use godot::{ classes::{GridContainer, Label, OptionButton}, prelude::*, }; use crate::{game_manager::Game, team_resource::TeamResource}; #[derive(GodotClass)] #[class(base=GridContainer, init)] pub struct PlayerListing { #[export] pub name_label: Option>, #[export] pub ping_label: Option>, #[export] pub ready_label: Option>, #[export] pub team_dropdown: Option>, pub player_id: Option, base: Base, } impl PlayerListing { pub fn update(&mut self) { if let Some(player_id) = &self.player_id && let Some(game) = Game::singleton() && let Some(player) = game.bind().find_player(*player_id) { if let Some(player_label) = &mut self.name_label { player_label.set_text(&format!("{} ({})", player.name, player.connection_addr)); } if let Some(ready_label) = &mut self.ready_label { if player.ready { ready_label.set_text("Ready"); } else { ready_label.set_text("Not Ready"); } } if let Some(ping_label) = &mut self.ping_label { ping_label.set_text(&format!("({}ms)", player.ping)); } } } pub fn update_teams(&mut self, teams: Array>) { if let Some(dropdown) = &mut self.team_dropdown { let prev_selection = dropdown.get_selected(); dropdown.clear(); for team in teams.iter_shared() { dropdown.add_item(&team.bind().name); } dropdown.select(prev_selection); } } }