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}