124 lines
4.2 KiB
GDScript
124 lines
4.2 KiB
GDScript
extends Control
|
|
class_name SettingsSection
|
|
## The base script for settings sections.
|
|
|
|
## Emitted when the apply button is pressed.
|
|
signal apply_button_pressed
|
|
## Emitted when a setting has it's value changed.
|
|
signal setting_changed(elementId: String)
|
|
|
|
## Identifier for the section.
|
|
## This value is used as the key in the settings data.
|
|
@export var IDENTIFIER: String
|
|
|
|
## Reference to the settings menu node.
|
|
var SettingsMenuRef: SettingsMenu
|
|
|
|
## Reference table of all elements under the section.
|
|
var ELEMENT_REFERENCE_TABLE_: Dictionary
|
|
## Cache of all the settings values for the section.
|
|
var settingsCache_: Dictionary
|
|
## A list of all the elements that were changed since the settings were last applied.
|
|
var changedElements_: Array[String]
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
SettingsMenuRef = owner
|
|
|
|
|
|
func _ready():
|
|
# Connect neccessary signals from the central root node for the settings
|
|
SettingsMenuRef.connect("settings_menu_opened", get_settings)
|
|
SettingsMenuRef.connect("apply_button_pressed", on_apply_settings)
|
|
SettingsMenuRef.connect("settings_menu_closed", clear_cache)
|
|
|
|
# Add a reference of the section to the reference table
|
|
SettingsDataManager.SECTION_REFERENCE_TABLE_[IDENTIFIER] = self
|
|
|
|
# Check if a save file exists
|
|
if SettingsDataManager.noSaveFile:
|
|
# Add the section to the settings data dictionary
|
|
SettingsDataManager.settingsData_[IDENTIFIER] = {}
|
|
|
|
|
|
## Called when opening the settings menu to fill the settings cache.
|
|
func get_settings() -> void:
|
|
# Copy the settings data for the section into it's cache
|
|
settingsCache_ =\
|
|
SettingsDataManager.settingsData_[IDENTIFIER].duplicate(true)
|
|
|
|
# If no save file exists saves the default values retrieved from the section's elements
|
|
if SettingsDataManager.noSaveFile or SettingsDataManager.invalidSaveFile:
|
|
SettingsDataManager.call_deferred("save_data")
|
|
|
|
# Clear the changed elements array
|
|
changedElements_.clear()
|
|
|
|
|
|
## Called to clear the section's cache.
|
|
func clear_cache() -> void:
|
|
settingsCache_.clear()
|
|
|
|
|
|
## Called when a setting has been changed.
|
|
func settings_changed(elementId: String) -> void:
|
|
SettingsMenuRef.ApplyButtonRef.set_disabled(check_for_changes(elementId))
|
|
emit_signal("setting_changed", elementId)
|
|
|
|
|
|
## Called to check for changes between the cache and the settings data.
|
|
func check_for_changes(elementId: String) -> bool:
|
|
var cacheValue = settingsCache_[elementId]
|
|
var savedValue = SettingsDataManager.settingsData_[IDENTIFIER][elementId]
|
|
# Check if there are differences between the cache and the settings data
|
|
if cacheValue == savedValue:
|
|
# Check if the element is on the changed elements list
|
|
if changedElements_.has(elementId):
|
|
# Remove the element from the list
|
|
changedElements_.erase(elementId)
|
|
# Decrease the changed elements count
|
|
SettingsDataManager.changedElementsCount -= 1
|
|
|
|
# Check if there are any other changed elements
|
|
if SettingsDataManager.changedElementsCount == 0:
|
|
# Disabled the apply button
|
|
return true
|
|
|
|
# Check if the element is not the changed elements list
|
|
if not changedElements_.has(elementId):
|
|
# Add the element to the list
|
|
changedElements_.append(elementId)
|
|
# Increase the changed elements count
|
|
SettingsDataManager.changedElementsCount += 1
|
|
|
|
# Enable the apply button
|
|
return false
|
|
|
|
|
|
## Called to saved the data in the section's cache to the settings data
|
|
## and apply the settings to the game.
|
|
func on_apply_settings() -> void:
|
|
# Check if any of the sections elements have been changed
|
|
if changedElements_.size() > 0:
|
|
# Copy the section cache into the settings data dictionary
|
|
SettingsDataManager.settingsData_[IDENTIFIER] = settingsCache_.duplicate(true)
|
|
|
|
# Apply the settings for the changed elements
|
|
for element in changedElements_:
|
|
ELEMENT_REFERENCE_TABLE_[element]._apply_settings()
|
|
|
|
# Clear the changed elements array
|
|
changedElements_.clear()
|
|
|
|
|
|
## Called to discard changes that have been made since the last save.
|
|
func discard_changes() -> void:
|
|
# Check if any of the sections elements have been changed
|
|
if changedElements_.size() > 0:
|
|
# Load the saved settings for each element in the section
|
|
for element in changedElements_:
|
|
ELEMENT_REFERENCE_TABLE_[element].load_settings()
|
|
|
|
# Clear the changed elements array
|
|
changedElements_.clear()
|