瀏覽代碼

wxGUI/legend: fix various problems related to updating legend with different map

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@59027 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 11 年之前
父節點
當前提交
b4b3974f87
共有 1 個文件被更改,包括 21 次插入5 次删除
  1. 21 5
      gui/wxpython/mapdisp/frame.py

+ 21 - 5
gui/wxpython/mapdisp/frame.py

@@ -364,7 +364,7 @@ class MapFrame(SingleMapFrame):
             self.MapWindow3D.UpdateView(None)
             self.MapWindow3D.overlayActivated.connect(self._activateOverlay)
             self.MapWindow3D.overlayHidden.connect(self._hideOverlay)
-            self.legend.overlayChanged.connect(lambda: self.MapWindow3D.UpdateOverlays())
+            self.legend.overlayChanged.connect(self.MapWindow3D.UpdateOverlays)
         else:
             self.MapWindow = self.MapWindow3D
             os.environ['GRASS_REGION'] = self.Map.SetRegion(windres = True, windres3 = True)
@@ -431,6 +431,7 @@ class MapFrame(SingleMapFrame):
         # TODO: here we end because self.MapWindow3D is None for a while
         self._giface.updateMap.disconnect(self.MapWindow3D.UpdateMap)
         self._giface.updateMap.connect(self.MapWindow2D.UpdateMap)
+        self.legend.overlayChanged.disconnect(self.MapWindow3D.UpdateOverlays)
 
         self.MapWindow.UpdateMap()
         self._mgr.Update()
@@ -988,7 +989,7 @@ class MapFrame(SingleMapFrame):
         if overlayId > 100:
             self.OnAddText(None)
         elif overlayId == 0:
-            self.AddLegend(showDialog=True)
+            self.AddLegend(cmd=self.legend.cmd, showDialog=True)
         elif overlayId == 1:
             self.AddBarscale(showDialog=True)
         elif overlayId == 2:
@@ -1051,7 +1052,20 @@ class MapFrame(SingleMapFrame):
             layers = self._giface.GetLayerList().GetSelectedLayers()
             for layer in layers:
                 if layer.type == 'raster':
-                    self.legend.cmd.append('map=%s' % layer.maplayer.name)
+                    isMap = False
+                    # replace map
+                    for i, legendParam in enumerate(self.legend.cmd[1:]):
+                        idx = i + 1
+                        param, val = legendParam.split('=')
+                        if param == 'map':
+                            self.legend.cmd[idx] = 'map={rast}'.format(rast=layer.maplayer.name)
+                            isMap = True
+                        elif param in ('use', 'range'):
+                            # clear range or use to avoid problems
+                            del self.legend.cmd[idx]
+
+                    if not isMap:  # for the first time
+                        self.legend.cmd.append('map=%s' % layer.maplayer.name)
                     break
 
         if not showDialog and self.legend.CmdIsValid():
@@ -1059,13 +1073,15 @@ class MapFrame(SingleMapFrame):
             return
 
         # Decoration overlay control dialog
+        # always create new one to avoid problem when switching between maps
         if self.legend.dialog:
             if self.legend.dialog.IsShown():
                 self.legend.dialog.SetFocus()
                 self.legend.dialog.Raise()
             else:
-                self.legend.dialog.Show()
-        else:
+                self.legend.dialog.Destroy()
+                self.legend.dialog = None
+        if not self.legend.dialog:
             GUI(parent=self, giface=self._giface, show=True,
                 modal=False).ParseCommand(self.legend.cmd,
                                           completed=(self.legend.GetOptData, None, None))