From 29326215ccf13e1d1e25bf3bf5ada007856bff69 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Mar 2024 03:48:08 +0100 Subject: Simplify theming for `Container` widget --- widget/src/overlay/menu.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 8a4d6a98..a666b98e 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -47,7 +47,7 @@ impl<'a, T, Message, Theme, Renderer> Menu<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, - Theme: StyleSheet + container::StyleSheet + scrollable::StyleSheet + 'a, + Theme: StyleSheet + container::Style + scrollable::StyleSheet + 'a, Renderer: text::Renderer + 'a, { /// Creates a new [`Menu`] with the given [`State`], a list of options, and @@ -165,7 +165,7 @@ impl Default for State { struct Overlay<'a, Message, Theme, Renderer> where - Theme: StyleSheet + container::StyleSheet, + Theme: StyleSheet + container::Style, Renderer: crate::core::Renderer, { position: Point, @@ -179,7 +179,7 @@ where impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> where Message: 'a, - Theme: StyleSheet + container::StyleSheet + scrollable::StyleSheet + 'a, + Theme: StyleSheet + container::Style + scrollable::StyleSheet + 'a, Renderer: text::Renderer + 'a, { pub fn new( @@ -235,7 +235,7 @@ impl<'a, Message, Theme, Renderer> crate::core::Overlay for Overlay<'a, Message, Theme, Renderer> where - Theme: StyleSheet + container::StyleSheet, + Theme: StyleSheet + container::Style, Renderer: text::Renderer, { fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node { -- cgit From d681aaa57e3106cf0ce90b74ade040ca7bb97832 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Mar 2024 04:42:25 +0100 Subject: Simplify theming for `Scrollable` widget --- widget/src/overlay/menu.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index a666b98e..b9b735e4 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -47,7 +47,7 @@ impl<'a, T, Message, Theme, Renderer> Menu<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, - Theme: StyleSheet + container::Style + scrollable::StyleSheet + 'a, + Theme: StyleSheet + container::Style + scrollable::Tradition + 'a, Renderer: text::Renderer + 'a, { /// Creates a new [`Menu`] with the given [`State`], a list of options, and @@ -179,7 +179,7 @@ where impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> where Message: 'a, - Theme: StyleSheet + container::Style + scrollable::StyleSheet + 'a, + Theme: StyleSheet + container::Style + scrollable::Tradition + 'a, Renderer: text::Renderer + 'a, { pub fn new( -- cgit From 704ec9cb5cdc1d44f2df2f15de700b0af330b1d7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Mar 2024 15:53:59 +0100 Subject: Simplify theming for `TextInput` widget --- widget/src/overlay/menu.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index b9b735e4..d820592d 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -47,7 +47,7 @@ impl<'a, T, Message, Theme, Renderer> Menu<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, - Theme: StyleSheet + container::Style + scrollable::Tradition + 'a, + Theme: StyleSheet + container::Style + scrollable::Style + 'a, Renderer: text::Renderer + 'a, { /// Creates a new [`Menu`] with the given [`State`], a list of options, and @@ -179,7 +179,7 @@ where impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> where Message: 'a, - Theme: StyleSheet + container::Style + scrollable::Tradition + 'a, + Theme: StyleSheet + container::Style + scrollable::Style + 'a, Renderer: text::Renderer + 'a, { pub fn new( -- cgit From 597a41cea73f078eda04eb3ff40cfda5d37d6135 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 6 Mar 2024 17:08:28 +0100 Subject: Simplify theming for `PickList`, `ComboBox`, and `Menu` widgets --- widget/src/overlay/menu.rs | 143 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 110 insertions(+), 33 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index d820592d..bb8ad0e0 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -10,12 +10,12 @@ use crate::core::text::{self, Text}; use crate::core::touch; use crate::core::widget::Tree; use crate::core::{ - Border, Clipboard, Length, Padding, Pixels, Point, Rectangle, Size, Vector, + Background, Border, Clipboard, Color, Length, Padding, Pixels, Point, + Rectangle, Size, Vector, }; use crate::core::{Element, Shell, Widget}; use crate::scrollable::{self, Scrollable}; - -pub use iced_style::menu::{Appearance, StyleSheet}; +use crate::style::Theme; /// A list of selectable options. #[allow(missing_debug_implementations)] @@ -26,7 +26,6 @@ pub struct Menu< Theme = crate::Theme, Renderer = crate::Renderer, > where - Theme: StyleSheet, Renderer: text::Renderer, { state: &'a mut State, @@ -40,14 +39,14 @@ pub struct Menu< text_line_height: text::LineHeight, text_shaping: text::Shaping, font: Option, - style: Theme::Style, + style: Style, } impl<'a, T, Message, Theme, Renderer> Menu<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, - Theme: StyleSheet + container::Style + scrollable::Style + 'a, + Theme: container::Style + scrollable::Style + 'a, Renderer: text::Renderer + 'a, { /// Creates a new [`Menu`] with the given [`State`], a list of options, and @@ -58,6 +57,29 @@ where hovered_option: &'a mut Option, on_selected: impl FnMut(T) -> Message + 'a, on_option_hovered: Option<&'a dyn Fn(T) -> Message>, + ) -> Self + where + Style: Default, + { + Self::with_style( + state, + options, + hovered_option, + on_selected, + on_option_hovered, + Style::default(), + ) + } + + /// Creates a new [`Menu`] with the given [`State`], a list of options, + /// the message to produced when an option is selected, and its [`Style`]. + pub fn with_style( + state: &'a mut State, + options: &'a [T], + hovered_option: &'a mut Option, + on_selected: impl FnMut(T) -> Message + 'a, + on_option_hovered: Option<&'a dyn Fn(T) -> Message>, + style: Style, ) -> Self { Menu { state, @@ -71,7 +93,7 @@ where text_line_height: text::LineHeight::default(), text_shaping: text::Shaping::Basic, font: None, - style: Default::default(), + style, } } @@ -115,10 +137,7 @@ where } /// Sets the style of the [`Menu`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into>) -> Self { self.style = style.into(); self } @@ -165,7 +184,6 @@ impl Default for State { struct Overlay<'a, Message, Theme, Renderer> where - Theme: StyleSheet + container::Style, Renderer: crate::core::Renderer, { position: Point, @@ -173,13 +191,13 @@ where container: Container<'a, Message, Theme, Renderer>, width: f32, target_height: f32, - style: ::Style, + style: Style, } impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> where Message: 'a, - Theme: StyleSheet + container::Style + scrollable::Style + 'a, + Theme: container::Style + scrollable::Style + 'a, Renderer: text::Renderer + 'a, { pub fn new( @@ -205,18 +223,21 @@ where style, } = menu; - let container = Container::new(Scrollable::new(List { - options, - hovered_option, - on_selected, - on_option_hovered, - font, - text_size, - text_line_height, - text_shaping, - padding, - style: style.clone(), - })); + let container = Container::new( + Scrollable::new(List { + options, + hovered_option, + on_selected, + on_option_hovered, + font, + text_size, + text_line_height, + text_shaping, + padding, + style: style.menu, + }) + .style(style.scrollable), + ); state.tree.diff(&container as &dyn Widget<_, _, _>); @@ -235,7 +256,6 @@ impl<'a, Message, Theme, Renderer> crate::core::Overlay for Overlay<'a, Message, Theme, Renderer> where - Theme: StyleSheet + container::Style, Renderer: text::Renderer, { fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node { @@ -302,9 +322,10 @@ where layout: Layout<'_>, cursor: mouse::Cursor, ) { - let appearance = StyleSheet::appearance(theme, &self.style); let bounds = layout.bounds(); + let appearance = (self.style.menu)(theme); + renderer.fill_quad( renderer::Quad { bounds, @@ -321,7 +342,6 @@ where struct List<'a, T, Message, Theme, Renderer> where - Theme: StyleSheet, Renderer: text::Renderer, { options: &'a [T], @@ -333,14 +353,13 @@ where text_line_height: text::LineHeight, text_shaping: text::Shaping, font: Option, - style: Theme::Style, + style: fn(&Theme) -> Appearance, } impl<'a, T, Message, Theme, Renderer> Widget for List<'a, T, Message, Theme, Renderer> where T: Clone + ToString, - Theme: StyleSheet, Renderer: text::Renderer, { fn size(&self) -> Size { @@ -483,7 +502,7 @@ where _cursor: mouse::Cursor, viewport: &Rectangle, ) { - let appearance = theme.appearance(&self.style); + let appearance = (self.style)(theme); let bounds = layout.bounds(); let text_size = @@ -553,10 +572,68 @@ impl<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, - Theme: StyleSheet + 'a, + Theme: 'a, Renderer: 'a + text::Renderer, { fn from(list: List<'a, T, Message, Theme, Renderer>) -> Self { Element::new(list) } } + +/// The appearance of a [`Menu`]. +#[derive(Debug, Clone, Copy)] +pub struct Appearance { + /// The [`Background`] of the menu. + pub background: Background, + /// The [`Border`] of the menu. + pub border: Border, + /// The text [`Color`] of the menu. + pub text_color: Color, + /// The text [`Color`] of a selected option in the menu. + pub selected_text_color: Color, + /// The background [`Color`] of a selected option in the menu. + pub selected_background: Background, +} + +/// The definiton of the default style of a [`Menu`]. +#[derive(Debug, PartialEq, Eq)] +pub struct Style { + /// The style of the [`Menu`]. + menu: fn(&Theme) -> Appearance, + /// The style of the [`Scrollable`] of the [`Menu`]. + scrollable: fn(&Theme, scrollable::Status) -> scrollable::Appearance, +} + +impl Clone for Style { + fn clone(&self) -> Self { + *self + } +} + +impl Copy for Style {} + +impl Default for Style { + fn default() -> Self { + Self { + menu: default, + scrollable: scrollable::default, + } + } +} + +/// The default style of a [`Menu`]. +pub fn default(theme: &Theme) -> Appearance { + let palette = theme.extended_palette(); + + Appearance { + background: palette.background.weak.color.into(), + border: Border { + width: 1.0, + radius: 0.0.into(), + color: palette.background.strong.color, + }, + text_color: palette.background.weak.text, + selected_text_color: palette.primary.strong.text, + selected_background: palette.primary.strong.color.into(), + } +} -- 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/overlay/menu.rs | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index bb8ad0e0..e0887e59 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -46,7 +46,7 @@ impl<'a, T, Message, Theme, Renderer> Menu<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, - Theme: container::Style + scrollable::Style + 'a, + Theme: 'a, Renderer: text::Renderer + 'a, { /// Creates a new [`Menu`] with the given [`State`], a list of options, and @@ -197,7 +197,7 @@ where impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> where Message: 'a, - Theme: container::Style + scrollable::Style + 'a, + Theme: 'a, Renderer: text::Renderer + 'a, { pub fn new( @@ -223,20 +223,24 @@ where style, } = menu; - let container = Container::new( - Scrollable::new(List { - options, - hovered_option, - on_selected, - on_option_hovered, - font, - text_size, - text_line_height, - text_shaping, - padding, - style: style.menu, - }) - .style(style.scrollable), + let container = Container::with_style( + Scrollable::with_direction_and_style( + List { + options, + hovered_option, + on_selected, + on_option_hovered, + font, + text_size, + text_line_height, + text_shaping, + padding, + style: style.menu, + }, + scrollable::Direction::default(), + style.scrollable, + ), + container::transparent, ); state.tree.diff(&container as &dyn Widget<_, _, _>); -- 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/overlay/menu.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index e0887e59..2b9e0d03 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -11,11 +11,10 @@ use crate::core::touch; use crate::core::widget::Tree; use crate::core::{ Background, Border, Clipboard, Color, Length, Padding, Pixels, Point, - Rectangle, Size, Vector, + Rectangle, Size, Theme, Vector, }; use crate::core::{Element, Shell, Widget}; use crate::scrollable::{self, Scrollable}; -use crate::style::Theme; /// A list of selectable options. #[allow(missing_debug_implementations)] -- 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/overlay/menu.rs | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 2b9e0d03..3ed26b7d 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -58,7 +58,7 @@ where on_option_hovered: Option<&'a dyn Fn(T) -> Message>, ) -> Self where - Style: Default, + Theme: DefaultStyle, { Self::with_style( state, @@ -66,7 +66,7 @@ where hovered_option, on_selected, on_option_hovered, - Style::default(), + Theme::default_style(), ) } @@ -234,7 +234,7 @@ where text_line_height, text_shaping, padding, - style: style.menu, + style: style.list, }, scrollable::Direction::default(), style.scrollable, @@ -327,7 +327,7 @@ where ) { let bounds = layout.bounds(); - let appearance = (self.style.menu)(theme); + let appearance = (self.style.list)(theme); renderer.fill_quad( renderer::Quad { @@ -598,15 +598,23 @@ pub struct Appearance { pub selected_background: Background, } -/// The definiton of the default style of a [`Menu`]. +/// The style of the different parts of a [`Menu`]. #[derive(Debug, PartialEq, Eq)] pub struct Style { - /// The style of the [`Menu`]. - menu: fn(&Theme) -> Appearance, + /// The style of the list of the [`Menu`]. + list: fn(&Theme) -> Appearance, /// The style of the [`Scrollable`] of the [`Menu`]. scrollable: fn(&Theme, scrollable::Status) -> scrollable::Appearance, } +impl Style { + /// The default style of a [`Menu`] with the built-in [`Theme`]. + pub const DEFAULT: Self = Self { + list: default, + scrollable: scrollable::default, + }; +} + impl Clone for Style { fn clone(&self) -> Self { *self @@ -615,16 +623,19 @@ impl Clone for Style { impl Copy for Style {} -impl Default for Style { - fn default() -> Self { - Self { - menu: default, - scrollable: scrollable::default, - } +/// The default style of a [`Menu`]. +pub trait DefaultStyle: Sized { + /// Returns the default style of a [`Menu`]. + fn default_style() -> Style; +} + +impl DefaultStyle for Theme { + fn default_style() -> Style { + Style::::DEFAULT } } -/// The default style of a [`Menu`]. +/// The default style of the list of a [`Menu`]. pub fn default(theme: &Theme) -> Appearance { let palette = theme.extended_palette(); -- cgit From e11776055dd6c79298c17e00a86ba43aba917bba Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 7 Mar 2024 20:13:29 +0100 Subject: Make fields of `Style` structs public --- widget/src/overlay/menu.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 3ed26b7d..e855fc14 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -602,9 +602,9 @@ pub struct Appearance { #[derive(Debug, PartialEq, Eq)] pub struct Style { /// The style of the list of the [`Menu`]. - list: fn(&Theme) -> Appearance, + pub list: fn(&Theme) -> Appearance, /// The style of the [`Scrollable`] of the [`Menu`]. - scrollable: fn(&Theme, scrollable::Status) -> scrollable::Appearance, + pub scrollable: fn(&Theme, scrollable::Status) -> scrollable::Appearance, } impl Style { -- 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/overlay/menu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'widget/src/overlay/menu.rs') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index e855fc14..746407c6 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -539,7 +539,7 @@ where width: bounds.width - appearance.border.width * 2.0, ..bounds }, - border: Border::with_radius(appearance.border.radius), + border: Border::rounded(appearance.border.radius), ..renderer::Quad::default() }, appearance.selected_background, -- cgit