1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-22 13:33:13 +00:00
Pixelorama/src/Autoload/Themes.gd
2024-10-17 14:41:43 +03:00

105 lines
3.2 KiB
GDScript

extends Node
signal theme_added(theme: Theme)
signal theme_removed(theme: Theme)
## 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
var theme_index := 0
var themes: Array[Theme] = [
preload("res://assets/themes/dark/theme.tres"),
preload("res://assets/themes/gray/theme.tres"),
preload("res://assets/themes/blue/theme.tres"),
preload("res://assets/themes/caramel/theme.tres"),
preload("res://assets/themes/light/theme.tres"),
preload("res://assets/themes/purple/theme.tres"),
preload("res://assets/themes/rose/theme.tres"),
]
func _ready() -> void:
var theme_id: int = Global.config_cache.get_value("preferences", "theme", 0)
if theme_id >= themes.size():
theme_id = 0
if theme_id != 0:
change_theme(theme_id)
else:
change_clear_color()
change_icon_colors()
func add_theme(theme: Theme) -> void:
themes.append(theme)
theme_added.emit(theme)
func remove_theme(theme: Theme) -> void:
themes.erase(theme)
theme_removed.emit(theme)
func change_theme(id: int) -> void:
theme_index = id
var theme := themes[id]
if theme.default_font != Global.theme_font:
theme.default_font = Global.theme_font
theme.default_font_size = Global.font_size
theme.set_font_size("font_size", "HeaderSmall", Global.font_size + 2)
var icon_color := theme.get_color("modulate_color", "Icons")
if Global.icon_color_from == Global.ColorFrom.THEME:
Global.modulate_icon_color = icon_color
Global.control.theme = theme
change_clear_color()
change_icon_colors()
Global.config_cache.set_value("preferences", "theme", id)
Global.config_cache.save(Global.CONFIG_PATH)
theme_switched.emit()
func change_clear_color() -> void:
var clear_color: Color = Global.control.theme.get_color("clear_color", "Misc")
if not clear_color:
var panel_stylebox: StyleBox = Global.control.theme.get_stylebox("panel", "PanelContainer")
if panel_stylebox is StyleBoxFlat:
clear_color = panel_stylebox.bg_color
else:
clear_color = Color.GRAY
if Global.clear_color_from == Global.ColorFrom.THEME:
RenderingServer.set_default_clear_color(clear_color)
else:
RenderingServer.set_default_clear_color(Global.modulate_clear_color)
func change_icon_colors() -> void:
for node in get_tree().get_nodes_in_group("UIButtons"):
if node is TextureRect or node is Sprite2D:
node.modulate = Global.modulate_icon_color
elif node is TextureButton:
node.modulate = Global.modulate_icon_color
if node.disabled and not ("RestoreDefaultButton" in node.name):
node.modulate.a = 0.5
elif node is Button:
var texture: TextureRect
for child in node.get_children():
if child is TextureRect and child.name != "Background":
texture = child
break
if is_instance_valid(texture):
texture.modulate = Global.modulate_icon_color
if node.disabled:
texture.modulate.a = 0.5
func get_font() -> Font:
if Global.control.theme.has_default_font():
return Global.control.theme.default_font
return ThemeDB.fallback_font
func get_font_size() -> int:
if Global.control.theme.has_default_font_size():
return Global.control.theme.default_font_size
return ThemeDB.fallback_font_size