@@ -125,37 +125,39 @@ def fuzzyFinder(key, collection):
125125 return [x for _ , _ , x in sorted (suggestions )]
126126
127127
128- class TabSearchMenuWidget (QtWidgets .QLineEdit ):
128+ class TabSearchMenuWidget (QtWidgets .QMenu ):
129129 search_submitted = QtCore .Signal (str )
130130
131- def __init__ (self , parent = None , node_dict = None ):
132- super (TabSearchMenuWidget , self ).__init__ (parent )
133- self .setAttribute (QtCore .Qt .WA_MacShowFocusRect , 0 )
134- self .setStyleSheet (STYLE_TABSEARCH )
135- self .setMinimumSize (200 , 22 )
136- self .setTextMargins (2 , 0 , 2 , 0 )
131+ def __init__ (self , node_dict = None ):
132+ super (TabSearchMenuWidget , self ).__init__ ()
133+
134+ self .line_edit = QtWidgets .QLineEdit ()
135+ self .line_edit .setAttribute (QtCore .Qt .WA_MacShowFocusRect , 0 )
136+ self .line_edit .setStyleSheet (STYLE_TABSEARCH )
137+ self .line_edit .setMinimumSize (200 , 22 )
138+ self .line_edit .setTextMargins (2 , 0 , 2 , 0 )
137139
138140 self ._node_dict = node_dict or {}
139141 if self ._node_dict :
140142 self ._generate_items_from_node_dict ()
141143
142- self .SearchMenu = QtWidgets .QMenu ()
143- searchWidget = QtWidgets .QWidgetAction (self )
144- searchWidget .setDefaultWidget (self )
145- self .SearchMenu .addAction (searchWidget )
146- self .SearchMenu .setStyleSheet (STYLE_QMENU )
144+ searchWidget = QtWidgets .QWidgetAction (self .line_edit )
145+ searchWidget .setDefaultWidget (self .line_edit )
146+ self .addAction (searchWidget )
147+ self .setStyleSheet (STYLE_QMENU )
147148
148149 self ._actions = {}
149150 self ._menus = {}
150151 self ._searched_actions = []
151152
152- self .returnPressed .connect (self ._on_search_submitted )
153- self .textChanged .connect (self ._on_text_changed )
153+ self .line_edit .returnPressed .connect (self ._on_search_submitted )
154+ self .line_edit .textChanged .connect (self ._on_text_changed )
155+ self .rebuild = False
154156
155157 def __repr__ (self ):
156158 return '<{} at {}>' .format (self .__class__ .__name__ , hex (id (self )))
157159
158- def _on_text_changed (self ,text ):
160+ def _on_text_changed (self , text ):
159161 self ._clear_actions ()
160162
161163 if not text :
@@ -167,32 +169,32 @@ def _on_text_changed(self,text):
167169 action_names = fuzzyFinder (text , self ._actions .keys ())
168170
169171 self ._searched_actions = [self ._actions [name ] for name in action_names ]
170- self .SearchMenu . addActions (self ._searched_actions )
172+ self .addActions (self ._searched_actions )
171173
172174 if self ._searched_actions :
173- self .SearchMenu . setActiveAction (self ._searched_actions [0 ])
175+ self .setActiveAction (self ._searched_actions [0 ])
174176
175177 def _clear_actions (self ):
176- for action in self ._searched_actions :
177- self .SearchMenu .removeAction (action )
178+ [self .removeAction (action ) for action in self ._searched_actions ]
178179 self ._searched_actions = []
179180
180181 def _set_menu_visible (self , visible ):
181182 [menu .menuAction ().setVisible (visible ) for menu in self ._menus .values ()]
182183
183184 def _close (self ):
184185 self ._set_menu_visible (False )
185- self .SearchMenu . setVisible (False )
186- self .SearchMenu . menuAction ().setVisible (False )
186+ self .setVisible (False )
187+ self .menuAction ().setVisible (False )
187188
188189 def _show (self ):
189- self .setText ("" )
190- self .setFocus ()
190+ self .line_edit . setText ("" )
191+ self .line_edit . setFocus ()
191192 self ._set_menu_visible (True )
192- self .SearchMenu . exec_ (QtGui .QCursor .pos ())
193+ self .exec_ (QtGui .QCursor .pos ())
193194
194195 def _on_search_submitted (self ):
195196 action = self .sender ()
197+ print (action )
196198 if type (action ) is not QtWidgets .QAction :
197199 if len (self ._searched_actions ) > 0 :
198200 action = self ._searched_actions [0 ]
@@ -237,7 +239,7 @@ def build_menu_tree(self):
237239 for menu_path , menu in menus .items ():
238240 self ._menus [menu_path ] = menu
239241 if i == 0 :
240- self .SearchMenu . addMenu (menu )
242+ self .addMenu (menu )
241243 else :
242244 parentMenu = self ._menus [menu .parentPath ]
243245 parentMenu .addMenu (menu )
@@ -254,18 +256,24 @@ def build_menu_tree(self):
254256 if menu_path in self ._menus .keys ():
255257 self ._menus [menu_path ].addAction (action )
256258 else :
257- self .SearchMenu . addAction (action )
259+ self .addAction (action )
258260
259261 def set_nodes (self , node_dict = None ):
260- if not self ._node_dict :
262+ if not self ._node_dict or self . rebuild :
261263 self ._node_dict .clear ()
264+ self ._clear_actions ()
265+ self ._set_menu_visible (False )
266+ [self .removeAction (menu .menuAction ()) for menu in self ._menus .values ()]
267+ self ._actions .clear ()
268+ self ._menus .clear ()
262269 for name , node_types in node_dict .items ():
263270 if len (node_types ) == 1 :
264271 self ._node_dict [name ] = node_types [0 ]
265272 continue
266273 for node_id in node_types :
267274 self ._node_dict ['{} ({})' .format (name , node_id )] = node_id
268275 self .build_menu_tree ()
276+ self .rebuild = False
269277
270278 self ._show ()
271279
0 commit comments