Add `Disableable` trait (#3439)

Marshall Bowers created

This PR adds a new `Disableable` trait to use for elements that are
capable of being disabled.

Release Notes:

- N/A

Change summary

crates/ui2/src/clickable.rs          |  2 ++
crates/ui2/src/components/button2.rs | 24 ++++++++----------------
crates/ui2/src/disableable.rs        |  5 +++++
crates/ui2/src/fixed.rs              |  4 ++++
crates/ui2/src/prelude.rs            |  2 ++
crates/ui2/src/selectable.rs         |  4 ++++
crates/ui2/src/ui2.rs                |  2 ++
7 files changed, 27 insertions(+), 16 deletions(-)

Detailed changes

crates/ui2/src/clickable.rs 🔗

@@ -1,5 +1,7 @@
 use gpui::{ClickEvent, WindowContext};
 
+/// A trait for elements that can be clicked.
 pub trait Clickable {
+    /// Sets the click handler that will fire whenever the element is clicked.
     fn on_click(self, handler: impl Fn(&ClickEvent, &mut WindowContext) + 'static) -> Self;
 }

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

@@ -201,13 +201,11 @@ impl ButtonSize2 {
 //     children: SmallVec<[AnyElement; 2]>,
 // }
 
-pub trait ButtonCommon: Clickable {
+pub trait ButtonCommon: Clickable + Disableable {
     fn id(&self) -> &ElementId;
     fn style(self, style: ButtonStyle2) -> Self;
-    fn disabled(self, disabled: bool) -> Self;
     fn size(self, size: ButtonSize2) -> Self;
     fn tooltip(self, tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) -> Self;
-    // fn width(&mut self, width: DefiniteLength) -> &mut Self;
 }
 
 // pub struct LabelButton {
@@ -266,14 +264,6 @@ pub struct ButtonLike {
 }
 
 impl ButtonLike {
-    pub fn children(
-        &mut self,
-        children: impl IntoIterator<Item = impl Into<AnyElement>>,
-    ) -> &mut Self {
-        self.children = children.into_iter().map(Into::into).collect();
-        self
-    }
-
     pub fn new(id: impl Into<ElementId>) -> Self {
         Self {
             id: id.into(),
@@ -287,6 +277,13 @@ impl ButtonLike {
     }
 }
 
+impl Disableable for ButtonLike {
+    fn disabled(mut self, disabled: bool) -> Self {
+        self.disabled = disabled;
+        self
+    }
+}
+
 impl Clickable for ButtonLike {
     fn on_click(mut self, handler: impl Fn(&ClickEvent, &mut WindowContext) + 'static) -> Self {
         self.on_click = Some(Box::new(handler));
@@ -317,11 +314,6 @@ impl ButtonCommon for ButtonLike {
         self
     }
 
-    fn disabled(mut self, disabled: bool) -> Self {
-        self.disabled = disabled;
-        self
-    }
-
     fn size(mut self, size: ButtonSize2) -> Self {
         self.size = size;
         self

crates/ui2/src/disableable.rs 🔗

@@ -0,0 +1,5 @@
+/// A trait for elements that can be disabled.
+pub trait Disableable {
+    /// Sets whether the element is disabled.
+    fn disabled(self, disabled: bool) -> Self;
+}

crates/ui2/src/fixed.rs 🔗

@@ -1,6 +1,10 @@
 use gpui::DefiniteLength;
 
+/// A trait for elements that have a fixed with.
 pub trait FixedWidth {
+    /// Sets the width of the element.
     fn width(self, width: DefiniteLength) -> Self;
+
+    /// Sets the element's width to the full width of its container.
     fn full_width(self) -> Self;
 }

crates/ui2/src/prelude.rs 🔗

@@ -1,9 +1,11 @@
+pub use gpui::prelude::*;
 pub use gpui::{
     div, Element, ElementId, InteractiveElement, ParentElement, RenderOnce, SharedString, Styled,
     ViewContext, WindowContext,
 };
 
 pub use crate::clickable::*;
+pub use crate::disableable::*;
 pub use crate::fixed::*;
 pub use crate::selectable::*;
 pub use crate::StyledExt;

crates/ui2/src/selectable.rs 🔗

@@ -1,7 +1,11 @@
 use gpui::{AnyView, WindowContext};
 
+/// A trait for elements that can be selected.
 pub trait Selectable {
+    /// Sets whether the element is selected.
     fn selected(self, selected: bool) -> Self;
+
+    /// Sets the tooltip that should be shown when the element is selected.
     fn selected_tooltip(
         self,
         tooltip: Box<dyn Fn(&mut WindowContext) -> AnyView + 'static>,

crates/ui2/src/ui2.rs 🔗

@@ -14,6 +14,7 @@
 
 mod clickable;
 mod components;
+mod disableable;
 mod fixed;
 pub mod prelude;
 mod selectable;
@@ -23,6 +24,7 @@ pub mod utils;
 
 pub use clickable::*;
 pub use components::*;
+pub use disableable::*;
 pub use fixed::*;
 pub use prelude::*;
 pub use selectable::*;