feat(widget): custom style variant for button widget
This commit is contained in:
parent
68f80daa67
commit
2e11d62de5
2 changed files with 25 additions and 3 deletions
|
|
@ -9,8 +9,14 @@ use palette::{rgb::Rgb, Alpha};
|
||||||
|
|
||||||
use crate::widget::button::{Appearance, StyleSheet};
|
use crate::widget::button::{Appearance, StyleSheet};
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default)]
|
#[derive(Default)]
|
||||||
pub enum Button {
|
pub enum Button {
|
||||||
|
Custom {
|
||||||
|
active: Box<dyn Fn(bool, &crate::Theme) -> Appearance>,
|
||||||
|
disabled: Box<dyn Fn(&crate::Theme) -> Appearance>,
|
||||||
|
hovered: Box<dyn Fn(bool, &crate::Theme) -> Appearance>,
|
||||||
|
pressed: Box<dyn Fn(bool, &crate::Theme) -> Appearance>,
|
||||||
|
},
|
||||||
Destructive,
|
Destructive,
|
||||||
Link,
|
Link,
|
||||||
Icon,
|
Icon,
|
||||||
|
|
@ -69,6 +75,8 @@ pub fn appearance(
|
||||||
appearance.text_color = cosmic.accent.base.into();
|
appearance.text_color = cosmic.accent.base.into();
|
||||||
corner_radii = &cosmic.corner_radii.radius_0;
|
corner_radii = &cosmic.corner_radii.radius_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Button::Custom { .. } => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
appearance.border_radius = (*corner_radii).into();
|
appearance.border_radius = (*corner_radii).into();
|
||||||
|
|
@ -87,6 +95,10 @@ impl StyleSheet for crate::Theme {
|
||||||
type Style = Button;
|
type Style = Button;
|
||||||
|
|
||||||
fn active(&self, focused: bool, style: &Self::Style) -> Appearance {
|
fn active(&self, focused: bool, style: &Self::Style) -> Appearance {
|
||||||
|
if let Button::Custom { active, .. } = style {
|
||||||
|
return active(focused, self);
|
||||||
|
}
|
||||||
|
|
||||||
appearance(self, focused, style, |component| {
|
appearance(self, focused, style, |component| {
|
||||||
(
|
(
|
||||||
component.base.into(),
|
component.base.into(),
|
||||||
|
|
@ -97,6 +109,10 @@ impl StyleSheet for crate::Theme {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn disabled(&self, style: &Self::Style) -> Appearance {
|
fn disabled(&self, style: &Self::Style) -> Appearance {
|
||||||
|
if let Button::Custom { disabled, .. } = style {
|
||||||
|
return disabled(self);
|
||||||
|
}
|
||||||
|
|
||||||
appearance(self, false, style, |component| {
|
appearance(self, false, style, |component| {
|
||||||
let mut background = Color::from(component.base);
|
let mut background = Color::from(component.base);
|
||||||
background.a *= 0.5;
|
background.a *= 0.5;
|
||||||
|
|
@ -113,6 +129,10 @@ impl StyleSheet for crate::Theme {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn hovered(&self, focused: bool, style: &Self::Style) -> Appearance {
|
fn hovered(&self, focused: bool, style: &Self::Style) -> Appearance {
|
||||||
|
if let Button::Custom { hovered, .. } = style {
|
||||||
|
return hovered(focused, self);
|
||||||
|
}
|
||||||
|
|
||||||
appearance(self, focused, style, |component| {
|
appearance(self, focused, style, |component| {
|
||||||
(
|
(
|
||||||
component.hover.into(),
|
component.hover.into(),
|
||||||
|
|
@ -123,6 +143,10 @@ impl StyleSheet for crate::Theme {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pressed(&self, focused: bool, style: &Self::Style) -> Appearance {
|
fn pressed(&self, focused: bool, style: &Self::Style) -> Appearance {
|
||||||
|
if let Button::Custom { pressed, .. } = style {
|
||||||
|
return pressed(focused, self);
|
||||||
|
}
|
||||||
|
|
||||||
appearance(self, focused, style, |component| {
|
appearance(self, focused, style, |component| {
|
||||||
(
|
(
|
||||||
component.pressed.into(),
|
component.pressed.into(),
|
||||||
|
|
|
||||||
|
|
@ -162,8 +162,6 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
|
||||||
let button = if builder.variant.vertical {
|
let button = if builder.variant.vertical {
|
||||||
crate::widget::column::with_children(content)
|
crate::widget::column::with_children(content)
|
||||||
.padding(builder.padding)
|
.padding(builder.padding)
|
||||||
// .width(builder.width)
|
|
||||||
// .height(builder.height)
|
|
||||||
.spacing(builder.spacing)
|
.spacing(builder.spacing)
|
||||||
.align_items(Alignment::Center)
|
.align_items(Alignment::Center)
|
||||||
.apply(button)
|
.apply(button)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue