1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-31 07:29:49 +00:00

Implemented a system that lets the user make and delete their own UI layouts

Layouts are being saved as .tres files in user://layouts
This commit is contained in:
Manolis Papadeas 2022-02-06 01:49:54 +02:00
parent 26d5b8de40
commit 8394f252f7
4 changed files with 171 additions and 4 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=2]
[gd_scene load_steps=19 format=2]
[ext_resource path="res://assets/themes/dark/theme.tres" type="Theme" id=1]
[ext_resource path="res://src/Main.gd" type="Script" id=2]
@ -12,6 +12,7 @@
[ext_resource path="res://src/UI/Dialogs/WindowOpacityDialog.tscn" type="PackedScene" id=10]
[ext_resource path="res://src/UI/Dialogs/SaveSprite.tscn" type="PackedScene" id=11]
[ext_resource path="res://src/UI/Dialogs/OpenSprite.tscn" type="PackedScene" id=12]
[ext_resource path="res://src/UI/Dialogs/ManageLayouts.tscn" type="PackedScene" id=13]
[ext_resource path="res://src/UI/Dialogs/SplashDialog.tscn" type="PackedScene" id=27]
[ext_resource path="res://src/UI/Dialogs/CreateNewImage.tscn" type="PackedScene" id=28]
[ext_resource path="res://src/Preferences/PreferencesDialog.tscn" type="PackedScene" id=32]
@ -76,6 +77,8 @@ margin_bottom = 388.0
[node name="PreferencesDialog" parent="Dialogs" instance=ExtResource( 32 )]
[node name="ManageLayouts" parent="Dialogs" instance=ExtResource( 13 )]
[node name="AboutDialog" parent="Dialogs" instance=ExtResource( 34 )]
[node name="UnsavedCanvasDialog" type="ConfirmationDialog" parent="Dialogs"]

View file

@ -0,0 +1,61 @@
extends AcceptDialog
var layout_selected := -1
onready var layout_list: ItemList = $VBoxContainer/SavedLayouts
onready var layout_name: LineEdit = $VBoxContainer/HBoxContainer/LayoutName
onready var delete_layout: Button = $VBoxContainer/DeleteLayout
onready var save_layout: Button = $VBoxContainer/HBoxContainer/SaveLayout
func _on_ManageLayouts_about_to_show() -> void:
for layout in Global.top_menu_container.layouts:
layout_list.add_item(layout[0])
func _on_ManageLayouts_popup_hide() -> void:
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
delete_layout.disabled = index < 2
func _on_SavedLayouts_nothing_selected() -> void:
delete_layout.disabled = true
func _on_DeleteLayout_pressed() -> void:
var dir := Directory.new()
var file_name := layout_list.get_item_text(layout_selected) + ".tres"
dir.remove("user://layouts/".plus_file(file_name))
Global.top_menu_container.layouts.remove(layout_selected)
layout_list.remove_item(layout_selected)
Global.top_menu_container.populate_layouts_submenu()
layout_selected = -1
delete_layout.disabled = true
func _on_LayoutName_text_changed(new_text: String) -> void:
save_layout.disabled = new_text.empty()
func _on_SaveLayout_pressed() -> void:
var file_name := layout_name.text + ".tres"
var path := "user://layouts/".plus_file(file_name)
var layout = Global.control.ui.get_layout()
var err := ResourceSaver.save(path, layout)
if err != OK:
print(err)
else:
Global.top_menu_container.layouts.append([layout_name.text, layout])
layout_list.add_item(layout_name.text)
Global.top_menu_container.populate_layouts_submenu()
var n: int = Global.top_menu_container.layouts_submenu.get_item_count()
Global.top_menu_container.layouts_submenu.set_item_checked(n - 2, true)

View file

@ -0,0 +1,76 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://src/UI/Dialogs/ManageLayouts.gd" type="Script" id=1]
[node name="ManageLayouts" type="AcceptDialog"]
margin_right = 191.0
margin_bottom = 217.0
window_title = "Manage Layouts"
resizable = true
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="VBoxContainer" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 8.0
margin_top = 8.0
margin_right = -8.0
margin_bottom = -36.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="VBoxContainer"]
margin_right = 175.0
margin_bottom = 14.0
text = "Layouts"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="SavedLayouts" type="ItemList" parent="VBoxContainer"]
margin_top = 18.0
margin_right = 175.0
margin_bottom = 121.0
rect_min_size = Vector2( 0, 20 )
size_flags_vertical = 3
[node name="DeleteLayout" type="Button" parent="VBoxContainer"]
margin_top = 125.0
margin_right = 55.0
margin_bottom = 145.0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
disabled = true
text = "Delete"
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 149.0
margin_right = 175.0
margin_bottom = 173.0
[node name="LayoutName" type="LineEdit" parent="VBoxContainer/HBoxContainer"]
margin_right = 130.0
margin_bottom = 24.0
size_flags_horizontal = 3
placeholder_text = "Insert name"
[node name="SaveLayout" type="Button" parent="VBoxContainer/HBoxContainer"]
margin_left = 134.0
margin_right = 175.0
margin_bottom = 24.0
mouse_default_cursor_shape = 2
disabled = true
text = "Save"
[connection signal="about_to_show" from="." to="." method="_on_ManageLayouts_about_to_show"]
[connection signal="popup_hide" from="." to="." method="_on_ManageLayouts_popup_hide"]
[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="nothing_selected" from="VBoxContainer/SavedLayouts" to="." method="_on_SavedLayouts_nothing_selected"]
[connection signal="pressed" from="VBoxContainer/DeleteLayout" to="." method="_on_DeleteLayout_pressed"]
[connection signal="text_changed" from="VBoxContainer/HBoxContainer/LayoutName" to="." method="_on_LayoutName_text_changed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/SaveLayout" to="." method="_on_SaveLayout_pressed"]

View file

@ -66,6 +66,8 @@ onready var recent_projects_submenu := PopupMenu.new()
func _ready() -> void:
var dir := Directory.new()
dir.make_dir("user://layouts")
_setup_file_menu()
_setup_edit_menu()
_setup_view_menu()
@ -209,11 +211,20 @@ func _setup_dockers_submenu(item: String) -> void:
func _setup_layouts_submenu(item: String) -> void:
var dir := Directory.new()
var path := "user://layouts"
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if !dir.current_is_dir():
var file_name_no_tres: String = file_name.get_basename()
layouts.append([file_name_no_tres, ResourceLoader.load(path.plus_file(file_name))])
file_name = dir.get_next()
layouts_submenu.set_name("layouts_submenu")
layouts_submenu.hide_on_checkable_item_selection = false
for layout in layouts:
layouts_submenu.add_radio_check_item(layout[0])
populate_layouts_submenu()
layouts_submenu.set_item_checked(0, true)
layouts_submenu.connect("id_pressed", self, "_layouts_submenu_id_pressed")
@ -221,6 +232,14 @@ func _setup_layouts_submenu(item: String) -> void:
view_menu.add_submenu_item(item, layouts_submenu.get_name())
func populate_layouts_submenu() -> void:
layouts_submenu.clear() # Does not do anything if it's called for the first time
for layout in layouts:
layouts_submenu.add_radio_check_item(layout[0])
layouts_submenu.add_item("Manage Layouts")
func _setup_image_menu() -> void:
var image_menu_items := { # order as in ImageMenuId enum
"Scale Image": 0,
@ -434,6 +453,14 @@ func _dockers_submenu_id_pressed(id: int) -> void:
func _layouts_submenu_id_pressed(id: int) -> void:
if id < layouts.size():
set_layout(id)
else:
Global.control.get_node("Dialogs/ManageLayouts").popup_centered()
Global.dialog_open(true)
func set_layout(id: int) -> void:
# Clone is needed so that the premade layouts do not get modified
Global.control.ui.layout = layouts[id][1].clone()
for i in layouts.size():