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 --- native/src/element.rs | 24 +++++++++++++++---- native/src/lib.rs | 2 ++ native/src/overlay.rs | 1 + native/src/overlay/element.rs | 8 +++++-- native/src/overlay/menu.rs | 12 ++++++++-- native/src/program/state.rs | 5 ++-- native/src/renderer.rs | 3 +++ native/src/renderer/null.rs | 4 +++- native/src/user_interface.rs | 7 ++++-- native/src/widget.rs | 1 + native/src/widget/button.rs | 40 +++++++++++++++++++++----------- native/src/widget/checkbox.rs | 1 + native/src/widget/column.rs | 10 +++++++- native/src/widget/container.rs | 2 ++ native/src/widget/image.rs | 1 + native/src/widget/image/viewer.rs | 1 + native/src/widget/pane_grid.rs | 10 +++++++- native/src/widget/pane_grid/content.rs | 13 +++++++++-- native/src/widget/pane_grid/title_bar.rs | 3 +++ native/src/widget/pick_list.rs | 1 + native/src/widget/progress_bar.rs | 1 + native/src/widget/radio.rs | 1 + native/src/widget/row.rs | 10 +++++++- native/src/widget/rule.rs | 1 + native/src/widget/scrollable.rs | 2 ++ native/src/widget/slider.rs | 1 + native/src/widget/space.rs | 1 + native/src/widget/svg.rs | 1 + native/src/widget/text.rs | 1 + native/src/widget/text_input.rs | 1 + native/src/widget/toggler.rs | 1 + native/src/widget/tooltip.rs | 3 +++ 32 files changed, 142 insertions(+), 31 deletions(-) (limited to 'native') diff --git a/native/src/element.rs b/native/src/element.rs index 119b7892..425bddc2 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -244,13 +244,20 @@ where pub fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, viewport: &Rectangle, ) { - self.widget - .draw(renderer, style, layout, cursor_position, viewport) + self.widget.draw( + renderer, + theme, + style, + layout, + cursor_position, + viewport, + ) } /// Returns the current [`mouse::Interaction`] of the [`Element`]. @@ -350,13 +357,20 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, viewport: &Rectangle, ) { - self.widget - .draw(renderer, style, layout, cursor_position, viewport) + self.widget.draw( + renderer, + theme, + style, + layout, + cursor_position, + viewport, + ) } fn mouse_interaction( @@ -444,6 +458,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -471,6 +486,7 @@ where self.element.widget.draw( renderer, + theme, style, layout, cursor_position, diff --git a/native/src/lib.rs b/native/src/lib.rs index db60976f..948fdff0 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -76,6 +76,7 @@ pub use iced_core::{ Rectangle, Size, Vector, }; pub use iced_futures::{executor, futures}; +pub use iced_style::theme; #[doc(no_inline)] pub use executor::Executor; @@ -93,5 +94,6 @@ pub use renderer::Renderer; pub use runtime::Runtime; pub use shell::Shell; pub use subscription::Subscription; +pub use theme::Theme; pub use user_interface::UserInterface; pub use widget::Widget; diff --git a/native/src/overlay.rs b/native/src/overlay.rs index 86878f6a..792d2905 100644 --- a/native/src/overlay.rs +++ b/native/src/overlay.rs @@ -34,6 +34,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/overlay/element.rs b/native/src/overlay/element.rs index 24c0fe01..de2e1f37 100644 --- a/native/src/overlay/element.rs +++ b/native/src/overlay/element.rs @@ -94,11 +94,13 @@ where pub fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, ) { - self.overlay.draw(renderer, style, layout, cursor_position) + self.overlay + .draw(renderer, theme, style, layout, cursor_position) } } @@ -173,10 +175,12 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, ) { - self.content.draw(renderer, style, layout, cursor_position) + self.content + .draw(renderer, theme, style, layout, cursor_position) } } diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 13fa7beb..78d65d13 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -241,6 +241,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -257,8 +258,14 @@ where self.style.background, ); - self.container - .draw(renderer, style, layout, cursor_position, &bounds); + self.container.draw( + renderer, + theme, + style, + layout, + cursor_position, + &bounds, + ); } } @@ -389,6 +396,7 @@ where fn draw( &self, renderer: &mut Renderer, + _theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/program/state.rs b/native/src/program/state.rs index cb87a628..6ab6051b 100644 --- a/native/src/program/state.rs +++ b/native/src/program/state.rs @@ -86,6 +86,7 @@ where bounds: Size, cursor_position: Point, renderer: &mut P::Renderer, + theme: &::Theme, clipboard: &mut dyn Clipboard, debug: &mut Debug, ) -> Option> { @@ -115,7 +116,7 @@ where if messages.is_empty() { debug.draw_started(); self.mouse_interaction = - user_interface.draw(renderer, cursor_position); + user_interface.draw(renderer, theme, cursor_position); debug.draw_finished(); self.cache = Some(user_interface.into_cache()); @@ -147,7 +148,7 @@ where debug.draw_started(); self.mouse_interaction = - user_interface.draw(renderer, cursor_position); + user_interface.draw(renderer, theme, cursor_position); debug.draw_finished(); self.cache = Some(user_interface.into_cache()); diff --git a/native/src/renderer.rs b/native/src/renderer.rs index 73d2f401..a7305a55 100644 --- a/native/src/renderer.rs +++ b/native/src/renderer.rs @@ -9,6 +9,9 @@ use crate::{Background, Color, Element, Rectangle, Vector}; /// A component that can be used by widgets to draw themselves on a screen. pub trait Renderer: Sized { + /// The supported theme of the [`Renderer`]. + type Theme; + /// Lays out the elements of a user interface. /// /// You should override this if you need to perform any operations before or diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs index a5b2f277..c591f4e2 100644 --- a/native/src/renderer/null.rs +++ b/native/src/renderer/null.rs @@ -1,6 +1,6 @@ use crate::renderer::{self, Renderer}; use crate::text::{self, Text}; -use crate::{Background, Font, Point, Rectangle, Size, Vector}; +use crate::{Background, Font, Point, Rectangle, Size, Theme, Vector}; /// A renderer that does nothing. /// @@ -16,6 +16,8 @@ impl Null { } impl Renderer for Null { + type Theme = Theme; + fn with_layer(&mut self, _bounds: Rectangle, _f: impl FnOnce(&mut Self)) {} fn with_translation( diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index f80786aa..12f9827d 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -274,7 +274,7 @@ where /// [completing the last example](#example-1): /// /// ```no_run - /// use iced_native::{clipboard, Size, Point}; + /// use iced_native::{clipboard, Size, Point, Theme}; /// use iced_native::user_interface::{self, UserInterface}; /// use iced_wgpu::Renderer; /// @@ -322,7 +322,7 @@ where /// ); /// /// // Draw the user interface - /// let mouse_cursor = user_interface.draw(&mut renderer, cursor_position); + /// let mouse_cursor = user_interface.draw(&mut renderer, &Theme::default(), cursor_position); /// /// cache = user_interface.into_cache(); /// @@ -337,6 +337,7 @@ where pub fn draw( &mut self, renderer: &mut Renderer, + theme: &Renderer::Theme, cursor_position: Point, ) -> mouse::Interaction { // TODO: Move to shell level (?) @@ -368,6 +369,7 @@ where self.root.widget.draw( renderer, + theme, &renderer::Style::default(), Layout::new(&self.base), base_cursor, @@ -409,6 +411,7 @@ where renderer.with_layer(overlay_bounds, |renderer| { overlay.draw( renderer, + theme, &renderer::Style::default(), Layout::new(layout), cursor_position, diff --git a/native/src/widget.rs b/native/src/widget.rs index 8417dad1..9fe96e33 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -125,6 +125,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index b03d9f27..09c59cbe 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -55,20 +55,26 @@ pub use iced_style::button::{Style, StyleSheet}; /// } /// ``` #[allow(missing_debug_implementations)] -pub struct Button<'a, Message, Renderer> { +pub struct Button<'a, Message, Renderer> +where + Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, +{ state: &'a mut State, content: Element<'a, Message, Renderer>, on_press: Option, width: Length, height: Length, padding: Padding, - style_sheet: Box, + variant: ::Variant, } impl<'a, Message, Renderer> Button<'a, Message, Renderer> where Message: Clone, Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, + ::Variant: Default, { /// Creates a new [`Button`] with some local [`State`] and the given /// content. @@ -83,7 +89,7 @@ where width: Length::Shrink, height: Length::Shrink, padding: Padding::new(5), - style_sheet: Default::default(), + variant: ::Variant::default(), } } @@ -112,12 +118,12 @@ where 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 } } @@ -190,28 +196,29 @@ pub fn update<'a, Message: Clone>( } /// Draws a [`Button`]. -pub fn draw<'a, Renderer: crate::Renderer>( +pub fn draw<'a, Renderer: crate::Renderer, Variant>( renderer: &mut Renderer, bounds: Rectangle, cursor_position: Point, is_enabled: bool, - style_sheet: &dyn StyleSheet, + style_sheet: &dyn StyleSheet, + variation: Variant, state: impl FnOnce() -> &'a State, ) -> Style { let is_mouse_over = bounds.contains(cursor_position); let styling = if !is_enabled { - style_sheet.disabled() + style_sheet.disabled(variation) } else if is_mouse_over { let state = state(); if state.is_pressed { - style_sheet.pressed() + style_sheet.pressed(variation) } else { - style_sheet.hovered() + style_sheet.hovered(variation) } } else { - style_sheet.active() + style_sheet.active(variation) }; if styling.background.is_some() || styling.border_width > 0.0 { @@ -287,6 +294,8 @@ impl<'a, Message, Renderer> Widget where Message: Clone, Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, + ::Variant: Copy, { fn width(&self) -> Length { self.width @@ -354,6 +363,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -367,12 +377,14 @@ where bounds, cursor_position, self.on_press.is_some(), - self.style_sheet.as_ref(), + theme, + self.variant, || &self.state, ); self.content.draw( renderer, + theme, &renderer::Style { text_color: styling.text_color, }, @@ -397,6 +409,8 @@ impl<'a, Message, Renderer> From> where Message: 'a + Clone, Renderer: 'a + crate::Renderer, + Renderer::Theme: StyleSheet, + ::Variant: Copy, { fn from( button: Button<'a, Message, Renderer>, diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index b6d920df..290cb114 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -197,6 +197,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index 268218b1..01ddd9f1 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -187,13 +187,21 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, viewport: &Rectangle, ) { for (child, layout) in self.children.iter().zip(layout.children()) { - child.draw(renderer, style, layout, cursor_position, viewport); + child.draw( + renderer, + theme, + style, + layout, + cursor_position, + viewport, + ); } } diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs index 0e7c301e..efcecb1e 100644 --- a/native/src/widget/container.rs +++ b/native/src/widget/container.rs @@ -209,6 +209,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, renderer_style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -220,6 +221,7 @@ where self.content.draw( renderer, + theme, &renderer::Style { text_color: style .text_color diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs index 8e7a28e5..1e753219 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -136,6 +136,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/image/viewer.rs b/native/src/widget/image/viewer.rs index 840b88e5..1aa75aa0 100644 --- a/native/src/widget/image/viewer.rs +++ b/native/src/widget/image/viewer.rs @@ -303,6 +303,7 @@ where fn draw( &self, renderer: &mut Renderer, + _theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index 0ceec83e..fb056f79 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -754,6 +754,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -772,7 +773,14 @@ where self.style_sheet.as_ref(), self.elements.iter().map(|(pane, content)| (*pane, content)), |pane, renderer, style, layout, cursor_position, rectangle| { - pane.draw(renderer, style, layout, cursor_position, rectangle); + pane.draw( + renderer, + theme, + style, + layout, + cursor_position, + rectangle, + ); }, ) } diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs index 407f5458..6b3ff680 100644 --- a/native/src/widget/pane_grid/content.rs +++ b/native/src/widget/pane_grid/content.rs @@ -59,6 +59,7 @@ where pub fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -81,6 +82,7 @@ where title_bar.draw( renderer, + theme, style, title_bar_layout, cursor_position, @@ -90,14 +92,21 @@ where self.body.draw( renderer, + theme, style, body_layout, cursor_position, viewport, ); } else { - self.body - .draw(renderer, style, layout, cursor_position, viewport); + self.body.draw( + renderer, + theme, + style, + layout, + cursor_position, + viewport, + ); } } diff --git a/native/src/widget/pane_grid/title_bar.rs b/native/src/widget/pane_grid/title_bar.rs index a10181af..1392d505 100644 --- a/native/src/widget/pane_grid/title_bar.rs +++ b/native/src/widget/pane_grid/title_bar.rs @@ -86,6 +86,7 @@ where pub fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, inherited_style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -108,6 +109,7 @@ where self.content.draw( renderer, + theme, &inherited_style, title_layout, cursor_position, @@ -120,6 +122,7 @@ where if show_controls || self.always_show_controls { controls.draw( renderer, + theme, &inherited_style, controls_layout, cursor_position, diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index 0374aef7..64a236e7 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -490,6 +490,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs index c26c38fa..2963451c 100644 --- a/native/src/widget/progress_bar.rs +++ b/native/src/widget/progress_bar.rs @@ -97,6 +97,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 657ae786..5d936eaf 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -211,6 +211,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 7a7c70c6..9cff74c6 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -187,13 +187,21 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, viewport: &Rectangle, ) { for (child, layout) in self.children.iter().zip(layout.children()) { - child.draw(renderer, style, layout, cursor_position, viewport); + child.draw( + renderer, + theme, + style, + layout, + cursor_position, + viewport, + ); } } diff --git a/native/src/widget/rule.rs b/native/src/widget/rule.rs index 69619583..fc3b0202 100644 --- a/native/src/widget/rule.rs +++ b/native/src/widget/rule.rs @@ -70,6 +70,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 8958f6da..5c59b8b2 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -702,6 +702,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -719,6 +720,7 @@ where |renderer, layout, cursor_position, viewport| { self.content.draw( renderer, + theme, style, layout, cursor_position, diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index f2e84ea9..3143aed9 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -410,6 +410,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/space.rs b/native/src/widget/space.rs index 4135d1b8..81338306 100644 --- a/native/src/widget/space.rs +++ b/native/src/widget/space.rs @@ -60,6 +60,7 @@ where fn draw( &self, _renderer: &mut Renderer, + _theme: &Renderer::Theme, _style: &renderer::Style, _layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/svg.rs b/native/src/widget/svg.rs index 008ab356..76b3eb8b 100644 --- a/native/src/widget/svg.rs +++ b/native/src/widget/svg.rs @@ -110,6 +110,7 @@ where fn draw( &self, renderer: &mut Renderer, + _theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs index a7855c30..5f7e9159 100644 --- a/native/src/widget/text.rs +++ b/native/src/widget/text.rs @@ -130,6 +130,7 @@ where fn draw( &self, renderer: &mut Renderer, + _theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 5ecd68e9..8230398c 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -812,6 +812,7 @@ where fn draw( &self, renderer: &mut Renderer, + _theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index 6d7592f3..c19b9a32 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -208,6 +208,7 @@ where fn draw( &self, renderer: &mut Renderer, + _theme: &Renderer::Theme, style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index c929395f..141aa5c8 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -267,6 +267,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, inherited_style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -274,6 +275,7 @@ where ) { self.content.draw( renderer, + theme, inherited_style, layout, cursor_position, @@ -299,6 +301,7 @@ where Widget::<(), Renderer>::draw( tooltip, renderer, + theme, defaults, layout, cursor_position, -- 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` --- native/src/widget/slider.rs | 46 +++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) (limited to 'native') diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index 3143aed9..f42bca28 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -40,7 +40,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: crate::Renderer, + Renderer::Theme: StyleSheet, +{ state: &'a mut State, range: RangeInclusive, step: T, @@ -49,13 +53,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: crate::Renderer, + Renderer::Theme: StyleSheet, { /// The default height of a [`Slider`]. pub const DEFAULT_HEIGHT: u16 = 22; @@ -99,7 +105,7 @@ where on_release: None, width: Length::Fill, height: Self::DEFAULT_HEIGHT, - style_sheet: Default::default(), + variant: Default::default(), } } @@ -129,9 +135,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 } @@ -230,26 +236,29 @@ where } /// Draws a [`Slider`]. -pub fn draw( - renderer: &mut impl crate::Renderer, +pub fn draw( + renderer: &mut R, layout: Layout<'_>, cursor_position: Point, state: &State, value: T, range: &RangeInclusive, - style_sheet: &dyn StyleSheet, + style_sheet: &dyn StyleSheet::Variant>, + variant: ::Variant, ) where T: Into + Copy, + R: crate::Renderer, + R::Theme: StyleSheet, { let bounds = layout.bounds(); let is_mouse_over = bounds.contains(cursor_position); let style = if state.is_dragging { - style_sheet.dragging() + style_sheet.dragging(variant) } else if is_mouse_over { - style_sheet.hovered() + style_sheet.hovered(variant) } else { - style_sheet.active() + style_sheet.active(variant) }; let rail_y = bounds.y + (bounds.height / 2.0).round(); @@ -357,11 +366,12 @@ impl State { } 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: crate::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { self.width @@ -423,7 +433,8 @@ where &self.state, self.value, &self.range, - self.style_sheet.as_ref(), + theme, + self.variant, ) } @@ -438,14 +449,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 + crate::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 822a3cd04f9edeb887d85164b0b3e556c3fde6bb Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 26 May 2022 01:10:26 +0200 Subject: Let a `Theme` control the `text_color` of an application --- native/src/program/state.rs | 7 ++++++- native/src/user_interface.rs | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'native') diff --git a/native/src/program/state.rs b/native/src/program/state.rs index 6ab6051b..0c133484 100644 --- a/native/src/program/state.rs +++ b/native/src/program/state.rs @@ -1,4 +1,5 @@ use crate::mouse; +use crate::theme; use crate::user_interface::{self, UserInterface}; use crate::{Clipboard, Command, Debug, Event, Point, Program, Size}; @@ -19,6 +20,7 @@ where impl

State

where P: Program + 'static, + ::Theme: theme::Definition, { /// Creates a new [`State`] with the provided [`Program`], initializing its /// primitive with the given logical bounds and renderer. @@ -164,7 +166,10 @@ fn build_user_interface<'a, P: Program>( renderer: &mut P::Renderer, size: Size, debug: &mut Debug, -) -> UserInterface<'a, P::Message, P::Renderer> { +) -> UserInterface<'a, P::Message, P::Renderer> +where + ::Theme: theme::Definition, +{ debug.view_started(); let view = program.view(); debug.view_finished(); diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 12f9827d..c8496112 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -3,6 +3,7 @@ use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; +use crate::theme::{self, Definition as _}; use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; /// A set of interactive graphical elements with a specific [`Layout`]. @@ -28,6 +29,7 @@ pub struct UserInterface<'a, Message, Renderer> { impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> where Renderer: crate::Renderer, + Renderer::Theme: theme::Definition, { /// Builds a user interface for an [`Element`]. /// @@ -370,7 +372,9 @@ where self.root.widget.draw( renderer, theme, - &renderer::Style::default(), + &renderer::Style { + text_color: theme.text_color(), + }, Layout::new(&self.base), base_cursor, &viewport, -- cgit From 7f3b7075db68a215f4331b4bfba1c8ddd1c4d7f3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 26 May 2022 19:02:15 +0200 Subject: Rename `theme::Definition` to `application::StyleSheet` --- native/src/lib.rs | 1 + native/src/program/state.rs | 6 +++--- native/src/user_interface.rs | 9 ++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'native') diff --git a/native/src/lib.rs b/native/src/lib.rs index 948fdff0..2d0dd6ec 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -76,6 +76,7 @@ pub use iced_core::{ Rectangle, Size, Vector, }; pub use iced_futures::{executor, futures}; +pub use iced_style::application; pub use iced_style::theme; #[doc(no_inline)] diff --git a/native/src/program/state.rs b/native/src/program/state.rs index 0c133484..c881a64f 100644 --- a/native/src/program/state.rs +++ b/native/src/program/state.rs @@ -1,5 +1,5 @@ +use crate::application; use crate::mouse; -use crate::theme; use crate::user_interface::{self, UserInterface}; use crate::{Clipboard, Command, Debug, Event, Point, Program, Size}; @@ -20,7 +20,7 @@ where impl

State

where P: Program + 'static, - ::Theme: theme::Definition, + ::Theme: application::StyleSheet, { /// Creates a new [`State`] with the provided [`Program`], initializing its /// primitive with the given logical bounds and renderer. @@ -168,7 +168,7 @@ fn build_user_interface<'a, P: Program>( debug: &mut Debug, ) -> UserInterface<'a, P::Message, P::Renderer> where - ::Theme: theme::Definition, + ::Theme: application::StyleSheet, { debug.view_started(); let view = program.view(); diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index c8496112..26850f0a 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,9 +1,9 @@ //! Implement your own event loop to drive a user interface. +use crate::application; use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; -use crate::theme::{self, Definition as _}; use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; /// A set of interactive graphical elements with a specific [`Layout`]. @@ -29,7 +29,7 @@ pub struct UserInterface<'a, Message, Renderer> { impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> where Renderer: crate::Renderer, - Renderer::Theme: theme::Definition, + Renderer::Theme: application::StyleSheet, { /// Builds a user interface for an [`Element`]. /// @@ -373,7 +373,10 @@ where renderer, theme, &renderer::Style { - text_color: theme.text_color(), + text_color: { + use application::StyleSheet; + theme.text_color() + }, }, Layout::new(&self.base), base_cursor, -- 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` --- native/src/widget/button.rs | 38 ++++++++++++++++++++------------------ native/src/widget/slider.rs | 22 +++++++++++----------- 2 files changed, 31 insertions(+), 29 deletions(-) (limited to 'native') diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 09c59cbe..d4e88424 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -12,7 +12,7 @@ use crate::{ Rectangle, Shell, Vector, Widget, }; -pub use iced_style::button::{Style, StyleSheet}; +pub use iced_style::button::{Appearance, StyleSheet}; /// A generic widget that produces a message when pressed. /// @@ -66,7 +66,7 @@ where width: Length, height: Length, padding: Padding, - variant: ::Variant, + style: ::Style, } impl<'a, Message, Renderer> Button<'a, Message, Renderer> @@ -74,7 +74,6 @@ where Message: Clone, Renderer: crate::Renderer, Renderer::Theme: StyleSheet, - ::Variant: Default, { /// Creates a new [`Button`] with some local [`State`] and the given /// content. @@ -89,7 +88,7 @@ where width: Length::Shrink, height: Length::Shrink, padding: Padding::new(5), - variant: ::Variant::default(), + style: Default::default(), } } @@ -118,12 +117,12 @@ where self } - /// Sets the style variant of this [`Button`]. + /// Sets the style of this [`Button`]. pub fn style( mut self, - variant: ::Variant, + style: ::Style, ) -> Self { - self.variant = variant; + self.style = style; self } } @@ -196,29 +195,34 @@ pub fn update<'a, Message: Clone>( } /// Draws a [`Button`]. -pub fn draw<'a, Renderer: crate::Renderer, Variant>( +pub fn draw<'a, Renderer: crate::Renderer>( renderer: &mut Renderer, bounds: Rectangle, cursor_position: Point, is_enabled: bool, - style_sheet: &dyn StyleSheet, - variation: Variant, + style_sheet: &dyn StyleSheet< + Style = ::Style, + >, + style: ::Style, state: impl FnOnce() -> &'a State, -) -> Style { +) -> Appearance +where + Renderer::Theme: StyleSheet, +{ let is_mouse_over = bounds.contains(cursor_position); let styling = if !is_enabled { - style_sheet.disabled(variation) + style_sheet.disabled(style) } else if is_mouse_over { let state = state(); if state.is_pressed { - style_sheet.pressed(variation) + style_sheet.pressed(style) } else { - style_sheet.hovered(variation) + style_sheet.hovered(style) } } else { - style_sheet.active(variation) + style_sheet.active(style) }; if styling.background.is_some() || styling.border_width > 0.0 { @@ -295,7 +299,6 @@ where Message: Clone, Renderer: crate::Renderer, Renderer::Theme: StyleSheet, - ::Variant: Copy, { fn width(&self) -> Length { self.width @@ -378,7 +381,7 @@ where cursor_position, self.on_press.is_some(), theme, - self.variant, + self.style, || &self.state, ); @@ -410,7 +413,6 @@ where Message: 'a + Clone, Renderer: 'a + crate::Renderer, Renderer::Theme: StyleSheet, - ::Variant: Copy, { fn from( button: Button<'a, Message, Renderer>, diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index f42bca28..7042e0ad 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -13,7 +13,7 @@ use crate::{ 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. @@ -53,7 +53,7 @@ where on_release: Option, width: Length, height: u16, - variant: ::Variant, + style: ::Style, } impl<'a, T, Message, Renderer> Slider<'a, T, Message, Renderer> @@ -105,7 +105,7 @@ where on_release: None, width: Length::Fill, height: Self::DEFAULT_HEIGHT, - variant: Default::default(), + style: Default::default(), } } @@ -135,9 +135,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 } @@ -243,8 +243,8 @@ pub fn draw( state: &State, value: T, range: &RangeInclusive, - style_sheet: &dyn StyleSheet::Variant>, - variant: ::Variant, + style_sheet: &dyn StyleSheet