Add ToggleButton component

This commit is contained in:
Marshall Bowers 2023-12-20 18:23:21 -05:00
parent 56f2b963ef
commit 443b1dd345
6 changed files with 242 additions and 1 deletions

View file

@ -59,6 +59,13 @@ pub enum ButtonStyle {
Transparent,
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
pub(crate) enum ButtonLikeRounding {
All,
Left,
Right,
}
#[derive(Debug, Clone)]
pub(crate) struct ButtonLikeStyles {
pub background: Hsla,
@ -256,6 +263,7 @@ pub struct ButtonLike {
pub(super) selected: bool,
pub(super) width: Option<DefiniteLength>,
size: ButtonSize,
rounding: Option<ButtonLikeRounding>,
tooltip: Option<Box<dyn Fn(&mut WindowContext) -> AnyView>>,
on_click: Option<Box<dyn Fn(&ClickEvent, &mut WindowContext) + 'static>>,
children: SmallVec<[AnyElement; 2]>,
@ -271,11 +279,17 @@ impl ButtonLike {
selected: false,
width: None,
size: ButtonSize::Default,
rounding: Some(ButtonLikeRounding::All),
tooltip: None,
children: SmallVec::new(),
on_click: None,
}
}
pub(crate) fn rounding(mut self, rounding: impl Into<Option<ButtonLikeRounding>>) -> Self {
self.rounding = rounding.into();
self
}
}
impl Disableable for ButtonLike {
@ -356,7 +370,11 @@ impl RenderOnce for ButtonLike {
.flex_none()
.h(self.size.height())
.when_some(self.width, |this, width| this.w(width).justify_center())
.rounded_md()
.when_some(self.rounding, |this, rounding| match rounding {
ButtonLikeRounding::All => this.rounded_md(),
ButtonLikeRounding::Left => this.rounded_l_md(),
ButtonLikeRounding::Right => this.rounded_r_md(),
})
.gap_1()
.map(|this| match self.size {
ButtonSize::Default | ButtonSize::Compact => this.px_1(),