MusicListPanel, PlayersPanel (was Players) and InspirationList (was ScrollContainer) each get their own scene and script. They report what happens through signals, and the quiz wires them to the playlist, the music player, the log and the popups. Every node keeps its place on screen. Screenshots of every UI state are pixel-identical to before, the layout test still matches the original baseline, and each part is tested on its own as well as through the quiz.
91 lines
3.3 KiB
GDScript
91 lines
3.3 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: Player, player_name: String)
|
|
|
|
var _player_row: PackedScene = preload("res://Player.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:
|
|
print("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:
|
|
print("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:
|
|
print("load_players")
|
|
Settings.delete_children(players_list_container)
|
|
var counter: int = 0
|
|
for player_object: PlayerObject in Settings.player_array:
|
|
print(player_object.player_name)
|
|
|
|
var new_player: Player = _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: Player, player_name: String) -> void:
|
|
change_character_requested.emit(row, player_name)
|
|
|
|
|
|
func _on_player_removed(player_object: PlayerObject) -> void:
|
|
print("_on_player_removed ", player_object.player_name)
|
|
Settings.player_array.erase(player_object)
|
|
reload()
|
|
player_removed.emit(player_object)
|