Use closures for ProgressBar::style

This commit is contained in:
Héctor Ramón Jiménez 2024-03-12 15:45:21 +01:00
parent fd7a23ca47
commit 7a5f5b0be7
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
2 changed files with 21 additions and 21 deletions

View file

@ -340,12 +340,12 @@ where
/// * the current value of the [`ProgressBar`]. /// * the current value of the [`ProgressBar`].
/// ///
/// [`ProgressBar`]: crate::ProgressBar /// [`ProgressBar`]: crate::ProgressBar
pub fn progress_bar<Theme>( pub fn progress_bar<'a, Theme>(
range: RangeInclusive<f32>, range: RangeInclusive<f32>,
value: f32, value: f32,
) -> ProgressBar<Theme> ) -> ProgressBar<'a, Theme>
where where
Theme: progress_bar::DefaultStyle, Theme: progress_bar::DefaultStyle + 'a,
{ {
ProgressBar::new(range, value) ProgressBar::new(range, value)
} }

View file

@ -13,7 +13,7 @@ use std::ops::RangeInclusive;
/// ///
/// # Example /// # Example
/// ```no_run /// ```no_run
/// # type ProgressBar = iced_widget::ProgressBar; /// # type ProgressBar<'a> = iced_widget::ProgressBar<'a>;
/// # /// #
/// let value = 50.0; /// let value = 50.0;
/// ///
@ -22,15 +22,15 @@ use std::ops::RangeInclusive;
/// ///
/// ![Progress bar drawn with `iced_wgpu`](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) /// ![Progress bar drawn with `iced_wgpu`](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png)
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct ProgressBar<Theme = crate::Theme> { pub struct ProgressBar<'a, Theme = crate::Theme> {
range: RangeInclusive<f32>, range: RangeInclusive<f32>,
value: f32, value: f32,
width: Length, width: Length,
height: Option<Length>, height: Option<Length>,
style: Style<Theme>, style: Style<'a, Theme>,
} }
impl<Theme> ProgressBar<Theme> { impl<'a, Theme> ProgressBar<'a, Theme> {
/// The default height of a [`ProgressBar`]. /// The default height of a [`ProgressBar`].
pub const DEFAULT_HEIGHT: f32 = 30.0; pub const DEFAULT_HEIGHT: f32 = 30.0;
@ -41,14 +41,14 @@ impl<Theme> ProgressBar<Theme> {
/// * the current value of the [`ProgressBar`] /// * the current value of the [`ProgressBar`]
pub fn new(range: RangeInclusive<f32>, value: f32) -> Self pub fn new(range: RangeInclusive<f32>, value: f32) -> Self
where where
Theme: DefaultStyle, Theme: DefaultStyle + 'a,
{ {
ProgressBar { ProgressBar {
value: value.clamp(*range.start(), *range.end()), value: value.clamp(*range.start(), *range.end()),
range, range,
width: Length::Fill, width: Length::Fill,
height: None, height: None,
style: Theme::default_style(), style: Box::new(Theme::default_style),
} }
} }
@ -65,14 +65,14 @@ impl<Theme> ProgressBar<Theme> {
} }
/// Sets the style of the [`ProgressBar`]. /// Sets the style of the [`ProgressBar`].
pub fn style(mut self, style: fn(&Theme) -> Appearance) -> Self { pub fn style(mut self, style: impl Fn(&Theme) -> Appearance + 'a) -> Self {
self.style = style.into(); self.style = Box::new(style);
self self
} }
} }
impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for ProgressBar<Theme> for ProgressBar<'a, Theme>
where where
Renderer: crate::core::Renderer, Renderer: crate::core::Renderer,
{ {
@ -143,7 +143,7 @@ where
} }
} }
impl<'a, Message, Theme, Renderer> From<ProgressBar<Theme>> impl<'a, Message, Theme, Renderer> From<ProgressBar<'a, Theme>>
for Element<'a, Message, Theme, Renderer> for Element<'a, Message, Theme, Renderer>
where where
Message: 'a, Message: 'a,
@ -151,7 +151,7 @@ where
Renderer: 'a + crate::core::Renderer, Renderer: 'a + crate::core::Renderer,
{ {
fn from( fn from(
progress_bar: ProgressBar<Theme>, progress_bar: ProgressBar<'a, Theme>,
) -> Element<'a, Message, Theme, Renderer> { ) -> Element<'a, Message, Theme, Renderer> {
Element::new(progress_bar) Element::new(progress_bar)
} }
@ -169,23 +169,23 @@ pub struct Appearance {
} }
/// The style of a [`ProgressBar`]. /// The style of a [`ProgressBar`].
pub type Style<Theme> = fn(&Theme) -> Appearance; pub type Style<'a, Theme> = Box<dyn Fn(&Theme) -> Appearance + 'a>;
/// The default style of a [`ProgressBar`]. /// The default style of a [`ProgressBar`].
pub trait DefaultStyle { pub trait DefaultStyle {
/// Returns the default style of a [`ProgressBar`]. /// Returns the default style of a [`ProgressBar`].
fn default_style() -> Style<Self>; fn default_style(&self) -> Appearance;
} }
impl DefaultStyle for Theme { impl DefaultStyle for Theme {
fn default_style() -> Style<Self> { fn default_style(&self) -> Appearance {
primary primary(self)
} }
} }
impl DefaultStyle for Appearance { impl DefaultStyle for Appearance {
fn default_style() -> Style<Self> { fn default_style(&self) -> Appearance {
|appearance| *appearance *self
} }
} }