Browse Source

wxGUI/GConsole: decoupling LayerManager and TaskForm/ModuleForm (co-author: annakrat)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@53933 15284696-431f-4ddb-bdfa-cd5b030d7da7
Vaclav Petras 12 years ago
parent
commit
a89427062d

+ 5 - 0
gui/wxpython/core/events.py

@@ -23,3 +23,8 @@ from wx.lib.newevent import NewCommandEvent
 # The message attribute contains the text of the message (plain text)
 # The message attribute contains the text of the message (plain text)
 gShowNotification, EVT_SHOW_NOTIFICATION = NewCommandEvent()
 gShowNotification, EVT_SHOW_NOTIFICATION = NewCommandEvent()
 
 
+
+# Occurs event when some map is created or updated by a module.
+# attributes: name: map name, ltype: map type,
+# add: if map should be added to layer tree (questionable attribute)
+gMapCreated, EVT_MAP_CREATED = NewCommandEvent()

+ 11 - 1
gui/wxpython/gmodeler/frame.py

@@ -36,6 +36,7 @@ from core                 import globalvar
 from gui_core.widgets     import GNotebook
 from gui_core.widgets     import GNotebook
 from gui_core.goutput     import GConsole, \
 from gui_core.goutput     import GConsole, \
     EVT_CMD_RUN, EVT_CMD_DONE, EVT_CMD_PREPARE, EVT_OUTPUT_TEXT
     EVT_CMD_RUN, EVT_CMD_DONE, EVT_CMD_PREPARE, EVT_OUTPUT_TEXT
+from core.events          import EVT_MAP_CREATED
 from core.debug           import Debug
 from core.debug           import Debug
 from core.gcmd            import GMessage, GException, GWarning, GError, RunCommand
 from core.gcmd            import GMessage, GException, GWarning, GError, RunCommand
 from gui_core.dialogs     import GetImageHandlers
 from gui_core.dialogs     import GetImageHandlers
@@ -110,6 +111,7 @@ class ModelFrame(wx.Frame):
         self.Bind(EVT_CMD_RUN, self.OnCmdRun)
         self.Bind(EVT_CMD_RUN, self.OnCmdRun)
         self.Bind(EVT_CMD_DONE, self.OnCmdDone)
         self.Bind(EVT_CMD_DONE, self.OnCmdDone)
         self.Bind(EVT_CMD_PREPARE, self.OnCmdPrepare)
         self.Bind(EVT_CMD_PREPARE, self.OnCmdPrepare)
+        self.Bind(EVT_MAP_CREATED, self.OnMapCreated)
 
 
         self.notebook.AddPage(page = self.canvas, text=_('Model'), name = 'model')
         self.notebook.AddPage(page = self.canvas, text=_('Model'), name = 'model')
         self.notebook.AddPage(page = self.itemPanel, text=_('Items'), name = 'items')
         self.notebook.AddPage(page = self.itemPanel, text=_('Items'), name = 'items')
@@ -226,7 +228,15 @@ class ModelFrame(wx.Frame):
                 action.Update(running = True)
                 action.Update(running = True)
         except IndexError:
         except IndexError:
             pass
             pass
-        
+
+    def OnMapCreated(self, event):
+        """!Map was created but we don't want to add it to layer tree.
+        """
+        # remove this method if you want to add it to layer tree
+        # or see gui_core.forms.TaskFrame.OnMapCreated
+        event.add = False
+        event.Skip()
+
     def OnCloseWindow(self, event):
     def OnCloseWindow(self, event):
         """!Close window"""
         """!Close window"""
         if self.modelChanged and \
         if self.modelChanged and \

+ 31 - 29
gui/wxpython/gui_core/forms.py

@@ -90,6 +90,7 @@ from gui_core         import gselect
 from core             import gcmd
 from core             import gcmd
 from core             import utils
 from core             import utils
 from core.settings    import UserSettings
 from core.settings    import UserSettings
+from core.events      import EVT_MAP_CREATED
 from gui_core.widgets import FloatValidator, GNotebook, FormNotebook, FormListbook
 from gui_core.widgets import FloatValidator, GNotebook, FormNotebook, FormListbook
 
 
 wxUpdateDialog, EVT_DIALOG_UPDATE = NewEvent()
 wxUpdateDialog, EVT_DIALOG_UPDATE = NewEvent()
@@ -533,9 +534,10 @@ class TaskFrame(wx.Frame):
             guisizer.Add(item = self.closebox, proportion = 0,
             guisizer.Add(item = self.closebox, proportion = 0,
                          flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
                          flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
                          border = 5)
                          border = 5)
-        
+        # bindings
         self.Bind(wx.EVT_CLOSE,  self.OnCancel)
         self.Bind(wx.EVT_CLOSE,  self.OnCancel)
         self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
         self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
+        self.Bind(EVT_MAP_CREATED, self.OnMapCreated)
         
         
         # do layout
         # do layout
         # called automatically by SetSizer()
         # called automatically by SetSizer()
@@ -606,34 +608,34 @@ class TaskFrame(wx.Frame):
 
 
         @param returncode command's return code (0 for success)
         @param returncode command's return code (0 for success)
         """
         """
-        if not self.parent or returncode !=  0:
-            return
-        if self.parent.GetName() not in ('LayerTree', 'LayerManager'):
-            return
-        
-        if self.parent.GetName() == 'LayerTree':
-            display = self.parent.GetMapDisplay()
-        else: # Layer Manager
-            display = self.parent.GetLayerTree().GetMapDisplay()
-            
-        if not display or not display.IsAutoRendered():
-            return
-        
-        mapLayers = map(lambda x: x.GetName(),
-                        display.GetMap().GetListOfLayers(l_type = 'raster') +
-                        display.GetMap().GetListOfLayers(l_type = 'vector'))
-        
-        task = GUI(show = None).ParseCommand(cmd)
-        for p in task.get_options()['params']:
-            if p.get('prompt', '') not in ('raster', 'vector'):
-                continue
-            mapName = p.get('value', '')
-            if '@' not in mapName:
-                mapName = mapName + '@' + grass.gisenv()['MAPSET']
-            if mapName in mapLayers:
-                display.GetWindow().UpdateMap(render = True)
-                return
-        
+
+        if hasattr(self, "btn_cancel"):
+            self.btn_cancel.Enable(True)
+
+        if hasattr(self, "btn_clipboard"):
+            self.btn_clipboard.Enable(True)
+
+        if hasattr(self, "btn_help"):
+            self.btn_help.Enable(True)
+
+        if hasattr(self, "btn_run"):
+            self.btn_run.Enable(True)
+
+        if hasattr(self, "get_dcmd") and \
+                    self.get_dcmd is None and \
+                    hasattr(self, "closebox") and \
+                    self.closebox.IsChecked() and \
+                    (returncode == 0):
+                # was closed also when aborted but better is leave it open
+                wx.FutureCall(2000, self.Close)
+
+    def OnMapCreated(self, event):
+        if hasattr(self, "addbox") and self.addbox.IsChecked():
+            event.add = True
+        else:
+            event.add = False
+        event.Skip()
+    
     def OnOK(self, event):
     def OnOK(self, event):
         """!OK button pressed"""
         """!OK button pressed"""
         cmd = self.OnApply(event)
         cmd = self.OnApply(event)

+ 27 - 107
gui/wxpython/gui_core/goutput.py

@@ -39,11 +39,11 @@ from   grass.script import task as gtask
 from core            import globalvar
 from core            import globalvar
 from core            import utils
 from core            import utils
 from core.gcmd       import CommandThread, GMessage, GError, GException, EncodeString
 from core.gcmd       import CommandThread, GMessage, GError, GException, EncodeString
-from core.events     import gShowNotification
+from core.events     import gShowNotification, gMapCreated
 from gui_core.forms  import GUI
 from gui_core.forms  import GUI
 from gui_core.prompt import GPromptSTC
 from gui_core.prompt import GPromptSTC
 from core.debug      import Debug
 from core.debug      import Debug
-from core.settings   import UserSettings, GetDisplayVectSettings
+from core.settings   import UserSettings
 from gui_core.widgets import SearchModuleWidget, EVT_MODULE_SELECTED
 from gui_core.widgets import SearchModuleWidget, EVT_MODULE_SELECTED
 from core.modulesdata import ModulesData
 from core.modulesdata import ModulesData
 
 
@@ -866,112 +866,32 @@ class GConsole(wx.SplitterWindow):
         if event.cmd[0] == 'g.gisenv':
         if event.cmd[0] == 'g.gisenv':
             Debug.SetLevel()
             Debug.SetLevel()
             self.Redirect()
             self.Redirect()
-        
-        if self.frame.GetName() == "LayerManager":
-            self.btnCmdAbort.Enable(False)
-            if event.cmd[0] not in globalvar.grassCmd or \
-                    event.cmd[0] == 'r.mapcalc':
-                return
-            
-            tree = self.frame.GetLayerTree()
-            display = None
-            if tree:
-                display = tree.GetMapDisplay()
-            if not display or not display.IsAutoRendered():
-                return
-            mapLayers = map(lambda x: x.GetName(),
-                            display.GetMap().GetListOfLayers(l_type = 'raster') +
-                            display.GetMap().GetListOfLayers(l_type = 'vector'))
-            
-            try:
-                task = GUI(show = None).ParseCommand(event.cmd)
-            except GException, e:
-                print >> sys.stderr, e
-                task = None
-                return
-            
-            for p in task.get_options()['params']:
-                if p.get('prompt', '') not in ('raster', 'vector'):
-                    continue
-                mapName = p.get('value', '')
-                if '@' not in mapName:
-                    mapName = mapName + '@' + grass.gisenv()['MAPSET']
-                if mapName in mapLayers:
-                    display.GetWindow().UpdateMap(render = True)
-                    return
-        elif self.frame.GetName() == 'Modeler':
-            pass
-        else: # standalone dialogs
-            dialog = self.frame
-            if hasattr(dialog, "btn_abort"):
-                dialog.btn_abort.Enable(False)
-            
-            if hasattr(dialog, "btn_cancel"):
-                dialog.btn_cancel.Enable(True)
-            
-            if hasattr(dialog, "btn_clipboard"):
-                dialog.btn_clipboard.Enable(True)
-            
-            if hasattr(dialog, "btn_help"):
-                dialog.btn_help.Enable(True)
-            
-            if hasattr(dialog, "btn_run"):
-                dialog.btn_run.Enable(True)
-            
-            if event.returncode == 0 and not event.aborted:
-                try:
-                    winName = self.frame.parent.GetName()
-                except AttributeError:
-                    winName = ''
-                
-                if winName == 'LayerManager':
-                    mapTree = self.frame.parent.GetLayerTree()
-                elif winName == 'LayerTree':
-                    mapTree = self.frame.parent
-                elif winName: # GConsole
-                    mapTree = self.frame.parent.parent.GetLayerTree()
-                else:
-                    mapTree = None
-                
-                cmd = dialog.notebookpanel.createCmd(ignoreErrors = True)
-                if hasattr(dialog, "addbox") and dialog.addbox.IsChecked():
-                    # add created maps into layer tree
-                    for p in dialog.task.get_options()['params']:
-                        prompt = p.get('prompt', '')
-                        if prompt in ('raster', 'vector', '3d-raster') and \
-                                p.get('age', 'old') == 'new' and \
-                                p.get('value', None):
-                            name, found = utils.GetLayerNameFromCmd(cmd, fullyQualified = True,
-                                                                    param = p.get('name', ''))
-                            
-                            if mapTree.GetMap().GetListOfLayers(l_name = name):
-                                display = mapTree.GetMapDisplay()
-                                if display and display.IsAutoRendered():
-                                    display.GetWindow().UpdateMap(render = True)
-                                continue
-                            
-                            if prompt == 'raster':
-                                lcmd = ['d.rast',
-                                        'map=%s' % name]
-                            elif prompt == '3d-raster':
-                                lcmd = ['d.rast3d',
-                                        'map=%s' % name]
-                            else:
-                                defaultParams = GetDisplayVectSettings()
-                                lcmd = ['d.vect',
-                                        'map=%s' % name] + defaultParams
-                            mapTree.AddLayer(ltype = prompt,
-                                             lcmd = lcmd,
-                                             lname = name)
+
+        # do nothing when no map added
+        if event.returncode != 0 or event.aborted:
+            event.Skip()
+            return
+
+        # find which maps were created
+        try:
+            task = GUI(show = None).ParseCommand(event.cmd)
+        except GException, e:
+            print >> sys.stderr, e
+            task = None
+            return
             
             
-            if hasattr(dialog, "get_dcmd") and \
-                    dialog.get_dcmd is None and \
-                    hasattr(dialog, "closebox") and \
-                    dialog.closebox.IsChecked() and \
-                    (event.returncode == 0 or event.aborted):
-                self.cmdOutput.Update()
-                time.sleep(2)
-                dialog.Close()
+        for p in task.get_options()['params']:
+            prompt = p.get('prompt', '')
+            if prompt in ('raster', 'vector', '3d-raster') and \
+                    p.get('age', 'old') == 'new' and \
+                    p.get('value', None):
+                name = p.get('value')
+                if '@' not in name:
+                    name = name + '@' + grass.gisenv()['MAPSET']
+                mapEvent = gMapCreated(self.GetId(),
+                                       name = name, ltype = prompt, add = None)
+                wx.PostEvent(self, mapEvent)
+
         event.Skip()
         event.Skip()
 
 
     def OnProcessPendingOutputWindowEvents(self, event):
     def OnProcessPendingOutputWindowEvents(self, event):

+ 49 - 4
gui/wxpython/lmgr/frame.py

@@ -42,7 +42,7 @@ from grass.script          import core as grass
 from core.gcmd             import RunCommand, GError, GMessage
 from core.gcmd             import RunCommand, GError, GMessage
 from core.settings         import UserSettings, GetDisplayVectSettings
 from core.settings         import UserSettings, GetDisplayVectSettings
 from core.utils            import SetAddOnPath
 from core.utils            import SetAddOnPath
-from core.events           import EVT_SHOW_NOTIFICATION
+from core.events           import EVT_SHOW_NOTIFICATION, EVT_MAP_CREATED
 from gui_core.preferences  import MapsetAccess, PreferencesDialog, EVT_SETTINGS_CHANGED
 from gui_core.preferences  import MapsetAccess, PreferencesDialog, EVT_SETTINGS_CHANGED
 from lmgr.layertree        import LayerTree, LMIcons
 from lmgr.layertree        import LayerTree, LMIcons
 from lmgr.menudata         import LayerManagerMenuData
 from lmgr.menudata         import LayerManagerMenuData
@@ -157,6 +157,7 @@ class GMFrame(wx.Frame):
         self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
         self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
         self.Bind(EVT_SHOW_NOTIFICATION,
         self.Bind(EVT_SHOW_NOTIFICATION,
                   lambda event: self.SetStatusText(event.message))
                   lambda event: self.SetStatusText(event.message))
+        self.Bind(EVT_MAP_CREATED, self.OnMapCreated)
 
 
         # minimal frame size
         # minimal frame size
         self.SetMinSize((globalvar.GM_WINDOW_SIZE[0], 400))
         self.SetMinSize((globalvar.GM_WINDOW_SIZE[0], 400))
@@ -1552,8 +1553,14 @@ class GMFrame(wx.Frame):
     def OnApplyMapLayers(self, event):
     def OnApplyMapLayers(self, event):
         self.AddMaps(mapLayers = event.mapLayers, ltype = event.ltype)
         self.AddMaps(mapLayers = event.mapLayers, ltype = event.ltype)
 
 
-    def AddMaps(self, mapLayers, ltype):
-        """!Add map layers to layer tree."""
+    def AddMaps(self, mapLayers, ltype, check = False):
+        """!Add map layers to layer tree.
+
+        @param mapLayers list of map names
+        @param ltype layer type ('rast', 'rast3d', 'vect')
+        @param check @c True if new layers should be checked in layer tree
+        @c False otherwise
+        """
         # start new map display if no display is available
         # start new map display if no display is available
         if not self.currentPage:
         if not self.currentPage:
             self.NewDisplay()
             self.NewDisplay()
@@ -1577,10 +1584,48 @@ class GMFrame(wx.Frame):
             
             
             newItem = maptree.AddLayer(ltype = wxType,
             newItem = maptree.AddLayer(ltype = wxType,
                                        lname = layerName,
                                        lname = layerName,
-                                       lchecked = False,
+                                       lchecked = check,
                                        lopacity = 1.0,
                                        lopacity = 1.0,
                                        lcmd = cmd,
                                        lcmd = cmd,
                                        lgroup = None)
                                        lgroup = None)
+
+    def OnMapCreated(self, event):
+        if event.add is None:
+            if UserSettings.Get(group = 'cmd',
+                                key = 'addNewLayer', subkey = 'enabled'):
+                self.AddOrUpdateMap(event.name, event.ltype)
+        elif event.add:
+            self.AddOrUpdateMap(event.name, event.ltype)
+
+    def AddOrUpdateMap(self, mapName, ltype):
+        """!Add map layer or update"""
+        # start new map display if no display is available
+
+        # TODO: standardize type identifiers
+        convertType = {'raster': 'rast',
+                       '3d-raster': 'rast3d',
+                       'vector': 'vect'}
+        try:
+            grassType = convertType[ltype]
+        except KeyError:
+            if ltype in convertType.values():
+                grassType = ltype
+            else:
+                GError(parent = self,
+                       message = _("Unsupported map layer type <%s>.") % ltype)
+                return
+
+        if not self.currentPage:
+            self.AddMaps([mapName], grassType, check = True)
+        else:
+            display = self.GetLayerTree().GetMapDisplay()
+            mapLayers = map(lambda x: x.GetName(),
+                            display.GetMap().GetListOfLayers(l_type = ltype))
+            if mapName in mapLayers:
+                display.GetWindow().UpdateMap(render = True)
+            else:
+                self.AddMaps([mapName], grassType, check = True)
+
     def OnAddRaster(self, event):
     def OnAddRaster(self, event):
         """!Add raster map layer"""
         """!Add raster map layer"""
         # start new map display if no display is available
         # start new map display if no display is available