diff options
author | 2024-03-05 22:13:36 +0100 | |
---|---|---|
committer | 2024-03-05 22:13:55 +0100 | |
commit | 5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269 (patch) | |
tree | a0a4ae0022d48490cc3f2c579aa020cd13955f71 | |
parent | 87d16a090b14fa206bb87041a32d66348bc294e4 (diff) | |
download | iced-5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269.tar.gz iced-5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269.tar.bz2 iced-5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269.zip |
Simplify theming for `ProgressBar` widget
-rw-r--r-- | examples/scrollable/src/main.rs | 5 | ||||
-rw-r--r-- | style/src/lib.rs | 1 | ||||
-rw-r--r-- | style/src/progress_bar.rs | 23 | ||||
-rw-r--r-- | style/src/theme.rs | 56 | ||||
-rw-r--r-- | widget/src/helpers.rs | 2 | ||||
-rw-r--r-- | widget/src/progress_bar.rs | 108 |
6 files changed, 89 insertions, 106 deletions
diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index bae23775..2ad7272b 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -5,7 +5,8 @@ use iced::widget::{ scrollable, slider, text, vertical_space, Scrollable, }; use iced::{ - Alignment, Application, Color, Command, Element, Length, Settings, Theme, + Alignment, Application, Border, Color, Command, Element, Length, Settings, + Theme, }; use once_cell::sync::Lazy; @@ -348,6 +349,6 @@ fn progress_bar_custom_style(theme: &Theme) -> progress_bar::Appearance { progress_bar::Appearance { background: theme.extended_palette().background.strong.color.into(), bar: Color::from_rgb8(250, 85, 134).into(), - border_radius: 0.0.into(), + border: Border::default(), } } diff --git a/style/src/lib.rs b/style/src/lib.rs index 45717d46..c8fb9ffe 100644 --- a/style/src/lib.rs +++ b/style/src/lib.rs @@ -20,7 +20,6 @@ pub mod application; pub mod menu; pub mod pane_grid; pub mod pick_list; -pub mod progress_bar; pub mod rule; pub mod svg; pub mod text_editor; diff --git a/style/src/progress_bar.rs b/style/src/progress_bar.rs deleted file mode 100644 index b62512d8..00000000 --- a/style/src/progress_bar.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! Change the appearance of a progress bar. -use crate::core::border; -use crate::core::Background; - -/// 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 radius of the progress bar. - pub border_radius: border::Radius, -} - -/// A set of rules that dictate the style of a progress bar. -pub trait StyleSheet { - /// The supported style of the [`StyleSheet`]. - type Style: Default; - - /// Produces the [`Appearance`] of the progress bar. - fn appearance(&self, style: &Self::Style) -> Appearance; -} diff --git a/style/src/theme.rs b/style/src/theme.rs index b188e561..8ed15408 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -8,7 +8,6 @@ use crate::core::widget::text; use crate::menu; use crate::pane_grid; use crate::pick_list; -use crate::progress_bar; use crate::rule; use crate::svg; use crate::text_editor; @@ -512,61 +511,6 @@ impl pane_grid::StyleSheet for Theme { } } -/// The style of a progress bar. -#[derive(Default)] -pub enum ProgressBar { - /// The primary style. - #[default] - Primary, - /// The success style. - Success, - /// The danger style. - Danger, - /// A custom style. - Custom(Box<dyn progress_bar::StyleSheet<Style = Theme>>), -} - -impl<T: Fn(&Theme) -> progress_bar::Appearance + 'static> From<T> - for ProgressBar -{ - fn from(f: T) -> Self { - Self::Custom(Box::new(f)) - } -} - -impl progress_bar::StyleSheet for Theme { - type Style = ProgressBar; - - fn appearance(&self, style: &Self::Style) -> progress_bar::Appearance { - if let ProgressBar::Custom(custom) = style { - return custom.appearance(self); - } - - let palette = self.extended_palette(); - - let from_palette = |bar: Color| progress_bar::Appearance { - background: palette.background.strong.color.into(), - bar: bar.into(), - border_radius: 2.0.into(), - }; - - match style { - ProgressBar::Primary => from_palette(palette.primary.base.color), - ProgressBar::Success => from_palette(palette.success.base.color), - ProgressBar::Danger => from_palette(palette.danger.base.color), - ProgressBar::Custom(custom) => custom.appearance(self), - } - } -} - -impl<T: Fn(&Theme) -> progress_bar::Appearance> progress_bar::StyleSheet for T { - type Style = Theme; - - fn appearance(&self, style: &Self::Style) -> progress_bar::Appearance { - (self)(style) - } -} - /// The style of a rule. #[derive(Default)] pub enum Rule { diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 355f7814..01645bc9 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -351,7 +351,7 @@ pub fn progress_bar<Theme>( value: f32, ) -> ProgressBar<Theme> where - Theme: progress_bar::StyleSheet, + Theme: progress_bar::Style, { ProgressBar::new(range, value) } 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), + } +} |