@@ -48,6 +48,9 @@ const RECENT_FILES_COUNT = 15
4848const MENU_QUICK_EXPORT : int = 1000
4949const RECENTS_MENU_CLEAR = 1001
5050
51+ const MENU_SAVE_PRESET : int = 1002
52+ const MENU_MANAGE_PRESETS : int = 1003
53+
5154const THEMES = ["Default Dark" , "Default Light" , "Classic" ]
5255
5356const MENU : Array [Dictionary ] = [
@@ -100,6 +103,8 @@ const MENU : Array[Dictionary] = [
100103 { menu = "View/-" },
101104 # { menu="View/Show or Hide side panels", command="toggle_side_panels", shortcut="Control+Space" },
102105 { menu = "View/Panels" , submenu = "show_panels" },
106+ { menu = "View/Presets" , submenu = "panels_preset" },
107+ { menu = "View/Reset Panels" , command = "view_reset_panels" },
103108
104109 { menu = "Tools/Create" , submenu = "create" },
105110 { menu = "Tools/Create group" , command = "create_subgraph" , shortcut = "Control+G" },
@@ -648,11 +653,62 @@ func create_menu_show_panels(menu : MMMenuManager.MenuBase) -> void:
648653 menu .set_item_checked (i , layout .is_panel_visible (panels [i ]))
649654 menu .connect_id_pressed (self ._on_ShowPanels_id_pressed )
650655
656+ func create_menu_panels_preset (menu : MMMenuManager .MenuBase ) -> void :
657+ menu .clear ()
658+ menu .add_item ("Save Preset" , MENU_SAVE_PRESET )
659+ menu .add_item ("Manage Presets" , MENU_MANAGE_PRESETS )
660+ if not layout .presets .is_empty ():
661+ menu .add_separator ()
662+ for id in layout .presets .size ():
663+ menu .add_item (layout .presets [id ].name , id )
664+ menu .connect_id_pressed (self ._on_PanelsPreset_id_pressed )
665+
651666func _on_ShowPanels_id_pressed (id ) -> void :
652667 var panel : String = layout .get_panel_list ()[id ]
653668 layout .set_panel_visible (panel , not layout .is_panel_visible (panel ))
654669 update_menus ()
655670
671+ func _on_PanelsPreset_id_pressed (id : int ) -> void :
672+ match id :
673+ MENU_MANAGE_PRESETS :
674+ if get_node_or_null ("PanelPresetsDialog" ):
675+ return
676+ var dialog : Window = preload ("res://material_maker/windows/panels_presets_dialog/panels_presets_dialog.tscn" ).instantiate ()
677+ add_child (dialog )
678+ await dialog .edit_presets (layout .presets )
679+ MENU_SAVE_PRESET :
680+ var dialog : Window = preload ("res://material_maker/windows/line_dialog/line_dialog.tscn" ).instantiate ()
681+ add_child (dialog )
682+ var status : Dictionary = await dialog .enter_text ("Save Preset" ,
683+ "Enter a name for the new preset" , "" )
684+ if status .ok :
685+ var preset_name : String = status .text .strip_edges ()
686+ if preset_name .is_empty ():
687+ accept_dialog ("Preset name cannot be empty." )
688+ else :
689+ var is_unique_preset : bool = true
690+ var existing_preset : Dictionary
691+ if not layout .presets .is_empty ():
692+ for preset in layout .presets :
693+ if preset .name .to_lower () == preset_name .to_lower ():
694+ is_unique_preset = false
695+ existing_preset = preset
696+ break
697+ if not is_unique_preset :
698+ var replace_status : String = await accept_dialog (
699+ "Preset \" %s \" already exists. Do you want to replace it?" % [preset_name ], true )
700+ if replace_status == "ok" :
701+ existing_preset .preset = $ VBoxContainer/Layout/FlexibleLayout .serialize ()
702+ else :
703+ var new_preset : Dictionary = {
704+ "name" : preset_name ,
705+ "preset" : $ VBoxContainer/Layout/FlexibleLayout .serialize ()
706+ }
707+ layout .presets .push_back (new_preset )
708+ _ :
709+ $ VBoxContainer/Layout/FlexibleLayout .init (layout .presets [id ].preset )
710+ update_menus ()
711+
656712func create_menu_create (menu : MMMenuManager .MenuBase ) -> void :
657713 var gens = mm_loader .get_generator_list ()
658714 menu .clear ()
@@ -1036,6 +1092,9 @@ func view_reset_zoom() -> void:
10361092 var graph_edit : MMGraphEdit = get_current_graph_edit ()
10371093 graph_edit .zoom = 1
10381094
1095+ func view_reset_panels () -> void :
1096+ $ VBoxContainer/Layout .reset_panels ()
1097+
10391098func toggle_side_panels () -> void :
10401099 $ VBoxContainer/Layout .toggle_side_panels ()
10411100
0 commit comments