facepile.rs

 1use std::marker::PhantomData;
 2
 3use crate::prelude::*;
 4use crate::{theme, Avatar, Player};
 5
 6#[derive(Element)]
 7pub struct Facepile<S: 'static + Send + Sync> {
 8    state_type: PhantomData<S>,
 9    players: Vec<Player>,
10}
11
12impl<S: 'static + Send + Sync> Facepile<S> {
13    pub fn new<P: Iterator<Item = Player>>(players: P) -> Self {
14        Self {
15            state_type: PhantomData,
16            players: players.collect(),
17        }
18    }
19
20    fn render(&mut self, cx: &mut ViewContext<S>) -> impl Element<State = S> {
21        let theme = theme(cx);
22        let player_count = self.players.len();
23        let player_list = self.players.iter().enumerate().map(|(ix, player)| {
24            let isnt_last = ix < player_count - 1;
25
26            div()
27                .when(isnt_last, |div| div.neg_mr_1())
28                .child(Avatar::new(player.avatar_src().to_string()))
29        });
30        div().p_1().flex().items_center().children(player_list)
31    }
32}