class SearchModuleWindow(wx.Panel): """Menu tree and search widget for searching modules. Signal: showNotification - attribute 'message' """ def __init__(self, parent, handlerObj, giface, model, id=wx.ID_ANY, **kwargs): self.parent = parent self._handlerObj = handlerObj self._giface = giface self._model = model self.showNotification = Signal("SearchModuleWindow.showNotification") wx.Panel.__init__(self, parent=parent, id=id, **kwargs) # search widget self._search = SearchCtrl(self) self._search.SetDescriptiveText(_("Search")) self._search.ShowCancelButton(True) self._btnAdvancedSearch = Button( self, id=wx.ID_ANY, label=_("Adva&nced search...") ) self._btnAdvancedSearch.SetToolTip( _("Do advanced search using %s tool") % "g.search.module" ) # tree self._tree = CTreeView(model=model, parent=self) self._tree.SetToolTip(_("Double-click to run selected tool")) # buttons self._btnRun = Button(self, id=wx.ID_OK, label=_("&Run...")) self._btnRun.SetToolTip(_("Run selected tool from the tree")) self._btnHelp = Button(self, id=wx.ID_ANY, label=_("H&elp")) self._btnHelp.SetToolTip(_("Show manual for selected tool from the tree")) # bindings self._search.Bind(wx.EVT_TEXT, lambda evt: self.Filter(evt.GetString())) self._search.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, lambda evt: self.Filter("")) self._btnRun.Bind(wx.EVT_BUTTON, lambda evt: self.Run()) self._btnHelp.Bind(wx.EVT_BUTTON, lambda evt: self.Help()) self._btnAdvancedSearch.Bind(wx.EVT_BUTTON, lambda evt: self.AdvancedSearch()) self._tree.selectionChanged.connect(self.OnItemSelected) self._tree.itemActivated.connect(lambda node: self.Run(node)) self._layout() self._search.SetFocus() def _layout(self): """Do dialog layout""" sizer = wx.BoxSizer(wx.VERTICAL) # search searchSizer = wx.BoxSizer(wx.HORIZONTAL) searchSizer.Add(self._search, proportion=1, flag=wx.EXPAND | wx.RIGHT, border=5) searchSizer.Add(self._btnAdvancedSearch, proportion=0, flag=wx.EXPAND) sizer.Add(searchSizer, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) # body sizer.Add( self._tree, proportion=1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5 ) # buttons btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.AddStretchSpacer() btnSizer.Add(self._btnHelp, proportion=0, flag=wx.EXPAND | wx.RIGHT, border=5) btnSizer.Add(self._btnRun, proportion=0) sizer.Add(btnSizer, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) self.SetSizerAndFit(sizer) self.SetAutoLayout(True) self.Layout() def Filter(self, text): if text: model = self._model.Filtered( key=["command", "keywords", "description"], value=text ) self._tree.SetModel(model) self._tree.ExpandAll() else: self._tree.SetModel(self._model) def _GetSelectedNode(self): selection = self._tree.GetSelected() if not selection: return None return selection[0] def Run(self, node=None): """Run selected command. :param node: a tree node associated with the module or other item """ if not node: node = self._GetSelectedNode() # nothing selected if not node: return data = node.data # non-leaf nodes if not data: # expand/collapse location/mapset... if self._tree.IsNodeExpanded(node): self._tree.CollapseNode(node, recursive=False) else: self._tree.ExpandNode(node, recursive=False) return # extract name of the handler and create a new call handler = "self._handlerObj." + data["handler"].lstrip("self.") if data["command"]: eval(handler)(event=None, cmd=data["command"].split()) else: eval(handler)(event=None) def Help(self, node=None): """Show documentation for a module""" if not node: node = self._GetSelectedNode() # nothing selected if not node: return data = node.data # non-leaf nodes if not data: return if not data["command"]: # showing nothing for non-modules return # strip parameters from command if present name = data["command"].split()[0] self._giface.Help(name) self.showNotification.emit( message=_("Documentation for %s is now open in the web browser") % name ) def AdvancedSearch(self): """Show advanced search window""" self._handlerObj.RunMenuCmd(cmd=["g.search.modules"]) def OnItemSelected(self, node): """Item selected""" data = node.data if not data or "command" not in data: return if data["command"]: label = data["command"] if data["description"]: label += " -- " + data["description"] else: label = data["description"] self.showNotification.emit(message=label)
class SearchModuleWindow(wx.Panel): """Menu tree and search widget for searching modules. Signal: showNotification - attribute 'message' """ def __init__(self, parent, handlerObj, giface, model, id=wx.ID_ANY, **kwargs): self.parent = parent self._handlerObj = handlerObj self._giface = giface self.showNotification = Signal('SearchModuleWindow.showNotification') wx.Panel.__init__(self, parent=parent, id=id, **kwargs) # tree self._tree = CTreeView(model=model, parent=self) self._tree.SetToolTip( _("Double-click or Ctrl-Enter to run selected module")) # self._dataBox = wx.StaticBox(parent = self, id = wx.ID_ANY, # label = " %s " % _("Module tree")) # search widget self._search = SearchModuleWidget(parent=self, model=model, showChoice=False) self._search.showSearchResult.connect( lambda result: self._tree.Select(result)) self._search.showNotification.connect(self.showNotification) self._helpText = StaticText( parent=self, id=wx.ID_ANY, label="Press Enter for next match, Ctrl+Enter to run command") self._helpText.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_GRAYTEXT)) # buttons self._btnRun = Button(self, id=wx.ID_OK, label=_("&Run")) self._btnRun.SetToolTip(_("Run selected module from the tree")) self._btnHelp = Button(self, id=wx.ID_ANY, label=_("H&elp")) self._btnHelp.SetToolTip( _("Show manual for selected module from the tree")) self._btnAdvancedSearch = Button(self, id=wx.ID_ANY, label=_("Adva&nced search...")) self._btnAdvancedSearch.SetToolTip( _("Do advanced search using %s module") % 'g.search.module') # bindings self._btnRun.Bind(wx.EVT_BUTTON, lambda evt: self.Run()) self._btnHelp.Bind(wx.EVT_BUTTON, lambda evt: self.Help()) self._btnAdvancedSearch.Bind(wx.EVT_BUTTON, lambda evt: self.AdvancedSearch()) self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) self._tree.selectionChanged.connect(self.OnItemSelected) self._tree.itemActivated.connect(lambda node: self.Run(node)) self._layout() self._search.SetFocus() def _layout(self): """Do dialog layout""" sizer = wx.BoxSizer(wx.VERTICAL) # body dataSizer = wx.BoxSizer(wx.HORIZONTAL) dataSizer.Add(self._tree, proportion=1, flag=wx.EXPAND) # buttons btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(self._btnAdvancedSearch, proportion=0) btnSizer.AddStretchSpacer() btnSizer.Add(self._btnHelp, proportion=0) btnSizer.Add(self._btnRun, proportion=0) sizer.Add(dataSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=5) sizer.Add(self._search, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) sizer.Add(btnSizer, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) sizer.Add(self._helpText, proportion=0, flag=wx.EXPAND | wx.LEFT, border=5) sizer.Fit(self) sizer.SetSizeHints(self) self.SetSizer(sizer) self.Fit() self.SetAutoLayout(True) self.Layout() def _GetSelectedNode(self): selection = self._tree.GetSelected() if not selection: return None return selection[0] def Run(self, node=None): """Run selected command. :param node: a tree node associated with the module or other item """ if not node: node = self._GetSelectedNode() # nothing selected if not node: return data = node.data # non-leaf nodes if not data: return # extract name of the handler and create a new call handler = 'self._handlerObj.' + data['handler'].lstrip('self.') if data['command']: eval(handler)(event=None, cmd=data['command'].split()) else: eval(handler)(event=None) def Help(self, node=None): """Show documentation for a module""" if not node: node = self._GetSelectedNode() # nothing selected if not node: return data = node.data # non-leaf nodes if not data: return if not data['command']: # showing nothing for non-modules return # strip parameters from command if present name = data['command'].split()[0] self._giface.Help(name) self.showNotification.emit( message=_("Documentation for %s is now open in the web browser") % name) def AdvancedSearch(self): """Show advanced search window""" self._handlerObj.RunMenuCmd(cmd=['g.search.modules']) def OnKeyUp(self, event): """Key or key combination pressed""" if event.ControlDown() and \ event.GetKeyCode() in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER): self.Run() def OnItemSelected(self, node): """Item selected""" data = node.data if not data or 'command' not in data: return if data['command']: label = data['command'] if data['description']: label += ' -- ' + data['description'] else: label = data['description'] self.showNotification.emit(message=label)