22
33from hoverset .ui .icons import get_icon_image
44from hoverset .ui .widgets import Button , ToggleButton , Label
5- from studio .debugtools .defs import RemoteWidget , RemoteMenuItem
5+ from studio .debugtools .defs import RemoteWidget
66from studio .feature .component_tree import ComponentTreeView
77from studio .i18n import _
88from studio .ui .tree import MalleableTreeView
@@ -49,7 +49,7 @@ def loaded(self):
4949 def update_preload_status (self , added ):
5050 if self ._loaded or self .widget .deleted :
5151 return
52- if added or self .widget .winfo_children () or self .widget .menu_items :
52+ if added or self .widget .winfo_children () or self .widget .extra_items :
5353 # widget can expand
5454 self ._set_expander (self .COLLAPSED_ICON )
5555 else :
@@ -58,9 +58,7 @@ def update_preload_status(self, added):
5858 def extract_name (self , widget ):
5959 if isinstance (widget , RemoteWidget ):
6060 return str (widget ._name ).strip ("!" )
61- if isinstance (widget , RemoteMenuItem ):
62- return widget .name or "-"
63- return 'root'
61+ return widget .name or "-"
6462
6563 def load (self ):
6664 # lazy loading
@@ -71,14 +69,14 @@ def load(self):
7169 if getattr (child , "_dbg_ignore" , False ):
7270 continue
7371 self .add_as_node (widget = child ).update_preload_status (False )
74- if self . widget . _class == tkinter . Menu :
75- for item in self .widget .menu_items :
76- if item ._dbg_node :
77- self .add (item ._dbg_node )
78- self .set_widget (item )
79- item ._dbg_node .update_preload_status (False )
80- else :
81- self .add_as_node (widget = item ).update_preload_status (False )
72+
73+ for item in self .widget .extra_items :
74+ if item ._dbg_node :
75+ self .add (item ._dbg_node )
76+ self .set_widget (item )
77+ item ._dbg_node .update_preload_status (False )
78+ else :
79+ self .add_as_node (widget = item ).update_preload_status (False )
8280 self ._loaded = True
8381
8482 def expand (self ):
@@ -158,6 +156,8 @@ def __init__(self, master, debugger):
158156 self .debugger .bind ("<<MenuItemModified>>" , self .on_menu_item_modified , add = True )
159157 self .debugger .bind ("<<MenuItemAdded>>" , self .on_menu_item_added )
160158 self .debugger .bind ("<<MenuItemRemoved>>" , self .on_menu_items_removed )
159+ self .debugger .bind ("<<CanvasItemCreated>>" , self .on_canvas_item_created , add = True )
160+ self .debugger .bind ("<<CanvasItemsDeleted>>" , self .on_canvas_items_deleted , add = True )
161161
162162 @property
163163 def selected (self ):
@@ -166,14 +166,20 @@ def selected(self):
166166 def on_select (self ):
167167 self .debugger .selection .set (map (lambda node : node .widget , self ._tree .get ()))
168168
169- def on_widget_tap (self , widget , event ):
169+ def on_widget_tap (self , widget , event , data = None ):
170170 self ._select_btn .toggle ()
171171 if widget :
172172 # bring debugger to front
173173 self .debugger .attributes ('-topmost' , True )
174174 self .debugger .attributes ('-topmost' , False )
175175 self .debugger .focus_force ()
176176 node = self ._tree .expand_to (widget )
177+ if widget ._class == tkinter .Canvas and data :
178+ item_id = int (data )
179+ node .expand ()
180+ item = widget .get_canvas_item_from_id (item_id )
181+ node = item ._dbg_node
182+
177183 if node :
178184 self ._tree .see (node )
179185 node .select (event )
@@ -206,10 +212,14 @@ def on_menu_item_added(self, event):
206212 widget , root , index = event .user_data .split (" " )
207213 widget = self .debugger .widget_from_id (widget , int (root ))
208214 parent_node = getattr (widget , "_dbg_node" , None )
209- if not parent_node or not parent_node . loaded :
215+ if not parent_node :
210216 return
211217
212218 item = widget ._add_menu_item (int (index ))
219+ if not parent_node .loaded :
220+ parent_node .update_preload_status (True )
221+ return
222+
213223 node = parent_node .add_as_node (widget = item ) if item ._dbg_node is None else item ._dbg_node
214224 if not item ._dbg_node :
215225 # remove node if it was just created
@@ -225,18 +235,22 @@ def on_menu_items_removed(self, event):
225235 parent_node = getattr (widget , "_dbg_node" , None )
226236
227237 items = widget ._remove_menu_items (int (index1 ), int (index2 ))
238+ if not parent_node :
239+ return
240+
241+ if not parent_node .loaded :
242+ parent_node .update_preload_status (False )
243+ return
244+
228245 had_selection = False
229246 for item in items :
230- if parent_node .loaded :
231- if item ._dbg_node in self .selected :
232- had_selection = True
233- self ._tree .toggle_from_selection (item ._dbg_node )
234- parent_node .remove (item ._dbg_node )
235- else :
236- parent_node .update_preload_status (False )
247+ if item ._dbg_node in self .selected :
248+ had_selection = True
249+ self ._tree .toggle_from_selection (item ._dbg_node )
250+ parent_node .remove (item ._dbg_node )
237251
238252 if had_selection and not self .selected :
239- self ._tree .see (self . debugger . root . _dbg_node )
253+ self ._tree .see (parent_node )
240254
241255 def on_widget_modified (self , _ ):
242256 if self .debugger .active_widget not in self .selected :
@@ -252,6 +266,45 @@ def on_menu_item_modified(self, event):
252266 if item ._dbg_node :
253267 item ._dbg_node .set_widget (item )
254268
269+ def on_canvas_item_created (self , event ):
270+ widget , root , id = event .user_data .split (" " )
271+ widget = self .debugger .widget_from_id (widget , int (root ))
272+ parent_node = getattr (widget , "_dbg_node" , None )
273+ if not parent_node :
274+ return
275+
276+ item = widget .add_canvas_item (int (id ))
277+ if not parent_node .loaded :
278+ parent_node .update_preload_status (True )
279+ return
280+
281+ node = parent_node .add_as_node (widget = item )
282+ node .set_widget (item )
283+ item ._dbg_node = node
284+
285+ def on_canvas_items_deleted (self , event ):
286+ widget , root , * ids = event .user_data .split (" " )
287+ widget = self .debugger .widget_from_id (widget , int (root ))
288+ parent_node = getattr (widget , "_dbg_node" , None )
289+ items = widget .delete_canvas_ids (* ids )
290+
291+ if not parent_node :
292+ return
293+
294+ if not parent_node .loaded :
295+ parent_node .update_preload_status (False )
296+ return
297+
298+ had_selection = False
299+ for item in items :
300+ if item ._dbg_node in self .selected :
301+ had_selection = True
302+ self ._tree .toggle_from_selection (item ._dbg_node )
303+ parent_node .remove (item ._dbg_node )
304+
305+ if had_selection and not self .selected :
306+ self ._tree .see (parent_node )
307+
255308 def on_widget_map (self , _ ):
256309 pass
257310
0 commit comments