From 664251f3f5c7b76f69a97683af1468094bba887f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 14 May 2022 01:47:55 +0200 Subject: Draft first-class `Theme` support RFC: https://github.com/iced-rs/rfcs/pull/6 --- pure/src/widget/button.rs | 32 ++++++++++++++++++++++++-------- pure/src/widget/checkbox.rs | 2 ++ pure/src/widget/column.rs | 2 ++ pure/src/widget/container.rs | 2 ++ pure/src/widget/image.rs | 2 ++ pure/src/widget/pane_grid.rs | 2 ++ pure/src/widget/pane_grid/content.rs | 4 ++++ pure/src/widget/pane_grid/title_bar.rs | 3 +++ pure/src/widget/pick_list.rs | 1 + pure/src/widget/progress_bar.rs | 2 ++ pure/src/widget/radio.rs | 2 ++ pure/src/widget/row.rs | 2 ++ pure/src/widget/rule.rs | 2 ++ pure/src/widget/scrollable.rs | 2 ++ pure/src/widget/slider.rs | 1 + pure/src/widget/space.rs | 2 ++ pure/src/widget/svg.rs | 2 ++ pure/src/widget/text.rs | 2 ++ pure/src/widget/text_input.rs | 1 + pure/src/widget/toggler.rs | 2 ++ pure/src/widget/tooltip.rs | 3 +++ pure/src/widget/tree.rs | 13 ++++++++++--- 22 files changed, 75 insertions(+), 11 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/button.rs b/pure/src/widget/button.rs index 456c2509..45f4a6aa 100644 --- a/pure/src/widget/button.rs +++ b/pure/src/widget/button.rs @@ -50,25 +50,34 @@ use button::State; /// disabled_button().on_press(Message::ButtonPressed) /// } /// ``` -pub struct Button<'a, Message, Renderer> { +pub struct Button<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, +{ content: Element<'a, Message, Renderer>, on_press: Option, - style_sheet: Box, width: Length, height: Length, padding: Padding, + variant: ::Variant, } -impl<'a, Message, Renderer> Button<'a, Message, Renderer> { +impl<'a, Message, Renderer> Button<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, + ::Variant: Default, +{ /// Creates a new [`Button`] with the given content. pub fn new(content: impl Into>) -> Self { Button { content: content.into(), on_press: None, - style_sheet: Default::default(), width: Length::Shrink, height: Length::Shrink, padding: Padding::new(5), + variant: ::Variant::default(), } } @@ -98,12 +107,12 @@ impl<'a, Message, Renderer> Button<'a, Message, Renderer> { self } - /// Sets the style of the [`Button`]. + /// Sets the style variant of this [`Button`]. pub fn style( mut self, - style_sheet: impl Into>, + variant: ::Variant, ) -> Self { - self.style_sheet = style_sheet.into(); + self.variant = variant; self } } @@ -113,6 +122,8 @@ impl<'a, Message, Renderer> Widget where Message: 'a + Clone, Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, + ::Variant: Copy, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -191,6 +202,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -204,13 +216,15 @@ where bounds, cursor_position, self.on_press.is_some(), - self.style_sheet.as_ref(), + theme, + self.variant, || tree.state.downcast_ref::(), ); self.content.as_widget().draw( &tree.children[0], renderer, + theme, &renderer::Style { text_color: styling.text_color, }, @@ -254,6 +268,8 @@ impl<'a, Message, Renderer> Into> where Message: Clone + 'a, Renderer: iced_native::Renderer + 'a, + Renderer::Theme: StyleSheet, + ::Variant: Copy, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/checkbox.rs b/pure/src/widget/checkbox.rs index 98f55a56..a6a6f8de 100644 --- a/pure/src/widget/checkbox.rs +++ b/pure/src/widget/checkbox.rs @@ -59,6 +59,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -67,6 +68,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/column.rs b/pure/src/widget/column.rs index 7256f474..74d789a1 100644 --- a/pure/src/widget/column.rs +++ b/pure/src/widget/column.rs @@ -194,6 +194,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -208,6 +209,7 @@ where child.as_widget().draw( state, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/container.rs b/pure/src/widget/container.rs index 91db1f3f..0ec2351a 100644 --- a/pure/src/widget/container.rs +++ b/pure/src/widget/container.rs @@ -201,6 +201,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, renderer_style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -213,6 +214,7 @@ where self.content.as_widget().draw( &tree.children[0], renderer, + theme, &renderer::Style { text_color: style .text_color diff --git a/pure/src/widget/image.rs b/pure/src/widget/image.rs index ef764ec2..c42113dc 100644 --- a/pure/src/widget/image.rs +++ b/pure/src/widget/image.rs @@ -38,6 +38,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -46,6 +47,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs index c532a6de..168fe12b 100644 --- a/pure/src/widget/pane_grid.rs +++ b/pure/src/widget/pane_grid.rs @@ -331,6 +331,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -360,6 +361,7 @@ where content.draw( tree, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/pane_grid/content.rs b/pure/src/widget/pane_grid/content.rs index e66ac40b..5069bd4a 100644 --- a/pure/src/widget/pane_grid/content.rs +++ b/pure/src/widget/pane_grid/content.rs @@ -89,6 +89,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -112,6 +113,7 @@ where title_bar.draw( &tree.children[1], renderer, + theme, style, title_bar_layout, cursor_position, @@ -122,6 +124,7 @@ where self.body.as_widget().draw( &tree.children[0], renderer, + theme, style, body_layout, cursor_position, @@ -131,6 +134,7 @@ where self.body.as_widget().draw( &tree.children[0], renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/pane_grid/title_bar.rs b/pure/src/widget/pane_grid/title_bar.rs index 4a7c8c17..28a3d7fc 100644 --- a/pure/src/widget/pane_grid/title_bar.rs +++ b/pure/src/widget/pane_grid/title_bar.rs @@ -113,6 +113,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, inherited_style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -136,6 +137,7 @@ where self.content.as_widget().draw( &tree.children[0], renderer, + theme, &inherited_style, title_layout, cursor_position, @@ -149,6 +151,7 @@ where controls.as_widget().draw( &tree.children[1], renderer, + theme, &inherited_style, controls_layout, cursor_position, diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 255e3681..78302a7d 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -181,6 +181,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + _theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/pure/src/widget/progress_bar.rs b/pure/src/widget/progress_bar.rs index 3016a81a..47a299ac 100644 --- a/pure/src/widget/progress_bar.rs +++ b/pure/src/widget/progress_bar.rs @@ -57,6 +57,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -65,6 +66,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/radio.rs b/pure/src/widget/radio.rs index 7c98c937..c92c8dbc 100644 --- a/pure/src/widget/radio.rs +++ b/pure/src/widget/radio.rs @@ -60,6 +60,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -68,6 +69,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/row.rs b/pure/src/widget/row.rs index 0385b8bd..e747adfc 100644 --- a/pure/src/widget/row.rs +++ b/pure/src/widget/row.rs @@ -181,6 +181,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -195,6 +196,7 @@ where child.as_widget().draw( state, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/rule.rs b/pure/src/widget/rule.rs index ab8537ae..8e6af58e 100644 --- a/pure/src/widget/rule.rs +++ b/pure/src/widget/rule.rs @@ -57,6 +57,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -65,6 +66,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/scrollable.rs b/pure/src/widget/scrollable.rs index 70e951ef..a0180dc0 100644 --- a/pure/src/widget/scrollable.rs +++ b/pure/src/widget/scrollable.rs @@ -171,6 +171,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -189,6 +190,7 @@ where self.content.as_widget().draw( &tree.children[0], renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/slider.rs b/pure/src/widget/slider.rs index 4d8bbce4..2f934a48 100644 --- a/pure/src/widget/slider.rs +++ b/pure/src/widget/slider.rs @@ -195,6 +195,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/pure/src/widget/space.rs b/pure/src/widget/space.rs index b408153b..7d95ebd7 100644 --- a/pure/src/widget/space.rs +++ b/pure/src/widget/space.rs @@ -56,6 +56,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -64,6 +65,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/svg.rs b/pure/src/widget/svg.rs index 14180097..501d9bfa 100644 --- a/pure/src/widget/svg.rs +++ b/pure/src/widget/svg.rs @@ -36,6 +36,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -44,6 +45,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/text.rs b/pure/src/widget/text.rs index 58a939c1..0a51b628 100644 --- a/pure/src/widget/text.rs +++ b/pure/src/widget/text.rs @@ -34,6 +34,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -42,6 +43,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/text_input.rs b/pure/src/widget/text_input.rs index 57ad26d9..7d768513 100644 --- a/pure/src/widget/text_input.rs +++ b/pure/src/widget/text_input.rs @@ -190,6 +190,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/pure/src/widget/toggler.rs b/pure/src/widget/toggler.rs index b9c5ec02..e08b5f47 100644 --- a/pure/src/widget/toggler.rs +++ b/pure/src/widget/toggler.rs @@ -38,6 +38,7 @@ where &self, _state: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -46,6 +47,7 @@ where >::draw( self, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/widget/tooltip.rs b/pure/src/widget/tooltip.rs index 3887732a..15aa32fe 100644 --- a/pure/src/widget/tooltip.rs +++ b/pure/src/widget/tooltip.rs @@ -157,6 +157,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, inherited_style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -165,6 +166,7 @@ where self.content.as_widget().draw( &tree.children[0], renderer, + theme, inherited_style, layout, cursor_position, @@ -191,6 +193,7 @@ where tooltip, &Tree::empty(), renderer, + theme, defaults, layout, cursor_position, diff --git a/pure/src/widget/tree.rs b/pure/src/widget/tree.rs index 0bb3107a..2f876523 100644 --- a/pure/src/widget/tree.rs +++ b/pure/src/widget/tree.rs @@ -31,7 +31,10 @@ impl Tree { /// Creates a new [`Tree`] for the provided [`Element`]. pub fn new<'a, Message, Renderer>( widget: impl Borrow + 'a>, - ) -> Self { + ) -> Self + where + Renderer: iced_native::Renderer, + { let widget = widget.borrow(); Self { @@ -52,7 +55,9 @@ impl Tree { pub fn diff<'a, Message, Renderer>( &mut self, new: impl Borrow + 'a>, - ) { + ) where + Renderer: iced_native::Renderer, + { if self.tag == new.borrow().tag() { new.borrow().diff(self) } else { @@ -64,7 +69,9 @@ impl Tree { pub fn diff_children<'a, Message, Renderer>( &mut self, new_children: &[impl Borrow + 'a>], - ) { + ) where + Renderer: iced_native::Renderer, + { self.diff_children_custom( new_children, |tree, widget| tree.diff(widget.borrow()), -- cgit From 3a820b45f336398c48f8bedf7b8c4b8af876efff Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 26 May 2022 00:40:27 +0200 Subject: Implement theme styling for `Slider` --- pure/src/widget/slider.rs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/slider.rs b/pure/src/widget/slider.rs index 2f934a48..a6deda41 100644 --- a/pure/src/widget/slider.rs +++ b/pure/src/widget/slider.rs @@ -37,7 +37,11 @@ pub use iced_style::slider::{Handle, HandleShape, Style, StyleSheet}; /// /// ![Slider drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/slider.png?raw=true) #[allow(missing_debug_implementations)] -pub struct Slider<'a, T, Message> { +pub struct Slider<'a, T, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, +{ range: RangeInclusive, step: T, value: T, @@ -45,13 +49,15 @@ pub struct Slider<'a, T, Message> { on_release: Option, width: Length, height: u16, - style_sheet: Box, + variant: ::Variant, } -impl<'a, T, Message> Slider<'a, T, Message> +impl<'a, T, Message, Renderer> Slider<'a, T, Message, Renderer> where T: Copy + From + std::cmp::PartialOrd, Message: Clone, + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { /// The default height of a [`Slider`]. pub const DEFAULT_HEIGHT: u16 = 22; @@ -88,7 +94,7 @@ where on_release: None, width: Length::Fill, height: Self::DEFAULT_HEIGHT, - style_sheet: Default::default(), + variant: Default::default(), } } @@ -118,9 +124,9 @@ where /// Sets the style of the [`Slider`]. pub fn style( mut self, - style_sheet: impl Into>, + variant: impl Into<::Variant>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.variant = variant.into(); self } @@ -132,11 +138,12 @@ where } impl<'a, T, Message, Renderer> Widget - for Slider<'a, T, Message> + for Slider<'a, T, Message, Renderer> where T: Copy + Into + num_traits::FromPrimitive, Message: Clone, Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -208,7 +215,8 @@ where tree.state.downcast_ref::(), self.value, &self.range, - self.style_sheet.as_ref(), + theme, + self.variant, ) } @@ -228,14 +236,17 @@ where } } -impl<'a, T, Message, Renderer> From> +impl<'a, T, Message, Renderer> From> for Element<'a, Message, Renderer> where T: 'a + Copy + Into + num_traits::FromPrimitive, Message: 'a + Clone, Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, { - fn from(slider: Slider<'a, T, Message>) -> Element<'a, Message, Renderer> { + fn from( + slider: Slider<'a, T, Message, Renderer>, + ) -> Element<'a, Message, Renderer> { Element::new(slider) } } -- cgit From cf0230072c01ea9523f4d98a3656f5c975b3f347 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 26 May 2022 23:07:34 +0200 Subject: Rename `Variant` to `Style` and `Style` to `Appearance` --- pure/src/widget/button.rs | 15 ++++++--------- pure/src/widget/slider.rs | 12 ++++++------ 2 files changed, 12 insertions(+), 15 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/button.rs b/pure/src/widget/button.rs index 45f4a6aa..dd7688e2 100644 --- a/pure/src/widget/button.rs +++ b/pure/src/widget/button.rs @@ -12,7 +12,7 @@ use iced_native::{ Clipboard, Layout, Length, Padding, Point, Rectangle, Shell, }; -pub use iced_style::button::{Style, StyleSheet}; +pub use iced_style::button::{Appearance, StyleSheet}; use button::State; @@ -60,14 +60,13 @@ where width: Length, height: Length, padding: Padding, - variant: ::Variant, + style: ::Style, } impl<'a, Message, Renderer> Button<'a, Message, Renderer> where Renderer: iced_native::Renderer, Renderer::Theme: StyleSheet, - ::Variant: Default, { /// Creates a new [`Button`] with the given content. pub fn new(content: impl Into>) -> Self { @@ -77,7 +76,7 @@ where width: Length::Shrink, height: Length::Shrink, padding: Padding::new(5), - variant: ::Variant::default(), + style: ::Style::default(), } } @@ -110,9 +109,9 @@ where /// Sets the style variant of this [`Button`]. pub fn style( mut self, - variant: ::Variant, + style: ::Style, ) -> Self { - self.variant = variant; + self.style = style; self } } @@ -123,7 +122,6 @@ where Message: 'a + Clone, Renderer: 'a + iced_native::Renderer, Renderer::Theme: StyleSheet, - ::Variant: Copy, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -217,7 +215,7 @@ where cursor_position, self.on_press.is_some(), theme, - self.variant, + self.style, || tree.state.downcast_ref::(), ); @@ -269,7 +267,6 @@ where Message: Clone + 'a, Renderer: iced_native::Renderer + 'a, Renderer::Theme: StyleSheet, - ::Variant: Copy, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/slider.rs b/pure/src/widget/slider.rs index a6deda41..9bc32f08 100644 --- a/pure/src/widget/slider.rs +++ b/pure/src/widget/slider.rs @@ -11,7 +11,7 @@ use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell, Size}; use std::ops::RangeInclusive; -pub use iced_style::slider::{Handle, HandleShape, Style, StyleSheet}; +pub use iced_style::slider::{Appearance, Handle, HandleShape, StyleSheet}; /// An horizontal bar and a handle that selects a single value from a range of /// values. @@ -49,7 +49,7 @@ where on_release: Option, width: Length, height: u16, - variant: ::Variant, + style: ::Style, } impl<'a, T, Message, Renderer> Slider<'a, T, Message, Renderer> @@ -94,7 +94,7 @@ where on_release: None, width: Length::Fill, height: Self::DEFAULT_HEIGHT, - variant: Default::default(), + style: Default::default(), } } @@ -124,9 +124,9 @@ where /// Sets the style of the [`Slider`]. pub fn style( mut self, - variant: impl Into<::Variant>, + style: impl Into<::Style>, ) -> Self { - self.variant = variant.into(); + self.style = style.into(); self } @@ -216,7 +216,7 @@ where self.value, &self.range, theme, - self.variant, + self.style, ) } -- cgit From d5bc610d0139fb331a59fc904a932d156f637391 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 26 May 2022 23:12:11 +0200 Subject: Fix examples and doc-tests --- pure/src/widget/slider.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/slider.rs b/pure/src/widget/slider.rs index 9bc32f08..fed979e5 100644 --- a/pure/src/widget/slider.rs +++ b/pure/src/widget/slider.rs @@ -23,7 +23,10 @@ pub use iced_style::slider::{Appearance, Handle, HandleShape, StyleSheet}; /// /// # Example /// ``` -/// # use iced_pure::widget::Slider; +/// # use iced_pure::widget::slider; +/// # use iced_native::renderer::Null; +/// # +/// # type Slider<'a, T, Message> = slider::Slider<'a, T, Message, Null>; /// # /// #[derive(Clone)] /// pub enum Message { -- cgit From 28d09bfff1dde55190986bab10d7aaeb0ceb49de Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 27 May 2022 01:26:57 +0200 Subject: Implement theme styling for `Radio` --- pure/src/widget/radio.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/radio.rs b/pure/src/widget/radio.rs index c92c8dbc..9a8885e0 100644 --- a/pure/src/widget/radio.rs +++ b/pure/src/widget/radio.rs @@ -9,13 +9,13 @@ use iced_native::renderer; use iced_native::text; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; -pub use iced_native::widget::radio::{Radio, Style, StyleSheet}; +pub use iced_native::widget::radio::{Appearance, Radio, StyleSheet}; -impl<'a, Message, Renderer> Widget - for Radio<'a, Message, Renderer> +impl Widget for Radio where Message: Clone, Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -96,10 +96,11 @@ where } impl<'a, Message, Renderer> Into> - for Radio<'a, Message, Renderer> + for Radio where Message: 'a + Clone, Renderer: text::Renderer + 'a, + Renderer::Theme: StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) -- cgit From 3e2b6247f72815b6e928237f242c2d66478cf15d Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 31 May 2022 05:13:57 +0200 Subject: Implement theme styling for `Toggler` ... and wire up theming to the `styling` example. --- pure/src/widget/toggler.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/toggler.rs b/pure/src/widget/toggler.rs index e08b5f47..fc01a2c9 100644 --- a/pure/src/widget/toggler.rs +++ b/pure/src/widget/toggler.rs @@ -9,12 +9,13 @@ use iced_native::renderer; use iced_native::text; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; -pub use iced_native::widget::toggler::{Style, StyleSheet, Toggler}; +pub use iced_native::widget::toggler::{Appearance, StyleSheet, Toggler}; impl<'a, Message, Renderer> Widget for Toggler<'a, Message, Renderer> where Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -99,6 +100,7 @@ impl<'a, Message, Renderer> Into> where Message: 'a, Renderer: text::Renderer + 'a, + Renderer::Theme: StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) -- cgit From 6f69df3d415bfc922ce15539746026843bd410e6 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 1 Jun 2022 01:44:59 +0200 Subject: Implement theme styling for `PaneGrid` --- pure/src/widget/pane_grid.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs index 168fe12b..e2ba1e7e 100644 --- a/pure/src/widget/pane_grid.rs +++ b/pure/src/widget/pane_grid.rs @@ -83,7 +83,11 @@ pub use iced_style::pane_grid::{Line, StyleSheet}; /// .on_resize(10, Message::PaneResized); /// ``` #[allow(missing_debug_implementations)] -pub struct PaneGrid<'a, Message, Renderer> { +pub struct PaneGrid<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, +{ state: &'a state::Internal, elements: Vec<(Pane, Content<'a, Message, Renderer>)>, width: Length, @@ -92,12 +96,13 @@ pub struct PaneGrid<'a, Message, Renderer> { on_click: Option Message + 'a>>, on_drag: Option Message + 'a>>, on_resize: Option<(u16, Box Message + 'a>)>, - style_sheet: Box, + style: ::Style, } impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { /// Creates a [`PaneGrid`] with the given [`State`] and view function. /// @@ -124,7 +129,7 @@ where on_click: None, on_drag: None, on_resize: None, - style_sheet: Default::default(), + style: Default::default(), } } @@ -184,8 +189,11 @@ where } /// Sets the style of the [`PaneGrid`]. - pub fn style(mut self, style: impl Into>) -> Self { - self.style_sheet = style.into(); + pub fn style( + mut self, + style: impl Into<::Style>, + ) -> Self { + self.style = style.into(); self } } @@ -194,6 +202,7 @@ impl<'a, Message, Renderer> Widget for PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -343,11 +352,12 @@ where layout, cursor_position, renderer, + theme, style, viewport, self.spacing, self.on_resize.as_ref().map(|(leeway, _)| *leeway), - self.style_sheet.as_ref(), + self.style, self.elements .iter() .zip(&tree.children) @@ -391,8 +401,9 @@ where impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + iced_native::Renderer, Message: 'a, + Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn from( pane_grid: PaneGrid<'a, Message, Renderer>, -- cgit From c275fde67a7f5d1d5789540dc7905250a2f01fe7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 1 Jun 2022 01:56:46 +0200 Subject: Implement theme styling for `Rule` --- pure/src/widget/rule.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/rule.rs b/pure/src/widget/rule.rs index 8e6af58e..66a47653 100644 --- a/pure/src/widget/rule.rs +++ b/pure/src/widget/rule.rs @@ -10,9 +10,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; pub use iced_native::widget::rule::*; -impl<'a, Message, Renderer> Widget for Rule<'a> +impl<'a, Message, Renderer> Widget for Rule where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -92,9 +93,11 @@ where } } -impl<'a, Message, Renderer> Into> for Rule<'a> +impl<'a, Message, Renderer> Into> + for Rule where Renderer: iced_native::Renderer + 'a, + Renderer::Theme: StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) -- cgit From 77dc9dc2cb4ac092ce88c2700253fbfc54292e2b Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 1 Jun 2022 02:40:42 +0200 Subject: Implement theme styling for `ProgressBar` --- pure/src/widget/progress_bar.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/progress_bar.rs b/pure/src/widget/progress_bar.rs index 47a299ac..69c7d302 100644 --- a/pure/src/widget/progress_bar.rs +++ b/pure/src/widget/progress_bar.rs @@ -10,9 +10,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; pub use iced_native::widget::progress_bar::*; -impl<'a, Message, Renderer> Widget for ProgressBar<'a> +impl<'a, Message, Renderer> Widget for ProgressBar where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -93,9 +94,10 @@ where } impl<'a, Message, Renderer> Into> - for ProgressBar<'a> + for ProgressBar where Renderer: iced_native::Renderer + 'a, + Renderer::Theme: StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) -- cgit From 835877fc636d71c1faaa4826cbfde8e09b3c82ba Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 4 Jun 2022 03:26:53 +0200 Subject: Implement theme styling for `Checkbox` --- pure/src/widget/checkbox.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/checkbox.rs b/pure/src/widget/checkbox.rs index a6a6f8de..4128876e 100644 --- a/pure/src/widget/checkbox.rs +++ b/pure/src/widget/checkbox.rs @@ -9,12 +9,13 @@ use iced_native::renderer; use iced_native::text; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; -pub use iced_native::widget::checkbox::{Checkbox, Style, StyleSheet}; +pub use iced_native::widget::checkbox::{Appearance, Checkbox, StyleSheet}; impl<'a, Message, Renderer> Widget for Checkbox<'a, Message, Renderer> where Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -99,6 +100,7 @@ impl<'a, Message, Renderer> Into> where Message: 'a, Renderer: text::Renderer + 'a, + Renderer::Theme: StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) -- cgit From ce53d3933c860cd958636cce415ac97c04aee746 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 7 Jun 2022 01:11:35 +0200 Subject: Implement theme styling for `TextInput` --- pure/src/widget/text_input.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/text_input.rs b/pure/src/widget/text_input.rs index 7d768513..d3e642a5 100644 --- a/pure/src/widget/text_input.rs +++ b/pure/src/widget/text_input.rs @@ -10,7 +10,7 @@ use iced_native::text; use iced_native::widget::text_input; use iced_native::{Clipboard, Length, Padding, Point, Rectangle, Shell}; -pub use iced_style::text_input::{Style, StyleSheet}; +pub use iced_style::text_input::{Appearance, StyleSheet}; /// A field that can be filled with text. /// @@ -33,7 +33,11 @@ pub use iced_style::text_input::{Style, StyleSheet}; /// ``` /// ![Text input drawn by `iced_wgpu`](https://github.com/iced-rs/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text_input.png?raw=true) #[allow(missing_debug_implementations)] -pub struct TextInput<'a, Message, Renderer: text::Renderer> { +pub struct TextInput<'a, Message, Renderer> +where + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, +{ placeholder: String, value: text_input::Value, is_secure: bool, @@ -43,13 +47,14 @@ pub struct TextInput<'a, Message, Renderer: text::Renderer> { size: Option, on_change: Box Message + 'a>, on_submit: Option, - style_sheet: Box, + style: ::Style, } impl<'a, Message, Renderer> TextInput<'a, Message, Renderer> where Message: Clone, Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { /// Creates a new [`TextInput`]. /// @@ -71,7 +76,7 @@ where size: None, on_change: Box::new(on_change), on_submit: None, - style_sheet: Default::default(), + style: Default::default(), } } @@ -83,7 +88,7 @@ where /// Sets the [`Font`] of the [`TextInput`]. /// - /// [`Font`]: iced_native::text::Renderer::Font + /// [`Font`]: text::Renderer::Font pub fn font(mut self, font: Renderer::Font) -> Self { self.font = font; self @@ -116,9 +121,9 @@ where /// Sets the style of the [`TextInput`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -127,7 +132,8 @@ impl<'a, Message, Renderer> Widget for TextInput<'a, Message, Renderer> where Message: Clone, - Renderer: iced_native::text::Renderer, + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -198,6 +204,7 @@ where ) { text_input::draw( renderer, + theme, layout, cursor_position, tree.state.downcast_ref::(), @@ -206,7 +213,7 @@ where self.size, &self.font, self.is_secure, - self.style_sheet.as_ref(), + self.style, ) } @@ -227,6 +234,7 @@ impl<'a, Message, Renderer> From> where Message: 'a + Clone, Renderer: 'a + text::Renderer, + Renderer::Theme: StyleSheet, { fn from( text_input: TextInput<'a, Message, Renderer>, -- cgit From de21a651c0616307bb6bfd36da1a06119e629b10 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 7 Jun 2022 03:26:48 +0200 Subject: Implement theme styling for `Scrollable` --- pure/src/widget/pick_list.rs | 5 ++++- pure/src/widget/scrollable.rs | 29 +++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 78302a7d..8fadd785 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -1,4 +1,5 @@ //! Display a dropdown list of selectable values. +use crate::widget::scrollable; use crate::widget::tree::{self, Tree}; use crate::{Element, Widget}; @@ -110,6 +111,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, + Renderer::Theme: scrollable::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -225,8 +227,9 @@ impl<'a, T: 'a, Message, Renderer> Into> where T: Clone + ToString + Eq + 'static, [T]: ToOwned>, - Renderer: text::Renderer + 'a, Message: 'a, + Renderer: text::Renderer + 'a, + Renderer::Theme: scrollable::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/scrollable.rs b/pure/src/widget/scrollable.rs index a0180dc0..4e24915b 100644 --- a/pure/src/widget/scrollable.rs +++ b/pure/src/widget/scrollable.rs @@ -15,18 +15,24 @@ pub use iced_style::scrollable::{Scrollbar, Scroller, StyleSheet}; /// A widget that can vertically display an infinite amount of content with a /// scrollbar. #[allow(missing_debug_implementations)] -pub struct Scrollable<'a, Message, Renderer> { +pub struct Scrollable<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, +{ height: Length, scrollbar_width: u16, scrollbar_margin: u16, scroller_width: u16, - on_scroll: Option Message + 'a>>, - style_sheet: Box, content: Element<'a, Message, Renderer>, + on_scroll: Option Message + 'a>>, + style: ::Style, } -impl<'a, Message, Renderer: iced_native::Renderer> - Scrollable<'a, Message, Renderer> +impl<'a, Message, Renderer> Scrollable<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { /// Creates a new [`Scrollable`]. pub fn new(content: impl Into>) -> Self { @@ -35,9 +41,9 @@ impl<'a, Message, Renderer: iced_native::Renderer> scrollbar_width: 10, scrollbar_margin: 0, scroller_width: 10, - on_scroll: None, - style_sheet: Default::default(), content: content.into(), + on_scroll: None, + style: Default::default(), } } @@ -80,9 +86,9 @@ impl<'a, Message, Renderer: iced_native::Renderer> /// Sets the style of the [`Scrollable`] . pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -91,6 +97,7 @@ impl<'a, Message, Renderer> Widget for Scrollable<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -180,12 +187,13 @@ where scrollable::draw( tree.state.downcast_ref::(), renderer, + theme, layout, cursor_position, self.scrollbar_width, self.scrollbar_margin, self.scroller_width, - self.style_sheet.as_ref(), + self.style, |renderer, layout, cursor_position, viewport| { self.content.as_widget().draw( &tree.children[0], @@ -259,6 +267,7 @@ impl<'a, Message, Renderer> From> where Message: 'a + Clone, Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn from( text_input: Scrollable<'a, Message, Renderer>, -- cgit From 97555e67af8b4bcc77df69c5e72156e14948150e Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 7 Jun 2022 04:11:24 +0200 Subject: Implement theme styling for `Container` --- pure/src/widget/container.rs | 23 +++++++++++++++-------- pure/src/widget/pane_grid.rs | 9 +++++---- pure/src/widget/pane_grid/content.rs | 22 ++++++++++++++++------ pure/src/widget/pane_grid/title_bar.rs | 20 ++++++++++++++------ pure/src/widget/pick_list.rs | 5 +++-- pure/src/widget/tooltip.rs | 25 +++++++++++++++++-------- 6 files changed, 70 insertions(+), 34 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/container.rs b/pure/src/widget/container.rs index 0ec2351a..8ea9ca72 100644 --- a/pure/src/widget/container.rs +++ b/pure/src/widget/container.rs @@ -15,13 +15,17 @@ use iced_native::{ use std::u32; -pub use iced_style::container::{Style, StyleSheet}; +pub use iced_style::container::{Appearance, StyleSheet}; /// An element decorating some content. /// /// It is normally used for alignment purposes. #[allow(missing_debug_implementations)] -pub struct Container<'a, Message, Renderer> { +pub struct Container<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, +{ padding: Padding, width: Length, height: Length, @@ -29,13 +33,14 @@ pub struct Container<'a, Message, Renderer> { max_height: u32, horizontal_alignment: alignment::Horizontal, vertical_alignment: alignment::Vertical, - style_sheet: Box, + style: ::Style, content: Element<'a, Message, Renderer>, } impl<'a, Message, Renderer> Container<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { /// Creates an empty [`Container`]. pub fn new(content: T) -> Self @@ -50,7 +55,7 @@ where max_height: u32::MAX, horizontal_alignment: alignment::Horizontal::Left, vertical_alignment: alignment::Vertical::Top, - style_sheet: Default::default(), + style: Default::default(), content: content.into(), } } @@ -112,9 +117,9 @@ where /// Sets the style of the [`Container`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -123,6 +128,7 @@ impl<'a, Message, Renderer> Widget for Container<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn children(&self) -> Vec { vec![Tree::new(&self.content)] @@ -207,7 +213,7 @@ where cursor_position: Point, viewport: &Rectangle, ) { - let style = self.style_sheet.style(); + let style = theme.appearance(self.style); container::draw_background(renderer, &style, layout.bounds()); @@ -243,8 +249,9 @@ where impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + iced_native::Renderer, Message: 'a, + Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn from( column: Container<'a, Message, Renderer>, diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs index e2ba1e7e..69150aa8 100644 --- a/pure/src/widget/pane_grid.rs +++ b/pure/src/widget/pane_grid.rs @@ -19,6 +19,7 @@ pub use iced_native::widget::pane_grid::{ }; use crate::overlay; +use crate::widget::container; use crate::widget::tree::{self, Tree}; use crate::{Element, Widget}; @@ -86,7 +87,7 @@ pub use iced_style::pane_grid::{Line, StyleSheet}; pub struct PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { state: &'a state::Internal, elements: Vec<(Pane, Content<'a, Message, Renderer>)>, @@ -102,7 +103,7 @@ where impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { /// Creates a [`PaneGrid`] with the given [`State`] and view function. /// @@ -202,7 +203,7 @@ impl<'a, Message, Renderer> Widget for PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -403,7 +404,7 @@ impl<'a, Message, Renderer> From> where Message: 'a, Renderer: 'a + iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { fn from( pane_grid: PaneGrid<'a, Message, Renderer>, diff --git a/pure/src/widget/pane_grid/content.rs b/pure/src/widget/pane_grid/content.rs index 5069bd4a..9c2a0f4a 100644 --- a/pure/src/widget/pane_grid/content.rs +++ b/pure/src/widget/pane_grid/content.rs @@ -15,22 +15,27 @@ use iced_native::{Clipboard, Layout, Point, Rectangle, Shell, Size}; /// /// [`Pane`]: crate::widget::pane_grid::Pane #[allow(missing_debug_implementations)] -pub struct Content<'a, Message, Renderer> { +pub struct Content<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, +{ title_bar: Option>, body: Element<'a, Message, Renderer>, - style_sheet: Box, + style: ::Style, } impl<'a, Message, Renderer> Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { /// Creates a new [`Content`] with the provided body. pub fn new(body: impl Into>) -> Self { Self { title_bar: None, body: body.into(), - style_sheet: Default::default(), + style: Default::default(), } } @@ -46,9 +51,9 @@ where /// Sets the style of the [`Content`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -56,6 +61,7 @@ where impl<'a, Message, Renderer> Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { pub(super) fn state(&self) -> Tree { let children = if let Some(title_bar) = self.title_bar.as_ref() { @@ -95,10 +101,12 @@ where cursor_position: Point, viewport: &Rectangle, ) { + use container::StyleSheet; + let bounds = layout.bounds(); { - let style = self.style_sheet.style(); + let style = theme.appearance(self.style); container::draw_background(renderer, &style, bounds); } @@ -307,6 +315,7 @@ where impl<'a, Message, Renderer> Draggable for &Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { fn can_be_dragged_at( &self, @@ -328,6 +337,7 @@ impl<'a, T, Message, Renderer> From for Content<'a, Message, Renderer> where T: Into>, Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { fn from(element: T) -> Self { Self::new(element) diff --git a/pure/src/widget/pane_grid/title_bar.rs b/pure/src/widget/pane_grid/title_bar.rs index 28a3d7fc..950fd990 100644 --- a/pure/src/widget/pane_grid/title_bar.rs +++ b/pure/src/widget/pane_grid/title_bar.rs @@ -13,17 +13,22 @@ use iced_native::{Clipboard, Layout, Padding, Point, Rectangle, Shell, Size}; /// /// [`Pane`]: crate::widget::pane_grid::Pane #[allow(missing_debug_implementations)] -pub struct TitleBar<'a, Message, Renderer> { +pub struct TitleBar<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, +{ content: Element<'a, Message, Renderer>, controls: Option>, padding: Padding, always_show_controls: bool, - style_sheet: Box, + style: ::Style, } impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { /// Creates a new [`TitleBar`] with the given content. pub fn new(content: E) -> Self @@ -35,7 +40,7 @@ where controls: None, padding: Padding::ZERO, always_show_controls: false, - style_sheet: Default::default(), + style: Default::default(), } } @@ -57,9 +62,9 @@ where /// Sets the style of the [`TitleBar`]. pub fn style( mut self, - style: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style.into(); + self.style = style.into(); self } @@ -80,6 +85,7 @@ where impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { pub(super) fn state(&self) -> Tree { let children = if let Some(controls) = self.controls.as_ref() { @@ -120,8 +126,10 @@ where viewport: &Rectangle, show_controls: bool, ) { + use container::StyleSheet; + let bounds = layout.bounds(); - let style = self.style_sheet.style(); + let style = theme.appearance(self.style); let inherited_style = renderer::Style { text_color: style.text_color.unwrap_or(inherited_style.text_color), }; diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 8fadd785..7c8a3be6 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -1,4 +1,5 @@ //! Display a dropdown list of selectable values. +use crate::widget::container; use crate::widget::scrollable; use crate::widget::tree::{self, Tree}; use crate::{Element, Widget}; @@ -111,7 +112,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: scrollable::StyleSheet, + Renderer::Theme: container::StyleSheet + scrollable::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -229,7 +230,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: scrollable::StyleSheet, + Renderer::Theme: container::StyleSheet + scrollable::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/tooltip.rs b/pure/src/widget/tooltip.rs index 15aa32fe..745d100d 100644 --- a/pure/src/widget/tooltip.rs +++ b/pure/src/widget/tooltip.rs @@ -7,27 +7,33 @@ use iced_native::mouse; use iced_native::overlay; use iced_native::renderer; use iced_native::text; +use iced_native::widget::container; use iced_native::widget::tooltip; use iced_native::widget::Text; use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell}; -pub use iced_style::container::{Style, StyleSheet}; +pub use iced_style::container::{Appearance, StyleSheet}; pub use tooltip::Position; /// An element to display a widget over another. #[allow(missing_debug_implementations)] -pub struct Tooltip<'a, Message, Renderer: text::Renderer> { +pub struct Tooltip<'a, Message, Renderer: text::Renderer> +where + Renderer: text::Renderer, + Renderer::Theme: container::StyleSheet, +{ content: Element<'a, Message, Renderer>, tooltip: Text, position: Position, - style_sheet: Box, gap: u16, padding: u16, + style: ::Style, } impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> where Renderer: text::Renderer, + Renderer::Theme: container::StyleSheet, { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16 = 5; @@ -44,9 +50,9 @@ where content: content.into(), tooltip: Text::new(tooltip.to_string()), position, - style_sheet: Default::default(), gap: 0, padding: Self::DEFAULT_PADDING, + style: Default::default(), } } @@ -79,9 +85,9 @@ where /// Sets the style of the [`Tooltip`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -90,6 +96,7 @@ impl<'a, Message, Renderer> Widget for Tooltip<'a, Message, Renderer> where Renderer: text::Renderer, + Renderer::Theme: container::StyleSheet, { fn children(&self) -> Vec { vec![Tree::new(&self.content)] @@ -177,6 +184,7 @@ where tooltip::draw( renderer, + theme, inherited_style, layout, cursor_position, @@ -184,7 +192,7 @@ where self.position, self.gap, self.padding, - self.style_sheet.as_ref(), + self.style, |renderer, limits| { Widget::<(), Renderer>::layout(tooltip, renderer, limits) }, @@ -220,8 +228,9 @@ where impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + text::Renderer, Message: 'a, + Renderer: 'a + text::Renderer, + Renderer::Theme: container::StyleSheet, { fn from( tooltip: Tooltip<'a, Message, Renderer>, -- cgit From 396735b682433928f52ba777891e14f2fbc703c7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 7 Jun 2022 04:51:44 +0200 Subject: Implement theme styling for `PickList` and `Menu` --- pure/src/widget/pick_list.rs | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 7c8a3be6..2c465932 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -1,6 +1,4 @@ //! Display a dropdown list of selectable values. -use crate::widget::container; -use crate::widget::scrollable; use crate::widget::tree::{self, Tree}; use crate::{Element, Widget}; @@ -17,13 +15,15 @@ use iced_native::{ use std::borrow::Cow; -pub use iced_style::pick_list::{Style, StyleSheet}; +pub use iced_style::pick_list::{Appearance, StyleSheet}; /// A widget for selecting a single value from a list of options. #[allow(missing_debug_implementations)] -pub struct PickList<'a, T, Message, Renderer: text::Renderer> +pub struct PickList<'a, T, Message, Renderer> where [T]: ToOwned>, + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { on_selected: Box Message + 'a>, options: Cow<'a, [T]>, @@ -33,14 +33,15 @@ where padding: Padding, text_size: Option, font: Renderer::Font, - style_sheet: Box, + style: ::Style, } -impl<'a, T: 'a, Message, Renderer: text::Renderer> - PickList<'a, T, Message, Renderer> +impl<'a, T: 'a, Message, Renderer> PickList<'a, T, Message, Renderer> where T: ToString + Eq, [T]: ToOwned>, + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, { /// The default padding of a [`PickList`]. pub const DEFAULT_PADDING: Padding = Padding::new(5); @@ -61,7 +62,7 @@ where text_size: None, padding: Self::DEFAULT_PADDING, font: Default::default(), - style_sheet: Default::default(), + style: Default::default(), } } @@ -98,9 +99,9 @@ where /// Sets the style of the [`PickList`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -112,7 +113,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: container::StyleSheet + scrollable::StyleSheet, + Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -184,7 +185,7 @@ where &self, _tree: &Tree, renderer: &mut Renderer, - _theme: &Renderer::Theme, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -192,6 +193,7 @@ where ) { pick_list::draw( renderer, + theme, layout, cursor_position, self.padding, @@ -199,7 +201,7 @@ where &self.font, self.placeholder.as_ref().map(String::as_str), self.selected.as_ref(), - self.style_sheet.as_ref(), + self.style, ) } @@ -218,7 +220,7 @@ where self.text_size, self.font.clone(), &self.options, - self.style_sheet.as_ref(), + self.style, ) } } @@ -230,7 +232,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: container::StyleSheet + scrollable::StyleSheet, + Renderer::Theme: StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) -- cgit From 1dd1a2f97fc747e15e12b5188dad6c41b0d052ea Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 29 Jun 2022 10:51:01 +0200 Subject: Introduce `StyleSheet` for `Text` widget --- pure/src/widget/checkbox.rs | 5 +++-- pure/src/widget/radio.rs | 5 +++-- pure/src/widget/text.rs | 7 ++++++- pure/src/widget/toggler.rs | 5 +++-- pure/src/widget/tooltip.rs | 10 +++++----- 5 files changed, 20 insertions(+), 12 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/checkbox.rs b/pure/src/widget/checkbox.rs index 4128876e..9d6a78ce 100644 --- a/pure/src/widget/checkbox.rs +++ b/pure/src/widget/checkbox.rs @@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout}; use iced_native::mouse; use iced_native::renderer; use iced_native::text; +use iced_native::widget; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; pub use iced_native::widget::checkbox::{Appearance, Checkbox, StyleSheet}; @@ -15,7 +16,7 @@ impl<'a, Message, Renderer> Widget for Checkbox<'a, Message, Renderer> where Renderer: text::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + widget::text::StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into> where Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + widget::text::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/radio.rs b/pure/src/widget/radio.rs index 9a8885e0..7a6ffbac 100644 --- a/pure/src/widget/radio.rs +++ b/pure/src/widget/radio.rs @@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout}; use iced_native::mouse; use iced_native::renderer; use iced_native::text; +use iced_native::widget; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; pub use iced_native::widget::radio::{Appearance, Radio, StyleSheet}; @@ -15,7 +16,7 @@ impl Widget for Radio where Message: Clone, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + widget::text::StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into> where Message: 'a + Clone, Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + widget::text::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/text.rs b/pure/src/widget/text.rs index 0a51b628..23999a2c 100644 --- a/pure/src/widget/text.rs +++ b/pure/src/widget/text.rs @@ -1,16 +1,19 @@ +//! Write some text for your users to read. use crate::widget::Tree; use crate::{Element, Widget}; use iced_native::layout::{self, Layout}; use iced_native::renderer; use iced_native::text; +use iced_native::widget; use iced_native::{Length, Point, Rectangle}; -pub use iced_native::widget::Text; +pub use iced_native::widget::text::{Appearance, StyleSheet, Text}; impl Widget for Text where Renderer: text::Renderer, + Renderer::Theme: widget::text::StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -56,6 +59,7 @@ impl<'a, Message, Renderer> Into> for Text where Renderer: text::Renderer + 'a, + Renderer::Theme: widget::text::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) @@ -65,6 +69,7 @@ where impl<'a, Message, Renderer> Into> for &'a str where Renderer: text::Renderer + 'a, + Renderer::Theme: widget::text::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Text::new(self).into() diff --git a/pure/src/widget/toggler.rs b/pure/src/widget/toggler.rs index fc01a2c9..5efa39ab 100644 --- a/pure/src/widget/toggler.rs +++ b/pure/src/widget/toggler.rs @@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout}; use iced_native::mouse; use iced_native::renderer; use iced_native::text; +use iced_native::widget; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; pub use iced_native::widget::toggler::{Appearance, StyleSheet, Toggler}; @@ -15,7 +16,7 @@ impl<'a, Message, Renderer> Widget for Toggler<'a, Message, Renderer> where Renderer: text::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + widget::text::StyleSheet, { fn width(&self) -> Length { >::width(self) @@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into> where Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + widget::text::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/tooltip.rs b/pure/src/widget/tooltip.rs index 745d100d..cbc34722 100644 --- a/pure/src/widget/tooltip.rs +++ b/pure/src/widget/tooltip.rs @@ -9,7 +9,7 @@ use iced_native::renderer; use iced_native::text; use iced_native::widget::container; use iced_native::widget::tooltip; -use iced_native::widget::Text; +use iced_native::widget::{self, Text}; use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell}; pub use iced_style::container::{Appearance, StyleSheet}; @@ -20,7 +20,7 @@ pub use tooltip::Position; pub struct Tooltip<'a, Message, Renderer: text::Renderer> where Renderer: text::Renderer, - Renderer::Theme: container::StyleSheet, + Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, { content: Element<'a, Message, Renderer>, tooltip: Text, @@ -33,7 +33,7 @@ where impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> where Renderer: text::Renderer, - Renderer::Theme: container::StyleSheet, + Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16 = 5; @@ -96,7 +96,7 @@ impl<'a, Message, Renderer> Widget for Tooltip<'a, Message, Renderer> where Renderer: text::Renderer, - Renderer::Theme: container::StyleSheet, + Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, { fn children(&self) -> Vec { vec![Tree::new(&self.content)] @@ -230,7 +230,7 @@ impl<'a, Message, Renderer> From> where Message: 'a, Renderer: 'a + text::Renderer, - Renderer::Theme: container::StyleSheet, + Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, { fn from( tooltip: Tooltip<'a, Message, Renderer>, -- cgit