/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/view.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/view.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 246 by bh, Mon Jul 29 13:38:04 2002 UTC revision 301 by bh, Mon Sep 2 15:59:11 2002 UTC
# Line 129  class ZoomInTool(RectTool): Line 129  class ZoomInTool(RectTool):
129              Tool.MouseUp(self, event)              Tool.MouseUp(self, event)
130              sx, sy = self.start              sx, sy = self.start
131              cx, cy = self.current              cx, cy = self.current
132              if sx == cx and sy == cy:              if sx == cx or sy == cy:
133                  # Just a mouse click. Simply zoom in by a factor of two                  # Just a mouse click or a degenerate rectangle. Simply
134                    # zoom in by a factor of two
135                    # FIXME: For a click this is the desired behavior but should we
136                    # really do this for degenrate rectagles as well or
137                    # should we ignore them?
138                  self.view.ZoomFactor(2, center = (cx, cy))                  self.view.ZoomFactor(2, center = (cx, cy))
139              else:              else:
140                  # A drag. Zoom in to the rectangle                  # A drag. Zoom in to the rectangle
# Line 149  class ZoomOutTool(RectTool): Line 153  class ZoomOutTool(RectTool):
153              Tool.MouseUp(self, event)              Tool.MouseUp(self, event)
154              sx, sy = self.start              sx, sy = self.start
155              cx, cy = self.current              cx, cy = self.current
156              if sx == cx and sy == cy:              if sx == cx or sy == cy:
157                  # Just a mouse click. Simply zoom out by a factor of two                  # Just a mouse click or a degenerate rectangle. Simply
158                    # zoom out by a factor of two.
159                    # FIXME: For a click this is the desired behavior but should we
160                    # really do this for degenrate rectagles as well or
161                    # should we ignore them?
162                  self.view.ZoomFactor(0.5, center = (cx, cy))                  self.view.ZoomFactor(0.5, center = (cx, cy))
163              else:              else:
164                  # A drag. Zoom out to the rectangle                  # A drag. Zoom out to the rectangle
# Line 276  class MapCanvas(wxWindow, Publisher): Line 284  class MapCanvas(wxWindow, Publisher):
284          # To force a redraw call full_redraw().          # To force a redraw call full_redraw().
285          self.redraw_on_idle = 0          self.redraw_on_idle = 0
286    
         # The region to update when idle  
         self.update_region = wx.wxRegion()  
   
287          # the bitmap serving as backing store          # the bitmap serving as backing store
288          self.bitmap = None          self.bitmap = None
289    
# Line 309  class MapCanvas(wxWindow, Publisher): Line 314  class MapCanvas(wxWindow, Publisher):
314          if self.map is not None and self.map.HasLayers():          if self.map is not None and self.map.HasLayers():
315              # We have a non-empty map. Redraw it in idle time              # We have a non-empty map. Redraw it in idle time
316              self.redraw_on_idle = 1              self.redraw_on_idle = 1
             # update the region that has to be redrawn  
             self.update_region.UnionRegion(self.GetUpdateRegion())  
317          else:          else:
318              # If we've got no map or if the map is empty, simply clear              # If we've got no map or if the map is empty, simply clear
319              # the screen.              # the screen.
# Line 323  class MapCanvas(wxWindow, Publisher): Line 326  class MapCanvas(wxWindow, Publisher):
326              dc.Clear()              dc.Clear()
327              dc.EndDrawing()              dc.EndDrawing()
328    
             # clear the region  
             self.update_region = wx.wxRegion()  
   
329      def do_redraw(self):      def do_redraw(self):
330          # This should only be called if we have a non-empty map.          # This should only be called if we have a non-empty map.
331    
         # get the update region and reset it. We're not actually using  
         # it anymore, though.  
         update_box = self.update_region.GetBox()  
         self.update_region = wx.wxRegion()  
   
332          # Get the window size.          # Get the window size.
333          width, height = self.GetSizeTuple()          width, height = self.GetSizeTuple()
334    
# Line 361  class MapCanvas(wxWindow, Publisher): Line 356  class MapCanvas(wxWindow, Publisher):
356              # draw the map into the bitmap              # draw the map into the bitmap
357              renderer = ScreenRenderer(dc, self.scale, self.offset)              renderer = ScreenRenderer(dc, self.scale, self.offset)
358    
359              # Pass the entire bitmap as update_region to the renderer.              # Pass the entire bitmap as update region to the renderer.
360              # We're redrawing the whole bitmap, after all.              # We're redrawing the whole bitmap, after all.
361              renderer.RenderMap(self.map, (0, 0, width, height),              renderer.RenderMap(self.map, (0, 0, width, height),
362                                 selected_layer, selected_shape)                                 selected_layer, selected_shape)
# Line 404  class MapCanvas(wxWindow, Publisher): Line 399  class MapCanvas(wxWindow, Publisher):
399          self.full_redraw()          self.full_redraw()
400    
401      def Map(self):      def Map(self):
402            """Return the map displayed by this canvas"""
403          return self.map          return self.map
404    
405      def redraw(self, *args):      def redraw(self, *args):
# Line 437  class MapCanvas(wxWindow, Publisher): Line 433  class MapCanvas(wxWindow, Publisher):
433          return ((x - offx) / self.scale, (offy - y) / self.scale)          return ((x - offx) / self.scale, (offy - y) / self.scale)
434    
435      def FitRectToWindow(self, rect):      def FitRectToWindow(self, rect):
436            """Fit the rectangular region given by rect into the window.
437            
438            Set scale so that rect (in projected coordinates) just fits into
439            the window and center it.
440            """
441          width, height = self.GetSizeTuple()          width, height = self.GetSizeTuple()
442          llx, lly, urx, ury = rect          llx, lly, urx, ury = rect
443          if llx == urx or lly == ury:          if llx == urx or lly == ury:
# Line 450  class MapCanvas(wxWindow, Publisher): Line 451  class MapCanvas(wxWindow, Publisher):
451          self.set_view_transform(scale, (offx, offy))          self.set_view_transform(scale, (offx, offy))
452    
453      def FitMapToWindow(self):      def FitMapToWindow(self):
454          """\          """Fit the map to the window
455          Set the scale and offset so that the map is centered in the          
456          window          Set the scale so that the map fits exactly into the window and
457            center it in the window.
458          """          """
459          bbox = self.map.ProjectedBoundingBox()          bbox = self.map.ProjectedBoundingBox()
460          if bbox is not None:          if bbox is not None:
# Line 478  class MapCanvas(wxWindow, Publisher): Line 480  class MapCanvas(wxWindow, Publisher):
480          self.set_view_transform(scale, offset)          self.set_view_transform(scale, offset)
481    
482      def ZoomOutToRect(self, rect):      def ZoomOutToRect(self, rect):
483          # rect is given in window coordinates          """Zoom out to fit the currently visible region into rect.
484    
485            The rect parameter is given in window coordinates
486            """
487          # determine the bbox of the displayed region in projected          # determine the bbox of the displayed region in projected
488          # coordinates          # coordinates
489          width, height = self.GetSizeTuple()          width, height = self.GetSizeTuple()
# Line 496  class MapCanvas(wxWindow, Publisher): Line 500  class MapCanvas(wxWindow, Publisher):
500          self.set_view_transform(scale, (offx, offy))          self.set_view_transform(scale, (offx, offy))
501    
502      def Translate(self, dx, dy):      def Translate(self, dx, dy):
503            """Move the map by dx, dy pixels"""
504          offx, offy = self.offset          offx, offy = self.offset
505          self.set_view_transform(self.scale, (offx + dx, offy + dy))          self.set_view_transform(self.scale, (offx + dx, offy + dy))
506    
507      def ZoomInTool(self):      def ZoomInTool(self):
508            """Start the zoom in tool"""
509          self.tool = ZoomInTool(self)          self.tool = ZoomInTool(self)
510    
511      def ZoomOutTool(self):      def ZoomOutTool(self):
512            """Start the zoom out tool"""
513          self.tool = ZoomOutTool(self)          self.tool = ZoomOutTool(self)
514    
515      def PanTool(self):      def PanTool(self):
516            """Start the pan tool"""
517          self.tool = PanTool(self)          self.tool = PanTool(self)
518    
519      def IdentifyTool(self):      def IdentifyTool(self):
520            """Start the identify tool"""
521          self.tool = IdentifyTool(self)          self.tool = IdentifyTool(self)
522    
523      def LabelTool(self):      def LabelTool(self):
524            """Start the label tool"""
525          self.tool = LabelTool(self)          self.tool = LabelTool(self)
526    
527      def CurrentTool(self):      def CurrentTool(self):
528            """Return the name of the current tool or None if no tool is active"""
529          return self.tool and self.tool.Name() or None          return self.tool and self.tool.Name() or None
530    
531      def CurrentPosition(self):      def CurrentPosition(self):
# Line 554  class MapCanvas(wxWindow, Publisher): Line 565  class MapCanvas(wxWindow, Publisher):
565              self.dragging = 1              self.dragging = 1
566    
567      def OnLeftUp(self, event):      def OnLeftUp(self, event):
         self.ReleaseMouse()  
568          self.set_current_position(event)          self.set_current_position(event)
569          if self.dragging:          if self.dragging:
570                self.ReleaseMouse()
571              self.tool.Hide(self.drag_dc)              self.tool.Hide(self.drag_dc)
572              self.tool.MouseUp(event)              self.tool.MouseUp(event)
573              self.drag_dc = None              self.drag_dc = None
# Line 607  class MapCanvas(wxWindow, Publisher): Line 618  class MapCanvas(wxWindow, Publisher):
618          self.last_selected_layer = layer          self.last_selected_layer = layer
619          self.last_selected_shape = shape          self.last_selected_shape = shape
620    
621      def unprojected_rect_around_point(self, x, y):      def unprojected_rect_around_point(self, x, y, dist):
622          """return a rect a few pixels around (x, y) in unprojected corrdinates          """return a rect dist pixels around (x, y) in unprojected corrdinates
623    
624          The return value is a tuple (minx, miny, maxx, maxy) suitable a          The return value is a tuple (minx, miny, maxx, maxy) suitable a
625          parameter to a layer's ShapesInRegion method.          parameter to a layer's ShapesInRegion method.
# Line 622  class MapCanvas(wxWindow, Publisher): Line 633  class MapCanvas(wxWindow, Publisher):
633          xs = []          xs = []
634          ys = []          ys = []
635          for dx, dy in ((-1, -1), (1, -1), (1, 1), (-1, 1)):          for dx, dy in ((-1, -1), (1, -1), (1, 1), (-1, 1)):
636              px, py = self.win_to_proj(x + dx, y + dy)              px, py = self.win_to_proj(x + dist * dx, y + dist * dy)
637              if inverse:              if inverse:
638                  px, py = inverse(px, py)                  px, py = inverse(px, py)
639              xs.append(px)              xs.append(px)
# Line 651  class MapCanvas(wxWindow, Publisher): Line 662  class MapCanvas(wxWindow, Publisher):
662          scale = self.scale          scale = self.scale
663          offx, offy = self.offset          offx, offy = self.offset
664    
         box = self.unprojected_rect_around_point(px, py)  
   
665          if select_labels:          if select_labels:
666              labels = self.map.LabelLayer().Labels()              labels = self.map.LabelLayer().Labels()
667    
# Line 712  class MapCanvas(wxWindow, Publisher): Line 721  class MapCanvas(wxWindow, Publisher):
721    
722              select_shape = -1              select_shape = -1
723    
724                # Determine the ids of the shapes that overlap a tiny area
725                # around the point. For layers containing points we have to
726                # choose a larger size of the box we're testing agains so
727                # that we take the size of the markers into account
728                # FIXME: Once the markers are more flexible this part has to
729                # become more flexible too, of course
730                if shapetype == SHAPETYPE_POINT:
731                    box = self.unprojected_rect_around_point(px, py, 5)
732                else:
733                    box = self.unprojected_rect_around_point(px, py, 1)
734              shape_ids = layer.ShapesInRegion(box)              shape_ids = layer.ShapesInRegion(box)
735              shape_ids.reverse()              shape_ids.reverse()
736    
# Line 774  class MapCanvas(wxWindow, Publisher): Line 793  class MapCanvas(wxWindow, Publisher):
793          return result          return result
794    
795      def LabelShapeAt(self, x, y):      def LabelShapeAt(self, x, y):
796            """Add or remove a label at window position x, y.
797    
798            If there's a label at the given position, remove it. Otherwise
799            determine the shape at the position, run the label dialog and
800            unless the user cancels the dialog, add a laber.
801            """
802          ox = x; oy = y          ox = x; oy = y
803          label_layer = self.map.LabelLayer()          label_layer = self.map.LabelLayer()
804          layer, shape_index = self.find_shape_at(x, y, select_labels = 1)          layer, shape_index = self.find_shape_at(x, y, select_labels = 1)

Legend:
Removed from v.246  
changed lines
  Added in v.301

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26