瀏覽代碼

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 年之前
父節點
當前提交
56fa0f8fff
共有 1 個文件被更改,包括 47 次插入8 次删除
  1. 47 8
      gui/wxpython/location_wizard/wizard.py

+ 47 - 8
gui/wxpython/location_wizard/wizard.py

@@ -73,6 +73,12 @@ 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,
     text entries, and buttons.
@@ -487,9 +493,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)
 
@@ -518,7 +525,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)
@@ -563,14 +571,19 @@ class ProjectionsPage(TitledPage):
 
     def OnSearch(self, event):
         """Search projection by desc"""
+        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()
@@ -993,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 = []
@@ -1032,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)
@@ -1125,19 +1140,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()
@@ -1171,6 +1190,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"),
@@ -1224,7 +1244,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,
@@ -1300,6 +1321,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()
@@ -1495,6 +1520,8 @@ class EPSGPage(TitledPage):
         # search box
         self.searchb = SearchCtrl(self, size=(-1, 30),
                                   style=wx.TE_PROCESS_ENTER)
+        self.searchb.ShowCancelButton(True)
+
         self.epsglist = ItemList(
             self,
             data=None,
@@ -1539,6 +1566,7 @@ class EPSGPage(TitledPage):
         # events
         self.searchb.Bind(wx.EVT_TEXT, self.OnTextChange)
         self.epsglist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
+        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)
 
@@ -1598,6 +1626,7 @@ class EPSGPage(TitledPage):
             self.tlink.SetURL(str("https://epsg.io/"))
             self.epsgcode = None
             self.epsgdesc = self.epsgparams = ''
+            self.searchb.ChangeValue('')
             self.OnBrowseCodes(None)
             self.EnableNext(False)
         else:
@@ -1637,6 +1666,10 @@ class EPSGPage(TitledPage):
 
         event.Skip()
 
+    def OnSearchCancel(self, event):
+        self.epsglist.Search(index=None, pattern="")
+        event.Skip()
+
     def OnBrowseCodes(self, event, search=None):
         """Browse EPSG codes"""
         try:
@@ -1700,6 +1733,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,
@@ -1746,7 +1780,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)
 
@@ -1855,6 +1890,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())