face_pile.rs

 1use gpui::{
 2    div, AnyElement, Div, IntoElement as _, ParentElement as _, RenderOnce, Styled, WindowContext,
 3};
 4
 5#[derive(Default)]
 6pub struct FacePile {
 7    pub faces: Vec<AnyElement>,
 8}
 9
10impl RenderOnce for FacePile {
11    type Rendered = Div;
12
13    fn render(self, _: &mut WindowContext) -> Self::Rendered {
14        let player_count = self.faces.len();
15        let player_list = self.faces.into_iter().enumerate().map(|(ix, player)| {
16            let isnt_last = ix < player_count - 1;
17
18            div().when(isnt_last, |div| div.neg_mr_1()).child(player)
19        });
20        div().p_1().flex().items_center().children(player_list)
21    }
22}
23
24// impl Element for FacePile {
25//     type State = ();
26//     fn layout(
27//         &mut self,
28//         state: Option<Self::State>,
29//         cx: &mut WindowContext,
30//     ) -> (LayoutId, Self::State) {
31//         let mut width = 0.;
32//         let mut max_height = 0.;
33//         let mut faces = Vec::with_capacity(self.faces.len());
34//         for face in &mut self.faces {
35//             let layout = face.layout(cx);
36//             width += layout.x();
37//             max_height = f32::max(max_height, layout.y());
38//             faces.push(layout);
39//         }
40//         width -= self.overlap * self.faces.len().saturating_sub(1) as f32;
41//         (cx.request_layout(&Style::default(), faces), ())
42//         // (
43//         //     Vector2F::new(width, max_height.clamp(1., constraint.max.y())),
44//         //     (),
45//         // ))
46//     }
47
48//     fn paint(
49//         &mut self,
50//         bounds: RectF,
51//         visible_bounds: RectF,
52//         _layout: &mut Self::LayoutState,
53//         view: &mut V,
54//         cx: &mut ViewContext<V>,
55//     ) -> Self::PaintState {
56//         let visible_bounds = bounds.intersection(visible_bounds).unwrap_or_default();
57
58//         let origin_y = bounds.upper_right().y();
59//         let mut origin_x = bounds.upper_right().x();
60
61//         for face in self.faces.iter_mut().rev() {
62//             let size = face.size();
63//             origin_x -= size.x();
64//             let origin_y = origin_y + (bounds.height() - size.y()) / 2.0;
65
66//             cx.scene().push_layer(None);
67//             face.paint(vec2f(origin_x, origin_y), visible_bounds, view, cx);
68//             cx.scene().pop_layer();
69//             origin_x += self.overlap;
70//         }
71
72//         ()
73//     }
74// }
75
76impl Extend<AnyElement> for FacePile {
77    fn extend<T: IntoIterator<Item = AnyElement>>(&mut self, children: T) {
78        self.faces.extend(children);
79    }
80}