Added menu settings add-on
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
extends Control
|
||||
class_name SettingsMenu
|
||||
|
||||
## Emitted when the settings menu is made visible.
|
||||
signal settings_menu_opened
|
||||
## Emitted when the apply button is pressed.
|
||||
signal apply_button_pressed
|
||||
## Emitted when the settings menu is hidden.
|
||||
signal settings_menu_closed
|
||||
## Emitted when changes are discarded.
|
||||
signal changes_discarded
|
||||
|
||||
## Used to check if gameplay related settings should be applied
|
||||
@export var IS_IN_GAME_MENU: bool = true
|
||||
## Reference to the parent node of the menu UI.
|
||||
## The node this references will get set visible when pressing the back button.
|
||||
@export var MenuPanelRef: Node
|
||||
## List of settings sections that should be left out of the settings menu instance.
|
||||
@export var IGNORED_SECTIONS_: Array[String]
|
||||
|
||||
|
||||
@onready var DiscardChangesRef: PanelContainer = $DiscardChangesPopup
|
||||
@onready var SettingsPanelRef: VBoxContainer = $SettingsPanel
|
||||
@onready var ApplyButtonRef: Button = %ApplyButton
|
||||
|
||||
var ElementPanelsRef: Control
|
||||
var SettingsTabsRef: TabContainer
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
ElementPanelsRef = $ElementPanels
|
||||
SettingsTabsRef = $SettingsPanel/SettingsTabs
|
||||
ignore_sections()
|
||||
|
||||
|
||||
func _ready():
|
||||
# Load the settings menu
|
||||
SettingsDataManager.call_deferred("emit_signal", "settings_retrieved")
|
||||
|
||||
|
||||
func on_back_button_pressed() -> void:
|
||||
# Check if there have been any changes made
|
||||
if ApplyButtonRef.is_disabled():
|
||||
hide()
|
||||
MenuPanelRef.show()
|
||||
# Clear the settings cache
|
||||
emit_signal("settings_menu_closed")
|
||||
else:
|
||||
# Display the discard changes popup
|
||||
display_discard_changes(self)
|
||||
|
||||
|
||||
func on_apply_button_pressed() -> void:
|
||||
ApplyButtonRef.set_disabled(true)
|
||||
# Apply the settings of each section
|
||||
emit_signal("apply_button_pressed")
|
||||
# Save the updated settings data
|
||||
SettingsDataManager.call_deferred("save_data")
|
||||
# Reset the changed elements count
|
||||
SettingsDataManager.changedElementsCount = 0
|
||||
|
||||
|
||||
func on_visibility_changed() -> void:
|
||||
if is_visible_in_tree():
|
||||
emit_signal("settings_menu_opened")
|
||||
|
||||
|
||||
# Called to discard the changes in the settings menu
|
||||
func discard_changes() -> void:
|
||||
emit_signal("changes_discarded")
|
||||
for SectionRef in SettingsTabsRef.get_children():
|
||||
SectionRef.discard_changes()
|
||||
|
||||
|
||||
func display_discard_changes(CallerRef: Control) -> void:
|
||||
DiscardChangesRef.show()
|
||||
DiscardChangesRef.CallerRef = CallerRef
|
||||
|
||||
|
||||
func ignore_sections() -> void:
|
||||
for SectionRef in SettingsTabsRef.get_children():
|
||||
if IGNORED_SECTIONS_.has(SectionRef.IDENTIFIER):
|
||||
SectionRef.queue_free()
|
||||
Reference in New Issue
Block a user