[GRASS-SVN] r37420 - in grass/branches/develbranch_6/gui/wxpython: . gui_modules

svn_grass at osgeo.org svn_grass at osgeo.org
Sun May 24 09:49:34 EDT 2009


Author: martinl
Date: 2009-05-24 09:49:34 -0400 (Sun, 24 May 2009)
New Revision: 37420

Modified:
   grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py
   grass/branches/develbranch_6/gui/wxpython/wxgui.py
Log:
wxGUI: autocomplete prompt stage 3 (list raster/vector maps)
       (merge from trunk, r37419)


Modified: grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py
===================================================================
--- grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py	2009-05-24 13:45:30 UTC (rev 37419)
+++ grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py	2009-05-24 13:49:34 UTC (rev 37420)
@@ -25,6 +25,7 @@
 import globalvar
 import utils
 import menuform
+from grass.script import core as grass
 
 class GPrompt:
     """Interactive GRASS prompt"""
@@ -73,6 +74,10 @@
     def GetPanel(self):
         """Get main widget panel"""
         return self.panel
+
+    def GetInput(self):
+        """Get main prompt widget"""
+        return self.input
     
     def OnCmdErase(self, event):
         """Erase command prompt"""
@@ -133,7 +138,7 @@
         self._choices = choices
         self._hideOnNoMatch = True
         self._module = None # currently selected module
-        self._params = None # params or flags ?
+        self._choiceType = None # type of choice (module, params, flags, raster, vector ...)
         self._screenheight = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)
         
         # sort variable needed by listmix
@@ -152,6 +157,10 @@
         
         # set choices (list of GRASS modules)
         self._choicesCmd = globalvar.grassCmd['all']
+        self._choicesMap = dict()
+        for type in ('raster', 'vector'):
+            self._choicesMap[type] = grass.list_strings(type = type[:4])
+        # first search for GRASS module
         self.SetChoices(self._choicesCmd)
 
         # bindings...
@@ -160,8 +169,6 @@
         self.Bind(wx.EVT_KEY_DOWN , self.OnKeyDown, self)
 
         # if need drop down on left click
-        ### self.Bind ( wx.EVT_LEFT_DOWN , self.onClickToggleDown, self )
-        ### self.Bind ( wx.EVT_LEFT_UP , self.onClickToggleUp, self )
         self.dropdown.Bind(wx.EVT_LISTBOX , self.OnListItemSelected, self.dropdownlistbox)
         self.dropdownlistbox.Bind(wx.EVT_LEFT_DOWN, self.OnListClick)
         self.dropdownlistbox.Bind(wx.EVT_LEFT_DCLICK, self.OnListDClick)
@@ -237,26 +244,27 @@
             else:
                 col = self._colSearch
             itemtext = self.dropdownlistbox.GetItem(sel, col).GetText()
-            ### if self._selectCallback:
-            ###    dd = self.dropdownlistbox
-            ###    values = [dd.GetItem(sel, x).GetText()
-            ###        for x in xrange(dd.GetColumnCount())]
-            ###    self._selectCallback(values)
             
             cmd = shlex.split(str(self.GetValue()))
             if len(cmd) > 1:
                 # -> append text (skip last item)
-                if self._params is True:
+                if self._choiceType == 'param':
                     self.SetValue(' '.join(cmd[:-1]) + ' ' + itemtext + '=')
-                else:
+                    optType = self._module.get_param(itemtext)['prompt']
+                    if optType in ('raster', 'vector'):
+                        # -> raster/vector map
+                        self.SetChoices(self._choicesMap[optType], optType)
+                elif self._choiceType == 'flag':
                     if len(itemtext) > 1:
                         prefix = '--'
                     else:
                         prefix = '-'
                     self.SetValue(' '.join(cmd[:-1]) + ' ' + prefix + itemtext)
+                elif self._choiceType in ('raster', 'vector'):
+                    self.SetValue(' '.join(cmd[:-1]) + ' ' + cmd[-1].split('=', 1)[0] + '=' + itemtext)
             else:
                 # -> reset text
-                self.SetValue(itemtext)
+                self.SetValue(itemtext + ' ')
             self.SetInsertionPointEnd()
             
             self._showDropDown(False)
@@ -265,18 +273,21 @@
         """Method required by listmix.ColumnSorterMixin"""
         return self.dropdownlistbox
     
-    def SetChoices(self, choices):
+    def SetChoices(self, choices, type = 'module'):
         """
         Sets the choices available in the popup wx.ListBox.
         The items will be sorted case insensitively.
         """
         self._choices = choices
+        self._choiceType = type
         
         self.dropdownlistbox.SetWindowStyleFlag(wx.LC_REPORT | wx.LC_SINGLE_SEL | \
                                                     wx.LC_SORT_ASCENDING | wx.LC_NO_HEADER)
         if not isinstance(choices, list):
             self._choices = [ x for x in choices ]
-        utils.ListSortLower(self._choices)
+        if self._choiceType not in ('raster', 'vector'):
+            # do not sort raster/vector maps
+            utils.ListSortLower(self._choices)
         
         self._updateDataList(self._choices)
         
@@ -321,8 +332,6 @@
         """Text entered"""
         text = event.GetString()
         
-        ### if self._entryCallback:
-        ###    self._entryCallback()
         if not text:
             # control is empty; hide dropdown if shown:
             if self.dropdown.IsShown():
@@ -331,34 +340,36 @@
             return
         
         cmd = shlex.split(str(text))
+        pattern = str(text)
         if len(cmd) > 1:
             # search for module's options
             if not self._module:
                 self._module = menuform.GUI().ParseInterface(cmd = cmd)
-            
-            if cmd[-1][0] == '-':
-                # -> flags
-                self.SetChoices(self._module.get_list_flags())
-                self._params = False
+            if len(cmd[-1].split('=', 1)) == 1:
+                # new option
+                if cmd[-1][0] == '-':
+                    # -> flags
+                    self.SetChoices(self._module.get_list_flags(), type = 'flag')
+                    pattern = cmd[-1].lstrip('-')
+                else:
+                    # -> options
+                    self.SetChoices(self._module.get_list_params(), type = 'param')
+                    pattern = cmd[-1]
             else:
-                # -> options
-                self.SetChoices(self._module.get_list_params())
-                self._params = True
+                # value
+                pattern = cmd[-1].split('=', 1)[1]
         else:
             # search for GRASS modules
             if self._module:
                 # -> switch back to GRASS modules list
                 self.SetChoices(self._choicesCmd)
                 self._module = None
-                self._params = None
+                self._choiceType = None
         
         found = False
         choices = self._choices
         for numCh, choice in enumerate(choices):
-            ### if self._matchFunction and self._matchFunction(text, choice):
-            ###    found = True
-            ### elif
-            if choice.lower().startswith(cmd[-1].lower().lstrip('-')):
+            if choice.lower().startswith(pattern):
                 found = True
             if found:
                 self._showDropDown(True)
@@ -397,10 +408,7 @@
                 self._listItemVisible()
             self._showDropDown ()
             skip = False
-        elif KC == wx.WXK_LEFT:
-            return
-        elif KC == wx.WXK_RIGHT:
-            return 
+        
         if visible:
             if event.GetKeyCode() == wx.WXK_RETURN:
                 self._setValueFromSelected()
@@ -408,7 +416,7 @@
             if event.GetKeyCode() == wx.WXK_ESCAPE:
                 self._showDropDown(False)
                 skip = False
-        if skip :
+        if skip:
             event.Skip()
         
     def OnControlChanged(self, event):

Modified: grass/branches/develbranch_6/gui/wxpython/wxgui.py
===================================================================
--- grass/branches/develbranch_6/gui/wxpython/wxgui.py	2009-05-24 13:45:30 UTC (rev 37419)
+++ grass/branches/develbranch_6/gui/wxpython/wxgui.py	2009-05-24 13:49:34 UTC (rev 37420)
@@ -126,7 +126,7 @@
         # creating widgets
         # -> self.notebook, self.goutput, self.outpage
         self.notebook  = self.__createNoteBook()
-        self.cmdprompt = self.__createCommandPrompt()
+        self.cmdprompt, self.cmdinput = self.__createCommandPrompt()
         self.menubar   = self.__createMenuBar()
         self.toolbar   = self.__createToolBar()
         self.statusbar = self.CreateStatusBar(number=1)
@@ -154,7 +154,8 @@
         self._auimgr.Update()
 
         wx.CallAfter(self.notebook.SetSelection, 0)
-
+        wx.CallAfter(self.cmdinput.SetFocus)
+        
         # use default window layout ?
         if UserSettings.Get(group='general', key='defWindowPos', subkey='enabled') is True:
             dim = UserSettings.Get(group='general', key='defWindowPos', subkey='dim')
@@ -193,7 +194,9 @@
         
     def __createCommandPrompt(self):
         """Creates command-line input area"""
-        return prompt.GPrompt(self).GetPanel()
+        p = prompt.GPrompt(self)
+
+        return p.GetPanel(), p.GetInput()
     
     def __createMenuBar(self):
         """Creates menubar"""



More information about the grass-commit mailing list