diff --git a/crates/ui2/src/components/context_menu.rs b/crates/ui2/src/components/context_menu.rs index 45e1d40bcc9c4ad4cdc9eedc038268233eee1ab7..5096f37c6d7757c3701eaa3ae1feb63b7551731c 100644 --- a/crates/ui2/src/components/context_menu.rs +++ b/crates/ui2/src/components/context_menu.rs @@ -1,14 +1,13 @@ use crate::{prelude::*, ListItemVariant}; use crate::{v_stack, Label, List, ListEntry, ListItem, ListSeparator, ListSubHeader}; -#[derive(Clone)] -pub enum ContextMenuItem { +pub enum ContextMenuItem { Header(SharedString), Entry(Label), Separator, } -impl ContextMenuItem { +impl ContextMenuItem { fn to_list_item(self) -> ListItem { match self { ContextMenuItem::Header(label) => ListSubHeader::new(label).into(), @@ -33,11 +32,11 @@ impl ContextMenuItem { } #[derive(Element)] -pub struct ContextMenu { +pub struct ContextMenu { items: Vec>, } -impl ContextMenu { +impl ContextMenu { pub fn new(items: impl IntoIterator>) -> Self { Self { items: items.into_iter().collect(), @@ -54,8 +53,7 @@ impl ContextMenu { .child( List::new( self.items - .clone() - .into_iter() + .drain(..) .map(ContextMenuItem::to_list_item) .collect(), ) diff --git a/crates/ui2/src/components/list.rs b/crates/ui2/src/components/list.rs index 6d37521d17ab57863c76d13b680efd8465ded470..ab0c3901107c09a82499836f0822227f993538c6 100644 --- a/crates/ui2/src/components/list.rs +++ b/crates/ui2/src/components/list.rs @@ -14,8 +14,8 @@ pub enum ListItemVariant { Inset, } -#[derive(Element, Clone)] -pub struct ListHeader { +#[derive(Element)] +pub struct ListHeader { state_type: PhantomData, label: SharedString, left_icon: Option, @@ -24,7 +24,7 @@ pub struct ListHeader { toggleable: Toggleable, } -impl ListHeader { +impl ListHeader { pub fn new(label: impl Into) -> Self { Self { state_type: PhantomData, @@ -133,15 +133,15 @@ impl ListHeader { } } -#[derive(Element, Clone)] -pub struct ListSubHeader { +#[derive(Element)] +pub struct ListSubHeader { state_type: PhantomData, label: SharedString, left_icon: Option, variant: ListItemVariant, } -impl ListSubHeader { +impl ListSubHeader { pub fn new(label: impl Into) -> Self { Self { state_type: PhantomData, @@ -198,32 +198,32 @@ pub enum ListEntrySize { Medium, } -#[derive(Clone, Element)] -pub enum ListItem { +#[derive(Element)] +pub enum ListItem { Entry(ListEntry), Separator(ListSeparator), Header(ListSubHeader), } -impl From> for ListItem { +impl From> for ListItem { fn from(entry: ListEntry) -> Self { Self::Entry(entry) } } -impl From> for ListItem { +impl From> for ListItem { fn from(entry: ListSeparator) -> Self { Self::Separator(entry) } } -impl From> for ListItem { +impl From> for ListItem { fn from(entry: ListSubHeader) -> Self { Self::Header(entry) } } -impl ListItem { +impl ListItem { fn render(&mut self, view: &mut S, cx: &mut ViewContext) -> impl Element { match self { ListItem::Entry(entry) => div().child(entry.render(view, cx)), @@ -245,11 +245,11 @@ impl ListItem { } } -#[derive(Element, Clone)] -pub struct ListEntry { +#[derive(Element)] +pub struct ListEntry { disclosure_control_style: DisclosureControlVisibility, indent_level: u32, - label: Label, + label: Option>, left_content: Option, variant: ListItemVariant, size: ListEntrySize, @@ -257,12 +257,12 @@ pub struct ListEntry { toggle: Option, } -impl ListEntry { +impl ListEntry { pub fn new(label: Label) -> Self { Self { disclosure_control_style: DisclosureControlVisibility::default(), indent_level: 0, - label, + label: Some(label), variant: ListItemVariant::default(), left_content: None, size: ListEntrySize::default(), @@ -411,7 +411,7 @@ impl ListEntry { .relative() .children(self.disclosure_control(cx)) .children(left_content) - .child(self.label.clone()), + .children(self.label.take()), ) } } @@ -436,14 +436,14 @@ impl ListSeparator { } #[derive(Element)] -pub struct List { +pub struct List { items: Vec>, empty_message: SharedString, header: Option>, toggleable: Toggleable, } -impl List { +impl List { pub fn new(items: Vec>) -> Self { Self { items, @@ -475,7 +475,7 @@ impl List { let list_content = match (self.items.is_empty(), is_toggled) { (_, false) => div(), - (false, _) => div().children(self.items.iter().cloned()), + (false, _) => div().children(self.items.drain(..)), (true, _) => { div().child(Label::new(self.empty_message.clone()).color(LabelColor::Muted)) } @@ -485,7 +485,7 @@ impl List { .py_1() .children( self.header - .clone() + .take() .map(|header| header.set_toggleable(self.toggleable)), ) .child(list_content) diff --git a/crates/ui2/src/elements/label.rs b/crates/ui2/src/elements/label.rs index 4f0ba5994b9b453fd72ace1b937ff7331bd727ad..cee964df12a2a8c5a0172f223a3b0296c08ede4f 100644 --- a/crates/ui2/src/elements/label.rs +++ b/crates/ui2/src/elements/label.rs @@ -48,8 +48,8 @@ pub enum LineHeightStyle { UILabel, } -#[derive(Element, Clone)] -pub struct Label { +#[derive(Element)] +pub struct Label { state_type: PhantomData, label: SharedString, line_height_style: LineHeightStyle, @@ -57,7 +57,7 @@ pub struct Label { strikethrough: bool, } -impl Label { +impl Label { pub fn new(label: impl Into) -> Self { Self { state_type: PhantomData,