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))