diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 113531804..6fdade8c6 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -350,20 +350,16 @@ msgstr "" msgid "Preview" msgstr "" -#. Found in the manage layouts dialog -msgid "This is a preview, changing this won't change the layout" -msgstr "" - -#. Found in the manage layouts dialog -msgid "Double click to set as new startup layout" -msgstr "" - msgid "Add" msgstr "" msgid "Add Layout" msgstr "" +#. Verb, deletes something. +msgid "Delete %s" +msgstr "" + msgid "Copy from" msgstr "" diff --git a/src/UI/Dialogs/ManageLayouts.gd b/src/UI/Dialogs/ManageLayouts.gd deleted file mode 100644 index 30ed0bd83..000000000 --- a/src/UI/Dialogs/ManageLayouts.gd +++ /dev/null @@ -1,140 +0,0 @@ -extends AcceptDialog - -var layout_selected := -1 -var is_editing := false - -@onready var layout_list := %SavedLayouts as ItemList -@onready var rename_layout := %RenameLayout as Button -@onready var delete_layout := %DeleteLayout as Button -@onready var layout_settings := $LayoutSettings as ConfirmationDialog -@onready var layout_name := %LayoutName as LineEdit -@onready var layout_from := %LayoutFrom as OptionButton -@onready var delete_confirmation := $DeleteConfirmation as ConfirmationDialog -@onready var mimic_ui := %LayoutPreview as DockableContainer - - -func _ready() -> void: - # Fill the copy layout from option button with the default layouts - for layout in Global.default_layouts: - layout_from.add_item(layout.resource_path.get_basename().get_file()) - - -func _on_ManageLayouts_about_to_show() -> void: - for layout in Global.layouts: - layout_list.add_item(layout.resource_path.get_basename().get_file()) - refresh_preview() - if layout_selected != -1: - layout_list.select(layout_selected) - - -func _on_ManageLayouts_visibility_changed() -> void: - if visible: - return - layout_list.clear() - Global.dialog_open(false) - - -func _on_SavedLayouts_item_activated(index: int) -> void: - Global.top_menu_container.set_layout(index) - - -func _on_SavedLayouts_item_selected(index: int) -> void: - layout_selected = index - rename_layout.disabled = false - delete_layout.disabled = false - refresh_preview() - - -func _on_SavedLayouts_empty_clicked(_position: Vector2, _button_index: int) -> void: - rename_layout.disabled = true - delete_layout.disabled = true - - -func _on_AddLayout_pressed() -> void: - is_editing = false - layout_name.text = "New Layout" - layout_settings.title = "Add Layout" - layout_from.get_parent().visible = true - layout_settings.popup_centered() - - -func _on_rename_layout_pressed() -> void: - is_editing = true - layout_name.text = layout_list.get_item_text(layout_selected) - layout_settings.title = "Rename Layout" - layout_from.get_parent().visible = false - layout_settings.popup_centered() - - -func _on_DeleteLayout_pressed() -> void: - delete_confirmation.popup_centered() - - -func _on_LayoutSettings_confirmed() -> void: - var file_name := layout_name.text + ".tres" - var path := Global.LAYOUT_DIR.path_join(file_name) - var layout: DockableLayout - if layout_from.selected == 0: - layout = Global.control.main_ui.layout.clone() - else: - layout = Global.default_layouts[layout_from.selected - 1].clone() - layout.resource_name = layout_name.text - layout.resource_path = path - var err := ResourceSaver.save(layout, path) - if err != OK: - print(err) - return - if is_editing: - var old_file_name: String = layout_list.get_item_text(layout_selected) + ".tres" - if old_file_name != file_name: - delete_layout_file(old_file_name) - Global.layouts[layout_selected] = layout - layout_list.set_item_text(layout_selected, layout_name.text) - else: - Global.layouts.append(layout) - # Save the layout every time it changes - layout.save_on_change = true - Global.control.main_ui.layout = layout - layout_list.add_item(layout_name.text) - Global.layouts.sort_custom( - func(a: DockableLayout, b: DockableLayout): - return a.resource_path.get_file() < b.resource_path.get_file() - ) - var layout_index := Global.layouts.find(layout) - Global.top_menu_container.populate_layouts_submenu() - Global.top_menu_container.layouts_submenu.set_item_checked(layout_index + 1, true) - - -func delete_layout_file(file_name: String) -> void: - var dir := DirAccess.open(Global.LAYOUT_DIR) - if not is_instance_valid(dir): - return - dir.remove(Global.LAYOUT_DIR.path_join(file_name)) - - -func _on_DeleteConfirmation_confirmed() -> void: - delete_layout_file(layout_list.get_item_text(layout_selected) + ".tres") - Global.layouts.remove_at(layout_selected) - layout_list.remove_item(layout_selected) - Global.top_menu_container.populate_layouts_submenu() - layout_selected = -1 - rename_layout.disabled = true - delete_layout.disabled = true - refresh_preview() - - -func refresh_preview() -> void: - for tab in mimic_ui.get_tabs(): - mimic_ui.remove_child(tab) - tab.queue_free() - for item in Global.control.main_ui.get_tabs(): - var box := TextEdit.new() - box.name = item.name - box.text = item.name - box.editable = false - mimic_ui.add_child(box) - if layout_selected == -1: - mimic_ui.visible = false - return - mimic_ui.visible = true - mimic_ui.set_layout(Global.layouts[layout_selected].clone()) diff --git a/src/UI/Dialogs/ManageLayouts.tscn b/src/UI/Dialogs/ManageLayouts.tscn deleted file mode 100644 index ed0b0680e..000000000 --- a/src/UI/Dialogs/ManageLayouts.tscn +++ /dev/null @@ -1,154 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://d1phd84dk4t5e"] - -[ext_resource type="Script" path="res://src/UI/Dialogs/ManageLayouts.gd" id="1"] -[ext_resource type="Script" path="res://addons/dockable_container/layout_panel.gd" id="2"] -[ext_resource type="Script" path="res://addons/dockable_container/layout.gd" id="3"] -[ext_resource type="Script" path="res://addons/dockable_container/dockable_container.gd" id="4"] - -[sub_resource type="Resource" id="1"] -resource_name = "Tabs" -script = ExtResource("2") -names = PackedStringArray() -current_tab = -1 - -[sub_resource type="Resource" id="2"] -resource_name = "Layout" -script = ExtResource("3") -root = SubResource("1") -hidden_tabs = {} -windows = {} -save_on_change = false -layout_reset_path = "" - -[node name="ManageLayouts" type="AcceptDialog"] -title = "Manage Layouts" -size = Vector2i(500, 500) -script = ExtResource("1") - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 8.0 -offset_top = 8.0 -offset_right = -8.0 -offset_bottom = -49.0 - -[node name="PreviewHeader" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="Label" type="Label" parent="VBoxContainer/PreviewHeader"] -layout_mode = 2 -theme_type_variation = &"HeaderSmall" -text = "Preview" - -[node name="HSeparator" type="HSeparator" parent="VBoxContainer/PreviewHeader"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="PreviewInstruction" type="Label" parent="VBoxContainer"] -layout_mode = 2 -text = "This is a preview, changing this won't change the layout" - -[node name="PreviewContainer" type="ScrollContainer" parent="VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="LayoutPreview" type="Container" parent="VBoxContainer/PreviewContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("4") -tabs_visible = false -layout = SubResource("2") - -[node name="LayoutsHeader" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="Label" type="Label" parent="VBoxContainer/LayoutsHeader"] -layout_mode = 2 -theme_type_variation = &"HeaderSmall" -text = "Layouts" - -[node name="HSeparator" type="HSeparator" parent="VBoxContainer/LayoutsHeader"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="LayoutInstruction" type="Label" parent="VBoxContainer"] -layout_mode = 2 -text = "Double click to set as new startup layout" - -[node name="SavedLayouts" type="ItemList" parent="VBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 100) -layout_mode = 2 - -[node name="ButtonsContainer" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 - -[node name="AddLayout" type="Button" parent="VBoxContainer/ButtonsContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -mouse_default_cursor_shape = 2 -text = "Add" - -[node name="RenameLayout" type="Button" parent="VBoxContainer/ButtonsContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -mouse_default_cursor_shape = 2 -disabled = true -text = "Rename" - -[node name="DeleteLayout" type="Button" parent="VBoxContainer/ButtonsContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -mouse_default_cursor_shape = 2 -disabled = true -text = "Delete" - -[node name="LayoutSettings" type="ConfirmationDialog" parent="."] -always_on_top = true - -[node name="VBoxContainer" type="VBoxContainer" parent="LayoutSettings"] -offset_right = 40.0 -offset_bottom = 40.0 - -[node name="LayoutName" type="LineEdit" parent="LayoutSettings/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "Insert name" - -[node name="HBoxContainer" type="HBoxContainer" parent="LayoutSettings/VBoxContainer"] -layout_mode = 2 - -[node name="LayoutFromLabel" type="Label" parent="LayoutSettings/VBoxContainer/HBoxContainer"] -layout_mode = 2 -text = "Copy from" - -[node name="LayoutFrom" type="OptionButton" parent="LayoutSettings/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -selected = 0 -item_count = 1 -popup/item_0/text = "Current layout" - -[node name="DeleteConfirmation" type="ConfirmationDialog" parent="."] -always_on_top = true -dialog_text = "Are you sure you want to delete this layout?" - -[connection signal="about_to_popup" from="." to="." method="_on_ManageLayouts_about_to_show"] -[connection signal="visibility_changed" from="." to="." method="_on_ManageLayouts_visibility_changed"] -[connection signal="empty_clicked" from="VBoxContainer/SavedLayouts" to="." method="_on_SavedLayouts_empty_clicked"] -[connection signal="item_activated" from="VBoxContainer/SavedLayouts" to="." method="_on_SavedLayouts_item_activated"] -[connection signal="item_selected" from="VBoxContainer/SavedLayouts" to="." method="_on_SavedLayouts_item_selected"] -[connection signal="pressed" from="VBoxContainer/ButtonsContainer/AddLayout" to="." method="_on_AddLayout_pressed"] -[connection signal="pressed" from="VBoxContainer/ButtonsContainer/RenameLayout" to="." method="_on_rename_layout_pressed"] -[connection signal="pressed" from="VBoxContainer/ButtonsContainer/DeleteLayout" to="." method="_on_DeleteLayout_pressed"] -[connection signal="confirmed" from="LayoutSettings" to="." method="_on_LayoutSettings_confirmed"] -[connection signal="confirmed" from="DeleteConfirmation" to="." method="_on_DeleteConfirmation_confirmed"] diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index 219026037..163175574 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -53,7 +53,6 @@ var palettize_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/PalettizeD var pixelize_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/PixelizeDialog.tscn") var posterize_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/Posterize.tscn") var loaded_effect_dialogs: Array[Dialog] = [] -var manage_layouts_dialog := Dialog.new("res://src/UI/Dialogs/ManageLayouts.tscn") var window_opacity_dialog := Dialog.new("res://src/UI/Dialogs/WindowOpacityDialog.tscn") var about_dialog := Dialog.new("res://src/UI/Dialogs/AboutDialog.tscn") @@ -67,6 +66,10 @@ var about_dialog := Dialog.new("res://src/UI/Dialogs/AboutDialog.tscn") @onready var view_menu := $MarginContainer/HBoxContainer/MenuBar/View as PopupMenu @onready var window_menu := $MarginContainer/HBoxContainer/MenuBar/Window as PopupMenu @onready var help_menu := $MarginContainer/HBoxContainer/MenuBar/Help as PopupMenu +@onready var add_layout_confirmation := $AddLayoutConfirmation as ConfirmationDialog +@onready var delete_layout_confirmation := $DeleteLayoutConfirmation as ConfirmationDialog +@onready var layout_name_line_edit := %LayoutName as LineEdit +@onready var layout_from_option_button := %LayoutFrom as OptionButton @onready var greyscale_vision: ColorRect = main_ui.find_child("GreyscaleVision") @onready var current_frame_mark := %CurrentFrameMark as Label @@ -110,6 +113,9 @@ func _ready() -> void: _setup_effects_menu() _setup_select_menu() _setup_help_menu() + # Fill the copy layout from option button with the default layouts + for layout in Global.default_layouts: + layout_from_option_button.add_item(layout.resource_path.get_basename().get_file()) func _input(event: InputEvent) -> void: @@ -415,8 +421,9 @@ func populate_layouts_submenu() -> void: var layout_name := layout.resource_path.get_basename().get_file() layouts_submenu.add_radio_check_item(layout_name) layouts_submenu.add_separator() - layouts_submenu.add_item("Manage Layouts") - layouts_submenu.add_item("Reset Default") + layouts_submenu.add_item("Add Layout") + layouts_submenu.add_item(tr("Delete %s") % "Default") + layouts_submenu.add_item(tr("Reset %s") % "Default") func _setup_image_menu() -> void: @@ -852,8 +859,11 @@ func _layouts_submenu_id_pressed(id: int) -> void: if id < layout_count: set_layout(id) elif id == layout_count + 1: - manage_layouts_dialog.popup() + layout_name_line_edit.text = "New layout" + add_layout_confirmation.popup_centered() elif id == layout_count + 2: + delete_layout_confirmation.popup_centered() + elif id == layout_count + 3: Global.layouts[selected_layout].reset() @@ -866,6 +876,7 @@ func set_layout(id: int) -> void: var layout := Global.layouts[id] main_ui.layout = layout var layout_name := layout.resource_path.get_basename().get_file() + layouts_submenu.set_item_text(layouts_submenu.item_count - 2, tr("Delete %s") % layout_name) layouts_submenu.set_item_text(layouts_submenu.item_count - 1, tr("Reset %s") % layout_name) layouts_submenu.set_item_disabled( layouts_submenu.item_count - 1, layout.layout_reset_path.is_empty() @@ -884,6 +895,59 @@ func set_layout(id: int) -> void: window_menu.set_item_checked(Global.WindowMenu.ZEN_MODE, false) +func _on_add_layout_confirmation_confirmed() -> void: + var file_name := layout_name_line_edit.text + ".tres" + var path := Global.LAYOUT_DIR.path_join(file_name) + var layout: DockableLayout + if layout_from_option_button.selected == 0: + layout = Global.control.main_ui.layout.clone() + layout.layout_reset_path = "" + else: + layout = Global.default_layouts[layout_from_option_button.selected - 1].clone() + layout.resource_name = layout_name_line_edit.text + layout.resource_path = path + var err := ResourceSaver.save(layout, path) + if err != OK: + print(err) + return + Global.layouts.append(layout) + # Save the layout every time it changes + layout.save_on_change = true + Global.control.main_ui.layout = layout + Global.layouts.sort_custom( + func(a: DockableLayout, b: DockableLayout): + return a.resource_path.get_file() < b.resource_path.get_file() + ) + var layout_index := Global.layouts.find(layout) + populate_layouts_submenu() + set_layout(layout_index) + + +func _on_delete_layout_confirmation_confirmed() -> void: + if Global.layouts.size() <= 1: # Don't delete any layout if we only have one left. + return + var layout_name := Global.layouts[selected_layout].resource_path.get_basename().get_file() + delete_layout_file(layout_name + ".tres") + Global.layouts.remove_at(selected_layout) + populate_layouts_submenu() + set_layout(0) + + +func delete_layout_file(file_name: String) -> void: + var dir := DirAccess.open(Global.LAYOUT_DIR) + if not is_instance_valid(dir): + return + dir.remove(Global.LAYOUT_DIR.path_join(file_name)) + + +func _on_add_layout_confirmation_visibility_changed() -> void: + Global.dialog_open(add_layout_confirmation.visible) + + +func _on_delete_layout_confirmation_visibility_changed() -> void: + Global.dialog_open(delete_layout_confirmation.visible) + + func _toggle_greyscale_view() -> void: Global.greyscale_view = !Global.greyscale_view greyscale_vision.visible = Global.greyscale_view diff --git a/src/UI/TopMenuContainer/TopMenuContainer.tscn b/src/UI/TopMenuContainer/TopMenuContainer.tscn index 397aca1be..fcb754963 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.tscn +++ b/src/UI/TopMenuContainer/TopMenuContainer.tscn @@ -109,3 +109,46 @@ unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 1 text = "1/1" + +[node name="AddLayoutConfirmation" type="ConfirmationDialog" parent="."] +auto_translate_mode = 1 +title = "Add Layout" +size = Vector2i(246, 123) + +[node name="VBoxContainer" type="VBoxContainer" parent="AddLayoutConfirmation"] +offset_left = 8.0 +offset_top = 8.0 +offset_right = 238.0 +offset_bottom = 74.0 + +[node name="LayoutName" type="LineEdit" parent="AddLayoutConfirmation/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "Insert name" + +[node name="HBoxContainer" type="HBoxContainer" parent="AddLayoutConfirmation/VBoxContainer"] +layout_mode = 2 + +[node name="LayoutFromLabel" type="Label" parent="AddLayoutConfirmation/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Copy from" + +[node name="LayoutFrom" type="OptionButton" parent="AddLayoutConfirmation/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +selected = 0 +item_count = 1 +popup/item_0/text = "Current layout" + +[node name="DeleteLayoutConfirmation" type="ConfirmationDialog" parent="."] +auto_translate_mode = 1 +title = "Delete Layout" +dialog_text = "Are you sure you want to delete this layout?" + +[connection signal="confirmed" from="AddLayoutConfirmation" to="." method="_on_add_layout_confirmation_confirmed"] +[connection signal="visibility_changed" from="AddLayoutConfirmation" to="." method="_on_add_layout_confirmation_visibility_changed"] +[connection signal="confirmed" from="DeleteLayoutConfirmation" to="." method="_on_delete_layout_confirmation_confirmed"] +[connection signal="visibility_changed" from="DeleteLayoutConfirmation" to="." method="_on_delete_layout_confirmation_visibility_changed"]