@@ -5,18 +5,44 @@ use crate::h_stack;
use crate::prelude::*;
pub trait ButtonCommon: Clickable + Disableable {
+ /// A unique element id to help identify the button.
fn id(&self) -> &ElementId;
+ /// The visual style of the button.
+ ///
+ /// Mosty commonly will be `ButtonStyle::Subtle`, or `ButtonStyle::Filled`
+ /// for an emphasized button.
fn style(self, style: ButtonStyle) -> Self;
+ /// The size of the button.
+ ///
+ /// Most buttons will use the default size.
+ ///
+ /// ButtonSize can also be used to help build non-button elements
+ /// that are consistently sized with buttons.
fn size(self, size: ButtonSize) -> Self;
+ /// The tooltip that shows when a user hovers over the button.
+ ///
+ /// Nearly all interactable elements should have a tooltip. Some example
+ /// exceptions might a scroll bar, or a slider.
fn tooltip(self, tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) -> Self;
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
pub enum ButtonStyle {
- #[default]
+ /// A filled button with a solid background color. Provides emphasis versus
+ /// the more common subtle button.
Filled,
- // Tinted,
+ /// 🚧 Under construction 🚧
+ ///
+ /// Used to emphasize a button in some way, like a selected state, or a semantic
+ /// coloring like an error or success button.
+ Tinted,
+ /// The default button style, used for most buttons. Has a transparent background,
+ /// but has a background color to indicate states like hover and active.
+ #[default]
Subtle,
+ /// Used for buttons that only change forground color on hover and active states.
+ ///
+ /// TODO: Better docs for this.
Transparent,
}
@@ -40,6 +66,12 @@ impl ButtonStyle {
label_color: Color::Default.color(cx),
icon_color: Color::Default.color(cx),
},
+ ButtonStyle::Tinted => ButtonLikeStyles {
+ background: gpui::red(),
+ border_color: gpui::red(),
+ label_color: gpui::red(),
+ icon_color: gpui::red(),
+ },
ButtonStyle::Subtle => ButtonLikeStyles {
background: cx.theme().colors().ghost_element_background,
border_color: transparent_black(),
@@ -63,6 +95,12 @@ impl ButtonStyle {
label_color: Color::Default.color(cx),
icon_color: Color::Default.color(cx),
},
+ ButtonStyle::Tinted => ButtonLikeStyles {
+ background: gpui::red(),
+ border_color: gpui::red(),
+ label_color: gpui::red(),
+ icon_color: gpui::red(),
+ },
ButtonStyle::Subtle => ButtonLikeStyles {
background: cx.theme().colors().ghost_element_hover,
border_color: transparent_black(),
@@ -88,6 +126,12 @@ impl ButtonStyle {
label_color: Color::Default.color(cx),
icon_color: Color::Default.color(cx),
},
+ ButtonStyle::Tinted => ButtonLikeStyles {
+ background: gpui::red(),
+ border_color: gpui::red(),
+ label_color: gpui::red(),
+ icon_color: gpui::red(),
+ },
ButtonStyle::Subtle => ButtonLikeStyles {
background: cx.theme().colors().ghost_element_active,
border_color: transparent_black(),
@@ -114,6 +158,12 @@ impl ButtonStyle {
label_color: Color::Default.color(cx),
icon_color: Color::Default.color(cx),
},
+ ButtonStyle::Tinted => ButtonLikeStyles {
+ background: gpui::red(),
+ border_color: gpui::red(),
+ label_color: gpui::red(),
+ icon_color: gpui::red(),
+ },
ButtonStyle::Subtle => ButtonLikeStyles {
background: cx.theme().colors().ghost_element_background,
border_color: cx.theme().colors().border_focused,
@@ -137,6 +187,12 @@ impl ButtonStyle {
label_color: Color::Disabled.color(cx),
icon_color: Color::Disabled.color(cx),
},
+ ButtonStyle::Tinted => ButtonLikeStyles {
+ background: gpui::red(),
+ border_color: gpui::red(),
+ label_color: gpui::red(),
+ icon_color: gpui::red(),
+ },
ButtonStyle::Subtle => ButtonLikeStyles {
background: cx.theme().colors().ghost_element_disabled,
border_color: cx.theme().colors().border_disabled,
@@ -153,6 +209,8 @@ impl ButtonStyle {
}
}
+/// ButtonSize can also be used to help build non-button elements
+/// that are consistently sized with buttons.
#[derive(Default, PartialEq, Clone, Copy)]
pub enum ButtonSize {
#[default]
@@ -171,6 +229,11 @@ impl ButtonSize {
}
}
+/// A button-like element that can be used to create a custom button when
+/// prebuilt buttons are not sufficient. Use this sparingly, as it is
+/// unconstrained and may make the UI feel less consistent.
+///
+/// This is also used to build the prebuilt buttons.
#[derive(IntoElement)]
pub struct ButtonLike {
id: ElementId,