From 03b173b76e9d0cebd5bd7497208481da43392abe Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas Date: Fri, 15 Mar 2024 01:31:12 +0200 Subject: [PATCH] Optimize cel switching by avoiding changing the stylebox of every CelButton --- src/Autoload/Global.gd | 6 +++++- src/Preferences/HandleThemes.gd | 1 + src/UI/Timeline/CelButton.gd | 29 +++++++++++++---------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 9c16ce45d..087317692 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -12,6 +12,10 @@ signal project_about_to_switch ## Emitted before a project is about to be switc signal project_switched ## Emitted whenever you switch to some other project tab. signal cel_switched ## Emitted whenever you select a different cel. signal project_data_changed(project: Project) ## Emitted when project data is modified. +## Emitted when the theme is switched. Unlike [signal Control.theme_changed], +## this doesn't get emitted when a stylebox of a control changes, only when the +## main theme gets switched to another. +signal theme_switched enum LayerTypes { PIXEL, GROUP, THREE_D } enum GridTypes { CARTESIAN, ISOMETRIC, ALL } @@ -466,7 +470,7 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn") @onready var main_window := get_window() ## The main Pixelorama [Window]. ## The control node (aka Main node). It has the [param Main.gd] script attached. -@onready var control := get_tree().current_scene +@onready var control := get_tree().current_scene as Control ## The project tabs bar. It has the [param Tabs.gd] script attached. @onready var tabs: TabBar = control.find_child("TabBar") diff --git a/src/Preferences/HandleThemes.gd b/src/Preferences/HandleThemes.gd index 976b58620..96a00682e 100644 --- a/src/Preferences/HandleThemes.gd +++ b/src/Preferences/HandleThemes.gd @@ -83,6 +83,7 @@ func change_theme(id: int) -> void: Global.control.theme = theme change_clear_color() change_icon_colors() + Global.theme_switched.emit() func change_clear_color() -> void: diff --git a/src/UI/Timeline/CelButton.gd b/src/UI/Timeline/CelButton.gd index 07cafe1e4..c08854db0 100644 --- a/src/UI/Timeline/CelButton.gd +++ b/src/UI/Timeline/CelButton.gd @@ -6,10 +6,7 @@ var frame := 0 var layer := 0 var cel: BaseCel -## Without this variable, [signal Control.theme_changed] calls [method cel_switched], which calls -## [method Control.add_theme_stylebox_override], firing [signal Control.theme_changed] -## and thus resulting in an endless loop. -var _call_theme_changed := true +var _is_guide_stylebox := false @onready var popup_menu: PopupMenu = get_node_or_null("PopupMenu") @onready var linked: ColorRect = $Linked @@ -20,7 +17,7 @@ var _call_theme_changed := true func _ready() -> void: Global.cel_switched.connect(cel_switched) - theme_changed.connect(cel_switched) + Global.theme_switched.connect(cel_switched.bind(true)) cel = Global.current_project.frames[frame].cels[layer] button_setup() _dim_checker() @@ -32,24 +29,24 @@ func _ready() -> void: transparent_checker.visible = false -func cel_switched() -> void: - if not _call_theme_changed: - _call_theme_changed = true - return - var current_theme: Theme = Global.control.theme +func cel_switched(force_stylebox_change := false) -> void: + z_index = 1 if button_pressed else 0 + var current_theme := Global.control.theme var is_guide := false for selected in Global.current_project.selected_cels: if selected[1] == layer or selected[0] == frame: is_guide = true break - _call_theme_changed = false if is_guide: - var guide_stylebox := current_theme.get_stylebox("guide", "CelButton") - add_theme_stylebox_override("normal", guide_stylebox) + if not _is_guide_stylebox or force_stylebox_change: + var guide_stylebox := current_theme.get_stylebox("guide", "CelButton") + add_theme_stylebox_override("normal", guide_stylebox) + _is_guide_stylebox = true else: - var normal_stylebox := current_theme.get_stylebox("normal", "CelButton") - add_theme_stylebox_override("normal", normal_stylebox) - z_index = 1 if button_pressed else 0 + if _is_guide_stylebox or force_stylebox_change: + var normal_stylebox := current_theme.get_stylebox("normal", "CelButton") + add_theme_stylebox_override("normal", normal_stylebox) + _is_guide_stylebox = false func button_setup() -> void: