75 lines
1.8 KiB
GDScript
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
|
|
)
|