Browse Source

wxGUI/GSelect: filtering items in progress, see https://trac.osgeo.org/grass/ticket/1251
patch by Anna Kratochvilova


git-svn-id: https://svn.osgeo.org/grass/grass/trunk@44725 15284696-431f-4ddb-bdfa-cd5b030d7da7

Martin Landa 14 years ago
parent
commit
ad781c36f5
1 changed files with 40 additions and 11 deletions
  1. 40 11
      gui/wxpython/gui_modules/gselect.py

+ 40 - 11
gui/wxpython/gui_modules/gselect.py

@@ -187,6 +187,7 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
         self.filterElements = filter
         self.filterElements = filter
         
         
     def _startsWith(self, text):
     def _startsWith(self, text):
+        """!Filter items - currently unused"""
         return True if text.startswith(self.GetCombo().GetValue()) else False
         return True if text.startswith(self.GetCombo().GetValue()) else False
     
     
     def OnPopup(self, force = False):
     def OnPopup(self, force = False):
@@ -198,14 +199,22 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
         else:
         else:
             selected = None
             selected = None
             exclude  = False
             exclude  = False
-        
-        text = self.GetCombo().GetValue().strip()
-        if grass.find_file(name = text, element = self.type)['fullname']:
-            self.SetFilter(None)
-        else:
-            self.SetFilter(self._startsWith)   
+ 
         self.GetElementList(selected, exclude)
         self.GetElementList(selected, exclude)
         
         
+        # selects map starting according to written text
+        inputText = self.GetCombo().GetValue().strip()
+        if inputText:
+            root = self.seltree.GetRootItem()
+            match = self.FindItem(root, inputText, startLetters = True)
+            if wx.TreeItemId.IsOk(self.seltree.GetPrevSibling(match)):
+                match = self.seltree.GetPrevSibling(match)
+            else: 
+                match = self.seltree.GetItemParent(match)
+            self.seltree.EnsureVisible(match)
+            self.seltree.SelectItem(match)
+            
+      
     def GetElementList(self, elements = None, exclude = False):
     def GetElementList(self, elements = None, exclude = False):
         """!Get filtered list of GIS elements in accessible mapsets
         """!Get filtered list of GIS elements in accessible mapsets
         and display as tree with all relevant elements displayed
         and display as tree with all relevant elements displayed
@@ -372,17 +381,22 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
             self.seltree.SelectItem(first_dir)
             self.seltree.SelectItem(first_dir)
     
     
     # helpers
     # helpers
-    def FindItem(self, parentItem, text):
+    def FindItem(self, parentItem, text, startLetters = False):
+        """!Finds item with given name or starting with given text"""
+        startletters = startLetters
         item, cookie = self.seltree.GetFirstChild(parentItem)
         item, cookie = self.seltree.GetFirstChild(parentItem)
-        while item:
+        while wx.TreeItemId.IsOk(item):
             if self.seltree.GetItemText(item) == text:
             if self.seltree.GetItemText(item) == text:
                 return item
                 return item
             if self.seltree.ItemHasChildren(item):
             if self.seltree.ItemHasChildren(item):
-                item = self.FindItem(item, text)
+                item = self.FindItem(item, text, startLetters = startletters)
+                if wx.TreeItemId.IsOk(item):
+                    return item
+            elif startletters and self.seltree.GetItemText(item).startswith(text.split('@')[0]):
+                return item
             item, cookie = self.seltree.GetNextChild(parentItem, cookie)
             item, cookie = self.seltree.GetNextChild(parentItem, cookie)
         return wx.TreeItemId()
         return wx.TreeItemId()
-
-
+    
     def AddItem(self, value, parent=None):
     def AddItem(self, value, parent=None):
         if not parent:
         if not parent:
             root = self.seltree.GetRootItem()
             root = self.seltree.GetRootItem()
@@ -412,6 +426,21 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
                     if item == self.seltree.GetFirstChild(self.seltree.GetRootItem())[0]:
                     if item == self.seltree.GetFirstChild(self.seltree.GetRootItem())[0]:
                         itemPrev = item
                         itemPrev = item
             self.seltree.SelectItem(itemPrev)
             self.seltree.SelectItem(itemPrev)
+        
+        # selects first item starting with the written text in next mapset
+        elif event.GetKeyCode() == wx.WXK_TAB:
+            selected = self.seltree.GetSelection()
+            if self.seltree.ItemHasChildren(selected):
+                parent = selected
+            else:
+                parent = self.seltree.GetItemParent(selected)
+            nextSibling = self.seltree.GetNextSibling(parent)
+            if wx.TreeItemId.IsOk(nextSibling):
+                match = self.FindItem(nextSibling, self.GetCombo().GetValue().strip(), True) 
+            else: 
+                match = self.FindItem(self.seltree.GetFirstChild(self.seltree.GetItemParent(parent))[0],
+                                        self.GetCombo().GetValue().strip(), True) 
+            self.seltree.SelectItem(match)
             
             
         elif event.GetKeyCode() == wx.WXK_RIGHT:
         elif event.GetKeyCode() == wx.WXK_RIGHT:
             if self.seltree.ItemHasChildren(item):
             if self.seltree.ItemHasChildren(item):