Randoloot/scripts/ui/options_dialog.gd
2026-10-27 22:20:01 +01:00

96 lines
3.8 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends "res://scripts/ui/menu_modal.gd"
var _volume: HSlider
var _music: HSlider
var _resolution: OptionButton
var _language: OptionButton
var _fullscreen: CheckButton
var _error: Label
func _ready() -> void:
heading = "OPCJE"
subtitle = "Dostosuj dźwięk, ekran i język swojej wyprawy."
marker = "USTAWIENIA / KOMPUTER POKŁADOWY"
preferred_size = Vector2(800,650)
super._ready()
var audio := _section("01 / DŹWIĘK")
_volume = _slider(audio,"Głośność ogólna",GameSettings.volume)
_music = _slider(audio,"Głośność muzyki",GameSettings.music_volume)
var columns := HBoxContainer.new()
columns.add_theme_constant_override("separation",16)
body.add_child(columns)
var display := _section("02 / OBRAZ",columns)
label(display,tr("Rozdzielczość"),12,MUTED)
_resolution = OptionButton.new()
_resolution.custom_minimum_size.y = 42
display.add_child(_resolution)
input_style(_resolution)
for value in GameSettings.RESOLUTIONS: _resolution.add_item("%d × %d" % [value.x,value.y])
_resolution.select(maxi(0,GameSettings.RESOLUTIONS.find(GameSettings.resolution)))
_fullscreen = CheckButton.new()
_fullscreen.text = tr("Pełny ekran")
_fullscreen.button_pressed = GameSettings.fullscreen
_fullscreen.add_theme_font_override("font",ThemeDB.fallback_font)
_fullscreen.add_theme_font_size_override("font_size",14)
display.add_child(_fullscreen)
var language := _section("03 / JĘZYK",columns)
label(language,tr("Język interfejsu"),12,MUTED)
_language = OptionButton.new()
_language.custom_minimum_size.y = 42
language.add_child(_language)
input_style(_language)
for name in GameSettings.LANGUAGES: _language.add_item(name)
_language.select(GameSettings.LOCALES.find(GameSettings.locale))
var note := label(language,tr("Ustawienia są zapamiętywane między uruchomieniami."),12,MUTED)
note.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
for select in [_resolution,_language]:
select.get_popup().add_theme_stylebox_override("panel",box(Color("102431"),Color("416471"),10))
select.get_popup().add_theme_font_override("font",ThemeDB.fallback_font)
_error = label(body,"",12,Color("ef9e8b"))
_error.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
button(footer,tr("Anuluj"),_close)
button(footer,tr("Zastosuj"),_apply,true)
func _section(caption: String, parent: Node = null) -> VBoxContainer:
var card := PanelContainer.new()
card.size_flags_horizontal = Control.SIZE_EXPAND_FILL
card.add_theme_stylebox_override("panel",box(Color("0e202d"),Color("263e4a"),16))
(parent if parent != null else body).add_child(card)
var column := VBoxContainer.new()
column.add_theme_constant_override("separation",14)
card.add_child(column)
label(column,tr(caption),11,GOLD)
return column
func _slider(parent: Node, caption: String, value: float) -> HSlider:
var row := HBoxContainer.new()
row.add_theme_constant_override("separation",18)
parent.add_child(row)
var title := label(row,tr(caption),14)
title.custom_minimum_size.x = 174
var slider := HSlider.new()
slider.max_value = 100
slider.step = 1
slider.value = roundf(value*100)
slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
slider.custom_minimum_size = Vector2(120,28)
row.add_child(slider)
var percentage := label(row,"%d%%" % slider.value,16,GOLD)
percentage.custom_minimum_size.x = 48
percentage.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
slider.value_changed.connect(func(amount: float) -> void: percentage.text = "%d%%" % amount)
return slider
func _apply() -> void:
GameSettings.volume = _volume.value/100.0
GameSettings.music_volume = _music.value/100.0
GameSettings.resolution = GameSettings.RESOLUTIONS[_resolution.selected]
GameSettings.fullscreen = _fullscreen.button_pressed
GameSettings.locale = GameSettings.LOCALES[_language.selected]
GameSettings.apply()
if GameSettings.save_settings() != OK:
_error.text = tr("Nie udało się zapisać ustawień.")
return
_close()