aboutsummaryrefslogtreecommitdiff
path: root/game/src/Game/Menu/OptionMenu/SettingNodes
diff options
context:
space:
mode:
Diffstat (limited to 'game/src/Game/Menu/OptionMenu/SettingNodes')
-rw-r--r--game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd41
-rw-r--r--game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd77
-rw-r--r--game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd27
3 files changed, 145 insertions, 0 deletions
diff --git a/game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd
new file mode 100644
index 0000000..6fa30ed
--- /dev/null
+++ b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd
@@ -0,0 +1,41 @@
+extends HSlider
+class_name SettingHSlider
+
+@export
+var section_name : String = "setting"
+
+@export
+var setting_name : String = "setting_hslider"
+
+@export
+var default_value : float = 0
+
+func _ready():
+ Events.Options.load_settings.connect(load_setting)
+ Events.Options.save_settings.connect(save_setting)
+ Events.Options.reset_settings.connect(reset_setting)
+
+func load_setting(file : ConfigFile):
+ if file == null: return
+ var load_value = file.get_value(section_name, setting_name, default_value)
+ match typeof(load_value):
+ TYPE_FLOAT, TYPE_INT:
+ if value == load_value: value_changed.emit(value)
+ value = load_value
+ return
+ TYPE_STRING, TYPE_STRING_NAME:
+ var load_string := load_value as String
+ if load_string.is_valid_float():
+ load_value = load_string.to_float()
+ if value == load_value: value_changed.emit(value)
+ value = load_value
+ return
+ push_error("Setting value '%s' invalid for setting [%s] \"%s\"" % [load_value, section_name, setting_name])
+ value = default_value
+
+func save_setting(file : ConfigFile):
+ if file == null: return
+ file.set_value(section_name, setting_name, value)
+
+func reset_setting():
+ value = default_value
diff --git a/game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd
new file mode 100644
index 0000000..c5a805e
--- /dev/null
+++ b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd
@@ -0,0 +1,77 @@
+extends OptionButton
+class_name SettingOptionButton
+
+signal option_selected(index : int, by_user : bool)
+
+@export
+var section_name : String = "setting"
+
+@export
+var setting_name : String = "setting_optionbutton"
+
+@export
+var default_selected : int = -1:
+ get: return default_selected
+ set(v):
+ if v < 0 or item_count == 0:
+ default_selected = -1
+ return
+ default_selected = v % item_count
+
+func _valid_index(index : int) -> bool:
+ return 0 <= index and index < item_count
+
+func _get_value_for_file(select_value : int):
+ if _valid_index(select_value):
+ return select_value
+ else:
+ return null
+
+func _set_value_from_file(load_value) -> void:
+ match typeof(load_value):
+ TYPE_INT:
+ if _valid_index(load_value):
+ selected = load_value
+ return
+ TYPE_STRING, TYPE_STRING_NAME:
+ var load_string := load_value as String
+ if load_string.is_valid_int():
+ var load_int := load_string.to_int()
+ if _valid_index(load_int):
+ selected = load_int
+ return
+ for item_index in item_count:
+ if load_string == get_item_text(item_index):
+ selected = item_index
+ return
+ push_error("Setting value '%s' invalid for setting [%s] \"%s\"" % [load_value, section_name, setting_name])
+ selected = default_selected
+
+func _setup_button() -> void:
+ pass
+
+func _ready():
+ Events.Options.load_settings.connect(load_setting)
+ Events.Options.save_settings.connect(save_setting)
+ Events.Options.reset_settings.connect(reset_setting)
+ item_selected.connect(func(index : int): option_selected.emit(index, true))
+ _setup_button()
+ if not _valid_index(default_selected) or selected == -1:
+ var msg := "Failed to generate %s %s options." % [setting_name, section_name]
+ push_error(msg)
+ OS.alert(msg, "%s Options Error" % section_name)
+ get_tree().quit()
+
+func load_setting(file : ConfigFile) -> void:
+ if file == null: return
+ _set_value_from_file(file.get_value(section_name, setting_name, _get_value_for_file(default_selected)))
+ option_selected.emit(selected, false)
+
+func save_setting(file : ConfigFile) -> void:
+ if file == null: return
+ file.set_value(section_name, setting_name, _get_value_for_file(selected))
+
+func reset_setting(no_emit : bool = false) -> void:
+ selected = default_selected
+ if not no_emit:
+ option_selected.emit(selected, false)
diff --git a/game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd
new file mode 100644
index 0000000..945d35b
--- /dev/null
+++ b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd
@@ -0,0 +1,27 @@
+extends SettingOptionButton
+class_name SettingRevertButton
+
+@export_group("Nodes")
+@export var revert_dialog : ResolutionRevertDialog
+
+var previous_index : int = -1
+
+func _ready():
+ super()
+ if revert_dialog != null:
+ revert_dialog.visibility_changed.connect(_on_revert_dialog_visibility_changed)
+ revert_dialog.dialog_accepted.connect(_on_accepted)
+ revert_dialog.dialog_reverted.connect(_on_reverted)
+
+func _on_revert_dialog_visibility_changed() -> void:
+ disabled = revert_dialog.visible
+ if not revert_dialog.visible:
+ previous_index = -1
+
+func _on_reverted(button : SettingRevertButton) -> void:
+ if button != self: return
+ selected = previous_index
+ option_selected.emit(selected, false)
+
+func _on_accepted(button : SettingRevertButton) -> void:
+ if button != self: return