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.
107 lines
3.3 KiB
GDScript
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))
|