use crate::prelude::*; use crate::theme::theme; use crate::{ v_stack, Label, List, ListEntry, ListItem, ListItemVariant, ListSeparator, ListSubHeader, }; #[derive(Clone)] pub enum ContextMenuItem { Header(&'static str), Entry(Label), Separator, } impl ContextMenuItem { fn to_list_item(self) -> ListItem { match self { ContextMenuItem::Header(label) => ListSubHeader::new(label).into(), ContextMenuItem::Entry(label) => { ListEntry::new(label).variant(ListItemVariant::Inset).into() } ContextMenuItem::Separator => ListSeparator::new().into(), } } pub fn header(label: &'static str) -> Self { Self::Header(label) } pub fn separator() -> Self { Self::Separator } pub fn entry(label: Label) -> Self { Self::Entry(label) } } #[derive(Element)] pub struct ContextMenu { items: Vec, } impl ContextMenu { pub fn new(items: impl IntoIterator) -> Self { Self { items: items.into_iter().collect(), } } fn render(&mut self, view: &mut V, cx: &mut ViewContext) -> impl IntoElement { let theme = theme(cx); v_stack() .flex() .fill(theme.lowest.base.default.background) .border() .border_color(theme.lowest.base.default.border) .child( List::new( self.items .clone() .into_iter() .map(ContextMenuItem::to_list_item) .collect(), ) .set_toggle(ToggleState::Toggled), ) //div().p_1().children(self.items.clone()) } }