popover_menu.rs

 1use gpui::{div, overlay, px, AnyElement, Div, ParentElement, RenderOnce, Styled, WindowContext};
 2use smallvec::SmallVec;
 3
 4use crate::{prelude::*, Popover};
 5
 6// 🚧 Under Construction
 7
 8#[derive(IntoElement)]
 9pub struct PopoverMenu {
10    trigger: AnyElement,
11    children: SmallVec<[AnyElement; 2]>,
12}
13
14impl RenderOnce for PopoverMenu {
15    type Rendered = Div;
16
17    fn render(self, _cx: &mut WindowContext) -> Self::Rendered {
18        div()
19            .bg(gpui::green())
20            .relative()
21            .child(div().bg(gpui::blue()).child(self.trigger))
22            .child(
23                overlay()
24                    .position(gpui::Point {
25                        x: px(100.),
26                        y: px(100.),
27                    })
28                    .anchor(gpui::AnchorCorner::TopRight)
29                    .child(Popover::new().children(self.children)),
30            )
31    }
32}
33
34impl PopoverMenu {
35    pub fn new(trigger: AnyElement) -> Self {
36        Self {
37            trigger,
38            children: SmallVec::new(),
39        }
40    }
41}
42
43impl ParentElement for PopoverMenu {
44    fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]> {
45        &mut self.children
46    }
47}