Add Tinted button style placeholder and document ButtonLike (#3476)
- Adds a placeholder `ButtonStyle::Tinted`. - Note: Using this now will just give you a block of `gpui::red()` - Documents ButtonLike and ButtonStyle to hopefully help make choosing a button style easier. Release Notes: - N/A
This commit is contained in:
parent
0d33f01fa4
commit
85d72f63c1
1 changed files with 65 additions and 2 deletions
|
@ -5,18 +5,44 @@ use crate::h_stack;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
pub trait ButtonCommon: Clickable + Disableable {
|
pub trait ButtonCommon: Clickable + Disableable {
|
||||||
|
/// A unique element id to help identify the button.
|
||||||
fn id(&self) -> &ElementId;
|
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;
|
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;
|
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;
|
fn tooltip(self, tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
|
||||||
pub enum ButtonStyle {
|
pub enum ButtonStyle {
|
||||||
#[default]
|
/// A filled button with a solid background color. Provides emphasis versus
|
||||||
|
/// the more common subtle button.
|
||||||
Filled,
|
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,
|
Subtle,
|
||||||
|
/// Used for buttons that only change forground color on hover and active states.
|
||||||
|
///
|
||||||
|
/// TODO: Better docs for this.
|
||||||
Transparent,
|
Transparent,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +66,12 @@ impl ButtonStyle {
|
||||||
label_color: Color::Default.color(cx),
|
label_color: Color::Default.color(cx),
|
||||||
icon_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 {
|
ButtonStyle::Subtle => ButtonLikeStyles {
|
||||||
background: cx.theme().colors().ghost_element_background,
|
background: cx.theme().colors().ghost_element_background,
|
||||||
border_color: transparent_black(),
|
border_color: transparent_black(),
|
||||||
|
@ -63,6 +95,12 @@ impl ButtonStyle {
|
||||||
label_color: Color::Default.color(cx),
|
label_color: Color::Default.color(cx),
|
||||||
icon_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 {
|
ButtonStyle::Subtle => ButtonLikeStyles {
|
||||||
background: cx.theme().colors().ghost_element_hover,
|
background: cx.theme().colors().ghost_element_hover,
|
||||||
border_color: transparent_black(),
|
border_color: transparent_black(),
|
||||||
|
@ -88,6 +126,12 @@ impl ButtonStyle {
|
||||||
label_color: Color::Default.color(cx),
|
label_color: Color::Default.color(cx),
|
||||||
icon_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 {
|
ButtonStyle::Subtle => ButtonLikeStyles {
|
||||||
background: cx.theme().colors().ghost_element_active,
|
background: cx.theme().colors().ghost_element_active,
|
||||||
border_color: transparent_black(),
|
border_color: transparent_black(),
|
||||||
|
@ -114,6 +158,12 @@ impl ButtonStyle {
|
||||||
label_color: Color::Default.color(cx),
|
label_color: Color::Default.color(cx),
|
||||||
icon_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 {
|
ButtonStyle::Subtle => ButtonLikeStyles {
|
||||||
background: cx.theme().colors().ghost_element_background,
|
background: cx.theme().colors().ghost_element_background,
|
||||||
border_color: cx.theme().colors().border_focused,
|
border_color: cx.theme().colors().border_focused,
|
||||||
|
@ -137,6 +187,12 @@ impl ButtonStyle {
|
||||||
label_color: Color::Disabled.color(cx),
|
label_color: Color::Disabled.color(cx),
|
||||||
icon_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 {
|
ButtonStyle::Subtle => ButtonLikeStyles {
|
||||||
background: cx.theme().colors().ghost_element_disabled,
|
background: cx.theme().colors().ghost_element_disabled,
|
||||||
border_color: cx.theme().colors().border_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)]
|
#[derive(Default, PartialEq, Clone, Copy)]
|
||||||
pub enum ButtonSize {
|
pub enum ButtonSize {
|
||||||
#[default]
|
#[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)]
|
#[derive(IntoElement)]
|
||||||
pub struct ButtonLike {
|
pub struct ButtonLike {
|
||||||
id: ElementId,
|
id: ElementId,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue