class_name MainMenuUI extends Control signal host_pressed(nickname: String, skin: String) signal join_pressed(nickname: String, skin: String, address: String) signal quit_pressed const SKIN_OPTIONS: Array[String] = ["Blue", "Yellow", "Green", "Red"] const SAFE_AREA_MARGIN := 24.0 @onready var skin_input: OptionButton = $MainContainer/MainMenu/Option2/SkinInput @onready var nick_input: LineEdit = $MainContainer/MainMenu/Option1/NickInput @onready var address_input: LineEdit = $MainContainer/MainMenu/Option3/AddressInput @onready var main_container: VBoxContainer = $MainContainer func _ready() -> void: skin_input.clear() for skin_name in SKIN_OPTIONS: skin_input.add_item(skin_name) skin_input.select(0) resized.connect(_update_responsive_layout) call_deferred("_update_responsive_layout") func _on_host_pressed() -> void: var nickname = nick_input.text.strip_edges() var skin = get_skin() host_pressed.emit(nickname, skin) func _on_join_pressed() -> void: var nickname = nick_input.text.strip_edges() var skin = get_skin() var address = address_input.text.strip_edges() join_pressed.emit(nickname, skin, address) func _on_quit_pressed(): quit_pressed.emit() func show_menu(): show() call_deferred("_update_responsive_layout") func hide_menu(): hide() func is_menu_visible() -> bool: return visible func _update_responsive_layout() -> void: if not main_container: return var available_size := Vector2( maxf(1.0, size.x - SAFE_AREA_MARGIN * 2.0), maxf(1.0, size.y - SAFE_AREA_MARGIN * 2.0) ) var content_size := main_container.get_combined_minimum_size() if content_size.x <= 0.0 or content_size.y <= 0.0: return var scale_factor := minf(1.0, minf(available_size.x / content_size.x, available_size.y / content_size.y)) main_container.pivot_offset = main_container.size * 0.5 main_container.scale = Vector2.ONE * scale_factor func get_skin() -> String: return skin_input.get_item_text(skin_input.selected).to_lower()