From 5824ceb1fe8420b9337eee9a0e6db6cf7cb7f269 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Mar 2024 22:13:36 +0100 Subject: Simplify theming for `ProgressBar` widget --- widget/src/progress_bar.rs | 108 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 85 insertions(+), 23 deletions(-) (limited to 'widget/src/progress_bar.rs') 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}; /// /// ![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 -where - Theme: StyleSheet, -{ +pub struct ProgressBar { range: RangeInclusive, value: f32, width: Length, height: Option, - style: Theme::Style, + style: fn(&Theme) -> Appearance, } -impl ProgressBar -where - Theme: StyleSheet, -{ +impl ProgressBar { /// 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, value: f32) -> Self { + pub fn new(range: RangeInclusive, 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) -> Self { - self.style = style.into(); + pub fn style(mut self, style: fn(&Theme) -> Appearance) -> Self { + self.style = style; self } } @@ -78,7 +76,6 @@ impl Widget for ProgressBar where Renderer: crate::core::Renderer, - Theme: StyleSheet, { fn size(&self) -> Size { 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> 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, + bar: impl Into, +) -> Appearance { + Appearance { + background: background.into(), + bar: bar.into(), + border: Border::with_radius(2), + } +} -- cgit From 420f49bef5f6938868a84086e729deaa1df9107f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Mar 2024 22:31:01 +0100 Subject: Improve default styling of `Slider` widget --- widget/src/progress_bar.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'widget/src/progress_bar.rs') diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index 40ee5e02..889c5558 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -185,7 +185,10 @@ impl Style for Theme { pub fn primary(theme: &Theme) -> Appearance { let palette = theme.extended_palette(); - styled(palette.background.strong.color, palette.primary.base.color) + styled( + palette.background.strong.color, + palette.primary.strong.color, + ) } /// The secondary style of a [`ProgressBar`]. -- cgit From 34e7c6593a9e0f56cee5db18b7258717cf6bc11b Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 6 Mar 2024 20:30:58 +0100 Subject: Use `Style` struct pattern instead of trait for all widgets --- widget/src/progress_bar.rs | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) (limited to 'widget/src/progress_bar.rs') diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index 889c5558..62d319f4 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -28,7 +28,7 @@ pub struct ProgressBar { value: f32, width: Length, height: Option, - style: fn(&Theme) -> Appearance, + style: Style, } impl ProgressBar { @@ -42,14 +42,14 @@ impl ProgressBar { /// * the current value of the [`ProgressBar`] pub fn new(range: RangeInclusive, value: f32) -> Self where - Theme: Style, + Style: Default, { ProgressBar { value: value.clamp(*range.start(), *range.end()), range, width: Length::Fill, height: None, - style: Theme::style(), + style: Style::default(), } } @@ -67,7 +67,7 @@ impl ProgressBar { /// Sets the style of the [`ProgressBar`]. pub fn style(mut self, style: fn(&Theme) -> Appearance) -> Self { - self.style = style; + self.style = style.into(); self } } @@ -117,7 +117,7 @@ where / (range_end - range_start) }; - let appearance = (self.style)(theme); + let appearance = (self.style.0)(theme); renderer.fill_quad( renderer::Quad { @@ -169,15 +169,27 @@ pub struct Appearance { 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; +/// The style of a [`ProgressBar`]. +#[derive(Debug, PartialEq, Eq)] +pub struct Style(fn(&Theme) -> Appearance); + +impl Clone for Style { + fn clone(&self) -> Self { + *self + } +} + +impl Copy for Style {} + +impl Default for Style { + fn default() -> Self { + Style(primary) + } } -impl Style for Theme { - fn style() -> fn(&Self) -> Appearance { - primary +impl From Appearance> for Style { + fn from(f: fn(&Theme) -> Appearance) -> Self { + Style(f) } } -- cgit From 905f2160e6eb7504f52d9bd62c7bfa42c8ec2902 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 7 Mar 2024 00:14:41 +0100 Subject: Move `Theme` type to `iced_core` --- widget/src/progress_bar.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'widget/src/progress_bar.rs') diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index 62d319f4..b667b506 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -4,9 +4,8 @@ use crate::core::mouse; use crate::core::renderer; use crate::core::widget::Tree; use crate::core::{ - Background, Border, Element, Layout, Length, Rectangle, Size, Widget, + Background, Border, Element, Layout, Length, Rectangle, Size, Theme, Widget, }; -use crate::style::Theme; use std::ops::RangeInclusive; @@ -14,7 +13,7 @@ use std::ops::RangeInclusive; /// /// # Example /// ```no_run -/// # type ProgressBar = iced_widget::ProgressBar; +/// # type ProgressBar = iced_widget::ProgressBar; /// # /// let value = 50.0; /// -- cgit From 833538ee7f3a60a839304762dfc29b0881d19094 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 7 Mar 2024 20:11:32 +0100 Subject: Leverage `DefaultStyle` traits instead of `Default` --- widget/src/progress_bar.rs | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'widget/src/progress_bar.rs') diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index b667b506..f945a7b5 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -41,14 +41,14 @@ impl ProgressBar { /// * the current value of the [`ProgressBar`] pub fn new(range: RangeInclusive, value: f32) -> Self where - Style: Default, + Theme: DefaultStyle, { ProgressBar { value: value.clamp(*range.start(), *range.end()), range, width: Length::Fill, height: None, - style: Style::default(), + style: Theme::default_style(), } } @@ -116,7 +116,7 @@ where / (range_end - range_start) }; - let appearance = (self.style.0)(theme); + let appearance = (self.style)(theme); renderer.fill_quad( renderer::Quad { @@ -169,26 +169,23 @@ pub struct Appearance { } /// The style of a [`ProgressBar`]. -#[derive(Debug, PartialEq, Eq)] -pub struct Style(fn(&Theme) -> Appearance); +pub type Style = fn(&Theme) -> Appearance; -impl Clone for Style { - fn clone(&self) -> Self { - *self - } +/// The default style of a [`ProgressBar`]. +pub trait DefaultStyle { + /// Returns the default style of a [`ProgressBar`]. + fn default_style() -> Style; } -impl Copy for Style {} - -impl Default for Style { - fn default() -> Self { - Style(primary) +impl DefaultStyle for Theme { + fn default_style() -> Style { + primary } } -impl From Appearance> for Style { - fn from(f: fn(&Theme) -> Appearance) -> Self { - Style(f) +impl DefaultStyle for Appearance { + fn default_style() -> Style { + |appearance| *appearance } } -- cgit From 7ece5eea509f3595432babfc7729701f2e063b21 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 7 Mar 2024 21:02:17 +0100 Subject: Implement additional helpers for `Border` and `container::Appearance` --- widget/src/progress_bar.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'widget/src/progress_bar.rs') diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index f945a7b5..7b0ea63f 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -134,7 +134,7 @@ where width: active_progress_width, ..bounds }, - border: Border::with_radius(appearance.border.radius), + border: Border::rounded(appearance.border.radius), ..renderer::Quad::default() }, appearance.bar, @@ -230,6 +230,6 @@ fn styled( Appearance { background: background.into(), bar: bar.into(), - border: Border::with_radius(2), + border: Border::rounded(2), } } -- cgit