Files
TheTree_mock/scripts/ui/ui_audio_settings_dialog.gd
T
Takeshi b84bade045 Save The Tree implementation and acceptance work in progress
Preserve production code, regression fixtures, audio assets and provenance, test infrastructure, and the original-completion plan and progress ledger. Final game and Windows acceptance remain pending; excluded local artifacts and native experiments are not part of this snapshot.
2026-10-11 15:58:00 +09:00

107 lines
3.3 KiB
GDScript

class_name UIAudioSettingsDialog
extends AcceptDialog
var _feedback: Variant
var _style_button: Callable
var _refreshing := false
var master_slider: HSlider
var ui_slider: HSlider
var mute_button: CheckButton
var status_label: Label
var _master_label: Label
var _ui_label: Label
func configure(feedback: Variant, style_button := Callable()) -> void:
_feedback = feedback
_style_button = style_button
func _ready() -> void:
name = "UIAudioSettingsDialog"
title = "音の設定"
ok_button_text = "設定を保存して閉じる"
var column := VBoxContainer.new()
column.add_theme_constant_override("separation", 12)
add_child(column)
_master_label = Label.new()
column.add_child(_master_label)
master_slider = _slider("MasterVolumeSlider")
column.add_child(master_slider)
_ui_label = Label.new()
column.add_child(_ui_label)
ui_slider = _slider("UIVolumeSlider")
column.add_child(ui_slider)
mute_button = CheckButton.new()
mute_button.name = "MuteAudioButton"
mute_button.text = "すべての音をミュート"
column.add_child(mute_button)
if _style_button.is_valid():
_style_button.call(mute_button)
_style_button.call(get_ok_button())
status_label = Label.new()
status_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
column.add_child(status_label)
master_slider.value_changed.connect(_on_volume_changed)
ui_slider.value_changed.connect(_on_volume_changed)
mute_button.toggled.connect(_on_mute_changed)
confirmed.connect(_save_settings)
refresh()
func _slider(node_name: String) -> HSlider:
var slider := HSlider.new()
slider.name = node_name
slider.min_value = 0.0
slider.max_value = 100.0
slider.step = 1.0
slider.custom_minimum_size.x = 340
return slider
func show_settings() -> void:
refresh()
popup_centered(Vector2i(440, 280))
func refresh() -> void:
if _feedback == null or master_slider == null:
return
_refreshing = true
master_slider.set_value_no_signal(float(_feedback.settings[&"master_volume"]) * 100.0)
ui_slider.set_value_no_signal(float(_feedback.settings[&"ui_volume"]) * 100.0)
mute_button.set_pressed_no_signal(bool(_feedback.settings[&"muted"]))
_refreshing = false
_refresh_labels()
status_label.text = "設定はすぐに音へ反映されます。保存すると次の起動でも使用します。"
if not _feedback.settings_writable:
status_label.text = "既存の設定を保護するため保存できません。今回の音量変更はこの起動中だけ有効です。"
get_ok_button().disabled = not _feedback.settings_writable
func _on_volume_changed(_value: float) -> void:
_update_settings()
func _on_mute_changed(_enabled: bool) -> void:
_update_settings()
func _update_settings() -> void:
if _refreshing or _feedback == null:
return
_feedback.update_settings({&"master_volume": master_slider.value / 100.0, &"ui_volume": ui_slider.value / 100.0, &"muted": mute_button.button_pressed})
_refresh_labels()
func _refresh_labels() -> void:
_master_label.text = "マスター音量 %d%%" % int(master_slider.value)
_ui_label.text = "UI操作音 %d%%" % int(ui_slider.value)
func _save_settings() -> void:
var result: Dictionary = _feedback.save_settings()
if not bool(result.get(&"ok", false)):
status_label.text = "音の設定を保存できませんでした。現在の音量はこの起動中だけ使用します。"
call_deferred(&"popup_centered", Vector2i(440, 280))