RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
settings_panel_controller.gd
Go to the documentation of this file.
1extends RefCounted
2
3
10
11const SettingsManagerScript = preload("res://scripts/systems/settingsManager/settings_manager.gd")
12
13var controls := {}
14var settings_manager_fallback
15
16
17
22func bind(bound_controls:Dictionary) -> void:
23 controls = bound_controls
24 var settings_manager = _settings_manager()
25 sync_values()
26 controls["window_size"].item_selected.connect(_on_window_size_selected)
27 if controls.has("theme"):
28 controls["theme"].item_selected.connect(_on_theme_selected)
29 if controls.has("text_size"):
30 controls["text_size"].item_selected.connect(_on_text_size_selected)
31 if controls.has("input_mode"):
32 controls["input_mode"].item_selected.connect(_on_input_mode_selected)
33 controls["fullscreen"].toggled.connect(settings_manager.set_fullscreen)
34 if controls.has("low_power_mode"):
35 controls["low_power_mode"].toggled.connect(settings_manager.set_low_power_mode)
36 controls["master_slider"].value_changed.connect(func(value): _settings_manager().set_audio_value("master_volume", value / 100.0))
37 controls["music_slider"].value_changed.connect(func(value): _settings_manager().set_audio_value("music_volume", value / 100.0))
38 controls["sfx_slider"].value_changed.connect(func(value): _settings_manager().set_audio_value("sfx_volume", value / 100.0))
39 controls["master_mute"].toggled.connect(func(value): _settings_manager().set_audio_value("master_muted", value))
40 controls["music_mute"].toggled.connect(func(value): _settings_manager().set_audio_value("music_muted", value))
41 controls["sfx_mute"].toggled.connect(func(value): _settings_manager().set_audio_value("sfx_muted", value))
42
43
44
45func sync_values() -> void:
46 var settings_manager = _settings_manager()
47 var settings = settings_manager.get_settings()
48 var window_size_options = settings_manager.get_window_size_options()
49 controls["window_size"].clear()
50 var selected_index = 0
51 var index = 0
52 for label in window_size_options.keys():
53 controls["window_size"].add_item(label)
54 if window_size_options[label] == settings["window_size"]:
55 selected_index = index
56 index += 1
57 controls["window_size"].select(selected_index)
58 if controls.has("theme"):
59 controls["theme"].clear()
60 var theme_options = settings_manager.get_theme_options()
61 var selected_theme_index = 0
62 var theme_index = 0
63 for label in theme_options.keys():
64 controls["theme"].add_item(label)
65 if theme_options[label] == settings["theme"]:
66 selected_theme_index = theme_index
67 theme_index += 1
68 controls["theme"].select(selected_theme_index)
69 if controls.has("text_size"):
70 controls["text_size"].clear()
71 var text_size_options = settings_manager.get_text_size_options()
72 var selected_text_index = 0
73 var text_index = 0
74 for label in text_size_options.keys():
75 controls["text_size"].add_item(label)
76 if text_size_options[label] == settings["text_size"]:
77 selected_text_index = text_index
78 text_index += 1
79 controls["text_size"].select(selected_text_index)
80 if controls.has("input_mode"):
81 controls["input_mode"].clear()
82 var input_mode_options = settings_manager.get_input_mode_options()
83 var selected_input_index := 0
84 var input_index := 0
85 for label in input_mode_options.keys():
86 controls["input_mode"].add_item(label)
87 if input_mode_options[label] == settings.get("input_mode", "touch"):
88 selected_input_index = input_index
89 input_index += 1
90 controls["input_mode"].select(selected_input_index)
91 controls["fullscreen"].button_pressed = bool(settings["fullscreen"])
92 if controls.has("low_power_mode"):
93 controls["low_power_mode"].button_pressed = bool(settings.get("low_power_mode", false))
94 controls["master_slider"].value = float(settings["master_volume"]) * 100.0
95 controls["music_slider"].value = float(settings["music_volume"]) * 100.0
96 controls["sfx_slider"].value = float(settings["sfx_volume"]) * 100.0
97 controls["master_mute"].button_pressed = bool(settings["master_muted"])
98 controls["music_mute"].button_pressed = bool(settings["music_muted"])
99 controls["sfx_mute"].button_pressed = bool(settings["sfx_muted"])
100
101
102func _on_window_size_selected(index:int) -> void:
103 var label = controls["window_size"].get_item_text(index)
104 _settings_manager().set_window_size_by_label(label)
105
106
107func _on_theme_selected(index:int) -> void:
108 var label = controls["theme"].get_item_text(index)
109 _settings_manager().set_theme_by_label(label)
110
111
112func _on_text_size_selected(index:int) -> void:
113 var label = controls["text_size"].get_item_text(index)
114 _settings_manager().set_text_size_by_label(label)
115
116
117func _on_input_mode_selected(index:int) -> void:
118 var label = controls["input_mode"].get_item_text(index)
119 var options = _settings_manager().get_input_mode_options()
120 _settings_manager().set_input_mode(str(options.get(label, "touch")))
121
122
123func _settings_manager():
124 var manager = _get_autoload("SettingsManager")
125 if manager != null:
126 return manager
127 if settings_manager_fallback == null:
128 settings_manager_fallback = SettingsManagerScript.new()
129 return settings_manager_fallback
130
131
132func _get_autoload(name:String):
133 var loop = Engine.get_main_loop()
134 if loop is SceneTree:
135 return loop.root.get_node_or_null(name)
136 return null