skullball/rust/src/ui/player_listing.rs
2026-07-23 23:40:43 +03:00

66 lines
1.8 KiB
Rust

use godot::{
classes::{HBoxContainer, IHBoxContainer, Label},
prelude::*,
};
use crate::game_manager::Game;
#[derive(GodotClass)]
#[class(base=HBoxContainer, init)]
pub struct PlayerListing {
#[export]
name_label: Option<Gd<Label>>,
#[export]
kills_label: Option<Gd<Label>>,
#[export]
deaths_label: Option<Gd<Label>>,
#[export]
ping_label: Option<Gd<Label>>,
pub player_id: Option<u16>,
base: Base<HBoxContainer>,
}
#[godot_api]
impl IHBoxContainer for PlayerListing {
fn ready(&mut self) {
self.update();
if let Some(game) = Game::singleton() {
game.signals()
.on_players_updated()
.connect_other(self, |s| s.update());
}
}
}
impl PlayerListing {
pub fn update(&mut self) {
if let Some(game) = Game::singleton() {
if let Some(player_id) = self.player_id
&& let Some(player) = game.bind().find_player(player_id)
{
if let Some(name_label) = &mut self.name_label {
name_label.set_text(&player.data.name);
}
if let Some(ping_label) = &mut self.ping_label {
ping_label.set_text(&player.data.ping.to_string());
}
} else {
if let Some(name_label) = &mut self.name_label {
name_label.set_text("Name");
}
if let Some(kills_label) = &mut self.kills_label {
kills_label.set_text("Kills");
}
if let Some(deaths_label) = &mut self.deaths_label {
deaths_label.set_text("Deaths");
}
if let Some(ping_label) = &mut self.ping_label {
ping_label.set_text("Ping");
}
}
}
}
}