@tool extends VBoxContainer class_name AudioOption const MIN_VOLUME: float = 0.0 const MAX_VOLUME: float = 1.0 @export var image: Texture: set(value): image = value if is_inside_tree() and has_node("%Texture"): $%Texture.texture = image @export var bus_name: StringName = &"Master" @export_range(0.0, 1.0, 0.01) var default_volume: float = 1.0 @onready var slider: HSlider = $HSlider func _ready() -> void: if image != null and has_node("%Texture"): $%Texture.texture = image if Engine.is_editor_hint(): return slider.min_value = MIN_VOLUME slider.max_value = MAX_VOLUME slider.step = 0.01 slider.value_changed.connect(_on_slider_value_changed) AudioManager.volume_changed.connect(_on_audio_manager_volume_changed) refresh() func refresh() -> void: if not has_bus(): slider.set_value_no_signal(default_volume) slider.editable = false return slider.editable = true var saved_volume := AudioManager.get_audio_bus_volume(bus_name, default_volume) slider.set_value_no_signal(saved_volume) apply_current_value() func reset_to_default() -> void: slider.value = default_volume func apply_current_value() -> void: _set_bus_volume(slider.value) func has_bus() -> bool: return get_bus_index() != -1 func get_bus_index() -> int: return AudioServer.get_bus_index(bus_name) func _set_bus_volume(linear_value: float) -> void: if Engine.is_editor_hint(): return if not has_bus(): return var clamped_value := clampf(linear_value, MIN_VOLUME, MAX_VOLUME) AudioManager.set_audio_bus_volume(bus_name, clamped_value) func _on_slider_value_changed(value: float) -> void: _set_bus_volume(value) func _on_audio_manager_volume_changed(changed_bus_name: StringName, volume: float) -> void: if changed_bus_name == bus_name: slider.set_value_no_signal(volume)