Browse Source

wxGUI/mapdisp: using signals to decouple mapwindow and frame (query, zoom history and mouse handlers signals)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@57078 15284696-431f-4ddb-bdfa-cd5b030d7da7
Vaclav Petras 12 years ago
parent
commit
94a3213b0c
2 changed files with 68 additions and 23 deletions
  1. 27 0
      gui/wxpython/mapdisp/frame.py
  2. 41 23
      gui/wxpython/mapdisp/mapwindow.py

+ 27 - 0
gui/wxpython/mapdisp/frame.py

@@ -148,6 +148,20 @@ class MapFrame(SingleMapFrame):
         self.MapWindow2D = BufferedWindow(self, giface = self._giface, id = wx.ID_ANY,
                                           Map = self.Map, frame = self, tree = self.tree,
                                           lmgr = self._layerManager, overlays = self.decorations)
+        self.MapWindow2D.mapQueried.connect(self.Query)
+        # enable or disable zoom history tool
+        self.MapWindow2D.zoomHistoryAvailable.connect(
+            lambda:
+            self.GetMapToolbar().Enable('zoomBack', enable=True))
+        self.MapWindow2D.zoomHistoryUnavailable.connect(
+            lambda:
+            self.GetMapToolbar().Enable('zoomBack', enable=False))
+        # manage the state of toolbars connected to mouse cursor
+        self.MapWindow2D.mouseHandlerRegistered.connect(
+            lambda:
+            self.UpdateTools(None))
+        self.MapWindow2D.mouseHandlerUnregistered.connect(self.ResetPointer)
+
         self._giface.updateMap.connect(self.MapWindow2D.UpdateMap)
         # default is 2D display mode
         self.MapWindow = self.MapWindow2D
@@ -1331,3 +1345,16 @@ class MapFrame(SingleMapFrame):
                         self.dialogs['legend'].resizeBtn.GetId():
                     return
             self.dialogs['legend'].resizeBtn.SetValue(0)
+
+    def ResetPointer(self):
+        """Sets pointer mode.
+
+        Sets pointer and toggles it (e.g. after unregistration of mouse
+        handler).
+        Somehow related to UpdateTools.
+        """
+        # sets pointer mode
+        toolbar = self.toolbars['map']
+        toolbar.action['id'] = vars(toolbar)["pointer"]
+        toolbar.OnTool(None)
+        self.OnPointer(event=None)

+ 41 - 23
gui/wxpython/mapdisp/mapwindow.py

@@ -83,6 +83,20 @@ class BufferedWindow(MapWindow, wx.Window):
         # Emitted when zoom of a window is changed
         self.zoomChanged = Signal('BufferedWindow.zoomChanged')
 
+        # Emitted when map was queried, parameters x, y are mouse coordinates
+        # TODO: change pixel coordinates to map coordinates (using Pixel2Cell)
+        self.mapQueried = Signal('BufferedWindow.mapQueried')
+
+        # Emitted when the zoom history stack is emptied
+        self.zoomHistoryUnavailable = Signal('BufferedWindow.zoomHistoryUnavailable')
+        # Emitted when the zoom history stack is not empty
+        self.zoomHistoryAvailable = Signal('BufferedWindow.zoomHistoryAvailable')
+
+        # Emitted when someone registers as mouse event handler
+        self.mouseHandlerRegistered = Signal('BufferedWindow.mouseHandlerRegistered')
+        # Emitted when mouse event handler is unregistered
+        self.mouseHandlerUnregistered = Signal('BufferedWindow.mouseHandlerUnregistered')
+
         # event bindings
         self.Bind(wx.EVT_PAINT,           self.OnPaint)
         self.Bind(wx.EVT_SIZE,            self.OnSize)
@@ -1164,6 +1178,8 @@ class BufferedWindow(MapWindow, wx.Window):
         
     def OnLeftUp(self, event):
         """!Left mouse button released
+
+        Emits mapQueried signal when mouse use is 'query'.
         """
         Debug.msg (5, "BufferedWindow.OnLeftUp(): use=%s" % \
                        self.mouse["use"])
@@ -1189,8 +1205,8 @@ class BufferedWindow(MapWindow, wx.Window):
             self.frame.StatusbarUpdate()
             
         elif self.mouse["use"] == "query":
-            self.frame.Query(self.mouse['end'][0], self.mouse['end'][1])
-        
+            self.mapQueried.emit(x=self.mouse['end'][0], y=self.mouse['end'][1])
+
         elif self.mouse["use"] in ["measure", "profile"]:
             # measure or profile
             if self.mouse["use"] == "measure":
@@ -1504,18 +1520,19 @@ class BufferedWindow(MapWindow, wx.Window):
         
     def ZoomBack(self):
         """!Zoom to previous extents in zoomhistory list
+
+        Emits zoomChanged signal.
+        Emits zoomHistoryUnavailable signal when stack is empty.
         """
         zoom = list()
         
         if len(self.zoomhistory) > 1:
             self.zoomhistory.pop()
             zoom = self.zoomhistory[-1]
-        
-        # disable tool if stack is empty
-        if len(self.zoomhistory) < 2: # disable tool
-            toolbar = self.frame.GetMapToolbar()
-            toolbar.Enable('zoomBack', enable = False)
-        
+
+        if len(self.zoomhistory) < 2:
+            self.zoomHistoryUnavailable.emit()
+
         # zoom to selected region
         self.Map.GetRegion(n = zoom[0], s = zoom[1],
                            e = zoom[2], w = zoom[3],
@@ -1531,6 +1548,10 @@ class BufferedWindow(MapWindow, wx.Window):
     def ZoomHistory(self, n, s, e, w):
         """!Manages a list of last 10 zoom extents
 
+        Emits zoomChanged signal.
+        Emits zoomHistoryAvailable signal when stack is not empty.
+        Emits zoomHistoryUnavailable signal when stack is empty.
+
         @param n,s,e,w north, south, east, west
 
         @return removed history item if exists (or None)
@@ -1550,13 +1571,9 @@ class BufferedWindow(MapWindow, wx.Window):
         
         # update toolbar
         if len(self.zoomhistory) > 1:
-            enable = True
+            self.zoomHistoryAvailable.emit()
         else:
-            enable = False
-        
-        toolbar = self.frame.GetMapToolbar()
-        
-        toolbar.Enable('zoomBack', enable)
+            self.zoomHistoryUnavailable.emit()
 
         self.zoomChanged.emit()
         
@@ -1817,19 +1834,20 @@ class BufferedWindow(MapWindow, wx.Window):
         return self.Map
 
     def RegisterMouseEventHandler(self, event, handler, cursor = None):
-        """!Calls UpdateTools to manage connected toolbars"""
-        self.frame.UpdateTools(None)
+        """Registeres mouse event handler.
+
+        Emits mouseHandlerRegistered signal before handler is registered.
+        """
+        self.mouseHandlerRegistered.emit()
         MapWindow.RegisterMouseEventHandler(self, event, handler, cursor)
 
     def UnregisterMouseEventHandler(self, event, handler):
-        """!Sets pointer and toggles it after unregistration"""
+        """Unregisteres mouse event handler.
+
+        Emits mouseHandlerUnregistered signal after handler is unregistered.
+        """
         MapWindow.UnregisterMouseEventHandler(self, event, handler)
-        
-        # sets pointer mode
-        toolbar = self.frame.toolbars['map']
-        toolbar.action['id'] = vars(toolbar)["pointer"]
-        toolbar.OnTool(None)
-        self.frame.OnPointer(event = None)
+        self.mouseHandlerUnregistered.emit()
         
     def RegisterGraphicsToDraw(self, graphicsType, setStatusFunc = None, drawFunc = None):
         """! This method registers graphics to draw.