Added menu settings add-on

This commit is contained in:
2026-03-07 14:16:44 +01:00
parent 8b7a8e014f
commit df8c8c6c3b
70 changed files with 4053 additions and 1 deletions

View File

@@ -0,0 +1,96 @@
extends SettingsElement
class_name SliderElement
## A settings element specifically for elements that have a slider.
# Default values for the element
@export var MIN_VALUE: float = 0
@export var MAX_VALUE: float = 1
@export var STEP_VALUE: float = 0.1
@export var DEFAULT_VALUE: float = 1
## If true, displays 0 to 100 instead of 0 to 1 in the settings,
## but the true value remains the same.
@export var DISPLAY_PERCENT_VALUE: bool = false
## An extra suffix for the value (optional).
@export var VALUE_SUFFIX: String = ""
## Reference to the slider of the element.
@export var SliderRef: HSlider
## Reference to the SpinBox or Label of the element.
@export var ValueBoxRef: Control
## Overwrite for SettingsElement.
func init_element() -> void:
init_slider(100 if DISPLAY_PERCENT_VALUE else 1)
## Called to initialize the slider element.
func init_slider(FACTOR: float) -> void:
# Apply the min/max/step/current value of the SliderRef
SliderRef.set_min(MIN_VALUE * FACTOR)
SliderRef.set_max(MAX_VALUE * FACTOR)
SliderRef.set_step(STEP_VALUE * FACTOR)
SliderRef.set_value(currentValue * FACTOR)
# Connect the value changed signal for the SliderRef
if not SliderRef.is_connected("value_changed", slider_value_changed):
SliderRef.connect("value_changed", slider_value_changed.bind(FACTOR))
# Check if the value box is a spin box or a label
if ValueBoxRef is SpinBox:
# Apply the min/max/step/current value of the spin box
ValueBoxRef.set_min(MIN_VALUE * FACTOR)
ValueBoxRef.set_max(MAX_VALUE * FACTOR)
ValueBoxRef.set_step(STEP_VALUE * FACTOR)
ValueBoxRef.set_value(currentValue * FACTOR)
# Add caret blink to spin box
ValueBoxRef.get_line_edit().set_caret_blink_enabled(true)
ValueBoxRef.set_suffix(VALUE_SUFFIX)
# Connect the value changed signal of the spin box
if not ValueBoxRef.is_connected("value_changed", value_box_value_changed):
ValueBoxRef.connect("value_changed", value_box_value_changed)
else:
# Set the text as the current value
ValueBoxRef.set_text(str(currentValue) + VALUE_SUFFIX)
## Gets the valid values from the element to be used for validating data.
func get_valid_values() -> Dictionary:
# Check if value is out of bounds
if DEFAULT_VALUE > MAX_VALUE or DEFAULT_VALUE < MIN_VALUE:
push_warning("Invalid default value for element '" + IDENTIFIER + "'.")
DEFAULT_VALUE = clampf(DEFAULT_VALUE, MIN_VALUE, MAX_VALUE)
return {
"defaultValue": DEFAULT_VALUE,
"minValue": MIN_VALUE,
"maxValue": MAX_VALUE,
}
## Used to update values of the section cache the element is under.
func value_changed(value: float) -> void:
# Check if the settings menu is open
if ParentRef.settingsCache_.size() > 0:
ParentRef.settingsCache_[IDENTIFIER] = value
# Check if the new value is different than the saved value
ParentRef.settings_changed(IDENTIFIER)
currentValue = value
func slider_value_changed(value: float, FACTOR: float) -> void:
if ValueBoxRef is SpinBox:
ValueBoxRef.set_value(value)
else:
ValueBoxRef.set_text(str(value) + VALUE_SUFFIX)
value_changed(value / FACTOR)
func value_box_value_changed(value: float) -> void:
SliderRef.set_value(value)