From 252eb88703196dd1d373fb45cbbb7ee7b85f3726 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 12 Mar 2024 14:58:06 +0100 Subject: Use closures for `Checkbox::style` --- examples/checkbox/src/main.rs | 11 +++++------ widget/src/checkbox.rs | 25 ++++++++++++++----------- widget/src/helpers.rs | 2 +- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/examples/checkbox/src/main.rs b/examples/checkbox/src/main.rs index 121c99ea..ee745c03 100644 --- a/examples/checkbox/src/main.rs +++ b/examples/checkbox/src/main.rs @@ -63,17 +63,16 @@ impl Application for Example { let default_checkbox = checkbox("Default", self.default) .on_toggle(Message::DefaultToggled); - let styled_checkbox = |label, style| { + let styled_checkbox = |label| { checkbox(label, self.styled) .on_toggle_maybe(self.default.then_some(Message::StyledToggled)) - .style(style) }; let checkboxes = row![ - styled_checkbox("Primary", checkbox::primary), - styled_checkbox("Secondary", checkbox::secondary), - styled_checkbox("Success", checkbox::success), - styled_checkbox("Danger", checkbox::danger), + styled_checkbox("Primary").style(checkbox::primary), + styled_checkbox("Secondary").style(checkbox::secondary), + styled_checkbox("Success").style(checkbox::success), + styled_checkbox("Danger").style(checkbox::danger), ] .spacing(20); diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index f0c7357b..15fb8f58 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -51,7 +51,7 @@ pub struct Checkbox< text_shaping: text::Shaping, font: Option, icon: Icon, - style: Style, + style: Style<'a, Theme>, } impl<'a, Message, Theme, Renderer> Checkbox<'a, Message, Theme, Renderer> @@ -71,7 +71,7 @@ where /// * a boolean describing whether the [`Checkbox`] is checked or not pub fn new(label: impl Into, is_checked: bool) -> Self where - Theme: DefaultStyle, + Theme: DefaultStyle + 'a, { Checkbox { is_checked, @@ -91,7 +91,7 @@ where line_height: text::LineHeight::default(), shaping: text::Shaping::Basic, }, - style: Theme::default_style(), + style: Box::new(Theme::default_style), } } @@ -174,8 +174,11 @@ where } /// Sets the style of the [`Checkbox`]. - pub fn style(mut self, style: fn(&Theme, Status) -> Appearance) -> Self { - self.style = style; + pub fn style( + mut self, + style: impl Fn(&Theme, Status) -> Appearance + 'a, + ) -> Self { + self.style = Box::new(style); self } } @@ -424,23 +427,23 @@ pub struct Appearance { } /// The style of a [`Checkbox`]. -pub type Style = fn(&Theme, Status) -> Appearance; +pub type Style<'a, Theme> = Box Appearance + 'a>; /// The default style of a [`Checkbox`]. pub trait DefaultStyle { /// Returns the default style of a [`Checkbox`]. - fn default_style() -> Style; + fn default_style(&self, status: Status) -> Appearance; } impl DefaultStyle for Theme { - fn default_style() -> Style { - primary + fn default_style(&self, status: Status) -> Appearance { + primary(self, status) } } impl DefaultStyle for Appearance { - fn default_style() -> Style { - |appearance, _status| *appearance + fn default_style(&self, _status: Status) -> Appearance { + *self } } diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index dde6a207..7912d7b8 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -161,7 +161,7 @@ pub fn checkbox<'a, Message, Theme, Renderer>( is_checked: bool, ) -> Checkbox<'a, Message, Theme, Renderer> where - Theme: checkbox::DefaultStyle, + Theme: checkbox::DefaultStyle + 'a, Renderer: core::text::Renderer, { Checkbox::new(label, is_checked) -- cgit