No moar toggleable

Conrad Irwin created

Change summary

crates/collab_ui2/src/collab_panel.rs           | 17 +++-----
crates/ui2/src/components/disclosure.rs         | 22 ++++-------
crates/ui2/src/components/list.rs               | 10 ++--
crates/ui2/src/components/list/list_header.rs   | 12 +++---
crates/ui2/src/components/list/list_item.rs     | 12 +++---
crates/ui2/src/components/stories/disclosure.rs |  6 +-
crates/ui2/src/toggleable.rs                    | 38 -------------------
crates/ui2/src/ui2.rs                           |  2 -
8 files changed, 34 insertions(+), 85 deletions(-)

Detailed changes

crates/collab_ui2/src/collab_panel.rs 🔗

@@ -179,8 +179,8 @@ use project::Fs;
 use serde_derive::{Deserialize, Serialize};
 use settings::{Settings, SettingsStore};
 use ui::{
-    h_stack, v_stack, Avatar, Button, Color, ContextMenu, Icon, IconButton, IconElement, IconSize, Label, List,
-    ListHeader, ListItem, Toggle, Tooltip,
+    h_stack, v_stack, Avatar, Button, Color, ContextMenu, Icon, IconButton, IconElement, IconSize,
+    Label, List, ListHeader, ListItem, Tooltip,
 };
 use util::{maybe, ResultExt, TryFutureExt};
 use workspace::{
@@ -2505,7 +2505,7 @@ impl CollabPanel {
             .when_some(button, |el, button| el.right_button(button))
             .selected(is_selected)
             .when(can_collapse, |el| {
-                el.toggle(ui::Toggle::Toggled(is_collapsed)).on_toggle(
+                el.toggle(Some(is_collapsed)).on_toggle(
                     cx.listener(move |this, _, cx| this.toggle_section_expanded(section, cx)),
                 )
             });
@@ -2757,9 +2757,8 @@ impl CollabPanel {
             .map(|channel| channel.visibility)
             == Some(proto::ChannelVisibility::Public);
         let other_selected = self.selected_channel().map(|channel| channel.id) == Some(channel.id);
-        let disclosed = has_children
-            .then(|| !self.collapsed_channels.binary_search(&channel.id).is_ok())
-            .unwrap_or(false);
+        let disclosed =
+            has_children.then(|| !self.collapsed_channels.binary_search(&channel.id).is_ok());
 
         let has_messages_notification = channel.unseen_message_id.is_some();
         let has_notes_notification = channel.unseen_note_version.is_some();
@@ -2874,11 +2873,7 @@ impl CollabPanel {
                                     ),
                             ),
                     )
-                    .toggle(if has_children {
-                        Toggle::Toggled(disclosed)
-                    } else {
-                        Toggle::NotToggleable
-                    })
+                    .toggle(disclosed)
                     .on_toggle(
                         cx.listener(move |this, _, cx| {
                             this.toggle_channel_collapsed(channel_id, cx)

crates/ui2/src/components/disclosure.rs 🔗

@@ -3,29 +3,22 @@ use std::rc::Rc;
 use gpui::ClickEvent;
 
 use crate::prelude::*;
-use crate::{Color, Icon, IconButton, IconSize, ToggleState, Toggleable};
+use crate::{Color, Icon, IconButton, IconSize};
 
 #[derive(IntoElement)]
 pub struct Disclosure {
-    state: ToggleState,
+    is_open: bool,
     on_toggle: Option<Rc<dyn Fn(&ClickEvent, &mut WindowContext) + 'static>>,
 }
 
 impl Disclosure {
-    pub fn new(state: ToggleState) -> Self {
+    pub fn new(is_open: bool) -> Self {
         Self {
-            state,
+            is_open,
             on_toggle: None,
         }
     }
 
-    pub fn from_toggleable(toggleable: Toggleable) -> Option<Self> {
-        match toggleable {
-            Toggleable::Toggleable(state) => Some(Self::new(state)),
-            Toggleable::NotToggleable => None,
-        }
-    }
-
     pub fn on_toggle(
         mut self,
         handler: impl Into<Option<Rc<dyn Fn(&ClickEvent, &mut WindowContext) + 'static>>>,
@@ -41,9 +34,10 @@ impl RenderOnce for Disclosure {
     fn render(self, _cx: &mut WindowContext) -> Self::Rendered {
         IconButton::new(
             "toggle",
-            match self.state {
-                ToggleState::Toggled => Icon::ChevronDown,
-                ToggleState::NotToggled => Icon::ChevronRight,
+            if self.is_open {
+                Icon::ChevronDown
+            } else {
+                Icon::ChevronRight
             },
         )
         .color(Color::Muted)

crates/ui2/src/components/list.rs 🔗

@@ -7,7 +7,7 @@ use gpui::{AnyElement, Div};
 use smallvec::SmallVec;
 
 use crate::prelude::*;
-use crate::{v_stack, Label, ToggleState, Toggleable};
+use crate::{v_stack, Label};
 
 pub use list_header::*;
 pub use list_item::*;
@@ -20,7 +20,7 @@ pub struct List {
     /// Defaults to "No items"
     empty_message: SharedString,
     header: Option<ListHeader>,
-    toggle: Toggleable,
+    toggle: Option<bool>,
     children: SmallVec<[AnyElement; 2]>,
 }
 
@@ -29,7 +29,7 @@ impl List {
         Self {
             empty_message: "No items".into(),
             header: None,
-            toggle: Toggleable::NotToggleable,
+            toggle: None,
             children: SmallVec::new(),
         }
     }
@@ -44,7 +44,7 @@ impl List {
         self
     }
 
-    pub fn toggle(mut self, toggle: Toggleable) -> Self {
+    pub fn toggle(mut self, toggle: Option<bool>) -> Self {
         self.toggle = toggle;
         self
     }
@@ -66,7 +66,7 @@ impl RenderOnce for List {
             .children(self.header.map(|header| header))
             .map(|this| match (self.children.is_empty(), self.toggle) {
                 (false, _) => this.children(self.children),
-                (true, Toggleable::Toggleable(ToggleState::NotToggled)) => this,
+                (true, Some(false)) => this,
                 (true, _) => this.child(Label::new(self.empty_message.clone()).color(Color::Muted)),
             })
     }

crates/ui2/src/components/list/list_header.rs 🔗

@@ -3,7 +3,7 @@ use std::rc::Rc;
 use gpui::{ClickEvent, Div};
 
 use crate::prelude::*;
-use crate::{h_stack, Disclosure, Icon, IconButton, IconElement, IconSize, Label, Toggleable};
+use crate::{h_stack, Disclosure, Icon, IconButton, IconElement, IconSize, Label};
 
 pub enum ListHeaderMeta {
     Tools(Vec<IconButton>),
@@ -17,7 +17,7 @@ pub struct ListHeader {
     label: SharedString,
     left_icon: Option<Icon>,
     meta: Option<ListHeaderMeta>,
-    toggle: Toggleable,
+    toggle: Option<bool>,
     on_toggle: Option<Rc<dyn Fn(&ClickEvent, &mut WindowContext) + 'static>>,
     inset: bool,
     selected: bool,
@@ -30,13 +30,13 @@ impl ListHeader {
             left_icon: None,
             meta: None,
             inset: false,
-            toggle: Toggleable::NotToggleable,
+            toggle: None,
             on_toggle: None,
             selected: false,
         }
     }
 
-    pub fn toggle(mut self, toggle: Toggleable) -> Self {
+    pub fn toggle(mut self, toggle: Option<bool>) -> Self {
         self.toggle = toggle;
         self
     }
@@ -114,8 +114,8 @@ impl RenderOnce for ListHeader {
                                 .child(Label::new(self.label.clone()).color(Color::Muted)),
                         )
                         .children(
-                            Disclosure::from_toggleable(self.toggle)
-                                .map(|disclosure| disclosure.on_toggle(self.on_toggle)),
+                            self.toggle
+                                .map(|is_open| Disclosure::new(is_open).on_toggle(self.on_toggle)),
                         ),
                 )
                 .child(meta),

crates/ui2/src/components/list/list_item.rs 🔗

@@ -6,7 +6,7 @@ use gpui::{
 use smallvec::SmallVec;
 
 use crate::prelude::*;
-use crate::{Avatar, Disclosure, GraphicSlot, Icon, IconElement, IconSize, Toggleable};
+use crate::{Avatar, Disclosure, GraphicSlot, Icon, IconElement, IconSize};
 
 #[derive(IntoElement)]
 pub struct ListItem {
@@ -17,7 +17,7 @@ pub struct ListItem {
     indent_level: usize,
     indent_step_size: Pixels,
     left_slot: Option<GraphicSlot>,
-    toggle: Toggleable,
+    toggle: Option<bool>,
     inset: bool,
     on_click: Option<Rc<dyn Fn(&ClickEvent, &mut WindowContext) + 'static>>,
     on_toggle: Option<Rc<dyn Fn(&ClickEvent, &mut WindowContext) + 'static>>,
@@ -33,7 +33,7 @@ impl ListItem {
             indent_level: 0,
             indent_step_size: px(12.),
             left_slot: None,
-            toggle: Toggleable::NotToggleable,
+            toggle: None,
             inset: false,
             on_click: None,
             on_secondary_mouse_down: None,
@@ -70,7 +70,7 @@ impl ListItem {
         self
     }
 
-    pub fn toggle(mut self, toggle: Toggleable) -> Self {
+    pub fn toggle(mut self, toggle: Option<bool>) -> Self {
         self.toggle = toggle;
         self
     }
@@ -151,8 +151,8 @@ impl RenderOnce for ListItem {
                     .items_center()
                     .relative()
                     .children(
-                        Disclosure::from_toggleable(self.toggle)
-                            .map(|disclosure| disclosure.on_toggle(self.on_toggle)),
+                        self.toggle
+                            .map(|is_open| Disclosure::new(is_open).on_toggle(self.on_toggle)),
                     )
                     .map(|this| match self.left_slot {
                         Some(GraphicSlot::Icon(i)) => this.child(

crates/ui2/src/components/stories/disclosure.rs 🔗

@@ -2,7 +2,7 @@ use gpui::{Div, Render};
 use story::Story;
 
 use crate::prelude::*;
-use crate::{Disclosure, ToggleState};
+use crate::Disclosure;
 
 pub struct DisclosureStory;
 
@@ -13,8 +13,8 @@ impl Render for DisclosureStory {
         Story::container()
             .child(Story::title_for::<Disclosure>())
             .child(Story::label("Toggled"))
-            .child(Disclosure::new(ToggleState::Toggled))
+            .child(Disclosure::new(true))
             .child(Story::label("Not Toggled"))
-            .child(Disclosure::new(ToggleState::NotToggled))
+            .child(Disclosure::new(false))
     }
 }

crates/ui2/src/toggleable.rs 🔗

@@ -1,38 +0,0 @@
-/// Whether an element is able to be toggled.
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
-pub enum Toggleable {
-    Toggleable(ToggleState),
-    NotToggleable,
-}
-
-/// The current state of a [`Toggleable`] element.
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
-pub enum ToggleState {
-    Toggled,
-    NotToggled,
-}
-
-impl ToggleState {
-    /// Returns whether an entry is toggled.
-    pub fn is_toggled(&self) -> bool {
-        match self {
-            ToggleState::Toggled => true,
-            ToggleState::NotToggled => false,
-        }
-    }
-}
-
-impl From<bool> for ToggleState {
-    fn from(toggled: bool) -> Self {
-        match toggled {
-            true => Self::Toggled,
-            false => Self::NotToggled,
-        }
-    }
-}
-
-impl From<ToggleState> for bool {
-    fn from(value: ToggleState) -> Self {
-        value.is_toggled()
-    }
-}

crates/ui2/src/ui2.rs 🔗

@@ -20,7 +20,6 @@ pub mod prelude;
 mod selectable;
 mod styled_ext;
 mod styles;
-mod toggleable;
 pub mod utils;
 
 pub use clickable::*;
@@ -31,4 +30,3 @@ pub use prelude::*;
 pub use selectable::*;
 pub use styled_ext::*;
 pub use styles::*;
-pub use toggleable::*;