소스 검색

wxGUI: fix panning (middle-click)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@41216 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 15 년 전
부모
커밋
da6c81a10d
3개의 변경된 파일90개의 추가작업 그리고 44개의 파일을 삭제
  1. 6 2
      gui/wxpython/gui_modules/mapdisp.py
  2. 61 25
      gui/wxpython/gui_modules/mapdisp_window.py
  3. 23 17
      gui/wxpython/wxgui.py

+ 6 - 2
gui/wxpython/gui_modules/mapdisp.py

@@ -14,7 +14,7 @@ Classes:
 Usage:
 python mapdisp.py monitor-identifier /path/to/command/file
 
-(C) 2006-2009 by the GRASS Development Team
+(C) 2006-2010 by the GRASS Development Team
 This program is free software under the GNU General Public
 License (>=v2). Read the file COPYING that comes with GRASS
 for details.
@@ -1281,11 +1281,15 @@ class MapFrame(wx.Frame):
                 self.layerbook.DeletePage(pgnum)
         
     def GetRender(self):
-        """
+        """!
         Returns the current instance of render.Map()
         """
         return self.Map
 
+    def GetWindow(self):
+        """!Get map window"""
+        return self.MapWindow
+    
     def OnQueryDisplay(self, event):
         """
         Query currrent raster/vector map layers (display mode)

+ 61 - 25
gui/wxpython/gui_modules/mapdisp_window.py

@@ -883,22 +883,21 @@ class BufferedWindow(MapWindow, wx.Window):
     def DragMap(self, moveto):
         """!
         Drag the entire map image for panning.
-        """
 
+        @param moveto dx,dy
+        """
         dc = wx.BufferedDC(wx.ClientDC(self))
         dc.SetBackground(wx.Brush("White"))
         dc.Clear()
-
+        
         self.dragimg = wx.DragImage(self.buffer)
         self.dragimg.BeginDrag((0, 0), self)
         self.dragimg.GetImageRect(moveto)
         self.dragimg.Move(moveto)
-
+        
         self.dragimg.DoDrawImage(dc, moveto)
         self.dragimg.EndDrag()
-
-        return True
-
+        
     def DragItem(self, id, event):
         """!
         Drag an overlay decoration item
@@ -1089,6 +1088,10 @@ class BufferedWindow(MapWindow, wx.Window):
         elif event.MiddleDown():
             self.OnMiddleDown(event)
 
+        # middle mouse button relesed
+        elif event.MiddleUp():
+            self.OnMiddleUp(event)
+        
         # right mouse button pressed
         elif event.RightDown():
             self.OnRightDown(event)
@@ -1099,8 +1102,8 @@ class BufferedWindow(MapWindow, wx.Window):
 
         elif event.Moving():
             self.OnMouseMoving(event)
-
-#        event.Skip()
+        
+        # event.Skip()
         
     def OnMouseWheel(self, event):
         """!
@@ -1115,7 +1118,7 @@ class BufferedWindow(MapWindow, wx.Window):
                  current[1] - self.Map.height / 4)
         end   = (current[0] + self.Map.width / 4,
                  current[1] + self.Map.height / 4)
-
+        
         if wheel > 0:
             zoomtype = 1
         else:
@@ -1158,7 +1161,7 @@ class BufferedWindow(MapWindow, wx.Window):
                 not digitToolbar and 
                 self.dragid != None):
             self.DragItem(self.dragid, event)
-
+        
         # dragging anything else - rubber band box or line
         else:
             if (self.mouse['use'] == 'pointer' and 
@@ -1171,8 +1174,8 @@ class BufferedWindow(MapWindow, wx.Window):
                     digitClass.driver.GetSelected() > 0)):
                 # draw box only when left mouse button is pressed
                 self.MouseDraw(pdc=self.pdcTmp)
-      
-#        event.Skip()
+        
+        # event.Skip()
 
     def OnLeftDownVDigitAddLine(self, event):
         """!
@@ -1500,7 +1503,7 @@ class BufferedWindow(MapWindow, wx.Window):
                    self.mouse["use"])
 
         self.mouse['begin'] = event.GetPositionTuple()[:]
-
+        
         if self.mouse["use"] in ["measure", "profile"]:
             # measure or profile
             if len(self.polycoords) == 0:
@@ -1847,14 +1850,15 @@ class BufferedWindow(MapWindow, wx.Window):
         Left mouse button released
         """
         Debug.msg (5, "BufferedWindow.OnLeftUp(): use=%s" % \
-                   self.mouse["use"])
-
+                       self.mouse["use"])
+        
         self.mouse['end'] = event.GetPositionTuple()[:]
-
+        
         if self.mouse['use'] in ["zoom", "pan"]:
             # set region in zoom or pan
             begin = self.mouse['begin']
             end = self.mouse['end']
+            
             if self.mouse['use'] == 'zoom':
                 # set region for click (zero-width box)
                 if begin[0] - end[0] == 0 or \
@@ -1864,7 +1868,7 @@ class BufferedWindow(MapWindow, wx.Window):
                              end[1] - self.Map.height / 4)
                     end   = (end[0] + self.Map.width / 4,
                              end[1] + self.Map.height / 4)
-
+            
             self.Zoom(begin, end, self.zoomtype)
 
             # redraw map
@@ -2232,6 +2236,8 @@ class BufferedWindow(MapWindow, wx.Window):
         """!
         Middle mouse button pressed
         """
+        self.mouse['begin'] = event.GetPositionTuple()[:]
+        
         digitToolbar = self.parent.toolbars['vdigit']
         # digitization tool
         if self.mouse["use"] == "pointer" and digitToolbar:
@@ -2292,7 +2298,25 @@ class BufferedWindow(MapWindow, wx.Window):
                 self.UpdateMap(render=False)
             
             self.redrawAll = True
-            
+
+    def OnMiddleUp(self, event):
+        """!
+        Middle mouse button released
+        """
+        self.mouse['end'] = event.GetPositionTuple()[:]
+        
+        # set region in zoom or pan
+        begin = self.mouse['begin']
+        end = self.mouse['end']
+        
+        self.Zoom(begin, end, 0) # no zoom
+        
+        # redraw map
+        self.UpdateMap(render=True)
+        
+        # update statusbar
+        self.parent.StatusbarUpdate()
+        
     def OnMouseMoving(self, event):
         """!
         Motion event and no mouse buttons were pressed
@@ -2546,14 +2570,16 @@ class BufferedWindow(MapWindow, wx.Window):
         """!
         Manages a list of last 10 zoom extents
 
-        Return removed history item if exists
+        @param n,s,e,w north, south, east, west
+
+        @return removed history item if exists (or None)
         """
         removed = None
         self.zoomhistory.append((n,s,e,w))
-
+        
         if len(self.zoomhistory) > 10:
             removed = self.zoomhistory.pop(0)
-
+        
         if removed:
             Debug.msg(4, "BufferedWindow.ZoomHistory(): hist=%s, removed=%s" %
                       (self.zoomhistory, removed))
@@ -2561,14 +2587,24 @@ class BufferedWindow(MapWindow, wx.Window):
             Debug.msg(4, "BufferedWindow.ZoomHistory(): hist=%s" %
                       (self.zoomhistory))
         
+        # update toolbar
         if len(self.zoomhistory) > 1:
-            if self.parent.GetName() == 'MapWindow':
-                self.parent.toolbars['map'].Enable('zoomback')
-            else:
-                self.parent.toolbars['georect'].Enable('zoomback')
+            enable = True
+        else:
+            enable = False
+        if self.parent.GetName() == 'MapWindow':
+            toolbar = self.parent.toolbars['map']
+        elif self.parent.GetName() == 'GRMapWindow':
+            toolbar = self.parent.toolbars['georect']
+        
+        toolbar.Enable('zoomback', enable)
         
         return removed
 
+    def ResetZoomHistory(self):
+        """!Reset zoom history"""
+        self.zoomhistory = list()
+        
     def OnZoomToMap(self, event):
         """!
         Set display extents to match selected raster (including NULLs)

+ 23 - 17
gui/wxpython/wxgui.py

@@ -661,17 +661,18 @@ class GMFrame(wx.Frame):
         # start map displays first (list of layers can be empty)
         #
         displayId = 0
-        mapdisplay = []
+        mapdisplay = list()
         for display in gxwXml.displays:
-            mapdisplay.append(self.NewDisplay(show=False))
+            mapdisp = self.NewDisplay(show=False)
+            mapdisplay.append(mapdisp)
             maptree = self.gm_cb.GetPage(displayId).maptree
             
             # set windows properties
-            mapdisplay[-1].SetProperties(render=display['render'],
-                                         mode=display['mode'],
-                                         showCompExtent=display['showCompExtent'],
-                                         constrainRes=display['constrainRes'],
-                                         projection=display['projection']['enabled'])
+            mapdisp.SetProperties(render=display['render'],
+                                  mode=display['mode'],
+                                  showCompExtent=display['showCompExtent'],
+                                  constrainRes=display['constrainRes'],
+                                  projection=display['projection']['enabled'])
 
             if display['projection']['enabled']:
                 if display['projection']['epsg']:
@@ -684,16 +685,21 @@ class GMFrame(wx.Frame):
             # set position and size of map display
             if UserSettings.Get(group='workspace', key='posDisplay', subkey='enabled') is False:
                 if display['pos']:
-                    mapdisplay[-1].SetPosition(display['pos'])
+                    mapdisp.SetPosition(display['pos'])
                 if display['size']:
-                    mapdisplay[-1].SetSize(display['size'])
+                    mapdisp.SetSize(display['size'])
                     
             # set extent if defined
             if display['extent']:
                 w, s, e, n = display['extent']
-                maptree.Map.region = maptree.Map.GetRegion(w=w, s=s, e=e, n=n)
+                region = maptree.Map.region = maptree.Map.GetRegion(w=w, s=s, e=e, n=n)
+                mapdisp.GetWindow().ResetZoomHistory()
+                mapdisp.GetWindow().ZoomHistory(region['n'],
+                                                region['s'],
+                                                region['e'],
+                                                region['w'])
                 
-            mapdisplay[-1].Show()
+            mapdisp.Show()
             
             displayId += 1
     
@@ -1143,12 +1149,12 @@ class GMFrame(wx.Frame):
         @return reference to mapdisplay intance
         """
         Debug.msg(1, "GMFrame.NewDisplay(): idx=%d" % self.disp_idx)
-
+        
         # make a new page in the bookcontrol for the layer tree (on page 0 of the notebook)
         self.pg_panel = wx.Panel(self.gm_cb, id=wx.ID_ANY, style= wx.EXPAND)
         self.gm_cb.AddPage(self.pg_panel, text="Display "+ str(self.disp_idx + 1), select = True)
         self.curr_page = self.gm_cb.GetCurrentPage()
-
+        
         # create layer tree (tree control for managing GIS layers)  and put on new notebook page
         self.curr_page.maptree = wxgui_utils.LayerTree(self.curr_page, id=wx.ID_ANY, pos=wx.DefaultPosition,
                                                        size=wx.DefaultSize, style=wx.TR_HAS_BUTTONS
@@ -1156,7 +1162,7 @@ class GMFrame(wx.Frame):
                                                        |wx.TR_DEFAULT_STYLE|wx.NO_BORDER|wx.FULL_REPAINT_ON_RESIZE,
                                                        idx=self.disp_idx, lmgr=self, notebook=self.gm_cb,
                                                        auimgr=self._auimgr, showMapDisplay=show)
-
+        
         # layout for controls
         cb_boxsizer = wx.BoxSizer(wx.VERTICAL)
         cb_boxsizer.Add(self.curr_page.maptree, proportion=1, flag=wx.EXPAND, border=1)
@@ -1164,7 +1170,7 @@ class GMFrame(wx.Frame):
         cb_boxsizer.Fit(self.curr_page.maptree)
         self.curr_page.Layout()
         self.curr_page.maptree.Layout()
-
+        
         # use default window layout
         if UserSettings.Get(group='general', key='defWindowPos', subkey='enabled') is True:
             dim = UserSettings.Get(group='general', key='defWindowPos', subkey='dim')
@@ -1176,9 +1182,9 @@ class GMFrame(wx.Frame):
                 self.curr_page.maptree.mapdisplay.SetSize((w, h))
             except:
                 pass
- 
+        
         self.disp_idx += 1
-
+        
         return self.curr_page.maptree.mapdisplay
 
     # toolBar button handlers