Files
step3/scripts/autoload/ui_theme_service.gd
2026-07-16 19:00:46 -05:00

75 lines
1.8 KiB
GDScript

extends Node
signal theme_changed(is_dark: bool)
const Style := preload("res://scripts/ui/ui_style.gd")
const SETTINGS_PATH := "user://settings.cfg"
const SETTINGS_SECTION := "appearance"
const SETTINGS_KEY := "color_scheme"
var _is_dark := true
func _enter_tree() -> void:
_is_dark = _load_preference()
Style.set_dark_mode(_is_dark)
_sync_web_preference()
func is_dark_mode() -> bool:
return _is_dark
func set_dark_mode(value: bool) -> void:
if _is_dark == value:
return
_is_dark = value
Style.set_dark_mode(_is_dark)
_save_preference()
_sync_web_preference()
theme_changed.emit(_is_dark)
func toggle_theme() -> void:
set_dark_mode(not _is_dark)
func _load_preference() -> bool:
var config := ConfigFile.new()
if config.load(SETTINGS_PATH) == OK:
var saved := str(config.get_value(SETTINGS_SECTION, SETTINGS_KEY, ""))
if saved == "dark" or saved == "light":
return saved == "dark"
return _system_prefers_dark()
func _system_prefers_dark() -> bool:
if OS.has_feature("web"):
var result: Variant = JavaScriptBridge.eval(
"window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches",
true
)
return bool(result)
if DisplayServer.is_dark_mode_supported():
return DisplayServer.is_dark_mode()
return true
func _save_preference() -> void:
var config := ConfigFile.new()
config.load(SETTINGS_PATH)
config.set_value(SETTINGS_SECTION, SETTINGS_KEY, "dark" if _is_dark else "light")
if config.save(SETTINGS_PATH) != OK:
push_warning("Unable to save color scheme preference.")
func _sync_web_preference() -> void:
if not OS.has_feature("web"):
return
JavaScriptBridge.eval(
"try { window.localStorage.setItem('medmind-color-scheme', %s); } catch (error) { console.warn('Theme preference storage is unavailable.', error); }" % JSON.stringify(
"dark" if _is_dark else "light"
),
true
)