diff options
author | 2024-03-05 22:13:36 +0100 | |
---|---|---|
committer | 2024-03-05 22:13:55 +0100 | |
commit | 5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269 (patch) | |
tree | a0a4ae0022d48490cc3f2c579aa020cd13955f71 /widget/src/progress_bar.rs | |
parent | 87d16a090b14fa206bb87041a32d66348bc294e4 (diff) | |
download | iced-5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269.tar.gz iced-5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269.tar.bz2 iced-5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269.zip |
Simplify theming for `ProgressBar` widget
Diffstat (limited to 'widget/src/progress_bar.rs')
-rw-r--r-- | widget/src/progress_bar.rs | 108 |
1 files changed, 85 insertions, 23 deletions
diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index 694fdd28..40ee5e02 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -3,12 +3,13 @@ use crate::core::layout; use crate::core::mouse; use crate::core::renderer; use crate::core::widget::Tree; -use crate::core::{Border, Element, Layout, Length, Rectangle, Size, Widget}; +use crate::core::{ + Background, Border, Element, Layout, Length, Rectangle, Size, Widget, +}; +use crate::style::Theme; use std::ops::RangeInclusive; -pub use iced_style::progress_bar::{Appearance, StyleSheet}; - /// A bar that displays progress. /// /// # Example @@ -22,21 +23,15 @@ pub use iced_style::progress_bar::{Appearance, StyleSheet}; /// ///  #[allow(missing_debug_implementations)] -pub struct ProgressBar<Theme = crate::Theme> -where - Theme: StyleSheet, -{ +pub struct ProgressBar<Theme = crate::Theme> { range: RangeInclusive<f32>, value: f32, width: Length, height: Option<Length>, - style: Theme::Style, + style: fn(&Theme) -> Appearance, } -impl<Theme> ProgressBar<Theme> -where - Theme: StyleSheet, -{ +impl<Theme> ProgressBar<Theme> { /// The default height of a [`ProgressBar`]. pub const DEFAULT_HEIGHT: f32 = 30.0; @@ -45,13 +40,16 @@ where /// It expects: /// * an inclusive range of possible values /// * 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 + Theme: Style, + { ProgressBar { value: value.clamp(*range.start(), *range.end()), range, width: Length::Fill, height: None, - style: Default::default(), + style: Theme::style(), } } @@ -68,8 +66,8 @@ where } /// Sets the style of the [`ProgressBar`]. - pub fn style(mut self, style: impl Into<Theme::Style>) -> Self { - self.style = style.into(); + pub fn style(mut self, style: fn(&Theme) -> Appearance) -> Self { + self.style = style; self } } @@ -78,7 +76,6 @@ impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for ProgressBar<Theme> where Renderer: crate::core::Renderer, - Theme: StyleSheet, { fn size(&self) -> Size<Length> { Size { @@ -120,15 +117,15 @@ where / (range_end - range_start) }; - let style = theme.appearance(&self.style); + let appearance = (self.style)(theme); renderer.fill_quad( renderer::Quad { bounds: Rectangle { ..bounds }, - border: Border::with_radius(style.border_radius), + border: appearance.border, ..renderer::Quad::default() }, - style.background, + appearance.background, ); if active_progress_width > 0.0 { @@ -138,10 +135,10 @@ where width: active_progress_width, ..bounds }, - border: Border::with_radius(style.border_radius), + border: Border::with_radius(appearance.border.radius), ..renderer::Quad::default() }, - style.bar, + appearance.bar, ); } } @@ -151,7 +148,7 @@ impl<'a, Message, Theme, Renderer> From<ProgressBar<Theme>> for Element<'a, Message, Theme, Renderer> where Message: 'a, - Theme: StyleSheet + 'a, + Theme: 'a, Renderer: 'a + crate::core::Renderer, { fn from( @@ -160,3 +157,68 @@ where Element::new(progress_bar) } } + +/// The appearance of a progress bar. +#[derive(Debug, Clone, Copy)] +pub struct Appearance { + /// The [`Background`] of the progress bar. + pub background: Background, + /// The [`Background`] of the bar of the progress bar. + pub bar: Background, + /// The [`Border`] of the progress bar. + pub border: Border, +} + +/// The definiton of the default style of a [`ProgressBar`]. +pub trait Style { + /// Returns the default style of a [`ProgressBar`]. + fn style() -> fn(&Self) -> Appearance; +} + +impl Style for Theme { + fn style() -> fn(&Self) -> Appearance { + primary + } +} + +/// The primary style of a [`ProgressBar`]. +pub fn primary(theme: &Theme) -> Appearance { + let palette = theme.extended_palette(); + + styled(palette.background.strong.color, palette.primary.base.color) +} + +/// The secondary style of a [`ProgressBar`]. +pub fn secondary(theme: &Theme) -> Appearance { + let palette = theme.extended_palette(); + + styled( + palette.background.strong.color, + palette.secondary.base.color, + ) +} + +/// The success style of a [`ProgressBar`]. +pub fn success(theme: &Theme) -> Appearance { + let palette = theme.extended_palette(); + + styled(palette.background.strong.color, palette.success.base.color) +} + +/// The danger style of a [`ProgressBar`]. +pub fn danger(theme: &Theme) -> Appearance { + let palette = theme.extended_palette(); + + styled(palette.background.strong.color, palette.danger.base.color) +} + +fn styled( + background: impl Into<Background>, + bar: impl Into<Background>, +) -> Appearance { + Appearance { + background: background.into(), + bar: bar.into(), + border: Border::with_radius(2), + } +} |