@@ -604,6 +604,7 @@ def _create_ui(self):
604604 self .visible_cb .pack (anchor = "w" , padx = 5 , pady = (0 , 5 ))
605605
606606 ttk .Button (props , text = "Применить к выбранному" , command = self .apply_props ).pack (fill = "x" , padx = 5 , pady = 5 )
607+ ttk .Button (props , text = "- Удалить выбранные" , command = self .delete_selected_items ).pack (fill = "x" , padx = 5 , pady = 5 )
607608
608609 # ---- Вкладка "Логика групп" ----
609610 groups_frame = ttk .LabelFrame (groups_tab , text = "Логика групп" )
@@ -1799,6 +1800,54 @@ def send_backward(self):
17991800 logger .info ("Sent selection backward" )
18001801 self .save_to_history ("Перемещение назад" )
18011802
1803+ def delete_selected_items (self ):
1804+ """Удаляет выбранные элементы с холста"""
1805+ if not self .current_selection :
1806+ messagebox .showwarning ("Нет выбора" , "Сначала выберите элемент(ы)" )
1807+ return
1808+
1809+ confirm = messagebox .askyesno (
1810+ "Удаление элементов" ,
1811+ f"Вы уверены, что хотите удалить { len (self .current_selection )} выбранных элементов?"
1812+ )
1813+
1814+ if not confirm :
1815+ return
1816+
1817+ # Удаляем выбранные элементы из списка items
1818+ items_to_remove = set (self .current_selection )
1819+ self .items = [ci for ci in self .items if ci not in items_to_remove ]
1820+
1821+ # Удаляем соответствующие слои из модели
1822+ layer_names_to_remove = {ci .layer .get ("name" ) for ci in items_to_remove }
1823+ self .model ["layers" ] = [layer for layer in self .model .get ("layers" , [])
1824+ if layer .get ("name" ) not in layer_names_to_remove ]
1825+
1826+ # Обновляем группы: удаляем ссылки на удаленные слои
1827+ for group in self .model .get ("groups" , []):
1828+ if "children" in group :
1829+ group ["children" ] = [child for child in group ["children" ]
1830+ if child not in layer_names_to_remove ]
1831+
1832+ # Сбрасываем выделение
1833+ for ci in self .current_selection :
1834+ if hasattr (ci , '_tk_images' ):
1835+ ci ._tk_images .clear ()
1836+
1837+ self .current_selection = []
1838+ self .clear_props_fields ()
1839+
1840+ # Обновляем интерфейс
1841+ self ._save_tree_state ()
1842+ self .tree_state ["preserve_selection" ] = False
1843+
1844+ self .refresh_tree ()
1845+ self ._canvas_cache_valid = False
1846+ self .redraw_canvas ()
1847+
1848+ logger .info (f"Deleted { len (items_to_remove )} selected items" )
1849+ self .save_to_history ("Удаление выбранных элементов" )
1850+
18021851 def apply_group_logic (self ):
18031852 """Применяет логику группы"""
18041853 if not self .selected_group :
@@ -2584,7 +2633,6 @@ def refresh_import_list(self):
25842633 icon = "GIF" if is_gif else "PNG"
25852634 ttk .Label (row , text = f"{ icon } : { fname } " , width = 20 ).pack (side = "left" , padx = 2 )
25862635 ttk .Button (row , text = "+" , width = 2 , command = lambda f = fname : self .add_to_canvas (f )).pack (side = "left" , padx = 2 )
2587- ttk .Button (row , text = "-" , width = 2 , command = lambda f = fname : self .remove_from_canvas_by_file (f )).pack (side = "left" , padx = 2 )
25882636 ttk .Button (row , text = "🗑️" , width = 2 , command = lambda f = fname : self .delete_file (f )).pack (side = "left" , padx = 2 )
25892637
25902638 def clear_props_fields (self ):
0 commit comments