/[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 296 by bh, Fri Aug 30 16:10:45 2002 UTC revision 404 by bh, Fri Feb 14 17:40:26 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001, 2002 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 279  class MapCanvas(wxWindow, Publisher): Line 279  class MapCanvas(wxWindow, Publisher):
279          # if the mouse is outside the window.          # if the mouse is outside the window.
280          self.current_position = None          self.current_position = None
281    
         # If true, OnIdle will call do_redraw to do the actual  
         # redrawing. Set by OnPaint to avoid some unnecessary redraws.  
         # To force a redraw call full_redraw().  
         self.redraw_on_idle = 0  
   
282          # the bitmap serving as backing store          # the bitmap serving as backing store
283          self.bitmap = None          self.bitmap = None
284    
# Line 303  class MapCanvas(wxWindow, Publisher): Line 298  class MapCanvas(wxWindow, Publisher):
298          EVT_MOTION(self, self.OnMotion)          EVT_MOTION(self, self.OnMotion)
299          EVT_LEAVE_WINDOW(self, self.OnLeaveWindow)          EVT_LEAVE_WINDOW(self, self.OnLeaveWindow)
300          wx.EVT_SIZE(self, self.OnSize)          wx.EVT_SIZE(self, self.OnSize)
         wx.EVT_IDLE(self, self.OnIdle)  
301    
302      def __del__(self):      def __del__(self):
303          wxWindow.__del__(self)          wxWindow.__del__(self)
# Line 312  class MapCanvas(wxWindow, Publisher): Line 306  class MapCanvas(wxWindow, Publisher):
306      def OnPaint(self, event):      def OnPaint(self, event):
307          dc = wxPaintDC(self)          dc = wxPaintDC(self)
308          if self.map is not None and self.map.HasLayers():          if self.map is not None and self.map.HasLayers():
309              # We have a non-empty map. Redraw it in idle time              self.do_redraw()
             self.redraw_on_idle = 1  
310          else:          else:
311              # 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
312              # the screen.              # the screen.
# Line 504  class MapCanvas(wxWindow, Publisher): Line 497  class MapCanvas(wxWindow, Publisher):
497          offx, offy = self.offset          offx, offy = self.offset
498          self.set_view_transform(self.scale, (offx + dx, offy + dy))          self.set_view_transform(self.scale, (offx + dx, offy + dy))
499    
500        def SelectTool(self, tool):
501            """Make tool the active tool.
502    
503            The parameter should be an instance of Tool or None to indicate
504            that no tool is active.
505            """
506            self.tool = tool
507    
508      def ZoomInTool(self):      def ZoomInTool(self):
509          """Start the zoom in tool"""          """Start the zoom in tool"""
510          self.tool = ZoomInTool(self)          self.SelectTool(ZoomInTool(self))
511    
512      def ZoomOutTool(self):      def ZoomOutTool(self):
513          """Start the zoom out tool"""          """Start the zoom out tool"""
514          self.tool = ZoomOutTool(self)          self.SelectTool(ZoomOutTool(self))
515    
516      def PanTool(self):      def PanTool(self):
517          """Start the pan tool"""          """Start the pan tool"""
518          self.tool = PanTool(self)          self.SelectTool(PanTool(self))
519    
520      def IdentifyTool(self):      def IdentifyTool(self):
521          """Start the identify tool"""          """Start the identify tool"""
522          self.tool = IdentifyTool(self)          self.SelectTool(IdentifyTool(self))
523    
524      def LabelTool(self):      def LabelTool(self):
525          """Start the label tool"""          """Start the label tool"""
526          self.tool = LabelTool(self)          self.SelectTool(LabelTool(self))
527    
528      def CurrentTool(self):      def CurrentTool(self):
529          """Return the name of the current tool or None if no tool is active"""          """Return the name of the current tool or None if no tool is active"""
# Line 568  class MapCanvas(wxWindow, Publisher): Line 569  class MapCanvas(wxWindow, Publisher):
569          self.set_current_position(event)          self.set_current_position(event)
570          if self.dragging:          if self.dragging:
571              self.ReleaseMouse()              self.ReleaseMouse()
572              self.tool.Hide(self.drag_dc)              try:
573              self.tool.MouseUp(event)                  self.tool.Hide(self.drag_dc)
574              self.drag_dc = None                  self.tool.MouseUp(event)
575          self.dragging = 0              finally:
576                    self.drag_dc = None
577                    self.dragging = 0
578    
579      def OnMotion(self, event):      def OnMotion(self, event):
580          self.set_current_position(event)          self.set_current_position(event)
# Line 583  class MapCanvas(wxWindow, Publisher): Line 586  class MapCanvas(wxWindow, Publisher):
586      def OnLeaveWindow(self, event):      def OnLeaveWindow(self, event):
587          self.set_current_position(None)          self.set_current_position(None)
588    
     def OnIdle(self, event):  
         if self.redraw_on_idle:  
             self.do_redraw()  
         self.redraw_on_idle = 0  
   
589      def OnSize(self, event):      def OnSize(self, event):
590          # the window's size has changed. We have to get a new bitmap. If          # the window's size has changed. We have to get a new bitmap. If
591          # we want to be clever we could try to get by without throwing          # we want to be clever we could try to get by without throwing
# Line 618  class MapCanvas(wxWindow, Publisher): Line 616  class MapCanvas(wxWindow, Publisher):
616          self.last_selected_layer = layer          self.last_selected_layer = layer
617          self.last_selected_shape = shape          self.last_selected_shape = shape
618    
619      def unprojected_rect_around_point(self, x, y):      def unprojected_rect_around_point(self, x, y, dist):
620          """return a rect a few pixels around (x, y) in unprojected corrdinates          """return a rect dist pixels around (x, y) in unprojected corrdinates
621    
622          The return value is a tuple (minx, miny, maxx, maxy) suitable a          The return value is a tuple (minx, miny, maxx, maxy) suitable a
623          parameter to a layer's ShapesInRegion method.          parameter to a layer's ShapesInRegion method.
# Line 633  class MapCanvas(wxWindow, Publisher): Line 631  class MapCanvas(wxWindow, Publisher):
631          xs = []          xs = []
632          ys = []          ys = []
633          for dx, dy in ((-1, -1), (1, -1), (1, 1), (-1, 1)):          for dx, dy in ((-1, -1), (1, -1), (1, 1), (-1, 1)):
634              px, py = self.win_to_proj(x + dx, y + dy)              px, py = self.win_to_proj(x + dist * dx, y + dist * dy)
635              if inverse:              if inverse:
636                  px, py = inverse(px, py)                  px, py = inverse(px, py)
637              xs.append(px)              xs.append(px)
# Line 662  class MapCanvas(wxWindow, Publisher): Line 660  class MapCanvas(wxWindow, Publisher):
660          scale = self.scale          scale = self.scale
661          offx, offy = self.offset          offx, offy = self.offset
662    
         box = self.unprojected_rect_around_point(px, py)  
   
663          if select_labels:          if select_labels:
664              labels = self.map.LabelLayer().Labels()              labels = self.map.LabelLayer().Labels()
665    
# Line 723  class MapCanvas(wxWindow, Publisher): Line 719  class MapCanvas(wxWindow, Publisher):
719    
720              select_shape = -1              select_shape = -1
721    
722                # Determine the ids of the shapes that overlap a tiny area
723                # around the point. For layers containing points we have to
724                # choose a larger size of the box we're testing agains so
725                # that we take the size of the markers into account
726                # FIXME: Once the markers are more flexible this part has to
727                # become more flexible too, of course
728                if shapetype == SHAPETYPE_POINT:
729                    box = self.unprojected_rect_around_point(px, py, 5)
730                else:
731                    box = self.unprojected_rect_around_point(px, py, 1)
732              shape_ids = layer.ShapesInRegion(box)              shape_ids = layer.ShapesInRegion(box)
733              shape_ids.reverse()              shape_ids.reverse()
734    

Legend:
Removed from v.296  
changed lines
  Added in v.404

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26