use gpui::{AnyView, Corner, Entity, ManagedView}; use crate::{prelude::*, PopoverMenu, PopoverMenuHandle, PopoverTrigger}; pub trait TriggerablePopover: ManagedView { fn menu_handle( &mut self, window: &mut Window, cx: &mut gpui::Context, ) -> PopoverMenuHandle; } pub struct PopoverButton { selector: Entity, button: B, tooltip: F, corner: Corner, } impl PopoverButton { pub fn new(selector: Entity, corner: Corner, button: B, tooltip: F) -> Self where F: Fn(&mut Window, &mut App) -> AnyView + 'static, { Self { selector, button, tooltip, corner, } } } impl RenderOnce for PopoverButton where F: Fn(&mut Window, &mut App) -> AnyView + 'static, { fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { let menu_handle = self .selector .update(cx, |selector, cx| selector.menu_handle(window, cx)); PopoverMenu::new("popover-button") .menu({ let selector = self.selector.clone(); move |_window, _cx| Some(selector.clone()) }) .trigger_with_tooltip(self.button, self.tooltip) .anchor(self.corner) .with_handle(menu_handle) .offset(gpui::Point { x: px(0.0), y: px(-2.0), }) } }