1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-07 10:59:49 +00:00

Remove the Manage Layouts dialog

Instead, add "Add Layout" and "Delete Layout" options in the layouts submenu. This makes layout management easier, more intuitive and quicker, as it now requires less clicks. This is similar to what Photoshop does with its Workspaces

By removing the manage layouts dialog, we also got rid of duplicate code that already existed in TopMenuContainer, and it should be less bug-prone now.
This commit is contained in:
Emmanouil Papadeas 2025-01-31 02:36:02 +02:00
parent b3ae706383
commit 7b96947066
5 changed files with 115 additions and 306 deletions

View file

@ -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 ""

View file

@ -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())

View file

@ -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"]

View file

@ -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

View file

@ -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"]