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`].
///
/// [`ProgressBar`]: crate::ProgressBar
pub fn progress_bar<Theme>(
pub fn progress_bar<'a, Theme>(
range: RangeInclusive<f32>,
value: f32,
) -> ProgressBar<Theme>
) -> ProgressBar<'a, Theme>
where
Theme: progress_bar::DefaultStyle,
Theme: progress_bar::DefaultStyle + 'a,
{
ProgressBar::new(range, value)
}

View file

@ -13,7 +13,7 @@ use std::ops::RangeInclusive;
///
/// # Example
/// ```no_run
/// # type ProgressBar = iced_widget::ProgressBar;
/// # type ProgressBar<'a> = iced_widget::ProgressBar<'a>;
/// #
/// 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)
#[allow(missing_debug_implementations)]
pub struct ProgressBar<Theme = crate::Theme> {
pub struct ProgressBar<'a, Theme = crate::Theme> {
range: RangeInclusive<f32>,
value: f32,
width: 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`].
pub const DEFAULT_HEIGHT: f32 = 30.0;
@ -41,14 +41,14 @@ impl<Theme> ProgressBar<Theme> {
/// * the current value of the [`ProgressBar`]
pub fn new(range: RangeInclusive<f32>, value: f32) -> Self
where
Theme: DefaultStyle,
Theme: DefaultStyle + 'a,
{
ProgressBar {
value: value.clamp(*range.start(), *range.end()),
range,
width: Length::Fill,
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`].
pub fn style(mut self, style: fn(&Theme) -> Appearance) -> Self {
self.style = style.into();
pub fn style(mut self, style: impl Fn(&Theme) -> Appearance + 'a) -> Self {
self.style = Box::new(style);
self
}
}
impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for ProgressBar<Theme>
impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for ProgressBar<'a, Theme>
where
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>
where
Message: 'a,
@ -151,7 +151,7 @@ where
Renderer: 'a + crate::core::Renderer,
{
fn from(
progress_bar: ProgressBar<Theme>,
progress_bar: ProgressBar<'a, Theme>,
) -> Element<'a, Message, Theme, Renderer> {
Element::new(progress_bar)
}
@ -169,23 +169,23 @@ pub struct Appearance {
}
/// 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`].
pub trait DefaultStyle {
/// Returns the default style of a [`ProgressBar`].
fn default_style() -> Style<Self>;
fn default_style(&self) -> Appearance;
}
impl DefaultStyle for Theme {
fn default_style() -> Style<Self> {
primary
fn default_style(&self) -> Appearance {
primary(self)
}
}
impl DefaultStyle for Appearance {
fn default_style() -> Style<Self> {
|appearance| *appearance
fn default_style(&self) -> Appearance {
*self
}
}