feat: custom button theme

This commit is contained in:
Ashley Wulber 2022-12-17 18:15:24 -05:00 committed by Michael Murphy
parent d6800f7716
commit 42ac442183

View file

@ -120,7 +120,7 @@ impl application::StyleSheet for Theme {
/* /*
* TODO: Button * TODO: Button
*/ */
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy)]
pub enum Button { pub enum Button {
Deactivated, Deactivated,
Destructive, Destructive,
@ -129,6 +129,10 @@ pub enum Button {
Secondary, Secondary,
Text, Text,
Transparent, Transparent,
Custom {
active: fn(&Theme) -> button::Appearance,
hover: fn(&Theme) -> button::Appearance
},
} }
impl Default for Button { impl Default for Button {
@ -148,6 +152,7 @@ impl Button {
Button::Text => &cosmic.secondary.component, Button::Text => &cosmic.secondary.component,
Button::Transparent => &TRANSPARENT_COMPONENT, Button::Transparent => &TRANSPARENT_COMPONENT,
Button::Deactivated => &cosmic.secondary.component, Button::Deactivated => &cosmic.secondary.component,
Button::Custom { .. } => &TRANSPARENT_COMPONENT
} }
} }
} }
@ -156,6 +161,10 @@ impl button::StyleSheet for Theme {
type Style = Button; type Style = Button;
fn active(&self, style: &Self::Style) -> button::Appearance { fn active(&self, style: &Self::Style) -> button::Appearance {
if let Button::Custom {active, ..} = style {
return active(self);
}
let cosmic = style.cosmic(self); let cosmic = style.cosmic(self);
button::Appearance { button::Appearance {
@ -170,6 +179,10 @@ impl button::StyleSheet for Theme {
} }
fn hovered(&self, style: &Self::Style) -> button::Appearance { fn hovered(&self, style: &Self::Style) -> button::Appearance {
if let Button::Custom {hover, ..} = style {
return hover(self);
}
let active = self.active(&style); let active = self.active(&style);
let cosmic = style.cosmic(self); let cosmic = style.cosmic(self);
@ -333,7 +346,7 @@ impl Default for Container {
} }
impl From<fn(&Theme) -> container::Appearance> for Container { impl From<fn(&Theme) -> container::Appearance> for Container {
fn from(f: fn(&Theme) -> container::Appearance) -> Self { fn from(_: fn(&Theme) -> container::Appearance) -> Self {
Self::default() Self::default()
} }
} }
@ -465,7 +478,7 @@ impl pick_list::StyleSheet for Theme {
impl radio::StyleSheet for Theme { impl radio::StyleSheet for Theme {
type Style = (); type Style = ();
fn active(&self, _style: &Self::Style, is_selected: bool) -> radio::Appearance { fn active(&self, _style: &Self::Style, _is_selected: bool) -> radio::Appearance {
let palette = self.extended_palette(); let palette = self.extended_palette();
radio::Appearance { radio::Appearance {