From afd138dba697976f61e335555b69417c4c84f7f2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 12 Mar 2024 14:47:36 +0100 Subject: Use closures for `Slider::style` and `VerticalSlider::style` --- widget/src/helpers.rs | 4 ++-- widget/src/slider.rs | 25 ++++++++++++++----------- widget/src/vertical_slider.rs | 13 ++++++++----- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 896e2c13..c3801b09 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -240,7 +240,7 @@ pub fn slider<'a, T, Message, Theme>( where T: Copy + From + std::cmp::PartialOrd, Message: Clone, - Theme: slider::DefaultStyle, + Theme: slider::DefaultStyle + 'a, { Slider::new(range, value, on_change) } @@ -256,7 +256,7 @@ pub fn vertical_slider<'a, T, Message, Theme>( where T: Copy + From + std::cmp::PartialOrd, Message: Clone, - Theme: vertical_slider::DefaultStyle, + Theme: vertical_slider::DefaultStyle + 'a, { VerticalSlider::new(range, value, on_change) } diff --git a/widget/src/slider.rs b/widget/src/slider.rs index f3ea9bfd..d3b46a98 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -49,7 +49,7 @@ pub struct Slider<'a, T, Message, Theme = crate::Theme> { on_release: Option, width: Length, height: f32, - style: Style, + style: Style<'a, Theme>, } impl<'a, T, Message, Theme> Slider<'a, T, Message, Theme> @@ -70,7 +70,7 @@ where /// `Message`. pub fn new(range: RangeInclusive, value: T, on_change: F) -> Self where - Theme: DefaultStyle, + Theme: DefaultStyle + 'a, F: 'a + Fn(T) -> Message, { let value = if value >= *range.start() { @@ -95,7 +95,7 @@ where on_release: None, width: Length::Fill, height: Self::DEFAULT_HEIGHT, - style: Theme::default_style(), + style: Box::new(Theme::default_style), } } @@ -131,8 +131,11 @@ where } /// Sets the style of the [`Slider`]. - pub fn style(mut self, style: fn(&Theme, Status) -> Appearance) -> Self { - self.style = style.into(); + pub fn style( + mut self, + style: impl Fn(&Theme, Status) -> Appearance + 'a, + ) -> Self { + self.style = Box::new(style); self } @@ -547,23 +550,23 @@ pub enum HandleShape { } /// The style of a [`Slider`]. -pub type Style = fn(&Theme, Status) -> Appearance; +pub type Style<'a, Theme> = Box Appearance + 'a>; /// The default style of a [`Slider`]. pub trait DefaultStyle { /// Returns the default style of a [`Slider`]. - fn default_style() -> Style; + fn default_style(&self, status: Status) -> Appearance; } impl DefaultStyle for Theme { - fn default_style() -> Style { - default + fn default_style(&self, status: Status) -> Appearance { + default(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/vertical_slider.rs b/widget/src/vertical_slider.rs index f7030584..2aa8f4d1 100644 --- a/widget/src/vertical_slider.rs +++ b/widget/src/vertical_slider.rs @@ -51,7 +51,7 @@ pub struct VerticalSlider<'a, T, Message, Theme = crate::Theme> { on_release: Option, width: f32, height: Length, - style: Style, + style: Style<'a, Theme>, } impl<'a, T, Message, Theme> VerticalSlider<'a, T, Message, Theme> @@ -72,7 +72,7 @@ where /// `Message`. pub fn new(range: RangeInclusive, value: T, on_change: F) -> Self where - Theme: DefaultStyle, + Theme: DefaultStyle + 'a, F: 'a + Fn(T) -> Message, { let value = if value >= *range.start() { @@ -97,7 +97,7 @@ where on_release: None, width: Self::DEFAULT_WIDTH, height: Length::Fill, - style: Theme::default_style(), + style: Box::new(Theme::default_style), } } @@ -133,8 +133,11 @@ where } /// Sets the style of the [`VerticalSlider`]. - pub fn style(mut self, style: fn(&Theme, Status) -> Appearance) -> Self { - self.style = style.into(); + pub fn style( + mut self, + style: impl Fn(&Theme, Status) -> Appearance + 'a, + ) -> Self { + self.style = Box::new(style); self } -- cgit