From b620cf2a9ed712b77247d8a588b6b11fd49742d7 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sun, 24 Mar 2024 02:46:57 +0200 Subject: [PATCH] Lazy load the preferences dialog Speeds up the initial loading time of Pixelorama. It's now almost as fast as 0.x on my computer (a bit more than 2 seconds). Lazy loading the preferences dialog also drastically reduces memory usage and node count (when preferences have not been opened), from 150MB, 13634 objects and 3680 nodes, to 94MB, 8207 objects and 1823 nodes. This essentially cuts the initial node count to half! --- src/Autoload/Global.gd | 8 +- src/Main.tscn | 5 +- src/Preferences/PreferencesDialog.gd | 225 ++++++++++++-------- src/UI/TopMenuContainer/TopMenuContainer.gd | 3 +- 4 files changed, 148 insertions(+), 93 deletions(-) diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 8bb25394d..4a71bae02 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -629,8 +629,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn") @onready var save_sprites_dialog: FileDialog = control.find_child("SaveSprite") ## Dialog used to export images. It has the [param ExportDialog.gd] script attached. @onready var export_dialog: AcceptDialog = control.find_child("ExportDialog") -## The preferences dialog. It has the [param PreferencesDialog.gd] script attached. -@onready var preferences_dialog: AcceptDialog = control.find_child("PreferencesDialog") ## An error dialog to show errors. @onready var error_dialog: AcceptDialog = control.find_child("ErrorDialog") @@ -680,6 +678,12 @@ func _ready() -> void: await get_tree().process_frame project_switched.emit() + # Load preferences from the config file + for pref in config_cache.get_section_keys("preferences"): + if get(pref) == null: + continue + var value = config_cache.get_value("preferences", pref) + set(pref, value) func _initialize_keychain() -> void: diff --git a/src/Main.tscn b/src/Main.tscn index 627b4657c..27dacfe11 100644 --- a/src/Main.tscn +++ b/src/Main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=3 uid="uid://dbylw5k04ulp8"] +[gd_scene load_steps=15 format=3 uid="uid://dbylw5k04ulp8"] [ext_resource type="Theme" uid="uid://cngbvfpwjoimv" path="res://assets/themes/dark/theme.tres" id="1"] [ext_resource type="Script" path="res://src/Main.gd" id="2"] @@ -13,7 +13,6 @@ [ext_resource type="PackedScene" uid="uid://c0nuukjakmai2" path="res://src/UI/Dialogs/TileModeOffsetsDialog.tscn" id="14"] [ext_resource type="Script" path="res://src/HandleExtensions.gd" id="15_v0k2h"] [ext_resource type="PackedScene" uid="uid://clbjfkdupw52l" path="res://src/UI/Timeline/CelProperties.tscn" id="17_ucs64"] -[ext_resource type="PackedScene" uid="uid://b3hkjj3s6pe4x" path="res://src/Preferences/PreferencesDialog.tscn" id="32"] [ext_resource type="PackedScene" uid="uid://clgu8wb5o6oup" path="res://src/UI/Dialogs/ExportDialog.tscn" id="39"] [node name="Control" type="Control"] @@ -54,8 +53,6 @@ mouse_filter = 2 [node name="ExportDialog" parent="Dialogs" instance=ExtResource("39")] -[node name="PreferencesDialog" parent="Dialogs" instance=ExtResource("32")] - [node name="UnsavedCanvasDialog" type="ConfirmationDialog" parent="Dialogs"] title = "Unsaved Image" exclusive = false diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd index 102c20ae8..107bca401 100644 --- a/src/Preferences/PreferencesDialog.gd +++ b/src/Preferences/PreferencesDialog.gd @@ -2,17 +2,22 @@ extends AcceptDialog var preferences: Array[Preference] = [ Preference.new( - "open_last_project", "Startup/StartupContainer/OpenLastProject", "button_pressed" + "open_last_project", "Startup/StartupContainer/OpenLastProject", "button_pressed", false ), Preference.new( - "quit_confirmation", "Startup/StartupContainer/QuitConfirmation", "button_pressed" + "quit_confirmation", "Startup/StartupContainer/QuitConfirmation", "button_pressed", false ), - Preference.new("ffmpeg_path", "Startup/StartupContainer/FFMPEGPath", "text"), - Preference.new("shrink", "%ShrinkSlider", "value"), - Preference.new("font_size", "Interface/InterfaceOptions/FontSizeSlider", "value"), - Preference.new("dim_on_popup", "Interface/InterfaceOptions/DimCheckBox", "button_pressed"), + Preference.new("ffmpeg_path", "Startup/StartupContainer/FFMPEGPath", "text", ""), + Preference.new("shrink", "%ShrinkSlider", "value", 1.0), + Preference.new("font_size", "Interface/InterfaceOptions/FontSizeSlider", "value", 16), Preference.new( - "use_native_file_dialogs", "Interface/InterfaceOptions/NativeFileDialogs", "button_pressed" + "dim_on_popup", "Interface/InterfaceOptions/DimCheckBox", "button_pressed", true + ), + Preference.new( + "use_native_file_dialogs", + "Interface/InterfaceOptions/NativeFileDialogs", + "button_pressed", + false ), Preference.new( "single_window_mode", @@ -21,97 +26,166 @@ var preferences: Array[Preference] = [ true, true ), - Preference.new("icon_color_from", "Interface/ButtonOptions/IconColorOptionButton", "selected"), - Preference.new("custom_icon_color", "Interface/ButtonOptions/IconColorButton", "color"), - Preference.new("left_tool_color", "Interface/ButtonOptions/LeftToolColorButton", "color"), - Preference.new("right_tool_color", "Interface/ButtonOptions/RightToolColorButton", "color"), Preference.new( - "tool_button_size", "Interface/ButtonOptions/ToolButtonSizeOptionButton", "selected" + "icon_color_from", + "Interface/ButtonOptions/IconColorOptionButton", + "selected", + Global.ColorFrom.THEME ), Preference.new( - "show_left_tool_icon", "Cursors/CursorsContainer/LeftToolIconCheckbox", "button_pressed" + "custom_icon_color", "Interface/ButtonOptions/IconColorButton", "color", Color.GRAY ), Preference.new( - "show_right_tool_icon", "Cursors/CursorsContainer/RightToolIconCheckbox", "button_pressed" + "left_tool_color", "Interface/ButtonOptions/LeftToolColorButton", "color", Color("0086cf") + ), + Preference.new( + "right_tool_color", "Interface/ButtonOptions/RightToolColorButton", "color", Color("fd6d14") + ), + Preference.new( + "tool_button_size", + "Interface/ButtonOptions/ToolButtonSizeOptionButton", + "selected", + Global.ButtonSize.SMALL + ), + Preference.new( + "show_left_tool_icon", + "Cursors/CursorsContainer/LeftToolIconCheckbox", + "button_pressed", + true + ), + Preference.new( + "show_right_tool_icon", + "Cursors/CursorsContainer/RightToolIconCheckbox", + "button_pressed", + true ), Preference.new( "left_square_indicator_visible", "Cursors/CursorsContainer/LeftIndicatorCheckbox", - "button_pressed" + "button_pressed", + true ), Preference.new( "right_square_indicator_visible", "Cursors/CursorsContainer/RightIndicatorCheckbox", - "button_pressed" + "button_pressed", + true ), Preference.new( - "native_cursors", "Cursors/CursorsContainer/NativeCursorsCheckbox", "button_pressed" + "native_cursors", "Cursors/CursorsContainer/NativeCursorsCheckbox", "button_pressed", false ), Preference.new( - "cross_cursor", "Cursors/CursorsContainer/CrossCursorCheckbox", "button_pressed" + "cross_cursor", "Cursors/CursorsContainer/CrossCursorCheckbox", "button_pressed", true ), - Preference.new("autosave_interval", "Backup/AutosaveContainer/AutosaveInterval", "value"), - Preference.new("enable_autosave", "Backup/AutosaveContainer/EnableAutosave", "button_pressed"), - Preference.new("default_width", "Image/ImageOptions/ImageDefaultWidth", "value"), - Preference.new("default_height", "Image/ImageOptions/ImageDefaultHeight", "value"), - Preference.new("default_fill_color", "Image/ImageOptions/DefaultFillColor", "color"), - Preference.new("smooth_zoom", "Canvas/ZoomOptions/SmoothZoom", "button_pressed"), - Preference.new("integer_zoom", "Canvas/ZoomOptions/IntegerZoom", "button_pressed"), - Preference.new("snapping_distance", "Canvas/SnappingOptions/DistanceValue", "value"), - Preference.new("grid_type", "Canvas/GridOptions/GridType", "selected"), - Preference.new("grid_size", "Canvas/GridOptions/GridSizeValue", "value"), - Preference.new("isometric_grid_size", "Canvas/GridOptions/IsometricGridSizeValue", "value"), - Preference.new("grid_offset", "Canvas/GridOptions/GridOffsetValue", "value"), + Preference.new("autosave_interval", "Backup/AutosaveContainer/AutosaveInterval", "value", 1.0), Preference.new( - "grid_draw_over_tile_mode", "Canvas/GridOptions/GridDrawOverTileMode", "button_pressed" + "enable_autosave", "Backup/AutosaveContainer/EnableAutosave", "button_pressed", true ), - Preference.new("grid_color", "Canvas/GridOptions/GridColor", "color"), - Preference.new("pixel_grid_show_at_zoom", "Canvas/PixelGridOptions/ShowAtZoom", "value"), - Preference.new("pixel_grid_color", "Canvas/PixelGridOptions/GridColor", "color"), - Preference.new("guide_color", "Canvas/GuideOptions/GuideColor", "color"), - Preference.new("checker_size", "Canvas/CheckerOptions/CheckerSizeValue", "value"), - Preference.new("checker_color_1", "Canvas/CheckerOptions/CheckerColor1", "color"), - Preference.new("checker_color_2", "Canvas/CheckerOptions/CheckerColor2", "color"), + Preference.new("default_width", "Image/ImageOptions/ImageDefaultWidth", "value", 64), + Preference.new("default_height", "Image/ImageOptions/ImageDefaultHeight", "value", 64), + Preference.new("default_fill_color", "Image/ImageOptions/DefaultFillColor", "color", Color(0)), + Preference.new("smooth_zoom", "Canvas/ZoomOptions/SmoothZoom", "button_pressed", true), + Preference.new("integer_zoom", "Canvas/ZoomOptions/IntegerZoom", "button_pressed", false), + Preference.new("snapping_distance", "Canvas/SnappingOptions/DistanceValue", "value", 32.0), Preference.new( - "checker_follow_movement", "Canvas/CheckerOptions/CheckerFollowMovement", "button_pressed" + "grid_type", "Canvas/GridOptions/GridType", "selected", Global.GridTypes.CARTESIAN + ), + Preference.new("grid_size", "Canvas/GridOptions/GridSizeValue", "value", Vector2i(2, 2)), + Preference.new( + "isometric_grid_size", "Canvas/GridOptions/IsometricGridSizeValue", "value", Vector2i(16, 8) + ), + Preference.new("grid_offset", "Canvas/GridOptions/GridOffsetValue", "value", Vector2i.ZERO), + Preference.new( + "grid_draw_over_tile_mode", + "Canvas/GridOptions/GridDrawOverTileMode", + "button_pressed", + false + ), + Preference.new("grid_color", "Canvas/GridOptions/GridColor", "color", Color.BLACK), + Preference.new( + "pixel_grid_show_at_zoom", "Canvas/PixelGridOptions/ShowAtZoom", "value", 1500.0 ), Preference.new( - "checker_follow_scale", "Canvas/CheckerOptions/CheckerFollowScale", "button_pressed" + "pixel_grid_color", "Canvas/PixelGridOptions/GridColor", "color", Color("21212191") + ), + Preference.new("guide_color", "Canvas/GuideOptions/GuideColor", "color", Color.PURPLE), + Preference.new("checker_size", "Canvas/CheckerOptions/CheckerSizeValue", "value", 10), + Preference.new( + "checker_color_1", + "Canvas/CheckerOptions/CheckerColor1", + "color", + Color(0.47, 0.47, 0.47, 1) + ), + Preference.new( + "checker_color_2", + "Canvas/CheckerOptions/CheckerColor2", + "color", + Color(0.34, 0.35, 0.34, 1) + ), + Preference.new( + "checker_follow_movement", + "Canvas/CheckerOptions/CheckerFollowMovement", + "button_pressed", + false + ), + Preference.new( + "checker_follow_scale", "Canvas/CheckerOptions/CheckerFollowScale", "button_pressed", false + ), + Preference.new("tilemode_opacity", "Canvas/CheckerOptions/TileModeOpacity", "value", 1.0), + Preference.new( + "clear_color_from", + "Canvas/BackgroundOptions/ColorOptionButton", + "selected", + Global.ColorFrom.THEME + ), + Preference.new( + "modulate_clear_color", "Canvas/BackgroundOptions/BackgroundColor", "color", Color.GRAY ), - Preference.new("tilemode_opacity", "Canvas/CheckerOptions/TileModeOpacity", "value"), - Preference.new("clear_color_from", "Canvas/BackgroundOptions/ColorOptionButton", "selected"), - Preference.new("modulate_clear_color", "Canvas/BackgroundOptions/BackgroundColor", "color"), Preference.new( "select_layer_on_button_click", "Timeline/TimelineOptions/SelectLayerOnButton", - "button_pressed" + "button_pressed", + false ), Preference.new( - "onion_skinning_past_color", "Timeline/TimelineOptions/OnionSkinningPastColor", "color" + "onion_skinning_past_color", + "Timeline/TimelineOptions/OnionSkinningPastColor", + "color", + Color.RED ), Preference.new( - "onion_skinning_future_color", "Timeline/TimelineOptions/OnionSkinningFutureColor", "color" + "onion_skinning_future_color", + "Timeline/TimelineOptions/OnionSkinningFutureColor", + "color", + Color.BLUE ), Preference.new( - "selection_animated_borders", "Selection/SelectionOptions/Animate", "button_pressed" + "selection_animated_borders", "Selection/SelectionOptions/Animate", "button_pressed", true ), - Preference.new("selection_border_color_1", "Selection/SelectionOptions/BorderColor1", "color"), - Preference.new("selection_border_color_2", "Selection/SelectionOptions/BorderColor2", "color"), - Preference.new("fps_limit", "Performance/PerformanceContainer/SetFPSLimit", "value"), Preference.new( - "pause_when_unfocused", "Performance/PerformanceContainer/PauseAppFocus", "button_pressed" + "selection_border_color_1", "Selection/SelectionOptions/BorderColor1", "color", Color.WHITE + ), + Preference.new( + "selection_border_color_2", "Selection/SelectionOptions/BorderColor2", "color", Color.BLACK + ), + Preference.new("fps_limit", "Performance/PerformanceContainer/SetFPSLimit", "value", 0), + Preference.new( + "pause_when_unfocused", + "Performance/PerformanceContainer/PauseAppFocus", + "button_pressed", + true ), Preference.new( "window_transparency", "Performance/PerformanceContainer/WindowTransparency", "button_pressed", - true, - false + false, + true ), # Preference.new( - # "renderer", "Drivers/DriversContainer/Renderer", "selected", true, OS.VIDEO_DRIVER_GLES2 + # "renderer", "Drivers/DriversContainer/Renderer", "selected", OS.VIDEO_DRIVER_GLES2, true # ), - Preference.new("tablet_driver", "Drivers/DriversContainer/TabletDriver", "selected", true, 0) + Preference.new("tablet_driver", "Drivers/DriversContainer/TabletDriver", "selected", 0, true) ] var content_list := [] @@ -135,15 +209,15 @@ class Preference: var prop_name: String var node_path: String var value_type: String - var require_restart := false var default_value + var require_restart := false func _init( _prop_name: String, _node_path: String, _value_type: String, - _require_restart := false, - _default_value = null + _default_value = null, + _require_restart := false ) -> void: prop_name = _prop_name node_path = _node_path @@ -241,34 +315,13 @@ func _ready() -> void: _on_Preference_value_changed.bind(pref, restore_default_button) ) - var global_value = Global.get(pref.prop_name) - if Global.config_cache.has_section_key("preferences", pref.prop_name): - var value = Global.config_cache.get_value("preferences", pref.prop_name) - Global.set(pref.prop_name, value) - node.set(pref.value_type, value) - global_value = Global.get(pref.prop_name) - - # This is needed because color_changed doesn't fire if the color changes in code - if typeof(value) == TYPE_VECTOR2 or typeof(value) == TYPE_COLOR: - preference_update(pref.require_restart) - if typeof(global_value) == TYPE_VECTOR2I: - disable_restore_default_button( - restore_default_button, global_value == pref.default_value - ) - else: - disable_restore_default_button( - restore_default_button, global_value.is_equal_approx(pref.default_value) - ) - elif pref.value_type == "selected": - preference_update(pref.require_restart) - disable_restore_default_button( - restore_default_button, global_value == pref.default_value - ) - else: - node.set(pref.value_type, global_value) - disable_restore_default_button( - restore_default_button, global_value == pref.default_value - ) + var value = Global.get(pref.prop_name) + node.set(pref.value_type, value) + var is_default: bool = value == pref.default_value + # This is needed because color_changed doesn't fire if the color changes in code + if typeof(value) == TYPE_VECTOR2 or typeof(value) == TYPE_COLOR: + is_default = value.is_equal_approx(pref.default_value) + disable_restore_default_button(restore_default_button, is_default) func _on_Preference_value_changed(value, pref: Preference, button: RestoreDefaultButton) -> void: diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index 7297b4da0..6eb2c000d 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -15,6 +15,7 @@ var zen_mode := false # Dialogs var new_image_dialog := Dialog.new("res://src/UI/Dialogs/CreateNewImage.tscn") +var preferences_dialog := Dialog.new("res://src/Preferences/PreferencesDialog.tscn") var offset_image_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/OffsetImage.tscn") var scale_image_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/ScaleImage.tscn") var resize_canvas_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn") @@ -528,7 +529,7 @@ func edit_menu_id_pressed(id: int) -> void: Global.EditMenu.NEW_BRUSH: Global.canvas.selection.new_brush() Global.EditMenu.PREFERENCES: - _popup_dialog(Global.preferences_dialog) + preferences_dialog.popup() _: _handle_metadata(id, edit_menu)