1use gpui::AnyElement;
2use smallvec::SmallVec;
3use ui::prelude::*;
4
5#[derive(IntoElement)]
6pub struct FacePile {
7 base: Div,
8 faces: SmallVec<[AnyElement; 2]>,
9}
10
11impl FacePile {
12 pub fn empty() -> Self {
13 Self::new(SmallVec::new())
14 }
15
16 pub fn new(faces: SmallVec<[AnyElement; 2]>) -> Self {
17 Self { base: div(), faces }
18 }
19}
20
21impl RenderOnce for FacePile {
22 fn render(self, _cx: &mut WindowContext) -> impl IntoElement {
23 // Lay the faces out in reverse so they overlap in the desired order (left to right, front to back)
24 self.base
25 .flex()
26 .flex_row_reverse()
27 .items_center()
28 .justify_start()
29 .children(
30 self.faces
31 .into_iter()
32 .enumerate()
33 .rev()
34 .map(|(ix, player)| div().when(ix > 0, |div| div.ml_neg_1()).child(player)),
35 )
36 }
37}
38
39impl ParentElement for FacePile {
40 fn extend(&mut self, elements: impl IntoIterator<Item = AnyElement>) {
41 self.faces.extend(elements);
42 }
43}
44
45impl Styled for FacePile {
46 fn style(&mut self) -> &mut gpui::StyleRefinement {
47 self.base.style()
48 }
49}