use crate::prelude::*; use crate::{Avatar, Facepile, PlayerWithCallStatus}; #[derive(Element)] pub struct PlayerStack { player_with_call_status: PlayerWithCallStatus, } impl PlayerStack { pub fn new(player_with_call_status: PlayerWithCallStatus) -> Self { Self { player_with_call_status, } } fn render(&mut self, _: &mut V, cx: &mut ViewContext) -> impl IntoElement { let system_color = SystemColor::new(); let player = self.player_with_call_status.get_player(); self.player_with_call_status.get_call_status(); let followers = self .player_with_call_status .get_call_status() .followers .as_ref() .map(|followers| followers.clone()); // if we have no followers return a slightly different element // if mic_status == muted add a red ring to avatar div() .h_full() .flex() .flex_col() .gap_px() .justify_center() .child( div().flex().justify_center().w_full().child( div() .w_4() .h_0p5() .rounded_sm() .fill(player.cursor_color(cx)), ), ) .child( div() .flex() .items_center() .justify_center() .h_6() .pl_1() .rounded_lg() .fill(if followers.is_none() { system_color.transparent } else { player.selection_color(cx) }) .child(Avatar::new(player.avatar_src().to_string())) .children(followers.map(|followers| { div().neg_ml_2().child(Facepile::new(followers.into_iter())) })), ) } }