Files
MusicPlayer/players_panel.gd
T
Sansan 390da577d7 Name popups *Popup and give scripts, scenes and classes matching names
Every popup is now called *Popup instead of *Window in its file, root node,
node name, class and variable, and PopupWindow becomes BasePopup. Player is
PlayerRow, SongListObject is SongRow and Character is CharacterCard. Script
files are snake_case and scene files PascalCase, each matching its class or
root node, and LightGrayTheme.tres is light_gray_theme.tres.
2026-10-06 11:22:39 +02:00

91 lines
3.2 KiB
GDScript

class_name PlayersPanel
extends PanelContainer
## The players and their points, with a row for adding new players.
##
## The players themselves live in [code]Settings.player_array[/code]; this panel shows
## them and adds and removes them there.
## Emitted when a player has been added to [code]Settings.player_array[/code], before
## the list shows it.
signal player_added(player_object: PlayerObject)
## Emitted when a player has been removed from [code]Settings.player_array[/code].
signal player_removed(player_object: PlayerObject)
## Emitted when the character button in [param row] is pressed.
signal change_character_requested(row: PlayerRow, player_name: String)
var _player_row: PackedScene = preload("res://PlayerRow.tscn")
@onready
var add_players_button: TextureButton = $VBoxContainer/HBoxContainer/AddPlayersButton
@onready
var add_player_container: HBoxContainer = $VBoxContainer/AddPlayerContainer
@onready
var add_player_button: Button = $VBoxContainer/AddPlayerContainer/AddPlayerButton
@onready
var new_player_name_field: TextEdit = $VBoxContainer/AddPlayerContainer/PlayerNameField
@onready
var players_list_container: VBoxContainer = $VBoxContainer/ScrollContainer/PlayersListVBoxContainer
func _ready() -> void:
add_players_button.pressed.connect(add_players)
add_player_button.pressed.connect(add_player)
new_player_name_field.connect("enter_key_pressed", add_player)
## Shows or hides the row for adding players, and the buttons for removing them.
func add_players() -> void:
GameLog.debug("add_players")
Settings.edit_players = !Settings.edit_players
add_player_container.visible = !add_player_container.visible
new_player_name_field.grab_focus()
## Adds a player with the name in the name field, unless it is empty or there are
## already as many players as there can be.
func add_player() -> void:
GameLog.debug("add_player")
if new_player_name_field.text != "" && Settings.player_array.size() < Settings.MAX_NUMBER_OF_PLAYERS:
var new_player_object: PlayerObject = PlayerObject.new(new_player_name_field.text)
new_player_name_field.text = ""
Settings.player_array.append(new_player_object)
player_added.emit(new_player_object)
reload()
## Shows the players in [code]Settings.player_array[/code] again, e.g. after their
## points were reset.
func reload() -> void:
GameLog.debug("load_players")
Settings.delete_children(players_list_container)
var counter: int = 0
for player_object: PlayerObject in Settings.player_array:
GameLog.debug(player_object.player_name)
var new_player: PlayerRow = _player_row.instantiate()
new_player.player_object = player_object
new_player.list_index = counter
new_player.connect("change_character_clicked", _on_change_character_clicked.bind(new_player, player_object.player_name))
new_player.connect("player_removed", _on_player_removed.bind(player_object))
players_list_container.add_child(new_player)
counter += 1
func _on_change_character_clicked(row: PlayerRow, player_name: String) -> void:
change_character_requested.emit(row, player_name)
func _on_player_removed(player_object: PlayerObject) -> void:
GameLog.debug("_on_player_removed ", player_object.player_name)
Settings.player_array.erase(player_object)
reload()
player_removed.emit(player_object)