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/element.rs | 7 ++++++- pure/src/helpers.rs | 7 ++++++- pure/src/lib.rs | 6 +++++- pure/src/overlay.rs | 5 ++++- pure/src/widget.rs | 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 ++++++++++--- 27 files changed, 101 insertions(+), 16 deletions(-) (limited to 'pure') diff --git a/pure/src/element.rs b/pure/src/element.rs index 5450db20..35c68716 100644 --- a/pure/src/element.rs +++ b/pure/src/element.rs @@ -25,7 +25,10 @@ pub struct Element<'a, Message, Renderer> { impl<'a, Message, Renderer> Element<'a, Message, Renderer> { /// Creates a new [`Element`] containing the given [`Widget`]. - pub fn new(widget: impl Widget + 'a) -> Self { + pub fn new(widget: impl Widget + 'a) -> Self + where + Renderer: iced_native::Renderer, + { Self { widget: Box::new(widget), } @@ -278,6 +281,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -286,6 +290,7 @@ where self.widget.draw( tree, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/helpers.rs b/pure/src/helpers.rs index 746b807d..ad6f10b1 100644 --- a/pure/src/helpers.rs +++ b/pure/src/helpers.rs @@ -50,7 +50,12 @@ where /// [`Button`]: widget::Button pub fn button<'a, Message, Renderer>( content: impl Into>, -) -> widget::Button<'a, Message, Renderer> { +) -> widget::Button<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: widget::button::StyleSheet, + ::Variant: Default, +{ widget::Button::new(content) } diff --git a/pure/src/lib.rs b/pure/src/lib.rs index fa5fd46f..95aa3098 100644 --- a/pure/src/lib.rs +++ b/pure/src/lib.rs @@ -174,7 +174,9 @@ impl State { fn diff( &mut self, new_element: &Element<'_, Message, Renderer>, - ) { + ) where + Renderer: iced_native::Renderer, + { self.state_tree.diff(new_element); } } @@ -224,6 +226,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -232,6 +235,7 @@ where self.element.as_widget().draw( &self.state.state_tree, renderer, + theme, style, layout, cursor_position, diff --git a/pure/src/overlay.rs b/pure/src/overlay.rs index fecaa2ac..b82d8a67 100644 --- a/pure/src/overlay.rs +++ b/pure/src/overlay.rs @@ -14,7 +14,10 @@ pub fn from_children<'a, Message, Renderer>( tree: &'a mut Tree, layout: Layout<'_>, renderer: &Renderer, -) -> Option> { +) -> Option> +where + Renderer: iced_native::Renderer, +{ children .iter() .zip(&mut tree.children) diff --git a/pure/src/widget.rs b/pure/src/widget.rs index cc04cc96..ab63f7cc 100644 --- a/pure/src/widget.rs +++ b/pure/src/widget.rs @@ -53,7 +53,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; /// /// If you want to build your own widgets, you will need to implement this /// trait. -pub trait Widget { +pub trait Widget +where + Renderer: iced_native::Renderer, +{ /// Returns the width of the [`Widget`]. fn width(&self) -> Length; @@ -75,6 +78,7 @@ pub trait Widget { &self, state: &Tree, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, 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