Sfoglia il codice sorgente

wxGUI: fix search field in location wizard (#1322)

Addresses a range of issues related to search field in startup
location wizzard:
- use wx.EVT_TEXT for dynamic search result
- make sure ItemList data is a list
- let system set alternate listrow colouring
- addition of reset (cancel) search result
nilason 4 anni fa
parent
commit
a577a3b4c4
1 ha cambiato i file con 50 aggiunte e 28 eliminazioni
  1. 50 28
      gui/wxpython/location_wizard/wizard.py

+ 50 - 28
gui/wxpython/location_wizard/wizard.py

@@ -72,6 +72,11 @@ global resolution
 global wizerror
 global translist
 
+if globalvar.CheckWxVersion(version=[4, 1, 0]):
+    search_cancel_evt = wx.EVT_SEARCH_CANCEL
+else:
+    search_cancel_evt = wx.EVT_SEARCHCTRL_CANCEL_BTN
+
 
 class TitledPage(WizardPageSimple):
     """Class to make wizard pages. Generic methods to make labels,
@@ -480,9 +485,10 @@ class ProjectionsPage(TitledPage):
         # search box
         self.searchb = SearchCtrl(self, size=(200, -1),
                                   style=wx.TE_PROCESS_ENTER)
+        self.searchb.ShowCancelButton(True)
 
         # projection list
-        self.projlist = ItemList(self, data=self.parent.projdesc.items(),
+        self.projlist = ItemList(self, data=list(self.parent.projdesc.items()),
                                  columns=[_('Code'), _('Description')])
         self.projlist.resizeLastColumn(30)
 
@@ -511,7 +517,8 @@ class ProjectionsPage(TitledPage):
 
         # events
         self.tproj.Bind(wx.EVT_TEXT, self.OnText)
-        self.searchb.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
+        self.searchb.Bind(wx.EVT_TEXT, self.OnSearch)
+        self.searchb.Bind(search_cancel_evt, self.OnSearchCancel)
         self.projlist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
@@ -556,15 +563,19 @@ class ProjectionsPage(TitledPage):
 
     def OnSearch(self, event):
         """Search projection by desc"""
-        str = event.GetString()
+        search_str = event.GetString()
         try:
             self.proj, self.projdesc = self.projlist.Search(
-                index=[0, 1], pattern=event.GetString())
+                index=[0, 1], pattern=search_str)
         except:
             self.proj = self.projdesc = ''
 
         event.Skip()
 
+    def OnSearchCancel(self, event):
+        self.projlist.Search(index=None, pattern="")
+        event.Skip()
+
     def OnItemSelected(self, event):
         """Projection selected"""
         index = event.GetIndex()
@@ -600,13 +611,8 @@ class ItemList(ListCtrl,
         for column in columns:
             self.InsertColumn(i, column)
             i += 1
-        #
-        # add some attributes
-        #
-        self.attr1 = wx.ListItemAttr()
-        self.attr1.SetBackgroundColour(wx.Colour(238, 238, 238))
-        self.attr2 = wx.ListItemAttr()
-        self.attr2.SetBackgroundColour("white")
+
+        self.EnableAlternateRowColours()
 
         if self.sourceData:
             self.Populate()
@@ -704,14 +710,6 @@ class ItemList(ListCtrl,
     def OnGetItemImage(self, item):
         return -1
 
-    def OnGetItemAttr(self, item):
-        """Get item attributes"""
-        index = self.itemIndexMap[item]
-        if (index % 2) == 0:
-            return self.attr2
-        else:
-            return self.attr1
-
     def SortItems(self, sorter=cmp):
         """Sort items"""
         items = list(self.itemDataMap.keys())
@@ -1008,6 +1006,7 @@ class DatumPage(TitledPage):
         # search box
         self.searchb = SearchCtrl(self, size=(200, -1),
                                   style=wx.TE_PROCESS_ENTER)
+        self.searchb.ShowCancelButton(True)
 
         # create list control for datum/elipsoid list
         data = []
@@ -1047,7 +1046,8 @@ class DatumPage(TitledPage):
 
         # events
         self.datumlist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnDatumSelected)
-        self.searchb.Bind(wx.EVT_TEXT_ENTER, self.OnDSearch)
+        self.searchb.Bind(wx.EVT_TEXT, self.OnDSearch)
+        self.searchb.Bind(search_cancel_evt, self.OnSearchCancel)
         self.tdatum.Bind(wx.EVT_TEXT, self.OnDText)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
@@ -1139,19 +1139,23 @@ class DatumPage(TitledPage):
 
     def OnDSearch(self, event):
         """Search geodetic datum by desc"""
-        str = self.searchb.GetValue()
+        search_str = self.searchb.GetValue()
         try:
             self.datum, self.ellipsoid, self.datumdesc = self.datumlist.Search(
                 index=[
                     0,
                     1,
                     2],
-                pattern=str)
+                pattern=search_str)
         except:
             self.datum = self.datumdesc = self.ellipsoid = ''
 
         event.Skip()
 
+    def OnSearchCancel(self, event):
+        self.datumlist.Search(index=None, pattern="")
+        event.Skip()
+
     def OnDatumSelected(self, event):
         """Datum selected"""
         index = event.GetIndex()
@@ -1182,6 +1186,7 @@ class EllipsePage(TitledPage):
         # search box
         self.searchb = SearchCtrl(self, size=(200, -1),
                                   style=wx.TE_PROCESS_ENTER)
+        self.searchb.ShowCancelButton(True)
         # radio buttons
         self.radio1 = wx.RadioButton(parent=self, id=wx.ID_ANY,
                                      label=_("Earth based"),
@@ -1235,7 +1240,8 @@ class EllipsePage(TitledPage):
         # events
         self.ellipselist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
         self.tellipse.Bind(wx.EVT_TEXT, self.OnText)
-        self.searchb.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
+        self.searchb.Bind(wx.EVT_TEXT, self.OnSearch)
+        self.searchb.Bind(search_cancel_evt, self.OnSearchCancel)
 
         self.radio1.Bind(
             wx.EVT_RADIOBUTTON,
@@ -1311,6 +1317,10 @@ class EllipsePage(TitledPage):
 
         event.Skip()
 
+    def OnSearchCancel(self, event):
+        self.ellipselist.Search(index=None, pattern="")
+        event.Skip()
+
     def OnItemSelected(self, event):
         """Ellipsoid selected"""
         index = event.GetIndex()
@@ -1520,6 +1530,7 @@ class EPSGPage(TitledPage):
         # search box
         self.searchb = SearchCtrl(self, size=(200, -1),
                                   style=wx.TE_PROCESS_ENTER)
+        self.searchb.ShowCancelButton(True)
 
         self.epsglist = ItemList(
             self,
@@ -1566,7 +1577,8 @@ class EPSGPage(TitledPage):
         self.tfile.Bind(wx.EVT_TEXT_ENTER, self.OnBrowseCodes)
         self.tcode.Bind(wx.EVT_TEXT, self.OnText)
         self.epsglist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
-        self.searchb.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
+        self.searchb.Bind(wx.EVT_TEXT, self.OnSearch)
+        self.searchb.Bind(search_cancel_evt, self.OnSearchCancel)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
 
@@ -1644,8 +1656,8 @@ class EPSGPage(TitledPage):
         if value == '':
             self.epsgcode = None
             self.epsgdesc = self.epsgparams = ''
-            self.tcode.SetValue('')
-            self.searchb.SetValue('')
+            self.tcode.ChangeValue('')
+            self.searchb.ChangeValue('')
             self.OnBrowseCodes(None)
         else:
             try:
@@ -1654,8 +1666,12 @@ class EPSGPage(TitledPage):
             except (IndexError, ValueError):  # -> no item found
                 self.epsgcode = None
                 self.epsgdesc = self.epsgparams = ''
-                self.tcode.SetValue('')
+                self.tcode.ChangeValue('')
+
+        event.Skip()
 
+    def OnSearchCancel(self, event):
+        self.epsglist.Search(index=None, pattern="")
         event.Skip()
 
     def OnBrowse(self, event):
@@ -1747,6 +1763,7 @@ class IAUPage(TitledPage):
         # search box
         self.searchb = SearchCtrl(self, size=(200, -1),
                                   style=wx.TE_PROCESS_ENTER)
+        self.searchb.ShowCancelButton(True)
 
         self.epsglist = ItemList(
             self,
@@ -1793,7 +1810,8 @@ class IAUPage(TitledPage):
         self.tfile.Bind(wx.EVT_TEXT_ENTER, self.OnBrowseCodes)
         self.tcode.Bind(wx.EVT_TEXT, self.OnText)
         self.epsglist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
-        self.searchb.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
+        self.searchb.Bind(wx.EVT_TEXT, self.OnSearch)
+        self.searchb.Bind(search_cancel_evt, self.OnSearchCancel)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
 
@@ -1902,6 +1920,10 @@ class IAUPage(TitledPage):
 
         event.Skip()
 
+    def OnSearchCancel(self, event):
+        self.epsglist.Search(index=None, pattern="")
+        event.Skip()
+
     def OnBrowse(self, event):
         """Define path for IAU code file"""
         path = os.path.dirname(self.tfile.GetValue())