From 7a50e9e8fbb8d37e53a42c1dd5936b97463ead53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Sun, 21 Jan 2024 17:56:01 +0100 Subject: [PATCH 1/2] Convert `Renderer::Theme` to generic `Widget` type --- core/src/element.rs | 78 ++++++----- core/src/layout/flex.rs | 4 +- core/src/overlay.rs | 12 +- core/src/overlay/element.rs | 35 ++--- core/src/overlay/group.rs | 38 +++--- core/src/renderer.rs | 3 - core/src/renderer/null.rs | 2 - core/src/widget.rs | 6 +- core/src/widget/text.rs | 45 +++---- core/src/widget/tree.rs | 12 +- examples/clock/src/main.rs | 2 +- examples/color_palette/src/main.rs | 2 +- examples/component/src/main.rs | 8 +- examples/custom_quad/src/main.rs | 9 +- examples/custom_shader/src/main.rs | 6 +- examples/custom_widget/src/main.rs | 7 +- examples/geometry/src/main.rs | 4 +- examples/integration/src/controls.rs | 5 +- examples/loading_spinners/src/circular.rs | 17 ++- examples/loading_spinners/src/linear.rs | 47 +++---- examples/modal/src/main.rs | 42 +++--- examples/multitouch/src/main.rs | 2 +- examples/screenshot/src/main.rs | 4 +- examples/toast/src/main.rs | 9 +- examples/tour/src/main.rs | 4 +- graphics/src/renderer.rs | 17 +-- renderer/src/compositor.rs | 14 +- renderer/src/geometry.rs | 2 +- renderer/src/geometry/cache.rs | 4 +- renderer/src/lib.rs | 29 ++-- runtime/src/multi_window/program.rs | 5 +- runtime/src/multi_window/state.rs | 6 +- runtime/src/overlay/nested.rs | 38 +++--- runtime/src/program.rs | 5 +- runtime/src/program/state.rs | 4 +- runtime/src/user_interface.rs | 16 +-- src/application.rs | 9 +- src/lib.rs | 20 ++- src/multi_window/application.rs | 9 +- tiny_skia/src/lib.rs | 2 +- tiny_skia/src/window/compositor.rs | 18 +-- wgpu/src/lib.rs | 2 +- wgpu/src/primitive/pipeline.rs | 2 +- wgpu/src/window/compositor.rs | 24 ++-- widget/src/button.rs | 65 +++++---- widget/src/canvas.rs | 34 ++--- widget/src/canvas/program.rs | 10 +- widget/src/checkbox.rs | 40 +++--- widget/src/column.rs | 26 ++-- widget/src/combo_box.rs | 57 ++++---- widget/src/container.rs | 45 +++---- widget/src/helpers.rs | 153 +++++++++++----------- widget/src/image.rs | 11 +- widget/src/image/viewer.rs | 11 +- widget/src/keyed/column.rs | 36 +++-- widget/src/lazy.rs | 75 ++++++----- widget/src/lazy/cache.rs | 6 +- widget/src/lazy/component.rs | 75 ++++++----- widget/src/lazy/helpers.rs | 19 +-- widget/src/lazy/responsive.rs | 71 ++++++---- widget/src/lib.rs | 3 +- widget/src/mouse_area.rs | 38 +++--- widget/src/overlay/menu.rs | 76 ++++++----- widget/src/pane_grid.rs | 54 ++++---- widget/src/pane_grid/content.rs | 51 ++++---- widget/src/pane_grid/title_bar.rs | 39 +++--- widget/src/pick_list.rs | 81 ++++++------ widget/src/progress_bar.rs | 37 +++--- widget/src/qr_code.rs | 8 +- widget/src/radio.rs | 34 ++--- widget/src/row.rs | 25 ++-- widget/src/rule.rs | 31 ++--- widget/src/scrollable.rs | 56 ++++---- widget/src/shader.rs | 13 +- widget/src/slider.rs | 61 ++++----- widget/src/space.rs | 9 +- widget/src/svg.rs | 33 ++--- widget/src/text.rs | 4 +- widget/src/text_editor.rs | 54 ++++---- widget/src/text_input.rs | 53 ++++---- widget/src/toggler.rs | 43 +++--- widget/src/tooltip.rs | 73 ++++++----- widget/src/vertical_slider.rs | 56 ++++---- winit/src/application.rs | 20 ++- winit/src/application/state.rs | 9 +- winit/src/multi_window.rs | 27 ++-- winit/src/multi_window/state.rs | 11 +- winit/src/multi_window/window_manager.rs | 10 +- 88 files changed, 1219 insertions(+), 1153 deletions(-) diff --git a/core/src/element.rs b/core/src/element.rs index 4d4bfa369d..fa07ad69dd 100644 --- a/core/src/element.rs +++ b/core/src/element.rs @@ -23,13 +23,13 @@ use std::borrow::Borrow; /// /// [built-in widget]: crate::widget #[allow(missing_debug_implementations)] -pub struct Element<'a, Message, Renderer> { - widget: Box + 'a>, +pub struct Element<'a, Message, Theme, Renderer> { + widget: Box + 'a>, } -impl<'a, Message, Renderer> Element<'a, Message, Renderer> { +impl<'a, Message, Theme, Renderer> Element<'a, Message, Theme, 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: crate::Renderer, { @@ -39,12 +39,14 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { } /// Returns a reference to the [`Widget`] of the [`Element`], - pub fn as_widget(&self) -> &dyn Widget { + pub fn as_widget(&self) -> &dyn Widget { self.widget.as_ref() } /// Returns a mutable reference to the [`Widget`] of the [`Element`], - pub fn as_widget_mut(&mut self) -> &mut dyn Widget { + pub fn as_widget_mut( + &mut self, + ) -> &mut dyn Widget { self.widget.as_mut() } @@ -100,7 +102,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { /// # impl Counter { /// # pub fn view( /// # &self, - /// # ) -> iced_core::Element { + /// # ) -> iced_core::Element { /// # unimplemented!() /// # } /// # } @@ -126,7 +128,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { /// # /// # pub fn push( /// # mut self, - /// # _: iced_core::Element, + /// # _: iced_core::Element, /// # ) -> Self { /// # unimplemented!() /// # } @@ -155,7 +157,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { /// Row::new().spacing(20), /// |row, (index, counter)| { /// // We display the counter - /// let element: Element = + /// let element: Element = /// counter.view().into(); /// /// row.push( @@ -210,9 +212,10 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { pub fn map( self, f: impl Fn(Message) -> B + 'a, - ) -> Element<'a, B, Renderer> + ) -> Element<'a, B, Theme, Renderer> where Message: 'a, + Theme: 'a, Renderer: crate::Renderer + 'a, B: 'a, { @@ -228,9 +231,10 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { pub fn explain>( self, color: C, - ) -> Element<'a, Message, Renderer> + ) -> Element<'a, Message, Theme, Renderer> where - Message: 'static, + Message: 'a, + Theme: 'a, Renderer: crate::Renderer + 'a, { Element { @@ -239,32 +243,34 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { } } -impl<'a, Message, Renderer> Borrow + 'a> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> + Borrow + 'a> + for Element<'a, Message, Theme, Renderer> { - fn borrow(&self) -> &(dyn Widget + 'a) { + fn borrow(&self) -> &(dyn Widget + 'a) { self.widget.borrow() } } -impl<'a, Message, Renderer> Borrow + 'a> - for &Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> + Borrow + 'a> + for &Element<'a, Message, Theme, Renderer> { - fn borrow(&self) -> &(dyn Widget + 'a) { + fn borrow(&self) -> &(dyn Widget + 'a) { self.widget.borrow() } } -struct Map<'a, A, B, Renderer> { - widget: Box + 'a>, +struct Map<'a, A, B, Theme, Renderer> { + widget: Box + 'a>, mapper: Box B + 'a>, } -impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { +impl<'a, A, B, Theme, Renderer> Map<'a, A, B, Theme, Renderer> { pub fn new( - widget: Box + 'a>, + widget: Box + 'a>, mapper: F, - ) -> Map<'a, A, B, Renderer> + ) -> Map<'a, A, B, Theme, Renderer> where F: 'a + Fn(A) -> B, { @@ -275,7 +281,8 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { } } -impl<'a, A, B, Renderer> Widget for Map<'a, A, B, Renderer> +impl<'a, A, B, Theme, Renderer> Widget + for Map<'a, A, B, Theme, Renderer> where Renderer: crate::Renderer + 'a, A: 'a, @@ -408,7 +415,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -435,7 +442,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let mapper = &self.mapper; self.widget @@ -444,22 +451,25 @@ where } } -struct Explain<'a, Message, Renderer: crate::Renderer> { - element: Element<'a, Message, Renderer>, +struct Explain<'a, Message, Theme, Renderer: crate::Renderer> { + element: Element<'a, Message, Theme, Renderer>, color: Color, } -impl<'a, Message, Renderer> Explain<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Explain<'a, Message, Theme, Renderer> where Renderer: crate::Renderer, { - fn new(element: Element<'a, Message, Renderer>, color: Color) -> Self { + fn new( + element: Element<'a, Message, Theme, Renderer>, + color: Color, + ) -> Self { Explain { element, color } } } -impl<'a, Message, Renderer> Widget - for Explain<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Explain<'a, Message, Theme, Renderer> where Renderer: crate::Renderer, { @@ -524,7 +534,7 @@ where &self, state: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -578,7 +588,7 @@ where state: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.element.widget.overlay(state, layout, renderer) } } diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 3358ef3d4d..40bd71232e 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -59,7 +59,7 @@ impl Axis { /// padding and alignment to the items as needed. /// /// It returns a new layout [`Node`]. -pub fn resolve( +pub fn resolve( axis: Axis, renderer: &Renderer, limits: &Limits, @@ -68,7 +68,7 @@ pub fn resolve( padding: Padding, spacing: f32, align_items: Alignment, - items: &[Element<'_, Message, Renderer>], + items: &[Element<'_, Message, Theme, Renderer>], trees: &mut [widget::Tree], ) -> Node where diff --git a/core/src/overlay.rs b/core/src/overlay.rs index af10afee60..6b8cf2a66e 100644 --- a/core/src/overlay.rs +++ b/core/src/overlay.rs @@ -14,7 +14,7 @@ use crate::widget::Tree; use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector}; /// An interactive component that can be displayed on top of other widgets. -pub trait Overlay +pub trait Overlay where Renderer: crate::Renderer, { @@ -36,7 +36,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -106,7 +106,7 @@ where &'a mut self, _layout: Layout<'_>, _renderer: &Renderer, - ) -> Option> { + ) -> Option> { None } } @@ -115,12 +115,12 @@ where /// /// This method will generally only be used by advanced users that are /// implementing the [`Widget`](crate::Widget) trait. -pub fn from_children<'a, Message, Renderer>( - children: &'a mut [crate::Element<'_, Message, Renderer>], +pub fn from_children<'a, Message, Theme, Renderer>( + children: &'a mut [crate::Element<'_, Message, Theme, Renderer>], tree: &'a mut Tree, layout: Layout<'_>, renderer: &Renderer, -) -> Option> +) -> Option> where Renderer: crate::Renderer, { diff --git a/core/src/overlay/element.rs b/core/src/overlay/element.rs index a279fe2859..c34ab86289 100644 --- a/core/src/overlay/element.rs +++ b/core/src/overlay/element.rs @@ -11,20 +11,20 @@ use std::any::Any; /// A generic [`Overlay`]. #[allow(missing_debug_implementations)] -pub struct Element<'a, Message, Renderer> { +pub struct Element<'a, Message, Theme, Renderer> { position: Point, translation: Vector, - overlay: Box + 'a>, + overlay: Box + 'a>, } -impl<'a, Message, Renderer> Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Element<'a, Message, Theme, Renderer> where Renderer: crate::Renderer, { /// Creates a new [`Element`] containing the given [`Overlay`]. pub fn new( position: Point, - overlay: Box + 'a>, + overlay: Box + 'a>, ) -> Self { Self { position, @@ -46,9 +46,13 @@ where } /// Applies a transformation to the produced message of the [`Element`]. - pub fn map(self, f: &'a dyn Fn(Message) -> B) -> Element<'a, B, Renderer> + pub fn map( + self, + f: &'a dyn Fn(Message) -> B, + ) -> Element<'a, B, Theme, Renderer> where Message: 'a, + Theme: 'a, Renderer: 'a, B: 'a, { @@ -104,7 +108,7 @@ where pub fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -137,26 +141,27 @@ where &'b mut self, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.overlay.overlay(layout, renderer) } } -struct Map<'a, A, B, Renderer> { - content: Box + 'a>, +struct Map<'a, A, B, Theme, Renderer> { + content: Box + 'a>, mapper: &'a dyn Fn(A) -> B, } -impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { +impl<'a, A, B, Theme, Renderer> Map<'a, A, B, Theme, Renderer> { pub fn new( - content: Box + 'a>, + content: Box + 'a>, mapper: &'a dyn Fn(A) -> B, - ) -> Map<'a, A, B, Renderer> { + ) -> Map<'a, A, B, Theme, Renderer> { Map { content, mapper } } } -impl<'a, A, B, Renderer> Overlay for Map<'a, A, B, Renderer> +impl<'a, A, B, Theme, Renderer> Overlay + for Map<'a, A, B, Theme, Renderer> where Renderer: crate::Renderer, { @@ -269,7 +274,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -290,7 +295,7 @@ where &'b mut self, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.content .overlay(layout, renderer) .map(|overlay| overlay.map(self.mapper)) diff --git a/core/src/overlay/group.rs b/core/src/overlay/group.rs index e1e9727a40..4e54a002c8 100644 --- a/core/src/overlay/group.rs +++ b/core/src/overlay/group.rs @@ -11,14 +11,15 @@ use crate::{ /// An [`Overlay`] container that displays multiple overlay [`overlay::Element`] /// children. #[allow(missing_debug_implementations)] -pub struct Group<'a, Message, Renderer> { - children: Vec>, +pub struct Group<'a, Message, Theme, Renderer> { + children: Vec>, } -impl<'a, Message, Renderer> Group<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Group<'a, Message, Theme, Renderer> where - Renderer: 'a + crate::Renderer, Message: 'a, + Theme: 'a, + Renderer: 'a + crate::Renderer, { /// Creates an empty [`Group`]. pub fn new() -> Self { @@ -27,7 +28,7 @@ where /// Creates a [`Group`] with the given elements. pub fn with_children( - children: Vec>, + children: Vec>, ) -> Self { Group { children } } @@ -35,30 +36,32 @@ where /// Adds an [`overlay::Element`] to the [`Group`]. pub fn push( mut self, - child: impl Into>, + child: impl Into>, ) -> Self { self.children.push(child.into()); self } /// Turns the [`Group`] into an overlay [`overlay::Element`]. - pub fn overlay(self) -> overlay::Element<'a, Message, Renderer> { + pub fn overlay(self) -> overlay::Element<'a, Message, Theme, Renderer> { overlay::Element::new(Point::ORIGIN, Box::new(self)) } } -impl<'a, Message, Renderer> Default for Group<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Default + for Group<'a, Message, Theme, Renderer> where - Renderer: 'a + crate::Renderer, Message: 'a, + Theme: 'a, + Renderer: 'a + crate::Renderer, { fn default() -> Self { Self::with_children(Vec::new()) } } -impl<'a, Message, Renderer> Overlay - for Group<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Overlay + for Group<'a, Message, Theme, Renderer> where Renderer: crate::Renderer, { @@ -106,7 +109,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -166,7 +169,7 @@ where &'b mut self, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let children = self .children .iter_mut() @@ -178,13 +181,14 @@ where } } -impl<'a, Message, Renderer> From> - for overlay::Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for overlay::Element<'a, Message, Theme, Renderer> where - Renderer: 'a + crate::Renderer, Message: 'a, + Theme: 'a, + Renderer: 'a + crate::Renderer, { - fn from(group: Group<'a, Message, Renderer>) -> Self { + fn from(group: Group<'a, Message, Theme, Renderer>) -> Self { group.overlay() } } diff --git a/core/src/renderer.rs b/core/src/renderer.rs index a2a66aa86a..0af74bb323 100644 --- a/core/src/renderer.rs +++ b/core/src/renderer.rs @@ -9,9 +9,6 @@ use crate::{Background, Border, Color, Rectangle, Shadow, Size, 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; - /// Draws the primitives recorded in the given closure in a new layer. /// /// The layer will clip its contents to the provided `bounds`. diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index 7accd34e10..455daa42f8 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -19,8 +19,6 @@ impl Null { } impl Renderer for Null { - type Theme = (); - fn with_layer(&mut self, _bounds: Rectangle, _f: impl FnOnce(&mut Self)) {} fn with_translation( diff --git a/core/src/widget.rs b/core/src/widget.rs index 7f5632ae4c..d5e2ec6fda 100644 --- a/core/src/widget.rs +++ b/core/src/widget.rs @@ -39,7 +39,7 @@ use crate::{Clipboard, Length, Rectangle, Shell, Size}; /// [`geometry`]: https://github.com/iced-rs/iced/tree/0.10/examples/geometry /// [`lyon`]: https://github.com/nical/lyon /// [`iced_wgpu`]: https://github.com/iced-rs/iced/tree/0.10/wgpu -pub trait Widget +pub trait Widget where Renderer: crate::Renderer, { @@ -70,7 +70,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -146,7 +146,7 @@ where _state: &'a mut Tree, _layout: Layout<'_>, _renderer: &Renderer, - ) -> Option> { + ) -> Option> { None } } diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index 4cabc7ce02..0796c4e4bb 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -15,10 +15,10 @@ pub use text::{LineHeight, Shaping}; /// A paragraph of text. #[allow(missing_debug_implementations)] -pub struct Text<'a, Renderer> +pub struct Text<'a, Theme, Renderer> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { content: Cow<'a, str>, size: Option, @@ -29,13 +29,13 @@ where vertical_alignment: alignment::Vertical, font: Option, shaping: Shaping, - style: ::Style, + style: Theme::Style, } -impl<'a, Renderer> Text<'a, Renderer> +impl<'a, Theme, Renderer> Text<'a, Theme, Renderer> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { /// Create a new fragment of [`Text`] with the given contents. pub fn new(content: impl Into>) -> Self { @@ -74,10 +74,7 @@ where } /// Sets the style of the [`Text`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } @@ -123,10 +120,11 @@ where #[derive(Debug, Default)] pub struct State(P); -impl<'a, Message, Renderer> Widget for Text<'a, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Text<'a, Theme, Renderer> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -169,7 +167,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, _cursor_position: mouse::Cursor, @@ -272,21 +270,23 @@ pub fn draw( ); } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where + Theme: StyleSheet + 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet, { - fn from(text: Text<'a, Renderer>) -> Element<'a, Message, Renderer> { + fn from( + text: Text<'a, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(text) } } -impl<'a, Renderer> Clone for Text<'a, Renderer> +impl<'a, Theme, Renderer> Clone for Text<'a, Theme, Renderer> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { fn clone(&self) -> Self { Self { @@ -304,20 +304,21 @@ where } } -impl<'a, Renderer> From<&'a str> for Text<'a, Renderer> +impl<'a, Theme, Renderer> From<&'a str> for Text<'a, Theme, Renderer> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { fn from(content: &'a str) -> Self { Self::new(content) } } -impl<'a, Message, Renderer> From<&'a str> for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From<&'a str> + for Element<'a, Message, Theme, Renderer> where + Theme: StyleSheet + 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet, { fn from(content: &'a str) -> Self { Text::from(content).into() diff --git a/core/src/widget/tree.rs b/core/src/widget/tree.rs index ff52b1ce42..6b1a130964 100644 --- a/core/src/widget/tree.rs +++ b/core/src/widget/tree.rs @@ -31,8 +31,8 @@ impl Tree { } /// Creates a new [`Tree`] for the provided [`Widget`]. - pub fn new<'a, Message, Renderer>( - widget: impl Borrow + 'a>, + pub fn new<'a, Message, Theme, Renderer>( + widget: impl Borrow + 'a>, ) -> Self where Renderer: crate::Renderer, @@ -54,9 +54,9 @@ impl Tree { /// Otherwise, the whole [`Tree`] is recreated. /// /// [`Widget::diff`]: crate::Widget::diff - pub fn diff<'a, Message, Renderer>( + pub fn diff<'a, Message, Theme, Renderer>( &mut self, - new: impl Borrow + 'a>, + new: impl Borrow + 'a>, ) where Renderer: crate::Renderer, { @@ -68,9 +68,9 @@ impl Tree { } /// Reconciles the children of the tree with the provided list of widgets. - pub fn diff_children<'a, Message, Renderer>( + pub fn diff_children<'a, Message, Theme, Renderer>( &mut self, - new_children: &[impl Borrow + 'a>], + new_children: &[impl Borrow + 'a>], ) where Renderer: crate::Renderer, { diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index 920aa0c583..1325252668 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -82,7 +82,7 @@ impl Application for Clock { } } -impl canvas::Program for Clock { +impl canvas::Program for Clock { type State = (); fn draw( diff --git a/examples/color_palette/src/main.rs b/examples/color_palette/src/main.rs index 7dc981d94d..a5fd46e070 100644 --- a/examples/color_palette/src/main.rs +++ b/examples/color_palette/src/main.rs @@ -298,7 +298,7 @@ impl ColorPicker { range: RangeInclusive, component: f32, update: impl Fn(f32) -> C + 'a, - ) -> Slider<'a, f64, C, iced::Renderer> { + ) -> Slider<'a, f64, C> { Slider::new(range, f64::from(component), move |v| update(v as f32)) .step(0.01) } diff --git a/examples/component/src/main.rs b/examples/component/src/main.rs index 010321a928..81be4d7f03 100644 --- a/examples/component/src/main.rs +++ b/examples/component/src/main.rs @@ -48,7 +48,7 @@ impl Sandbox for Component { mod numeric_input { use iced::alignment::{self, Alignment}; use iced::widget::{button, component, row, text, text_input, Component}; - use iced::{Element, Length, Renderer}; + use iced::{Element, Length}; pub struct NumericInput { value: Option, @@ -81,7 +81,7 @@ mod numeric_input { } } - impl Component for NumericInput { + impl Component for NumericInput { type State = (); type Event = Event; @@ -111,7 +111,7 @@ mod numeric_input { } } - fn view(&self, _state: &Self::State) -> Element { + fn view(&self, _state: &Self::State) -> Element { let button = |label, on_press| { button( text(label) @@ -145,7 +145,7 @@ mod numeric_input { } } - impl<'a, Message> From> for Element<'a, Message, Renderer> + impl<'a, Message> From> for Element<'a, Message> where Message: 'a, { diff --git a/examples/custom_quad/src/main.rs b/examples/custom_quad/src/main.rs index 14f62caa1d..f64379fa1b 100644 --- a/examples/custom_quad/src/main.rs +++ b/examples/custom_quad/src/main.rs @@ -29,7 +29,7 @@ mod quad { } } - impl Widget for CustomQuad + impl Widget for CustomQuad where Renderer: renderer::Renderer, { @@ -53,7 +53,7 @@ mod quad { &self, _state: &widget::Tree, renderer: &mut Renderer, - _theme: &Renderer::Theme, + _theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -74,10 +74,7 @@ mod quad { } } - impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> - where - Renderer: renderer::Renderer, - { + impl<'a, Message> From for Element<'a, Message> { fn from(circle: CustomQuad) -> Self { Self::new(circle) } diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index 3bfa3a433a..78b2fbbb31 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -8,8 +8,8 @@ use iced::widget::shader::wgpu; use iced::widget::{checkbox, column, container, row, shader, slider, text}; use iced::window; use iced::{ - Alignment, Application, Color, Command, Element, Length, Renderer, - Subscription, Theme, + Alignment, Application, Color, Command, Element, Length, Subscription, + Theme, }; fn main() -> iced::Result { @@ -72,7 +72,7 @@ impl Application for IcedCubes { Command::none() } - fn view(&self) -> Element<'_, Self::Message, Renderer> { + fn view(&self) -> Element<'_, Self::Message> { let top_controls = row![ control( "Amount", diff --git a/examples/custom_widget/src/main.rs b/examples/custom_widget/src/main.rs index d5ecebaf8d..25c0bb3943 100644 --- a/examples/custom_widget/src/main.rs +++ b/examples/custom_widget/src/main.rs @@ -29,7 +29,7 @@ mod circle { Circle::new(radius) } - impl Widget for Circle + impl Widget for Circle where Renderer: renderer::Renderer, { @@ -53,7 +53,7 @@ mod circle { &self, _state: &widget::Tree, renderer: &mut Renderer, - _theme: &Renderer::Theme, + _theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -70,7 +70,8 @@ mod circle { } } - impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> + impl<'a, Message, Theme, Renderer> From + for Element<'a, Message, Theme, Renderer> where Renderer: renderer::Renderer, { diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index 5cf9963d3c..1ccc4dd69a 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -15,7 +15,7 @@ mod rainbow { Rainbow } - impl Widget for Rainbow { + impl Widget for Rainbow { fn size(&self) -> Size { Size { width: Length::Fill, @@ -139,7 +139,7 @@ mod rainbow { } } - impl<'a, Message> From for Element<'a, Message, Renderer> { + impl<'a, Message> From for Element<'a, Message> { fn from(rainbow: Rainbow) -> Self { Self::new(rainbow) } diff --git a/examples/integration/src/controls.rs b/examples/integration/src/controls.rs index 89a595c185..c9bab8284f 100644 --- a/examples/integration/src/controls.rs +++ b/examples/integration/src/controls.rs @@ -29,8 +29,9 @@ impl Controls { } impl Program for Controls { - type Renderer = Renderer; + type Theme = Theme; type Message = Message; + type Renderer = Renderer; fn update(&mut self, message: Message) -> Command { match message { @@ -45,7 +46,7 @@ impl Program for Controls { Command::none() } - fn view(&self) -> Element> { + fn view(&self) -> Element { let background_color = self.background_color; let text = &self.text; diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index 2e1199797f..8598b20af2 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -2,14 +2,15 @@ use iced::advanced::layout; use iced::advanced::renderer; use iced::advanced::widget::tree::{self, Tree}; -use iced::advanced::{Clipboard, Layout, Renderer, Shell, Widget}; +use iced::advanced::{self, Clipboard, Layout, Shell, Widget}; use iced::event; use iced::mouse; use iced::time::Instant; use iced::widget::canvas; use iced::window::{self, RedrawRequest}; use iced::{ - Background, Color, Element, Event, Length, Rectangle, Size, Vector, + Background, Color, Element, Event, Length, Rectangle, Renderer, Size, + Vector, }; use super::easing::{self, Easing}; @@ -230,7 +231,7 @@ struct State { cache: canvas::Cache, } -impl<'a, Message, Theme> Widget> +impl<'a, Message, Theme> Widget for Circular<'a, Theme> where Message: 'a + Clone, @@ -254,7 +255,7 @@ where fn layout( &self, _tree: &mut Tree, - _renderer: &iced::Renderer, + _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { layout::atomic(limits, self.size, self.size) @@ -266,7 +267,7 @@ where event: Event, _layout: Layout<'_>, _cursor: mouse::Cursor, - _renderer: &iced::Renderer, + _renderer: &Renderer, _clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, _viewport: &Rectangle, @@ -290,13 +291,15 @@ where fn draw( &self, tree: &Tree, - renderer: &mut iced::Renderer, + renderer: &mut Renderer, theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, _viewport: &Rectangle, ) { + use advanced::Renderer as _; + let state = tree.state.downcast_ref::(); let bounds = layout.bounds(); let custom_style = @@ -361,7 +364,7 @@ where } impl<'a, Message, Theme> From> - for Element<'a, Message, iced::Renderer> + for Element<'a, Message, Theme, Renderer> where Message: Clone + 'a, Theme: StyleSheet + 'a, diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs index 03aee9b191..ce37562160 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -2,7 +2,7 @@ use iced::advanced::layout; use iced::advanced::renderer::{self, Quad}; use iced::advanced::widget::tree::{self, Tree}; -use iced::advanced::{Clipboard, Layout, Shell, Widget}; +use iced::advanced::{self, Clipboard, Layout, Shell, Widget}; use iced::event; use iced::mouse; use iced::time::Instant; @@ -14,29 +14,27 @@ use super::easing::{self, Easing}; use std::time::Duration; #[allow(missing_debug_implementations)] -pub struct Linear<'a, Renderer> +pub struct Linear<'a, Theme> where - Renderer: iced::advanced::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { width: Length, height: Length, - style: ::Style, + style: Theme::Style, easing: &'a Easing, cycle_duration: Duration, } -impl<'a, Renderer> Linear<'a, Renderer> +impl<'a, Theme> Linear<'a, Theme> where - Renderer: iced::advanced::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { /// Creates a new [`Linear`] with the given content. pub fn new() -> Self { Linear { width: Length::Fixed(100.0), height: Length::Fixed(4.0), - style: ::Style::default(), + style: Theme::Style::default(), easing: &easing::STANDARD, cycle_duration: Duration::from_millis(600), } @@ -55,11 +53,8 @@ where } /// Sets the style variant of this [`Linear`]. - pub fn style( - mut self, - style: ::Style, - ) -> Self { - self.style = style; + pub fn style(mut self, style: impl Into) -> Self { + self.style = style.into(); self } @@ -76,10 +71,9 @@ where } } -impl<'a, Renderer> Default for Linear<'a, Renderer> +impl<'a, Theme> Default for Linear<'a, Theme> where - Renderer: iced::advanced::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { fn default() -> Self { Self::new() @@ -151,11 +145,12 @@ impl State { } } -impl<'a, Message, Renderer> Widget for Linear<'a, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Linear<'a, Theme> where - Message: 'a + Clone, - Renderer: 'a + iced::advanced::Renderer, - Renderer::Theme: StyleSheet, + Message: Clone + 'a, + Theme: StyleSheet + 'a, + Renderer: advanced::Renderer + 'a, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -207,7 +202,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -262,14 +257,14 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: Clone + 'a, + Theme: StyleSheet + 'a, Renderer: iced::advanced::Renderer + 'a, - Renderer::Theme: StyleSheet, { - fn from(linear: Linear<'a, Renderer>) -> Self { + fn from(linear: Linear<'a, Theme>) -> Self { Self::new(linear) } } diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index c9d5df2977..c2a4132c66 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -234,17 +234,17 @@ mod modal { use iced::{Color, Element, Event, Length, Point, Rectangle, Size, Vector}; /// A widget that centers a modal element over some base element - pub struct Modal<'a, Message, Renderer> { - base: Element<'a, Message, Renderer>, - modal: Element<'a, Message, Renderer>, + pub struct Modal<'a, Message, Theme, Renderer> { + base: Element<'a, Message, Theme, Renderer>, + modal: Element<'a, Message, Theme, Renderer>, on_blur: Option, } - impl<'a, Message, Renderer> Modal<'a, Message, Renderer> { + impl<'a, Message, Theme, Renderer> Modal<'a, Message, Theme, Renderer> { /// Returns a new [`Modal`] pub fn new( - base: impl Into>, - modal: impl Into>, + base: impl Into>, + modal: impl Into>, ) -> Self { Self { base: base.into(), @@ -263,8 +263,8 @@ mod modal { } } - impl<'a, Message, Renderer> Widget - for Modal<'a, Message, Renderer> + impl<'a, Message, Theme, Renderer> Widget + for Modal<'a, Message, Theme, Renderer> where Renderer: advanced::Renderer, Message: Clone, @@ -324,7 +324,7 @@ mod modal { &self, state: &widget::Tree, renderer: &mut Renderer, - theme: &::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -346,7 +346,7 @@ mod modal { state: &'b mut widget::Tree, layout: Layout<'_>, _renderer: &Renderer, - ) -> Option> { + ) -> Option> { Some(overlay::Element::new( layout.position(), Box::new(Overlay { @@ -391,15 +391,16 @@ mod modal { } } - struct Overlay<'a, 'b, Message, Renderer> { - content: &'b mut Element<'a, Message, Renderer>, + struct Overlay<'a, 'b, Message, Theme, Renderer> { + content: &'b mut Element<'a, Message, Theme, Renderer>, tree: &'b mut widget::Tree, size: Size, on_blur: Option, } - impl<'a, 'b, Message, Renderer> overlay::Overlay - for Overlay<'a, 'b, Message, Renderer> + impl<'a, 'b, Message, Theme, Renderer> + overlay::Overlay + for Overlay<'a, 'b, Message, Theme, Renderer> where Renderer: advanced::Renderer, Message: Clone, @@ -463,7 +464,7 @@ mod modal { fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -524,7 +525,7 @@ mod modal { &'c mut self, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.content.as_widget_mut().overlay( self.tree, layout.children().next().unwrap(), @@ -533,13 +534,14 @@ mod modal { } } - impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> + impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where - Renderer: 'a + advanced::Renderer, + Theme: 'a, Message: 'a + Clone, + Renderer: 'a + advanced::Renderer, { - fn from(modal: Modal<'a, Message, Renderer>) -> Self { + fn from(modal: Modal<'a, Message, Theme, Renderer>) -> Self { Element::new(modal) } } diff --git a/examples/multitouch/src/main.rs b/examples/multitouch/src/main.rs index ba8df7aa13..956ad4710e 100644 --- a/examples/multitouch/src/main.rs +++ b/examples/multitouch/src/main.rs @@ -96,7 +96,7 @@ impl Application for Multitouch { } } -impl canvas::Program for State { +impl canvas::Program for State { type State = (); fn update( diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index 6955551e70..c5fe300482 100644 --- a/examples/screenshot/src/main.rs +++ b/examples/screenshot/src/main.rs @@ -7,7 +7,7 @@ use iced::window; use iced::window::screenshot::{self, Screenshot}; use iced::{ Alignment, Application, Command, ContentFit, Element, Length, Rectangle, - Renderer, Subscription, Theme, + Subscription, Theme, }; use ::image as img; @@ -131,7 +131,7 @@ impl Application for Example { Command::none() } - fn view(&self) -> Element<'_, Self::Message, Renderer> { + fn view(&self) -> Element<'_, Self::Message> { let image: Element = if let Some(screenshot) = &self.screenshot { image(image::Handle::from_pixels( diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 2e837fa358..cc9875d94d 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -177,7 +177,6 @@ mod toast { use std::fmt; use std::time::{Duration, Instant}; - use iced::advanced; use iced::advanced::layout::{self, Layout}; use iced::advanced::overlay; use iced::advanced::renderer; @@ -314,7 +313,7 @@ mod toast { } } - impl<'a, Message> Widget for Manager<'a, Message> { + impl<'a, Message> Widget for Manager<'a, Message> { fn size(&self) -> Size { self.content.as_widget().size() } @@ -457,7 +456,7 @@ mod toast { state: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let instants = state.state.downcast_mut::>>(); let (content_state, toasts_state) = state.children.split_at_mut(1); @@ -496,7 +495,7 @@ mod toast { timeout_secs: u64, } - impl<'a, 'b, Message> overlay::Overlay + impl<'a, 'b, Message> overlay::Overlay for Overlay<'a, 'b, Message> { fn layout( @@ -601,7 +600,7 @@ mod toast { fn draw( &self, renderer: &mut Renderer, - theme: &::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index 8633bc0ad3..b656289a9b 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -5,7 +5,7 @@ use iced::widget::{ scrollable, slider, text, text_input, toggler, vertical_space, }; use iced::widget::{Button, Column, Container, Slider}; -use iced::{Color, Element, Font, Length, Pixels, Renderer, Sandbox, Settings}; +use iced::{Color, Element, Font, Length, Pixels, Sandbox, Settings}; pub fn main() -> iced::Result { #[cfg(target_arch = "wasm32")] @@ -697,7 +697,7 @@ fn button<'a, Message: Clone>(label: &str) -> Button<'a, Message> { fn color_slider<'a>( component: f32, update: impl Fn(f32) -> Color + 'a, -) -> Slider<'a, f64, StepMessage, Renderer> { +) -> Slider<'a, f64, StepMessage> { slider(0.0..=1.0, f64::from(component), move |c| { StepMessage::TextColorChanged(update(c as f32)) }) diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index 3ba41c3feb..cb07c23bc5 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -12,19 +12,17 @@ use crate::text; use crate::Primitive; use std::borrow::Cow; -use std::marker::PhantomData; /// A backend-agnostic renderer that supports all the built-in widgets. #[derive(Debug)] -pub struct Renderer { +pub struct Renderer { backend: B, default_font: Font, default_text_size: Pixels, primitives: Vec>, - theme: PhantomData, } -impl Renderer { +impl Renderer { /// Creates a new [`Renderer`] from the given [`Backend`]. pub fn new( backend: B, @@ -36,7 +34,6 @@ impl Renderer { default_font, default_text_size, primitives: Vec::new(), - theme: PhantomData, } } @@ -93,9 +90,7 @@ impl Renderer { } } -impl iced_core::Renderer for Renderer { - type Theme = T; - +impl iced_core::Renderer for Renderer { fn with_layer(&mut self, bounds: Rectangle, f: impl FnOnce(&mut Self)) { let current = self.start_layer(); @@ -134,7 +129,7 @@ impl iced_core::Renderer for Renderer { } } -impl core::text::Renderer for Renderer +impl core::text::Renderer for Renderer where B: Backend + backend::Text, { @@ -210,7 +205,7 @@ where } } -impl image::Renderer for Renderer +impl image::Renderer for Renderer where B: Backend + backend::Image, { @@ -234,7 +229,7 @@ where } } -impl svg::Renderer for Renderer +impl svg::Renderer for Renderer where B: Backend + backend::Svg, { diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index f10ed04833..dc2c50ffd5 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -5,10 +5,10 @@ use crate::{Renderer, Settings}; use std::env; -pub enum Compositor { - TinySkia(iced_tiny_skia::window::Compositor), +pub enum Compositor { + TinySkia(iced_tiny_skia::window::Compositor), #[cfg(feature = "wgpu")] - Wgpu(iced_wgpu::window::Compositor), + Wgpu(iced_wgpu::window::Compositor), } pub enum Surface { @@ -17,9 +17,9 @@ pub enum Surface { Wgpu(iced_wgpu::window::Surface<'static>), } -impl crate::graphics::Compositor for Compositor { +impl crate::graphics::Compositor for Compositor { type Settings = Settings; - type Renderer = Renderer; + type Renderer = Renderer; type Surface = Surface; fn new( @@ -225,11 +225,11 @@ impl Candidate { ) } - fn build( + fn build( self, settings: Settings, _compatible_window: W, - ) -> Result, Error> { + ) -> Result { match self { Self::TinySkia => { let compositor = iced_tiny_skia::window::compositor::new( diff --git a/renderer/src/geometry.rs b/renderer/src/geometry.rs index 1ecb0a43a9..19ac87da2c 100644 --- a/renderer/src/geometry.rs +++ b/renderer/src/geometry.rs @@ -29,7 +29,7 @@ macro_rules! delegate { } impl Frame { - pub fn new(renderer: &Renderer, size: Size) -> Self { + pub fn new(renderer: &Renderer, size: Size) -> Self { match renderer { Renderer::TinySkia(_) => { Frame::TinySkia(iced_tiny_skia::geometry::Frame::new(size)) diff --git a/renderer/src/geometry/cache.rs b/renderer/src/geometry/cache.rs index d4bb04b33e..3aff76b975 100644 --- a/renderer/src/geometry/cache.rs +++ b/renderer/src/geometry/cache.rs @@ -54,9 +54,9 @@ impl Cache { /// Otherwise, the previously stored [`Geometry`] will be returned. The /// [`Cache`] is not cleared in this case. In other words, it will keep /// returning the stored [`Geometry`] if needed. - pub fn draw( + pub fn draw( &self, - renderer: &Renderer, + renderer: &Renderer, bounds: Size, draw_fn: impl FnOnce(&mut Frame), ) -> Geometry { diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index f2acfa00f5..a7df414b9c 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -32,10 +32,10 @@ use std::borrow::Cow; /// The default graphics renderer for [`iced`]. /// /// [`iced`]: https://github.com/iced-rs/iced -pub enum Renderer { - TinySkia(iced_tiny_skia::Renderer), +pub enum Renderer { + TinySkia(iced_tiny_skia::Renderer), #[cfg(feature = "wgpu")] - Wgpu(iced_wgpu::Renderer), + Wgpu(iced_wgpu::Renderer), } macro_rules! delegate { @@ -48,7 +48,7 @@ macro_rules! delegate { }; } -impl Renderer { +impl Renderer { pub fn draw_mesh(&mut self, mesh: Mesh) { match self { Self::TinySkia(_) => { @@ -64,9 +64,7 @@ impl Renderer { } } -impl core::Renderer for Renderer { - type Theme = T; - +impl core::Renderer for Renderer { fn with_layer(&mut self, bounds: Rectangle, f: impl FnOnce(&mut Self)) { match self { Self::TinySkia(renderer) => { @@ -148,15 +146,14 @@ impl core::Renderer for Renderer { } } -impl text::Renderer for Renderer { +impl text::Renderer for Renderer { type Font = Font; type Paragraph = Paragraph; type Editor = Editor; - const ICON_FONT: Font = iced_tiny_skia::Renderer::::ICON_FONT; - const CHECKMARK_ICON: char = iced_tiny_skia::Renderer::::CHECKMARK_ICON; - const ARROW_DOWN_ICON: char = - iced_tiny_skia::Renderer::::ARROW_DOWN_ICON; + const ICON_FONT: Font = iced_tiny_skia::Renderer::ICON_FONT; + const CHECKMARK_ICON: char = iced_tiny_skia::Renderer::CHECKMARK_ICON; + const ARROW_DOWN_ICON: char = iced_tiny_skia::Renderer::ARROW_DOWN_ICON; fn default_font(&self) -> Self::Font { delegate!(self, renderer, renderer.default_font()) @@ -214,7 +211,7 @@ impl text::Renderer for Renderer { } #[cfg(feature = "image")] -impl crate::core::image::Renderer for Renderer { +impl crate::core::image::Renderer for Renderer { type Handle = crate::core::image::Handle; fn dimensions( @@ -235,7 +232,7 @@ impl crate::core::image::Renderer for Renderer { } #[cfg(feature = "svg")] -impl crate::core::svg::Renderer for Renderer { +impl crate::core::svg::Renderer for Renderer { fn dimensions(&self, handle: &crate::core::svg::Handle) -> core::Size { delegate!(self, renderer, renderer.dimensions(handle)) } @@ -251,7 +248,7 @@ impl crate::core::svg::Renderer for Renderer { } #[cfg(feature = "geometry")] -impl crate::graphics::geometry::Renderer for Renderer { +impl crate::graphics::geometry::Renderer for Renderer { type Geometry = crate::Geometry; fn draw(&mut self, layers: Vec) { @@ -283,7 +280,7 @@ impl crate::graphics::geometry::Renderer for Renderer { } #[cfg(feature = "wgpu")] -impl iced_wgpu::primitive::pipeline::Renderer for Renderer { +impl iced_wgpu::primitive::pipeline::Renderer for Renderer { fn draw_pipeline_primitive( &mut self, bounds: Rectangle, diff --git a/runtime/src/multi_window/program.rs b/runtime/src/multi_window/program.rs index 591b3e9a7b..963a09d748 100644 --- a/runtime/src/multi_window/program.rs +++ b/runtime/src/multi_window/program.rs @@ -12,6 +12,9 @@ pub trait Program: Sized { /// The type of __messages__ your [`Program`] will produce. type Message: std::fmt::Debug + Send; + /// The theme used to draw the [`Program`]. + type Theme; + /// Handles a __message__ and updates the state of the [`Program`]. /// /// This is where you define your __update logic__. All the __messages__, @@ -28,5 +31,5 @@ pub trait Program: Sized { fn view( &self, window: window::Id, - ) -> Element<'_, Self::Message, Self::Renderer>; + ) -> Element<'_, Self::Message, Self::Theme, Self::Renderer>; } diff --git a/runtime/src/multi_window/state.rs b/runtime/src/multi_window/state.rs index 49f72c3971..afd0451965 100644 --- a/runtime/src/multi_window/state.rs +++ b/runtime/src/multi_window/state.rs @@ -92,7 +92,7 @@ where bounds: Size, cursor: mouse::Cursor, renderer: &mut P::Renderer, - theme: &::Theme, + theme: &P::Theme, style: &renderer::Style, clipboard: &mut dyn Clipboard, debug: &mut Debug, @@ -252,7 +252,7 @@ fn build_user_interfaces<'a, P: Program>( renderer: &mut P::Renderer, size: Size, debug: &mut Debug, -) -> Vec> { +) -> Vec> { caches .drain(..) .map(|cache| { @@ -267,7 +267,7 @@ 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::Theme, P::Renderer> { debug.view_started(); let view = program.view(); debug.view_finished(); diff --git a/runtime/src/overlay/nested.rs b/runtime/src/overlay/nested.rs index 4256efb705..60e2eb875e 100644 --- a/runtime/src/overlay/nested.rs +++ b/runtime/src/overlay/nested.rs @@ -10,16 +10,18 @@ use crate::core::{ /// An overlay container that displays nested overlays #[allow(missing_debug_implementations)] -pub struct Nested<'a, Message, Renderer> { - overlay: overlay::Element<'a, Message, Renderer>, +pub struct Nested<'a, Message, Theme, Renderer> { + overlay: overlay::Element<'a, Message, Theme, Renderer>, } -impl<'a, Message, Renderer> Nested<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Nested<'a, Message, Theme, Renderer> where Renderer: renderer::Renderer, { /// Creates a nested overlay from the provided [`overlay::Element`] - pub fn new(element: overlay::Element<'a, Message, Renderer>) -> Self { + pub fn new( + element: overlay::Element<'a, Message, Theme, Renderer>, + ) -> Self { Self { overlay: element } } @@ -38,8 +40,8 @@ where _position: Point, translation: Vector, ) -> layout::Node { - fn recurse( - element: &mut overlay::Element<'_, Message, Renderer>, + fn recurse( + element: &mut overlay::Element<'_, Message, Theme, Renderer>, renderer: &Renderer, bounds: Size, translation: Vector, @@ -71,16 +73,16 @@ where pub fn draw( &mut self, renderer: &mut Renderer, - theme: &::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, ) { - fn recurse( - element: &mut overlay::Element<'_, Message, Renderer>, + fn recurse( + element: &mut overlay::Element<'_, Message, Theme, Renderer>, layout: Layout<'_>, renderer: &mut Renderer, - theme: &::Theme, + theme: &Theme, style: &renderer::Style, cursor: mouse::Cursor, ) where @@ -144,8 +146,8 @@ where renderer: &Renderer, operation: &mut dyn widget::Operation, ) { - fn recurse( - element: &mut overlay::Element<'_, Message, Renderer>, + fn recurse( + element: &mut overlay::Element<'_, Message, Theme, Renderer>, layout: Layout<'_>, renderer: &Renderer, operation: &mut dyn widget::Operation, @@ -178,8 +180,8 @@ where clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, ) -> event::Status { - fn recurse( - element: &mut overlay::Element<'_, Message, Renderer>, + fn recurse( + element: &mut overlay::Element<'_, Message, Theme, Renderer>, layout: Layout<'_>, event: Event, cursor: mouse::Cursor, @@ -267,8 +269,8 @@ where viewport: &Rectangle, renderer: &Renderer, ) -> mouse::Interaction { - fn recurse( - element: &mut overlay::Element<'_, Message, Renderer>, + fn recurse( + element: &mut overlay::Element<'_, Message, Theme, Renderer>, layout: Layout<'_>, cursor: mouse::Cursor, viewport: &Rectangle, @@ -318,8 +320,8 @@ where renderer: &Renderer, cursor_position: Point, ) -> bool { - fn recurse( - element: &mut overlay::Element<'_, Message, Renderer>, + fn recurse( + element: &mut overlay::Element<'_, Message, Theme, Renderer>, layout: Layout<'_>, renderer: &Renderer, cursor_position: Point, diff --git a/runtime/src/program.rs b/runtime/src/program.rs index 44585cc55d..6c1b8f07b1 100644 --- a/runtime/src/program.rs +++ b/runtime/src/program.rs @@ -13,6 +13,9 @@ pub trait Program: Sized { /// The graphics backend to use to draw the [`Program`]. type Renderer: Renderer + text::Renderer; + /// The theme used to draw the [`Program`]. + type Theme; + /// The type of __messages__ your [`Program`] will produce. type Message: std::fmt::Debug + Send; @@ -29,5 +32,5 @@ pub trait Program: Sized { /// Returns the widgets to display in the [`Program`]. /// /// These widgets can produce __messages__ based on user interaction. - fn view(&self) -> Element<'_, Self::Message, Self::Renderer>; + fn view(&self) -> Element<'_, Self::Message, Self::Theme, Self::Renderer>; } diff --git a/runtime/src/program/state.rs b/runtime/src/program/state.rs index 6f8f4063e2..d685b07c86 100644 --- a/runtime/src/program/state.rs +++ b/runtime/src/program/state.rs @@ -91,7 +91,7 @@ where bounds: Size, cursor: mouse::Cursor, renderer: &mut P::Renderer, - theme: &::Theme, + theme: &P::Theme, style: &renderer::Style, clipboard: &mut dyn Clipboard, debug: &mut Debug, @@ -219,7 +219,7 @@ 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::Theme, P::Renderer> { debug.view_started(); let view = program.view(); debug.view_finished(); diff --git a/runtime/src/user_interface.rs b/runtime/src/user_interface.rs index 3594ac188c..054d56b781 100644 --- a/runtime/src/user_interface.rs +++ b/runtime/src/user_interface.rs @@ -23,15 +23,15 @@ use crate::overlay; /// /// [`integration`]: https://github.com/iced-rs/iced/tree/0.10/examples/integration #[allow(missing_debug_implementations)] -pub struct UserInterface<'a, Message, Renderer> { - root: Element<'a, Message, Renderer>, +pub struct UserInterface<'a, Message, Theme, Renderer> { + root: Element<'a, Message, Theme, Renderer>, base: layout::Node, state: widget::Tree, overlay: Option, bounds: Size, } -impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> UserInterface<'a, Message, Theme, Renderer> where Renderer: crate::core::Renderer, { @@ -54,7 +54,7 @@ where /// # /// # impl Counter { /// # pub fn new() -> Self { Counter } - /// # pub fn view(&self) -> iced_core::Element<(), Renderer> { unimplemented!() } + /// # pub fn view(&self) -> iced_core::Element<(), (), Renderer> { unimplemented!() } /// # pub fn update(&mut self, _: ()) {} /// # } /// use iced_runtime::core::Size; @@ -86,7 +86,7 @@ where /// cache = user_interface.into_cache(); /// } /// ``` - pub fn build>>( + pub fn build>>( root: E, bounds: Size, cache: Cache, @@ -130,7 +130,7 @@ where /// # /// # impl Counter { /// # pub fn new() -> Self { Counter } - /// # pub fn view(&self) -> iced_core::Element<(), Renderer> { unimplemented!() } + /// # pub fn view(&self) -> iced_core::Element<(), (), Renderer> { unimplemented!() } /// # pub fn update(&mut self, _: ()) {} /// # } /// use iced_runtime::core::clipboard; @@ -384,7 +384,7 @@ where /// # /// # impl Counter { /// # pub fn new() -> Self { Counter } - /// # pub fn view(&self) -> Element<(), Renderer> { unimplemented!() } + /// # pub fn view(&self) -> Element<(), (), Renderer> { unimplemented!() } /// # pub fn update(&mut self, _: ()) {} /// # } /// use iced_runtime::core::clipboard; @@ -439,7 +439,7 @@ where pub fn draw( &mut self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, cursor: mouse::Cursor, ) -> mouse::Interaction { diff --git a/src/application.rs b/src/application.rs index 9518b8c59d..01b2032f43 100644 --- a/src/application.rs +++ b/src/application.rs @@ -139,7 +139,7 @@ pub trait Application: Sized { /// Returns the widgets to display in the [`Application`]. /// /// These widgets can produce __messages__ based on user interaction. - fn view(&self) -> Element<'_, Self::Message, crate::Renderer>; + fn view(&self) -> Element<'_, Self::Message, Self::Theme, crate::Renderer>; /// Returns the current [`Theme`] of the [`Application`]. /// @@ -208,7 +208,7 @@ pub trait Application: Sized { Ok(crate::shell::application::run::< Instance, Self::Executor, - crate::renderer::Compositor, + crate::renderer::Compositor, >(settings.into(), renderer_settings)?) } } @@ -219,14 +219,15 @@ impl crate::runtime::Program for Instance where A: Application, { - type Renderer = crate::Renderer; type Message = A::Message; + type Theme = A::Theme; + type Renderer = crate::Renderer; fn update(&mut self, message: Self::Message) -> Command { self.0.update(message) } - fn view(&self) -> Element<'_, Self::Message, Self::Renderer> { + fn view(&self) -> Element<'_, Self::Message, Self::Theme, Self::Renderer> { self.0.view() } } diff --git a/src/lib.rs b/src/lib.rs index eb1bd3bda7..86207d6e2b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -271,8 +271,12 @@ pub mod overlay { /// This is an alias of an [`overlay::Element`] with a default `Renderer`. /// /// [`overlay::Element`]: crate::core::overlay::Element - pub type Element<'a, Message, Renderer = crate::Renderer> = - crate::core::overlay::Element<'a, Message, Renderer>; + pub type Element< + 'a, + Message, + Theme = crate::Renderer, + Renderer = crate::Renderer, + > = crate::core::overlay::Element<'a, Message, Theme, Renderer>; pub use iced_widget::overlay::*; } @@ -302,19 +306,21 @@ pub use error::Error; pub use event::Event; pub use executor::Executor; pub use font::Font; +pub use renderer::Renderer; pub use sandbox::Sandbox; pub use settings::Settings; pub use subscription::Subscription; pub use theme::Theme; -/// The default renderer. -pub type Renderer = renderer::Renderer; - /// A generic widget. /// /// This is an alias of an `iced_native` element with a default `Renderer`. -pub type Element<'a, Message, Renderer = crate::Renderer> = - crate::core::Element<'a, Message, Renderer>; +pub type Element< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> = crate::core::Element<'a, Message, Theme, Renderer>; /// The result of running an [`Application`]. /// diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 4a91bdf4f1..ac625281c6 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -114,7 +114,7 @@ pub trait Application: Sized { fn view( &self, window: window::Id, - ) -> Element<'_, Self::Message, crate::Renderer>; + ) -> Element<'_, Self::Message, Self::Theme, crate::Renderer>; /// Returns the current [`Theme`] of the `window` of the [`Application`]. /// @@ -185,7 +185,7 @@ pub trait Application: Sized { Ok(crate::shell::multi_window::run::< Instance, Self::Executor, - crate::renderer::Compositor, + crate::renderer::Compositor, >(settings.into(), renderer_settings)?) } } @@ -196,8 +196,9 @@ impl crate::runtime::multi_window::Program for Instance where A: Application, { - type Renderer = crate::Renderer; type Message = A::Message; + type Theme = A::Theme; + type Renderer = crate::Renderer; fn update(&mut self, message: Self::Message) -> Command { self.0.update(message) @@ -206,7 +207,7 @@ where fn view( &self, window: window::Id, - ) -> Element<'_, Self::Message, Self::Renderer> { + ) -> Element<'_, Self::Message, Self::Theme, Self::Renderer> { self.0.view(window) } } diff --git a/tiny_skia/src/lib.rs b/tiny_skia/src/lib.rs index ec8012beca..e7294f9b66 100644 --- a/tiny_skia/src/lib.rs +++ b/tiny_skia/src/lib.rs @@ -28,4 +28,4 @@ pub use settings::Settings; /// /// [`tiny-skia`]: https://github.com/RazrFalcon/tiny-skia /// [`iced`]: https://github.com/iced-rs/iced -pub type Renderer = iced_graphics::Renderer; +pub type Renderer = iced_graphics::Renderer; diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 781ed8a5c2..21ccf6200e 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -5,13 +5,11 @@ use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; use std::collections::VecDeque; -use std::marker::PhantomData; use std::num::NonZeroU32; -pub struct Compositor { +pub struct Compositor { context: softbuffer::Context>, settings: Settings, - _theme: PhantomData, } pub struct Surface { @@ -25,9 +23,9 @@ pub struct Surface { max_age: u8, } -impl crate::graphics::Compositor for Compositor { +impl crate::graphics::Compositor for Compositor { type Settings = Settings; - type Renderer = Renderer; + type Renderer = Renderer; type Surface = Surface; fn new( @@ -138,19 +136,15 @@ impl crate::graphics::Compositor for Compositor { } } -pub fn new( +pub fn new( settings: Settings, compatible_window: W, -) -> Compositor { +) -> Compositor { #[allow(unsafe_code)] let context = softbuffer::Context::new(Box::new(compatible_window) as _) .expect("Create softbuffer context"); - Compositor { - context, - settings, - _theme: PhantomData, - } + Compositor { context, settings } } pub fn present>( diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 424dfeb311..b00e5c3ce3 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -63,4 +63,4 @@ mod image; /// /// [`wgpu`]: https://github.com/gfx-rs/wgpu-rs /// [`iced`]: https://github.com/iced-rs/iced -pub type Renderer = iced_graphics::Renderer; +pub type Renderer = iced_graphics::Renderer; diff --git a/wgpu/src/primitive/pipeline.rs b/wgpu/src/primitive/pipeline.rs index c8e45458c7..c6b7c5e22f 100644 --- a/wgpu/src/primitive/pipeline.rs +++ b/wgpu/src/primitive/pipeline.rs @@ -67,7 +67,7 @@ pub trait Renderer: crate::core::Renderer { ); } -impl Renderer for crate::Renderer { +impl Renderer for crate::Renderer { fn draw_pipeline_primitive( &mut self, bounds: Rectangle, diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 31cf3819a1..58f3f65410 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -6,21 +6,18 @@ use crate::graphics::compositor; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use std::marker::PhantomData; - /// A window graphics backend for iced powered by `wgpu`. #[allow(missing_debug_implementations)] -pub struct Compositor { +pub struct Compositor { settings: Settings, instance: wgpu::Instance, adapter: wgpu::Adapter, device: wgpu::Device, queue: wgpu::Queue, format: wgpu::TextureFormat, - theme: PhantomData, } -impl Compositor { +impl Compositor { /// Requests a new [`Compositor`] with the given [`Settings`]. /// /// Returns `None` if no compatible graphics adapter could be found. @@ -123,7 +120,6 @@ impl Compositor { device, queue, format, - theme: PhantomData, }) } @@ -135,10 +131,10 @@ impl Compositor { /// Creates a [`Compositor`] and its [`Backend`] for the given [`Settings`] and /// window. -pub fn new( +pub fn new( settings: Settings, compatible_window: W, -) -> Result, Error> { +) -> Result { let compositor = futures::executor::block_on(Compositor::request( settings, Some(compatible_window), @@ -149,8 +145,8 @@ pub fn new( } /// Presents the given primitives with the given [`Compositor`] and [`Backend`]. -pub fn present>( - compositor: &mut Compositor, +pub fn present>( + compositor: &mut Compositor, backend: &mut Backend, surface: &mut wgpu::Surface<'static>, primitives: &[Primitive], @@ -203,9 +199,9 @@ pub fn present>( } } -impl graphics::Compositor for Compositor { +impl graphics::Compositor for Compositor { type Settings = Settings; - type Renderer = Renderer; + type Renderer = Renderer; type Surface = wgpu::Surface<'static>; fn new( @@ -314,8 +310,8 @@ impl graphics::Compositor for Compositor { /// Renders the current surface to an offscreen buffer. /// /// Returns RGBA bytes of the texture data. -pub fn screenshot>( - compositor: &Compositor, +pub fn screenshot>( + compositor: &Compositor, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, diff --git a/widget/src/button.rs b/widget/src/button.rs index 14626dd378..3b11e8a7aa 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -14,13 +14,13 @@ use crate::core::{ Shell, Size, Widget, }; -pub use iced_style::button::{Appearance, StyleSheet}; +pub use crate::style::button::{Appearance, StyleSheet}; /// A generic widget that produces a message when pressed. /// /// ```no_run /// # type Button<'a, Message> = -/// # iced_widget::Button<'a, Message, iced_widget::renderer::Renderer>; +/// # iced_widget::Button<'a, Message, iced_widget::style::Theme, iced_widget::renderer::Renderer>; /// # /// #[derive(Clone)] /// enum Message { @@ -35,7 +35,7 @@ pub use iced_style::button::{Appearance, StyleSheet}; /// /// ``` /// # type Button<'a, Message> = -/// # iced_widget::Button<'a, Message, iced_widget::renderer::Renderer>; +/// # iced_widget::Button<'a, Message, iced_widget::style::Theme, iced_widget::renderer::Renderer>; /// # /// #[derive(Clone)] /// enum Message { @@ -51,26 +51,28 @@ pub use iced_style::button::{Appearance, StyleSheet}; /// } /// ``` #[allow(missing_debug_implementations)] -pub struct Button<'a, Message, Renderer = crate::Renderer> +pub struct Button<'a, Message, Theme = crate::Theme, Renderer = crate::Renderer> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { - content: Element<'a, Message, Renderer>, + content: Element<'a, Message, Theme, Renderer>, on_press: Option, width: Length, height: Length, padding: Padding, - style: ::Style, + style: Theme::Style, } -impl<'a, Message, Renderer> Button<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Button<'a, Message, Theme, Renderer> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { /// Creates a new [`Button`] with the given content. - pub fn new(content: impl Into>) -> Self { + pub fn new( + content: impl Into>, + ) -> Self { let content = content.into(); let size = content.as_widget().size_hint(); @@ -80,7 +82,7 @@ where width: size.width.fluid(), height: size.height.fluid(), padding: Padding::new(5.0), - style: ::Style::default(), + style: Theme::Style::default(), } } @@ -120,21 +122,18 @@ where } /// Sets the style variant of this [`Button`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } } -impl<'a, Message, Renderer> Widget - for Button<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Button<'a, Message, Theme, Renderer> where Message: 'a + Clone, + Theme: StyleSheet, Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -224,7 +223,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -272,7 +271,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.content.as_widget_mut().overlay( &mut tree.children[0], layout.children().next().unwrap(), @@ -281,14 +280,14 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: Clone + 'a, + Theme: StyleSheet + 'a, Renderer: crate::core::Renderer + 'a, - Renderer::Theme: StyleSheet, { - fn from(button: Button<'a, Message, Renderer>) -> Self { + fn from(button: Button<'a, Message, Theme, Renderer>) -> Self { Self::new(button) } } @@ -361,34 +360,32 @@ pub fn update<'a, Message: Clone>( } /// Draws a [`Button`]. -pub fn draw<'a, Renderer: crate::core::Renderer>( +pub fn draw<'a, Theme, Renderer: crate::core::Renderer>( renderer: &mut Renderer, bounds: Rectangle, cursor: mouse::Cursor, is_enabled: bool, - style_sheet: &dyn StyleSheet< - Style = ::Style, - >, - style: &::Style, + theme: &Theme, + style: &Theme::Style, state: impl FnOnce() -> &'a State, ) -> Appearance where - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { let is_mouse_over = cursor.is_over(bounds); let styling = if !is_enabled { - style_sheet.disabled(style) + theme.disabled(style) } else if is_mouse_over { let state = state(); if state.is_pressed { - style_sheet.pressed(style) + theme.pressed(style) } else { - style_sheet.hovered(style) + theme.hovered(style) } } else { - style_sheet.active(style) + theme.active(style) }; if styling.background.is_some() diff --git a/widget/src/canvas.rs b/widget/src/canvas.rs index 4e42a671b6..b95e6206f7 100644 --- a/widget/src/canvas.rs +++ b/widget/src/canvas.rs @@ -30,9 +30,8 @@ use std::marker::PhantomData; /// # use iced_widget::canvas::{self, Canvas, Fill, Frame, Geometry, Path, Program}; /// # use iced_widget::core::{Color, Rectangle}; /// # use iced_widget::core::mouse; -/// # use iced_widget::style::Theme; +/// # use iced_widget::{Renderer, Theme}; /// # -/// # pub type Renderer = iced_widget::renderer::Renderer; /// // First, we define the data we need for drawing /// #[derive(Debug)] /// struct Circle { @@ -62,22 +61,23 @@ use std::marker::PhantomData; /// let canvas = Canvas::new(Circle { radius: 50.0 }); /// ``` #[derive(Debug)] -pub struct Canvas +pub struct Canvas where Renderer: geometry::Renderer, - P: Program, + P: Program, { width: Length, height: Length, program: P, message_: PhantomData, - theme_: PhantomData, + theme_: PhantomData, + renderer_: PhantomData, } -impl Canvas +impl Canvas where + P: Program, Renderer: geometry::Renderer, - P: Program, { const DEFAULT_SIZE: f32 = 100.0; @@ -89,6 +89,7 @@ where program, message_: PhantomData, theme_: PhantomData, + renderer_: PhantomData, } } @@ -105,11 +106,11 @@ where } } -impl Widget - for Canvas +impl Widget + for Canvas where Renderer: geometry::Renderer, - P: Program, + P: Program, { fn tag(&self) -> tree::Tag { struct Tag(T); @@ -192,7 +193,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -217,16 +218,17 @@ where } } -impl<'a, P, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, P, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: 'a, Renderer: 'a + geometry::Renderer, - P: Program + 'a, + P: 'a + Program, { fn from( - canvas: Canvas, - ) -> Element<'a, Message, Renderer> { + canvas: Canvas, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(canvas) } } diff --git a/widget/src/canvas/program.rs b/widget/src/canvas/program.rs index 2ac23061e3..0bff4bda4f 100644 --- a/widget/src/canvas/program.rs +++ b/widget/src/canvas/program.rs @@ -9,7 +9,7 @@ use crate::graphics::geometry; /// application. /// /// [`Canvas`]: crate::Canvas -pub trait Program +pub trait Program where Renderer: geometry::Renderer, { @@ -49,7 +49,7 @@ where &self, state: &Self::State, renderer: &Renderer, - theme: &Renderer::Theme, + theme: &Theme, bounds: Rectangle, cursor: mouse::Cursor, ) -> Vec; @@ -70,10 +70,10 @@ where } } -impl Program for &T +impl Program for &T where Renderer: geometry::Renderer, - T: Program, + T: Program, { type State = T::State; @@ -91,7 +91,7 @@ where &self, state: &Self::State, renderer: &Renderer, - theme: &Renderer::Theme, + theme: &Theme, bounds: Rectangle, cursor: mouse::Cursor, ) -> Vec { diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index 762683143f..6f559ccc72 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -12,7 +12,7 @@ use crate::core::{ Clipboard, Element, Layout, Length, Pixels, Rectangle, Shell, Size, Widget, }; -pub use iced_style::checkbox::{Appearance, StyleSheet}; +pub use crate::style::checkbox::{Appearance, StyleSheet}; /// A box that can be checked. /// @@ -20,7 +20,7 @@ pub use iced_style::checkbox::{Appearance, StyleSheet}; /// /// ```no_run /// # type Checkbox<'a, Message> = -/// # iced_widget::Checkbox<'a, Message, iced_widget::renderer::Renderer>; +/// # iced_widget::Checkbox<'a, Message, iced_widget::style::Theme, iced_widget::renderer::Renderer>; /// # /// pub enum Message { /// CheckboxToggled(bool), @@ -33,10 +33,14 @@ pub use iced_style::checkbox::{Appearance, StyleSheet}; /// /// ![Checkbox drawn by `iced_wgpu`](https://github.com/iced-rs/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/checkbox.png?raw=true) #[allow(missing_debug_implementations)] -pub struct Checkbox<'a, Message, Renderer = crate::Renderer> -where +pub struct Checkbox< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: StyleSheet + crate::text::StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet + crate::text::StyleSheet, { is_checked: bool, on_toggle: Box Message + 'a>, @@ -49,13 +53,13 @@ where text_shaping: text::Shaping, font: Option, icon: Icon, - style: ::Style, + style: ::Style, } -impl<'a, Message, Renderer> Checkbox<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Checkbox<'a, Message, Theme, Renderer> where Renderer: text::Renderer, - Renderer::Theme: StyleSheet + crate::text::StyleSheet, + Theme: StyleSheet + crate::text::StyleSheet, { /// The default size of a [`Checkbox`]. const DEFAULT_SIZE: f32 = 20.0; @@ -153,18 +157,18 @@ where /// Sets the style of the [`Checkbox`]. pub fn style( mut self, - style: impl Into<::Style>, + style: impl Into<::Style>, ) -> Self { self.style = style.into(); self } } -impl<'a, Message, Renderer> Widget - for Checkbox<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Checkbox<'a, Message, Theme, Renderer> where + Theme: StyleSheet + crate::text::StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet + crate::text::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -261,7 +265,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -335,16 +339,16 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: 'a + StyleSheet + crate::text::StyleSheet, Renderer: 'a + text::Renderer, - Renderer::Theme: StyleSheet + crate::text::StyleSheet, { fn from( - checkbox: Checkbox<'a, Message, Renderer>, - ) -> Element<'a, Message, Renderer> { + checkbox: Checkbox<'a, Message, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(checkbox) } } diff --git a/widget/src/column.rs b/widget/src/column.rs index d6eea84bb3..faac0e48d8 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -12,17 +12,18 @@ use crate::core::{ /// A container that distributes its contents vertically. #[allow(missing_debug_implementations)] -pub struct Column<'a, Message, Renderer = crate::Renderer> { +pub struct Column<'a, Message, Theme = crate::Theme, Renderer = crate::Renderer> +{ spacing: f32, padding: Padding, width: Length, height: Length, max_width: f32, align_items: Alignment, - children: Vec>, + children: Vec>, } -impl<'a, Message, Renderer> Column<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Column<'a, Message, Theme, Renderer> where Renderer: crate::core::Renderer, { @@ -41,7 +42,7 @@ where /// Creates a [`Column`] with the given elements. pub fn with_children( - children: impl IntoIterator>, + children: impl IntoIterator>, ) -> Self { children.into_iter().fold(Self::new(), Self::push) } @@ -89,7 +90,7 @@ where /// Adds an element to the [`Column`]. pub fn push( mut self, - child: impl Into>, + child: impl Into>, ) -> Self { let child = child.into(); let size = child.as_widget().size_hint(); @@ -116,8 +117,8 @@ where } } -impl<'a, Message, Renderer> Widget - for Column<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Column<'a, Message, Theme, Renderer> where Renderer: crate::core::Renderer, { @@ -233,7 +234,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -258,18 +259,19 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { overlay::from_children(&mut self.children, tree, layout, renderer) } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: 'a, Renderer: crate::core::Renderer + 'a, { - fn from(column: Column<'a, Message, Renderer>) -> Self { + fn from(column: Column<'a, Message, Theme, Renderer>) -> Self { Self::new(column) } } diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 73beeac3e1..0103e9cd8c 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -25,29 +25,34 @@ use std::fmt::Display; /// to search for corresponding values from the list of options that are displayed /// as a Menu. #[allow(missing_debug_implementations)] -pub struct ComboBox<'a, T, Message, Renderer = crate::Renderer> -where +pub struct ComboBox< + 'a, + T, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: text_input::StyleSheet + menu::StyleSheet, Renderer: text::Renderer, - Renderer::Theme: text_input::StyleSheet + menu::StyleSheet, { state: &'a State, - text_input: TextInput<'a, TextInputEvent, Renderer>, + text_input: TextInput<'a, TextInputEvent, Theme, Renderer>, font: Option, selection: text_input::Value, on_selected: Box Message>, on_option_hovered: Option Message>>, on_close: Option, on_input: Option Message>>, - menu_style: ::Style, + menu_style: ::Style, padding: Padding, size: Option, } -impl<'a, T, Message, Renderer> ComboBox<'a, T, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> ComboBox<'a, T, Message, Theme, Renderer> where T: std::fmt::Display + Clone, + Theme: text_input::StyleSheet + menu::StyleSheet, Renderer: text::Renderer, - Renderer::Theme: text_input::StyleSheet + menu::StyleSheet, { /// Creates a new [`ComboBox`] with the given list of options, a placeholder, /// the current selected value, and the message to produce when an option is @@ -116,8 +121,8 @@ where // TODO: Define its own `StyleSheet` trait pub fn style(mut self, style: S) -> Self where - S: Into<::Style> - + Into<::Style> + S: Into<::Style> + + Into<::Style> + Clone, { self.menu_style = style.clone().into(); @@ -128,7 +133,7 @@ where /// Sets the style of the [`TextInput`] of the [`ComboBox`]. pub fn text_input_style(mut self, style: S) -> Self where - S: Into<::Style> + Clone, + S: Into<::Style> + Clone, { self.text_input = self.text_input.style(style); self @@ -289,19 +294,19 @@ enum TextInputEvent { TextChanged(String), } -impl<'a, T, Message, Renderer> Widget - for ComboBox<'a, T, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> Widget + for ComboBox<'a, T, Message, Theme, Renderer> where T: Display + Clone + 'static, Message: Clone, - Renderer: text::Renderer, - Renderer::Theme: container::StyleSheet + Theme: container::StyleSheet + text_input::StyleSheet + scrollable::StyleSheet + menu::StyleSheet, + Renderer: text::Renderer, { fn size(&self) -> Size { - Widget::::size(&self.text_input) + Widget::::size(&self.text_input) } fn layout( @@ -340,7 +345,7 @@ where } fn children(&self) -> Vec { - vec![widget::Tree::new(&self.text_input as &dyn Widget<_, _>)] + vec![widget::Tree::new(&self.text_input as &dyn Widget<_, _, _>)] } fn on_event( @@ -616,7 +621,7 @@ where &self, tree: &widget::Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -652,7 +657,7 @@ where tree: &'b mut widget::Tree, layout: Layout<'_>, _renderer: &Renderer, - ) -> Option> { + ) -> Option> { let is_focused = { let text_input_state = tree.children[0] .state @@ -707,18 +712,20 @@ where } } -impl<'a, T, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> + From> + for Element<'a, Message, Theme, Renderer> where T: Display + Clone + 'static, - Message: 'a + Clone, - Renderer: text::Renderer + 'a, - Renderer::Theme: container::StyleSheet + Message: Clone + 'a, + Theme: container::StyleSheet + text_input::StyleSheet + scrollable::StyleSheet - + menu::StyleSheet, + + menu::StyleSheet + + 'a, + Renderer: text::Renderer + 'a, { - fn from(combo_box: ComboBox<'a, T, Message, Renderer>) -> Self { + fn from(combo_box: ComboBox<'a, T, Message, Theme, Renderer>) -> Self { Self::new(combo_box) } } diff --git a/widget/src/container.rs b/widget/src/container.rs index f2d1aabaa9..78ec19788d 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -19,10 +19,14 @@ pub use iced_style::container::{Appearance, StyleSheet}; /// /// It is normally used for alignment purposes. #[allow(missing_debug_implementations)] -pub struct Container<'a, Message, Renderer = crate::Renderer> -where +pub struct Container< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { id: Option, padding: Padding, @@ -32,19 +36,19 @@ where max_height: f32, horizontal_alignment: alignment::Horizontal, vertical_alignment: alignment::Vertical, - style: ::Style, - content: Element<'a, Message, Renderer>, + style: Theme::Style, + content: Element<'a, Message, Theme, Renderer>, } -impl<'a, Message, Renderer> Container<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Container<'a, Message, Theme, Renderer> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { /// Creates an empty [`Container`]. pub fn new(content: T) -> Self where - T: Into>, + T: Into>, { let content = content.into(); let size = content.as_widget().size_hint(); @@ -124,20 +128,17 @@ where } /// Sets the style of the [`Container`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } } -impl<'a, Message, Renderer> Widget - for Container<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Container<'a, Message, Theme, Renderer> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { self.content.as_widget().tag() @@ -246,7 +247,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, renderer_style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -278,7 +279,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.content.as_widget_mut().overlay( tree, layout.children().next().unwrap(), @@ -287,16 +288,16 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: 'a + StyleSheet, Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn from( - column: Container<'a, Message, Renderer>, - ) -> Element<'a, Message, Renderer> { + column: Container<'a, Message, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(column) } } diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 498dd76c33..28fdbbb556 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -54,20 +54,20 @@ macro_rules! row { /// Creates a new [`Container`] with the provided content. /// /// [`Container`]: crate::Container -pub fn container<'a, Message, Renderer>( - content: impl Into>, -) -> Container<'a, Message, Renderer> +pub fn container<'a, Message, Theme, Renderer>( + content: impl Into>, +) -> Container<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet, Renderer: core::Renderer, - Renderer::Theme: container::StyleSheet, { Container::new(content) } /// Creates a new [`Column`] with the given children. -pub fn column<'a, Message, Renderer>( - children: impl IntoIterator>, -) -> Column<'a, Message, Renderer> +pub fn column<'a, Message, Theme, Renderer>( + children: impl IntoIterator>, +) -> Column<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -75,9 +75,9 @@ where } /// Creates a new [`keyed::Column`] with the given children. -pub fn keyed_column<'a, Key, Message, Renderer>( - children: impl IntoIterator)>, -) -> keyed::Column<'a, Key, Message, Renderer> +pub fn keyed_column<'a, Key, Message, Theme, Renderer>( + children: impl IntoIterator)>, +) -> keyed::Column<'a, Key, Message, Theme, Renderer> where Key: Copy + PartialEq, Renderer: core::Renderer, @@ -88,9 +88,9 @@ where /// Creates a new [`Row`] with the given children. /// /// [`Row`]: crate::Row -pub fn row<'a, Message, Renderer>( - children: impl IntoIterator>, -) -> Row<'a, Message, Renderer> +pub fn row<'a, Message, Theme, Renderer>( + children: impl IntoIterator>, +) -> Row<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -100,12 +100,12 @@ where /// Creates a new [`Scrollable`] with the provided content. /// /// [`Scrollable`]: crate::Scrollable -pub fn scrollable<'a, Message, Renderer>( - content: impl Into>, -) -> Scrollable<'a, Message, Renderer> +pub fn scrollable<'a, Message, Theme, Renderer>( + content: impl Into>, +) -> Scrollable<'a, Message, Theme, Renderer> where + Theme: scrollable::StyleSheet, Renderer: core::Renderer, - Renderer::Theme: scrollable::StyleSheet, { Scrollable::new(content) } @@ -113,13 +113,12 @@ where /// Creates a new [`Button`] with the provided content. /// /// [`Button`]: crate::Button -pub fn button<'a, Message, Renderer>( - content: impl Into>, -) -> Button<'a, Message, Renderer> +pub fn button<'a, Message, Theme, Renderer>( + content: impl Into>, +) -> Button<'a, Message, Theme, Renderer> where Renderer: core::Renderer, - Renderer::Theme: button::StyleSheet, - ::Style: Default, + Theme: button::StyleSheet, { Button::new(content) } @@ -128,14 +127,14 @@ where /// /// [`Tooltip`]: crate::Tooltip /// [`tooltip::Position`]: crate::tooltip::Position -pub fn tooltip<'a, Message, Renderer>( - content: impl Into>, +pub fn tooltip<'a, Message, Theme, Renderer>( + content: impl Into>, tooltip: impl ToString, position: tooltip::Position, -) -> crate::Tooltip<'a, Message, Renderer> +) -> crate::Tooltip<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet + text::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: container::StyleSheet + text::StyleSheet, { Tooltip::new(content, tooltip.to_string(), position) } @@ -143,10 +142,12 @@ where /// Creates a new [`Text`] widget with the provided content. /// /// [`Text`]: core::widget::Text -pub fn text<'a, Renderer>(text: impl ToString) -> Text<'a, Renderer> +pub fn text<'a, Theme, Renderer>( + text: impl ToString, +) -> Text<'a, Theme, Renderer> where + Theme: text::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: text::StyleSheet, { Text::new(text.to_string()) } @@ -154,14 +155,14 @@ where /// Creates a new [`Checkbox`]. /// /// [`Checkbox`]: crate::Checkbox -pub fn checkbox<'a, Message, Renderer>( +pub fn checkbox<'a, Message, Theme, Renderer>( label: impl Into, is_checked: bool, f: impl Fn(bool) -> Message + 'a, -) -> Checkbox<'a, Message, Renderer> +) -> Checkbox<'a, Message, Theme, Renderer> where + Theme: checkbox::StyleSheet + text::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: checkbox::StyleSheet + text::StyleSheet, { Checkbox::new(label, is_checked, f) } @@ -169,16 +170,16 @@ where /// Creates a new [`Radio`]. /// /// [`Radio`]: crate::Radio -pub fn radio( +pub fn radio( label: impl Into, value: V, selected: Option, on_click: impl FnOnce(V) -> Message, -) -> Radio +) -> Radio where Message: Clone, + Theme: radio::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: radio::StyleSheet, V: Copy + Eq, { Radio::new(label, value, selected, on_click) @@ -187,14 +188,14 @@ where /// Creates a new [`Toggler`]. /// /// [`Toggler`]: crate::Toggler -pub fn toggler<'a, Message, Renderer>( +pub fn toggler<'a, Message, Theme, Renderer>( label: impl Into>, is_checked: bool, f: impl Fn(bool) -> Message + 'a, -) -> Toggler<'a, Message, Renderer> +) -> Toggler<'a, Message, Theme, Renderer> where Renderer: core::text::Renderer, - Renderer::Theme: toggler::StyleSheet, + Theme: toggler::StyleSheet, { Toggler::new(label, is_checked, f) } @@ -202,14 +203,14 @@ where /// Creates a new [`TextInput`]. /// /// [`TextInput`]: crate::TextInput -pub fn text_input<'a, Message, Renderer>( +pub fn text_input<'a, Message, Theme, Renderer>( placeholder: &str, value: &str, -) -> TextInput<'a, Message, Renderer> +) -> TextInput<'a, Message, Theme, Renderer> where Message: Clone, + Theme: text_input::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: text_input::StyleSheet, { TextInput::new(placeholder, value) } @@ -217,13 +218,13 @@ where /// Creates a new [`TextEditor`]. /// /// [`TextEditor`]: crate::TextEditor -pub fn text_editor( +pub fn text_editor( content: &text_editor::Content, -) -> TextEditor<'_, core::text::highlighter::PlainText, Message, Renderer> +) -> TextEditor<'_, core::text::highlighter::PlainText, Message, Theme, Renderer> where Message: Clone, + Theme: text_editor::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: text_editor::StyleSheet, { TextEditor::new(content) } @@ -231,16 +232,15 @@ where /// Creates a new [`Slider`]. /// /// [`Slider`]: crate::Slider -pub fn slider<'a, T, Message, Renderer>( +pub fn slider<'a, T, Message, Theme>( range: std::ops::RangeInclusive, value: T, on_change: impl Fn(T) -> Message + 'a, -) -> Slider<'a, T, Message, Renderer> +) -> Slider<'a, T, Message, Theme> where T: Copy + From + std::cmp::PartialOrd, Message: Clone, - Renderer: core::Renderer, - Renderer::Theme: slider::StyleSheet, + Theme: slider::StyleSheet, { Slider::new(range, value, on_change) } @@ -248,16 +248,15 @@ where /// Creates a new [`VerticalSlider`]. /// /// [`VerticalSlider`]: crate::VerticalSlider -pub fn vertical_slider<'a, T, Message, Renderer>( +pub fn vertical_slider<'a, T, Message, Theme>( range: std::ops::RangeInclusive, value: T, on_change: impl Fn(T) -> Message + 'a, -) -> VerticalSlider<'a, T, Message, Renderer> +) -> VerticalSlider<'a, T, Message, Theme> where T: Copy + From + std::cmp::PartialOrd, Message: Clone, - Renderer: core::Renderer, - Renderer::Theme: slider::StyleSheet, + Theme: slider::StyleSheet, { VerticalSlider::new(range, value, on_change) } @@ -265,21 +264,21 @@ where /// Creates a new [`PickList`]. /// /// [`PickList`]: crate::PickList -pub fn pick_list<'a, Message, Renderer, T>( +pub fn pick_list<'a, Message, Theme, Renderer, T>( options: impl Into>, selected: Option, on_selected: impl Fn(T) -> Message + 'a, -) -> PickList<'a, T, Message, Renderer> +) -> PickList<'a, T, Message, Theme, Renderer> where T: ToString + PartialEq + 'static, [T]: ToOwned>, Renderer: core::text::Renderer, - Renderer::Theme: pick_list::StyleSheet + Theme: pick_list::StyleSheet + scrollable::StyleSheet + overlay::menu::StyleSheet + container::StyleSheet, - ::Style: - From<::Style>, + ::Style: + From<::Style>, { PickList::new(options, selected, on_selected) } @@ -287,16 +286,16 @@ where /// Creates a new [`ComboBox`]. /// /// [`ComboBox`]: crate::ComboBox -pub fn combo_box<'a, T, Message, Renderer>( +pub fn combo_box<'a, T, Message, Theme, Renderer>( state: &'a combo_box::State, placeholder: &str, selection: Option<&T>, on_selected: impl Fn(T) -> Message + 'static, -) -> ComboBox<'a, T, Message, Renderer> +) -> ComboBox<'a, T, Message, Theme, Renderer> where T: std::fmt::Display + Clone, + Theme: text_input::StyleSheet + overlay::menu::StyleSheet, Renderer: core::text::Renderer, - Renderer::Theme: text_input::StyleSheet + overlay::menu::StyleSheet, { ComboBox::new(state, placeholder, selection, on_selected) } @@ -318,10 +317,9 @@ pub fn vertical_space(height: impl Into) -> Space { /// Creates a horizontal [`Rule`] with the given height. /// /// [`Rule`]: crate::Rule -pub fn horizontal_rule(height: impl Into) -> Rule +pub fn horizontal_rule(height: impl Into) -> Rule where - Renderer: core::Renderer, - Renderer::Theme: rule::StyleSheet, + Theme: rule::StyleSheet, { Rule::horizontal(height) } @@ -329,10 +327,9 @@ where /// Creates a vertical [`Rule`] with the given width. /// /// [`Rule`]: crate::Rule -pub fn vertical_rule(width: impl Into) -> Rule +pub fn vertical_rule(width: impl Into) -> Rule where - Renderer: core::Renderer, - Renderer::Theme: rule::StyleSheet, + Theme: rule::StyleSheet, { Rule::vertical(width) } @@ -344,13 +341,12 @@ where /// * the current value of the [`ProgressBar`]. /// /// [`ProgressBar`]: crate::ProgressBar -pub fn progress_bar( +pub fn progress_bar( range: RangeInclusive, value: f32, -) -> ProgressBar +) -> ProgressBar where - Renderer: core::Renderer, - Renderer::Theme: progress_bar::StyleSheet, + Theme: progress_bar::StyleSheet, { ProgressBar::new(range, value) } @@ -368,12 +364,9 @@ pub fn image(handle: impl Into) -> crate::Image { /// [`Svg`]: crate::Svg /// [`Handle`]: crate::svg::Handle #[cfg(feature = "svg")] -pub fn svg( - handle: impl Into, -) -> crate::Svg +pub fn svg(handle: impl Into) -> crate::Svg where - Renderer: core::svg::Renderer, - Renderer::Theme: crate::svg::StyleSheet, + Theme: crate::svg::StyleSheet, { crate::Svg::new(handle) } @@ -382,12 +375,12 @@ where /// /// [`Canvas`]: crate::Canvas #[cfg(feature = "canvas")] -pub fn canvas( +pub fn canvas( program: P, -) -> crate::Canvas +) -> crate::Canvas where Renderer: crate::graphics::geometry::Renderer, - P: crate::canvas::Program, + P: crate::canvas::Program, { crate::Canvas::new(program) } @@ -420,9 +413,9 @@ where } /// A container intercepting mouse events. -pub fn mouse_area<'a, Message, Renderer>( - widget: impl Into>, -) -> MouseArea<'a, Message, Renderer> +pub fn mouse_area<'a, Message, Theme, Renderer>( + widget: impl Into>, +) -> MouseArea<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { diff --git a/widget/src/image.rs b/widget/src/image.rs index e906ac13d5..ccf1f1754a 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -159,7 +159,8 @@ pub fn draw( } } -impl Widget for Image +impl Widget + for Image where Renderer: image::Renderer, Handle: Clone + Hash, @@ -191,7 +192,7 @@ where &self, _state: &Tree, renderer: &mut Renderer, - _theme: &Renderer::Theme, + _theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -207,13 +208,13 @@ where } } -impl<'a, Message, Renderer, Handle> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer, Handle> From> + for Element<'a, Message, Theme, Renderer> where Renderer: image::Renderer, Handle: Clone + Hash + 'a, { - fn from(image: Image) -> Element<'a, Message, Renderer> { + fn from(image: Image) -> Element<'a, Message, Theme, Renderer> { Element::new(image) } } diff --git a/widget/src/image/viewer.rs b/widget/src/image/viewer.rs index 9808057713..9666ff9f0e 100644 --- a/widget/src/image/viewer.rs +++ b/widget/src/image/viewer.rs @@ -84,7 +84,8 @@ impl Viewer { } } -impl Widget for Viewer +impl Widget + for Viewer where Renderer: image::Renderer, Handle: Clone + Hash, @@ -305,7 +306,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - _theme: &Renderer::Theme, + _theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -390,14 +391,14 @@ impl State { } } -impl<'a, Message, Renderer, Handle> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer, Handle> From> + for Element<'a, Message, Theme, Renderer> where Renderer: 'a + image::Renderer, Message: 'a, Handle: Clone + Hash + 'a, { - fn from(viewer: Viewer) -> Element<'a, Message, Renderer> { + fn from(viewer: Viewer) -> Element<'a, Message, Theme, Renderer> { Element::new(viewer) } } diff --git a/widget/src/keyed/column.rs b/widget/src/keyed/column.rs index 7f05a81e59..6203d2c587 100644 --- a/widget/src/keyed/column.rs +++ b/widget/src/keyed/column.rs @@ -13,8 +13,13 @@ use crate::core::{ /// A container that distributes its contents vertically. #[allow(missing_debug_implementations)] -pub struct Column<'a, Key, Message, Renderer = crate::Renderer> -where +pub struct Column< + 'a, + Key, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where Key: Copy + PartialEq, { spacing: f32, @@ -24,10 +29,11 @@ where max_width: f32, align_items: Alignment, keys: Vec, - children: Vec>, + children: Vec>, } -impl<'a, Key, Message, Renderer> Column<'a, Key, Message, Renderer> +impl<'a, Key, Message, Theme, Renderer> + Column<'a, Key, Message, Theme, Renderer> where Key: Copy + PartialEq, Renderer: crate::core::Renderer, @@ -48,7 +54,9 @@ where /// Creates a [`Column`] with the given elements. pub fn with_children( - children: impl IntoIterator)>, + children: impl IntoIterator< + Item = (Key, Element<'a, Message, Theme, Renderer>), + >, ) -> Self { children .into_iter() @@ -99,7 +107,7 @@ where pub fn push( mut self, key: Key, - child: impl Into>, + child: impl Into>, ) -> Self { let child = child.into(); let size = child.as_widget().size_hint(); @@ -135,8 +143,8 @@ where keys: Vec, } -impl<'a, Key, Message, Renderer> Widget - for Column<'a, Key, Message, Renderer> +impl<'a, Key, Message, Theme, Renderer> Widget + for Column<'a, Key, Message, Theme, Renderer> where Renderer: crate::core::Renderer, Key: Copy + PartialEq + 'static, @@ -285,7 +293,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -308,19 +316,21 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { overlay::from_children(&mut self.children, tree, layout, renderer) } } -impl<'a, Key, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Key, Message, Theme, Renderer> + From> + for Element<'a, Message, Theme, Renderer> where Key: Copy + PartialEq + 'static, Message: 'a, + Theme: 'a, Renderer: crate::core::Renderer + 'a, { - fn from(column: Column<'a, Key, Message, Renderer>) -> Self { + fn from(column: Column<'a, Key, Message, Theme, Renderer>) -> Self { Self::new(column) } } diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs index e9edbb4c77..dda6162b27 100644 --- a/widget/src/lazy.rs +++ b/widget/src/lazy.rs @@ -29,19 +29,19 @@ use std::rc::Rc; /// A widget that only rebuilds its contents when necessary. #[allow(missing_debug_implementations)] -pub struct Lazy<'a, Message, Renderer, Dependency, View> { +pub struct Lazy<'a, Message, Theme, Renderer, Dependency, View> { dependency: Dependency, view: Box View + 'a>, element: RefCell< - Option>>>>, + Option>>>>, >, } -impl<'a, Message, Renderer, Dependency, View> - Lazy<'a, Message, Renderer, Dependency, View> +impl<'a, Message, Theme, Renderer, Dependency, View> + Lazy<'a, Message, Theme, Renderer, Dependency, View> where Dependency: Hash + 'a, - View: Into>, + View: Into>, { /// Creates a new [`Lazy`] widget with the given data `Dependency` and a /// closure that can turn this data into a widget tree. @@ -58,7 +58,7 @@ where fn with_element( &self, - f: impl FnOnce(&Element<'_, Message, Renderer>) -> T, + f: impl FnOnce(&Element<'_, Message, Theme, Renderer>) -> T, ) -> T { f(self .element @@ -72,7 +72,7 @@ where fn with_element_mut( &self, - f: impl FnOnce(&mut Element<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Element<'_, Message, Theme, Renderer>) -> T, ) -> T { f(self .element @@ -85,17 +85,19 @@ where } } -struct Internal { - element: Rc>>>, +struct Internal { + element: Rc>>>, hash: u64, } -impl<'a, Message, Renderer, Dependency, View> Widget - for Lazy<'a, Message, Renderer, Dependency, View> +impl<'a, Message, Theme, Renderer, Dependency, View> + Widget + for Lazy<'a, Message, Theme, Renderer, Dependency, View> where - View: Into> + 'static, + View: Into> + 'static, Dependency: Hash + 'a, Message: 'static, + Theme: 'static, Renderer: core::Renderer + 'static, { fn tag(&self) -> tree::Tag { @@ -121,7 +123,9 @@ where } fn diff(&self, tree: &mut Tree) { - let current = tree.state.downcast_mut::>(); + let current = tree + .state + .downcast_mut::>(); let mut hasher = Hasher::default(); self.dependency.hash(&mut hasher); @@ -231,7 +235,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -255,7 +259,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let overlay = Overlay(Some( InnerBuilder { cell: self.element.borrow().as_ref().unwrap().clone(), @@ -287,29 +291,33 @@ where } #[self_referencing] -struct Inner<'a, Message: 'a, Renderer: 'a> { - cell: Rc>>>, - element: Element<'static, Message, Renderer>, +struct Inner<'a, Message: 'a, Theme: 'a, Renderer: 'a> { + cell: Rc>>>, + element: Element<'static, Message, Theme, Renderer>, tree: &'a mut Tree, #[borrows(mut element, mut tree)] #[not_covariant] - overlay: Option>>, + overlay: Option>>, } -struct Overlay<'a, Message, Renderer>(Option>); +struct Overlay<'a, Message, Theme, Renderer>( + Option>, +); -impl<'a, Message, Renderer> Drop for Overlay<'a, Message, Renderer> { +impl<'a, Message, Theme, Renderer> Drop + for Overlay<'a, Message, Theme, Renderer> +{ fn drop(&mut self) { let heads = self.0.take().unwrap().into_heads(); (*heads.cell.borrow_mut()) = Some(heads.element); } } -impl<'a, Message, Renderer> Overlay<'a, Message, Renderer> { +impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> { fn with_overlay_maybe( &self, - f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, ) -> Option { self.0.as_ref().unwrap().with_overlay(|overlay| { overlay.as_ref().map(|nested| (f)(&mut nested.borrow_mut())) @@ -318,7 +326,7 @@ impl<'a, Message, Renderer> Overlay<'a, Message, Renderer> { fn with_overlay_mut_maybe( &mut self, - f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, ) -> Option { self.0.as_mut().unwrap().with_overlay_mut(|overlay| { overlay.as_mut().map(|nested| (f)(nested.get_mut())) @@ -326,8 +334,8 @@ impl<'a, Message, Renderer> Overlay<'a, Message, Renderer> { } } -impl<'a, Message, Renderer> overlay::Overlay - for Overlay<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> overlay::Overlay + for Overlay<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -347,7 +355,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -398,16 +406,19 @@ where } } -impl<'a, Message, Renderer, Dependency, View> - From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer, Dependency, View> + From> + for Element<'a, Message, Theme, Renderer> where - View: Into> + 'static, + View: Into> + 'static, Renderer: core::Renderer + 'static, Message: 'static, + Theme: 'static, Dependency: Hash + 'a, { - fn from(lazy: Lazy<'a, Message, Renderer, Dependency, View>) -> Self { + fn from( + lazy: Lazy<'a, Message, Theme, Renderer, Dependency, View>, + ) -> Self { Self::new(lazy) } } diff --git a/widget/src/lazy/cache.rs b/widget/src/lazy/cache.rs index e7b876142d..f922fd1991 100644 --- a/widget/src/lazy/cache.rs +++ b/widget/src/lazy/cache.rs @@ -4,10 +4,10 @@ use crate::core::Element; use ouroboros::self_referencing; #[self_referencing(pub_extras)] -pub struct Cache<'a, Message: 'a, Renderer: 'a> { - pub element: Element<'a, Message, Renderer>, +pub struct Cache<'a, Message: 'a, Theme: 'a, Renderer: 'a> { + pub element: Element<'a, Message, Theme, Renderer>, #[borrows(mut element)] #[covariant] - overlay: Option>, + overlay: Option>, } diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs index 3684e0c93e..30b1efedd3 100644 --- a/widget/src/lazy/component.rs +++ b/widget/src/lazy/component.rs @@ -30,7 +30,7 @@ use std::rc::Rc; /// /// Additionally, a [`Component`] is capable of producing a `Message` to notify /// the parent application of any relevant interactions. -pub trait Component { +pub trait Component { /// The internal state of this [`Component`]. type State: Default; @@ -48,7 +48,10 @@ pub trait Component { /// Produces the widgets of the [`Component`], which may trigger an [`Event`](Component::Event) /// on user interaction. - fn view(&self, state: &Self::State) -> Element<'_, Self::Event, Renderer>; + fn view( + &self, + state: &Self::State, + ) -> Element<'_, Self::Event, Theme, Renderer>; /// Update the [`Component`] state based on the provided [`Operation`](widget::Operation) /// @@ -65,13 +68,14 @@ struct Tag(T); /// Turns an implementor of [`Component`] into an [`Element`] that can be /// embedded in any application. -pub fn view<'a, C, Message, Renderer>( +pub fn view<'a, C, Message, Theme, Renderer>( component: C, -) -> Element<'a, Message, Renderer> +) -> Element<'a, Message, Theme, Renderer> where - C: Component + 'a, + C: Component + 'a, C::State: 'static, Message: 'a, + Theme: 'a, Renderer: core::Renderer + 'a, { Element::new(Instance { @@ -88,24 +92,26 @@ where }) } -struct Instance<'a, Message, Renderer, Event, S> { - state: RefCell>>, +struct Instance<'a, Message, Theme, Renderer, Event, S> { + state: RefCell>>, tree: RefCell>>>, } #[self_referencing] -struct State<'a, Message: 'a, Renderer: 'a, Event: 'a, S: 'a> { - component: - Box + 'a>, +struct State<'a, Message: 'a, Theme: 'a, Renderer: 'a, Event: 'a, S: 'a> { + component: Box< + dyn Component + 'a, + >, message: PhantomData, state: PhantomData, #[borrows(component)] #[covariant] - element: Option>, + element: Option>, } -impl<'a, Message, Renderer, Event, S> Instance<'a, Message, Renderer, Event, S> +impl<'a, Message, Theme, Renderer, Event, S> + Instance<'a, Message, Theme, Renderer, Event, S> where S: Default + 'static, Renderer: renderer::Renderer, @@ -196,14 +202,14 @@ where fn with_element( &self, - f: impl FnOnce(&Element<'_, Event, Renderer>) -> T, + f: impl FnOnce(&Element<'_, Event, Theme, Renderer>) -> T, ) -> T { self.with_element_mut(|element| f(element)) } fn with_element_mut( &self, - f: impl FnOnce(&mut Element<'_, Event, Renderer>) -> T, + f: impl FnOnce(&mut Element<'_, Event, Theme, Renderer>) -> T, ) -> T { self.rebuild_element_if_necessary(); self.state @@ -214,8 +220,8 @@ where } } -impl<'a, Message, Renderer, Event, S> Widget - for Instance<'a, Message, Renderer, Event, S> +impl<'a, Message, Theme, Renderer, Event, S> Widget + for Instance<'a, Message, Theme, Renderer, Event, S> where S: 'static + Default, Renderer: core::Renderer, @@ -411,7 +417,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -456,7 +462,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.rebuild_element_if_necessary(); let tree = tree .state @@ -506,12 +512,12 @@ where } } -struct Overlay<'a, 'b, Message, Renderer, Event, S>( - Option>, +struct Overlay<'a, 'b, Message, Theme, Renderer, Event, S>( + Option>, ); -impl<'a, 'b, Message, Renderer, Event, S> Drop - for Overlay<'a, 'b, Message, Renderer, Event, S> +impl<'a, 'b, Message, Theme, Renderer, Event, S> Drop + for Overlay<'a, 'b, Message, Theme, Renderer, Event, S> { fn drop(&mut self) { if let Some(heads) = self.0.take().map(Inner::into_heads) { @@ -521,26 +527,26 @@ impl<'a, 'b, Message, Renderer, Event, S> Drop } #[self_referencing] -struct Inner<'a, 'b, Message, Renderer, Event, S> { - instance: &'a mut Instance<'b, Message, Renderer, Event, S>, +struct Inner<'a, 'b, Message, Theme, Renderer, Event, S> { + instance: &'a mut Instance<'b, Message, Theme, Renderer, Event, S>, tree: Tree, types: PhantomData<(Message, Event, S)>, #[borrows(mut instance, mut tree)] #[not_covariant] - overlay: Option>>, + overlay: Option>>, } -struct OverlayInstance<'a, 'b, Message, Renderer, Event, S> { - overlay: Option>, +struct OverlayInstance<'a, 'b, Message, Theme, Renderer, Event, S> { + overlay: Option>, } -impl<'a, 'b, Message, Renderer, Event, S> - OverlayInstance<'a, 'b, Message, Renderer, Event, S> +impl<'a, 'b, Message, Theme, Renderer, Event, S> + OverlayInstance<'a, 'b, Message, Theme, Renderer, Event, S> { fn with_overlay_maybe( &self, - f: impl FnOnce(&mut Nested<'_, Event, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Event, Theme, Renderer>) -> T, ) -> Option { self.overlay .as_ref() @@ -555,7 +561,7 @@ impl<'a, 'b, Message, Renderer, Event, S> fn with_overlay_mut_maybe( &mut self, - f: impl FnOnce(&mut Nested<'_, Event, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Event, Theme, Renderer>) -> T, ) -> Option { self.overlay .as_mut() @@ -569,8 +575,9 @@ impl<'a, 'b, Message, Renderer, Event, S> } } -impl<'a, 'b, Message, Renderer, Event, S> overlay::Overlay - for OverlayInstance<'a, 'b, Message, Renderer, Event, S> +impl<'a, 'b, Message, Theme, Renderer, Event, S> + overlay::Overlay + for OverlayInstance<'a, 'b, Message, Theme, Renderer, Event, S> where Renderer: core::Renderer, S: 'static + Default, @@ -591,7 +598,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, diff --git a/widget/src/lazy/helpers.rs b/widget/src/lazy/helpers.rs index 5dc60d52a4..4d0776ca0d 100644 --- a/widget/src/lazy/helpers.rs +++ b/widget/src/lazy/helpers.rs @@ -7,13 +7,13 @@ use std::hash::Hash; /// Creates a new [`Lazy`] widget with the given data `Dependency` and a /// closure that can turn this data into a widget tree. #[cfg(feature = "lazy")] -pub fn lazy<'a, Message, Renderer, Dependency, View>( +pub fn lazy<'a, Message, Theme, Renderer, Dependency, View>( dependency: Dependency, view: impl Fn(&Dependency) -> View + 'a, -) -> Lazy<'a, Message, Renderer, Dependency, View> +) -> Lazy<'a, Message, Theme, Renderer, Dependency, View> where Dependency: Hash + 'a, - View: Into>, + View: Into>, { Lazy::new(dependency, view) } @@ -21,13 +21,14 @@ where /// Turns an implementor of [`Component`] into an [`Element`] that can be /// embedded in any application. #[cfg(feature = "lazy")] -pub fn component<'a, C, Message, Renderer>( +pub fn component<'a, C, Message, Theme, Renderer>( component: C, -) -> Element<'a, Message, Renderer> +) -> Element<'a, Message, Theme, Renderer> where - C: Component + 'a, + C: Component + 'a, C::State: 'static, Message: 'a, + Theme: 'a, Renderer: core::Renderer + 'a, { component::view(component) @@ -40,9 +41,9 @@ where /// the [`Responsive`] widget and, therefore, can be used to build the /// contents of the widget in a responsive way. #[cfg(feature = "lazy")] -pub fn responsive<'a, Message, Renderer>( - f: impl Fn(Size) -> Element<'a, Message, Renderer> + 'a, -) -> Responsive<'a, Message, Renderer> +pub fn responsive<'a, Message, Theme, Renderer>( + f: impl Fn(Size) -> Element<'a, Message, Theme, Renderer> + 'a, +) -> Responsive<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs index 1df0866f38..9875b24ef0 100644 --- a/widget/src/lazy/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -22,12 +22,17 @@ use std::ops::Deref; /// A [`Responsive`] widget will always try to fill all the available space of /// its parent. #[allow(missing_debug_implementations)] -pub struct Responsive<'a, Message, Renderer = crate::Renderer> { - view: Box Element<'a, Message, Renderer> + 'a>, - content: RefCell>, +pub struct Responsive< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> { + view: Box Element<'a, Message, Theme, Renderer> + 'a>, + content: RefCell>, } -impl<'a, Message, Renderer> Responsive<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Responsive<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -38,7 +43,7 @@ where /// the [`Responsive`] widget and, therefore, can be used to build the /// contents of the widget in a responsive way. pub fn new( - view: impl Fn(Size) -> Element<'a, Message, Renderer> + 'a, + view: impl Fn(Size) -> Element<'a, Message, Theme, Renderer> + 'a, ) -> Self { Self { view: Box::new(view), @@ -51,13 +56,13 @@ where } } -struct Content<'a, Message, Renderer> { +struct Content<'a, Message, Theme, Renderer> { size: Size, layout: Option, - element: Element<'a, Message, Renderer>, + element: Element<'a, Message, Theme, Renderer>, } -impl<'a, Message, Renderer> Content<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Content<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -75,7 +80,7 @@ where &mut self, tree: &mut Tree, new_size: Size, - view: &dyn Fn(Size) -> Element<'a, Message, Renderer>, + view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>, ) { if self.size == new_size { return; @@ -93,12 +98,12 @@ where tree: &mut Tree, renderer: R, layout: Layout<'_>, - view: &dyn Fn(Size) -> Element<'a, Message, Renderer>, + view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>, f: impl FnOnce( &mut Tree, R, Layout<'_>, - &mut Element<'a, Message, Renderer>, + &mut Element<'a, Message, Theme, Renderer>, ) -> T, ) -> T where @@ -120,8 +125,8 @@ struct State { tree: RefCell, } -impl<'a, Message, Renderer> Widget - for Responsive<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Responsive<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -223,7 +228,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -274,7 +279,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { use std::ops::DerefMut; let state = tree.state.downcast_ref::(); @@ -283,7 +288,10 @@ where content: self.content.borrow_mut(), tree: state.tree.borrow_mut(), types: PhantomData, - overlay_builder: |content: &mut RefMut<'_, Content<'_, _, _>>, + overlay_builder: |content: &mut RefMut< + '_, + Content<'_, _, _, _>, + >, tree| { content.update(tree, layout.bounds().size(), &self.view); content.layout(tree, renderer); @@ -315,32 +323,36 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> + From> + for Element<'a, Message, Theme, Renderer> where - Renderer: core::Renderer + 'a, Message: 'a, + Theme: 'a, + Renderer: core::Renderer + 'a, { - fn from(responsive: Responsive<'a, Message, Renderer>) -> Self { + fn from(responsive: Responsive<'a, Message, Theme, Renderer>) -> Self { Self::new(responsive) } } #[self_referencing] -struct Overlay<'a, 'b, Message, Renderer> { - content: RefMut<'a, Content<'b, Message, Renderer>>, +struct Overlay<'a, 'b, Message, Theme, Renderer> { + content: RefMut<'a, Content<'b, Message, Theme, Renderer>>, tree: RefMut<'a, Tree>, types: PhantomData, #[borrows(mut content, mut tree)] #[not_covariant] - overlay: Option>>, + overlay: Option>>, } -impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> { +impl<'a, 'b, Message, Theme, Renderer> + Overlay<'a, 'b, Message, Theme, Renderer> +{ fn with_overlay_maybe( &self, - f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, ) -> Option { self.with_overlay(|overlay| { overlay.as_ref().map(|nested| (f)(&mut nested.borrow_mut())) @@ -349,7 +361,7 @@ impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> { fn with_overlay_mut_maybe( &mut self, - f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, ) -> Option { self.with_overlay_mut(|overlay| { overlay.as_mut().map(|nested| (f)(nested.get_mut())) @@ -357,8 +369,9 @@ impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> { } } -impl<'a, 'b, Message, Renderer> overlay::Overlay - for Overlay<'a, 'b, Message, Renderer> +impl<'a, 'b, Message, Theme, Renderer> + overlay::Overlay + for Overlay<'a, 'b, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -378,7 +391,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, diff --git a/widget/src/lib.rs b/widget/src/lib.rs index 07378d8349..def1bde3f8 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -132,4 +132,5 @@ pub mod qr_code; #[doc(no_inline)] pub use qr_code::QRCode; -type Renderer = renderer::Renderer; +pub use crate::style::theme::{self, Theme}; +pub use renderer::Renderer; diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 87cac3a748..62bb45d827 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -13,8 +13,13 @@ use crate::core::{ /// Emit messages on mouse events. #[allow(missing_debug_implementations)] -pub struct MouseArea<'a, Message, Renderer> { - content: Element<'a, Message, Renderer>, +pub struct MouseArea< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> { + content: Element<'a, Message, Theme, Renderer>, on_press: Option, on_release: Option, on_right_press: Option, @@ -23,7 +28,7 @@ pub struct MouseArea<'a, Message, Renderer> { on_middle_release: Option, } -impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { +impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { /// The message to emit on a left button press. #[must_use] pub fn on_press(mut self, message: Message) -> Self { @@ -73,9 +78,11 @@ struct State { // TODO: Support on_mouse_enter and on_mouse_exit } -impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { +impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { /// Creates a [`MouseArea`] with the given content. - pub fn new(content: impl Into>) -> Self { + pub fn new( + content: impl Into>, + ) -> Self { MouseArea { content: content.into(), on_press: None, @@ -88,8 +95,8 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { } } -impl<'a, Message, Renderer> Widget - for MouseArea<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for MouseArea<'a, Message, Theme, Renderer> where Renderer: renderer::Renderer, Message: Clone, @@ -188,7 +195,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, renderer_style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -210,7 +217,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.content.as_widget_mut().overlay( &mut tree.children[0], layout, @@ -219,23 +226,24 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a + Clone, + Theme: 'a, Renderer: 'a + renderer::Renderer, { fn from( - area: MouseArea<'a, Message, Renderer>, - ) -> Element<'a, Message, Renderer> { + area: MouseArea<'a, Message, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(area) } } /// Processes the given [`Event`] and updates the [`State`] of an [`MouseArea`] /// accordingly. -fn update( - widget: &mut MouseArea<'_, Message, Renderer>, +fn update( + widget: &mut MouseArea<'_, Message, Theme, Renderer>, event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 678bb7b52d..a7b7ec9406 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -19,10 +19,15 @@ pub use iced_style::menu::{Appearance, StyleSheet}; /// A list of selectable options. #[allow(missing_debug_implementations)] -pub struct Menu<'a, T, Message, Renderer = crate::Renderer> -where +pub struct Menu< + 'a, + T, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { state: &'a mut State, options: &'a [T], @@ -35,16 +40,15 @@ where text_line_height: text::LineHeight, text_shaping: text::Shaping, font: Option, - style: ::Style, + style: Theme::Style, } -impl<'a, T, Message, Renderer> Menu<'a, T, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> Menu<'a, T, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, + Theme: StyleSheet + container::StyleSheet + scrollable::StyleSheet + 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: - StyleSheet + container::StyleSheet + scrollable::StyleSheet, { /// Creates a new [`Menu`] with the given [`State`], a list of options, and /// the message to produced when an option is selected. @@ -113,7 +117,7 @@ where /// Sets the style of the [`Menu`]. pub fn style( mut self, - style: impl Into<::Style>, + style: impl Into<::Style>, ) -> Self { self.style = style.into(); self @@ -129,7 +133,7 @@ where self, position: Point, target_height: f32, - ) -> overlay::Element<'a, Message, Renderer> { + ) -> overlay::Element<'a, Message, Theme, Renderer> { overlay::Element::new( position, Box::new(Overlay::new(self, target_height)), @@ -158,28 +162,26 @@ impl Default for State { } } -struct Overlay<'a, Message, Renderer> +struct Overlay<'a, Message, Theme, Renderer> where + Theme: StyleSheet + container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet + container::StyleSheet, { state: &'a mut Tree, - container: Container<'a, Message, Renderer>, + container: Container<'a, Message, Theme, Renderer>, width: f32, target_height: f32, - style: ::Style, + style: ::Style, } -impl<'a, Message, Renderer> Overlay<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Overlay<'a, Message, Theme, Renderer> where Message: 'a, - Renderer: 'a, - Renderer: text::Renderer, - Renderer::Theme: - StyleSheet + container::StyleSheet + scrollable::StyleSheet, + Theme: StyleSheet + container::StyleSheet + scrollable::StyleSheet + 'a, + Renderer: text::Renderer + 'a, { pub fn new( - menu: Menu<'a, T, Message, Renderer>, + menu: Menu<'a, T, Message, Theme, Renderer>, target_height: f32, ) -> Self where @@ -213,7 +215,7 @@ where style: style.clone(), })); - state.tree.diff(&container as &dyn Widget<_, _>); + state.tree.diff(&container as &dyn Widget<_, _, _>); Self { state: &mut state.tree, @@ -225,11 +227,12 @@ where } } -impl<'a, Message, Renderer> crate::core::Overlay - for Overlay<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> + crate::core::Overlay + for Overlay<'a, Message, Theme, Renderer> where + Theme: StyleSheet + container::StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet + container::StyleSheet, { fn layout( &mut self, @@ -295,12 +298,12 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, ) { - let appearance = theme.appearance(&self.style); + let appearance = StyleSheet::appearance(theme, &self.style); let bounds = layout.bounds(); renderer.fill_quad( @@ -317,10 +320,10 @@ where } } -struct List<'a, T, Message, Renderer> +struct List<'a, T, Message, Theme, Renderer> where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { options: &'a [T], hovered_option: &'a mut Option, @@ -331,15 +334,15 @@ where text_line_height: text::LineHeight, text_shaping: text::Shaping, font: Option, - style: ::Style, + style: Theme::Style, } -impl<'a, T, Message, Renderer> Widget - for List<'a, T, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> Widget + for List<'a, T, Message, Theme, Renderer> where T: Clone + ToString, + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { fn size(&self) -> Size { Size { @@ -475,7 +478,7 @@ where &self, _state: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -545,15 +548,16 @@ where } } -impl<'a, T, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> + From> + for Element<'a, Message, Theme, Renderer> where T: ToString + Clone, Message: 'a, + Theme: StyleSheet + 'a, Renderer: 'a + text::Renderer, - Renderer::Theme: StyleSheet, { - fn from(list: List<'a, T, Message, Renderer>) -> Self { + fn from(list: List<'a, T, Message, Theme, Renderer>) -> Self { Element::new(list) } } diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs index 3fda0e32f7..c20d959a98 100644 --- a/widget/src/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -71,7 +71,7 @@ use crate::core::{ /// # use iced_widget::{pane_grid, text}; /// # /// # type PaneGrid<'a, Message> = -/// # iced_widget::PaneGrid<'a, Message, iced_widget::renderer::Renderer>; +/// # iced_widget::PaneGrid<'a, Message, iced_widget::style::Theme, iced_widget::renderer::Renderer>; /// # /// enum PaneState { /// SomePane, @@ -96,25 +96,29 @@ use crate::core::{ /// .on_resize(10, Message::PaneResized); /// ``` #[allow(missing_debug_implementations)] -pub struct PaneGrid<'a, Message, Renderer = crate::Renderer> -where +pub struct PaneGrid< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: StyleSheet + container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet + container::StyleSheet, { - contents: Contents<'a, Content<'a, Message, Renderer>>, + contents: Contents<'a, Content<'a, Message, Theme, Renderer>>, width: Length, height: Length, spacing: f32, on_click: Option Message + 'a>>, on_drag: Option Message + 'a>>, on_resize: Option<(f32, Box Message + 'a>)>, - style: ::Style, + style: ::Style, } -impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> PaneGrid<'a, Message, Theme, Renderer> where + Theme: StyleSheet + container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet + container::StyleSheet, { /// Creates a [`PaneGrid`] with the given [`State`] and view function. /// @@ -122,7 +126,7 @@ where /// [`State`]. [`bool`] is set if the pane is maximized. pub fn new( state: &'a State, - view: impl Fn(Pane, &'a T, bool) -> Content<'a, Message, Renderer>, + view: impl Fn(Pane, &'a T, bool) -> Content<'a, Message, Theme, Renderer>, ) -> Self { let contents = if let Some((pane, pane_state)) = state.maximized.and_then(|pane| { @@ -216,7 +220,7 @@ where /// Sets the style of the [`PaneGrid`]. pub fn style( mut self, - style: impl Into<::Style>, + style: impl Into<::Style>, ) -> Self { self.style = style.into(); self @@ -229,11 +233,11 @@ where } } -impl<'a, Message, Renderer> Widget - for PaneGrid<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for PaneGrid<'a, Message, Theme, Renderer> where Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet + container::StyleSheet, + Theme: StyleSheet + container::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -408,7 +412,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -443,7 +447,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let children = self .contents .iter_mut() @@ -458,16 +462,16 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, - Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet + container::StyleSheet, + Theme: StyleSheet + container::StyleSheet + 'a, + Renderer: crate::core::Renderer + 'a, { fn from( - pane_grid: PaneGrid<'a, Message, Renderer>, - ) -> Element<'a, Message, Renderer> { + pane_grid: PaneGrid<'a, Message, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(pane_grid) } } @@ -811,18 +815,18 @@ pub fn mouse_interaction( } /// Draws a [`PaneGrid`]. -pub fn draw( +pub fn draw( action: &state::Action, node: &Node, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, default_style: &renderer::Style, viewport: &Rectangle, spacing: f32, resize_leeway: Option, - style: &::Style, + style: &Theme::Style, contents: impl Iterator, draw_pane: impl Fn( T, @@ -833,8 +837,8 @@ pub fn draw( &Rectangle, ), ) where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { let picked_pane = action.picked_pane(); diff --git a/widget/src/pane_grid/content.rs b/widget/src/pane_grid/content.rs index ee00f186e7..415dcc3ef0 100644 --- a/widget/src/pane_grid/content.rs +++ b/widget/src/pane_grid/content.rs @@ -12,23 +12,27 @@ use crate::pane_grid::{Draggable, TitleBar}; /// /// [`Pane`]: super::Pane #[allow(missing_debug_implementations)] -pub struct Content<'a, Message, Renderer = crate::Renderer> -where +pub struct Content< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { - title_bar: Option>, - body: Element<'a, Message, Renderer>, - style: ::Style, + title_bar: Option>, + body: Element<'a, Message, Theme, Renderer>, + style: Theme::Style, } -impl<'a, Message, Renderer> Content<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Content<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { /// Creates a new [`Content`] with the provided body. - pub fn new(body: impl Into>) -> Self { + pub fn new(body: impl Into>) -> Self { Self { title_bar: None, body: body.into(), @@ -39,26 +43,23 @@ where /// Sets the [`TitleBar`] of this [`Content`]. pub fn title_bar( mut self, - title_bar: TitleBar<'a, Message, Renderer>, + title_bar: TitleBar<'a, Message, Theme, Renderer>, ) -> Self { self.title_bar = Some(title_bar); self } /// Sets the style of the [`Content`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } } -impl<'a, Message, Renderer> Content<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Content<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { pub(super) fn state(&self) -> Tree { let children = if let Some(title_bar) = self.title_bar.as_ref() { @@ -92,14 +93,12 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, viewport: &Rectangle, ) { - use container::StyleSheet; - let bounds = layout.bounds(); { @@ -331,7 +330,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { if let Some(title_bar) = self.title_bar.as_mut() { let mut children = layout.children(); let title_bar_layout = children.next()?; @@ -359,10 +358,11 @@ where } } -impl<'a, Message, Renderer> Draggable for &Content<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Draggable + for &Content<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { fn can_be_dragged_at( &self, @@ -380,11 +380,12 @@ where } } -impl<'a, T, Message, Renderer> From for Content<'a, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> From + for Content<'a, Message, Theme, Renderer> where - T: Into>, + T: Into>, + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { fn from(element: T) -> Self { Self::new(element) diff --git a/widget/src/pane_grid/title_bar.rs b/widget/src/pane_grid/title_bar.rs index eb21b743d6..3cca6b33da 100644 --- a/widget/src/pane_grid/title_bar.rs +++ b/widget/src/pane_grid/title_bar.rs @@ -13,27 +13,31 @@ use crate::core::{ /// /// [`Pane`]: super::Pane #[allow(missing_debug_implementations)] -pub struct TitleBar<'a, Message, Renderer = crate::Renderer> -where +pub struct TitleBar< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { - content: Element<'a, Message, Renderer>, - controls: Option>, + content: Element<'a, Message, Theme, Renderer>, + controls: Option>, padding: Padding, always_show_controls: bool, - style: ::Style, + style: Theme::Style, } -impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> TitleBar<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { /// Creates a new [`TitleBar`] with the given content. pub fn new(content: E) -> Self where - E: Into>, + E: Into>, { Self { content: content.into(), @@ -47,7 +51,7 @@ where /// Sets the controls of the [`TitleBar`]. pub fn controls( mut self, - controls: impl Into>, + controls: impl Into>, ) -> Self { self.controls = Some(controls.into()); self @@ -60,10 +64,7 @@ where } /// Sets the style of the [`TitleBar`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } @@ -82,10 +83,10 @@ where } } -impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> TitleBar<'a, Message, Theme, Renderer> where + Theme: container::StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: container::StyleSheet, { pub(super) fn state(&self) -> Tree { let children = if let Some(controls) = self.controls.as_ref() { @@ -119,15 +120,13 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, inherited_style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, viewport: &Rectangle, show_controls: bool, ) { - use container::StyleSheet; - let bounds = layout.bounds(); let style = theme.appearance(&self.style); let inherited_style = renderer::Style { @@ -406,7 +405,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let mut children = layout.children(); let padded = children.next()?; diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 4d4e14d355..70b1d4c07a 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -23,11 +23,16 @@ pub use crate::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 = crate::Renderer> -where +pub struct PickList< + 'a, + T, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where [T]: ToOwned>, + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { on_selected: Box Message + 'a>, options: Cow<'a, [T]>, @@ -40,20 +45,20 @@ where text_shaping: text::Shaping, font: Option, handle: Handle, - style: ::Style, + style: Theme::Style, } -impl<'a, T: 'a, Message, Renderer> PickList<'a, T, Message, Renderer> +impl<'a, T: 'a, Message, Theme, Renderer> + PickList<'a, T, Message, Theme, Renderer> where T: ToString + PartialEq, [T]: ToOwned>, - Renderer: text::Renderer, - Renderer::Theme: StyleSheet + Theme: StyleSheet + scrollable::StyleSheet + menu::StyleSheet + container::StyleSheet, - ::Style: - From<::Style>, + ::Style: From<::Style>, + Renderer: text::Renderer, { /// The default padding of a [`PickList`]. pub const DEFAULT_PADDING: Padding = Padding::new(5.0); @@ -135,26 +140,25 @@ where /// Sets the style of the [`PickList`]. pub fn style( mut self, - style: impl Into<::Style>, + style: impl Into<::Style>, ) -> Self { self.style = style.into(); self } } -impl<'a, T: 'a, Message, Renderer> Widget - for PickList<'a, T, Message, Renderer> +impl<'a, T: 'a, Message, Theme, Renderer> Widget + for PickList<'a, T, Message, Theme, Renderer> where T: Clone + ToString + PartialEq + 'static, [T]: ToOwned>, Message: 'a, - Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet + Theme: StyleSheet + scrollable::StyleSheet + menu::StyleSheet + container::StyleSheet, - ::Style: - From<::Style>, + ::Style: From<::Style>, + Renderer: text::Renderer + 'a, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -230,7 +234,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -261,7 +265,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { let state = tree.state.downcast_mut::>(); overlay( @@ -278,21 +282,22 @@ where } } -impl<'a, T: 'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, T: 'a, Message, Theme, Renderer> + From> + for Element<'a, Message, Theme, Renderer> where T: Clone + ToString + PartialEq + 'static, [T]: ToOwned>, Message: 'a, - Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet + Theme: StyleSheet + scrollable::StyleSheet + menu::StyleSheet - + container::StyleSheet, - ::Style: - From<::Style>, + + container::StyleSheet + + 'a, + ::Style: From<::Style>, + Renderer: text::Renderer + 'a, { - fn from(pick_list: PickList<'a, T, Message, Renderer>) -> Self { + fn from(pick_list: PickList<'a, T, Message, Theme, Renderer>) -> Self { Self::new(pick_list) } } @@ -566,7 +571,7 @@ pub fn mouse_interaction( } /// Returns the current overlay of a [`PickList`]. -pub fn overlay<'a, T, Message, Renderer>( +pub fn overlay<'a, T, Message, Theme, Renderer>( layout: Layout<'_>, state: &'a mut State, padding: Padding, @@ -575,18 +580,18 @@ pub fn overlay<'a, T, Message, Renderer>( font: Renderer::Font, options: &'a [T], on_selected: &'a dyn Fn(T) -> Message, - style: ::Style, -) -> Option> + style: ::Style, +) -> Option> where T: Clone + ToString, Message: 'a, - Renderer: text::Renderer + 'a, - Renderer::Theme: StyleSheet + Theme: StyleSheet + scrollable::StyleSheet + menu::StyleSheet - + container::StyleSheet, - ::Style: - From<::Style>, + + container::StyleSheet + + 'a, + ::Style: From<::Style>, + Renderer: text::Renderer + 'a, { if state.is_open { let bounds = layout.bounds(); @@ -619,9 +624,9 @@ where } /// Draws a [`PickList`]. -pub fn draw<'a, T, Renderer>( +pub fn draw<'a, T, Theme, Renderer>( renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, layout: Layout<'_>, cursor: mouse::Cursor, padding: Padding, @@ -632,12 +637,12 @@ pub fn draw<'a, T, Renderer>( placeholder: Option<&str>, selected: Option<&T>, handle: &Handle, - style: &::Style, + style: &Theme::Style, state: impl FnOnce() -> &'a State, viewport: &Rectangle, ) where Renderer: text::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, T: ToString + 'a, { let bounds = layout.bounds(); diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index eb15644e6c..694fdd28ad 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -13,8 +13,7 @@ pub use iced_style::progress_bar::{Appearance, StyleSheet}; /// /// # Example /// ```no_run -/// # type ProgressBar = -/// # iced_widget::ProgressBar>; +/// # type ProgressBar = iced_widget::ProgressBar; /// # /// let value = 50.0; /// @@ -23,22 +22,20 @@ pub use iced_style::progress_bar::{Appearance, StyleSheet}; /// /// ![Progress bar drawn with `iced_wgpu`](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) #[allow(missing_debug_implementations)] -pub struct ProgressBar +pub struct ProgressBar where - Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { range: RangeInclusive, value: f32, width: Length, height: Option, - style: ::Style, + style: Theme::Style, } -impl ProgressBar +impl ProgressBar where - Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { /// The default height of a [`ProgressBar`]. pub const DEFAULT_HEIGHT: f32 = 30.0; @@ -71,19 +68,17 @@ where } /// Sets the style of the [`ProgressBar`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } } -impl Widget for ProgressBar +impl Widget + for ProgressBar where Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { fn size(&self) -> Size { Size { @@ -109,7 +104,7 @@ where &self, _state: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -152,16 +147,16 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: StyleSheet + 'a, Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn from( - progress_bar: ProgressBar, - ) -> Element<'a, Message, Renderer> { + progress_bar: ProgressBar, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(progress_bar) } } diff --git a/widget/src/qr_code.rs b/widget/src/qr_code.rs index a229eb5943..91c0a97bc8 100644 --- a/widget/src/qr_code.rs +++ b/widget/src/qr_code.rs @@ -49,7 +49,7 @@ impl<'a> QRCode<'a> { } } -impl<'a, Message, Theme> Widget> for QRCode<'a> { +impl<'a, Message, Theme> Widget for QRCode<'a> { fn size(&self) -> Size { Size { width: Length::Shrink, @@ -60,7 +60,7 @@ impl<'a, Message, Theme> Widget> for QRCode<'a> { fn layout( &self, _tree: &mut Tree, - _renderer: &Renderer, + _renderer: &Renderer, _limits: &layout::Limits, ) -> layout::Node { let side_length = (self.state.width + 2 * QUIET_ZONE) as f32 @@ -72,7 +72,7 @@ impl<'a, Message, Theme> Widget> for QRCode<'a> { fn draw( &self, _state: &Tree, - renderer: &mut Renderer, + renderer: &mut Renderer, _theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, @@ -128,7 +128,7 @@ impl<'a, Message, Theme> Widget> for QRCode<'a> { } impl<'a, Message, Theme> From> - for Element<'a, Message, Renderer> + for Element<'a, Message, Theme, Renderer> { fn from(qr_code: QRCode<'a>) -> Self { Self::new(qr_code) diff --git a/widget/src/radio.rs b/widget/src/radio.rs index ceb51eadff..68e9bc7eff 100644 --- a/widget/src/radio.rs +++ b/widget/src/radio.rs @@ -20,7 +20,7 @@ pub use iced_style::radio::{Appearance, StyleSheet}; /// # Example /// ```no_run /// # type Radio = -/// # iced_widget::Radio>; +/// # iced_widget::Radio; /// # /// # use iced_widget::column; /// #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -69,10 +69,10 @@ pub use iced_style::radio::{Appearance, StyleSheet}; /// let content = column![a, b, c, all]; /// ``` #[allow(missing_debug_implementations)] -pub struct Radio +pub struct Radio where + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { is_selected: bool, on_click: Message, @@ -84,14 +84,14 @@ where text_line_height: text::LineHeight, text_shaping: text::Shaping, font: Option, - style: ::Style, + style: Theme::Style, } -impl Radio +impl Radio where Message: Clone, + Theme: StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet, { /// The default size of a [`Radio`] button. pub const DEFAULT_SIZE: f32 = 28.0; @@ -178,20 +178,18 @@ where } /// Sets the style of the [`Radio`] button. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } } -impl Widget for Radio +impl Widget + for Radio where Message: Clone, + Theme: StyleSheet + crate::text::StyleSheet, Renderer: text::Renderer, - Renderer::Theme: StyleSheet + crate::text::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -286,7 +284,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -356,14 +354,16 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a + Clone, + Theme: StyleSheet + crate::text::StyleSheet + 'a, Renderer: 'a + text::Renderer, - Renderer::Theme: StyleSheet + crate::text::StyleSheet, { - fn from(radio: Radio) -> Element<'a, Message, Renderer> { + fn from( + radio: Radio, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(radio) } } diff --git a/widget/src/row.rs b/widget/src/row.rs index 90fd2926e4..89f610c990 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -12,16 +12,16 @@ use crate::core::{ /// A container that distributes its contents horizontally. #[allow(missing_debug_implementations)] -pub struct Row<'a, Message, Renderer = crate::Renderer> { +pub struct Row<'a, Message, Theme = crate::Theme, Renderer = crate::Renderer> { spacing: f32, padding: Padding, width: Length, height: Length, align_items: Alignment, - children: Vec>, + children: Vec>, } -impl<'a, Message, Renderer> Row<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Row<'a, Message, Theme, Renderer> where Renderer: crate::core::Renderer, { @@ -39,7 +39,7 @@ where /// Creates a [`Row`] with the given elements. pub fn with_children( - children: impl IntoIterator>, + children: impl IntoIterator>, ) -> Self { children.into_iter().fold(Self::new(), Self::push) } @@ -81,7 +81,7 @@ where /// Adds an [`Element`] to the [`Row`]. pub fn push( mut self, - child: impl Into>, + child: impl Into>, ) -> Self { let child = child.into(); let size = child.as_widget().size_hint(); @@ -108,8 +108,8 @@ where } } -impl<'a, Message, Renderer> Widget - for Row<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Row<'a, Message, Theme, Renderer> where Renderer: crate::core::Renderer, { @@ -223,7 +223,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -248,18 +248,19 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { overlay::from_children(&mut self.children, tree, layout, renderer) } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: 'a, Renderer: crate::core::Renderer + 'a, { - fn from(row: Row<'a, Message, Renderer>) -> Self { + fn from(row: Row<'a, Message, Theme, Renderer>) -> Self { Self::new(row) } } diff --git a/widget/src/rule.rs b/widget/src/rule.rs index c958c44d96..bca345413c 100644 --- a/widget/src/rule.rs +++ b/widget/src/rule.rs @@ -11,21 +11,19 @@ pub use crate::style::rule::{Appearance, FillMode, StyleSheet}; /// Display a horizontal or vertical rule for dividing content. #[allow(missing_debug_implementations)] -pub struct Rule +pub struct Rule where - Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { width: Length, height: Length, is_horizontal: bool, - style: ::Style, + style: Theme::Style, } -impl Rule +impl Rule where - Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { /// Creates a horizontal [`Rule`] with the given height. pub fn horizontal(height: impl Into) -> Self { @@ -48,19 +46,16 @@ where } /// Sets the style of the [`Rule`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } } -impl Widget for Rule +impl Widget for Rule where Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { fn size(&self) -> Size { Size { @@ -82,7 +77,7 @@ where &self, _state: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, _cursor: mouse::Cursor, @@ -132,14 +127,14 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: StyleSheet + 'a, Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet, { - fn from(rule: Rule) -> Element<'a, Message, Renderer> { + fn from(rule: Rule) -> Element<'a, Message, Theme, Renderer> { Element::new(rule) } } diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs index b7b6c3d282..509a6b342e 100644 --- a/widget/src/scrollable.rs +++ b/widget/src/scrollable.rs @@ -21,27 +21,33 @@ pub use operation::scrollable::{AbsoluteOffset, RelativeOffset}; /// A widget that can vertically display an infinite amount of content with a /// scrollbar. #[allow(missing_debug_implementations)] -pub struct Scrollable<'a, Message, Renderer = crate::Renderer> -where +pub struct Scrollable< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { id: Option, width: Length, height: Length, direction: Direction, - content: Element<'a, Message, Renderer>, + content: Element<'a, Message, Theme, Renderer>, on_scroll: Option Message + 'a>>, - style: ::Style, + style: Theme::Style, } -impl<'a, Message, Renderer> Scrollable<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Scrollable<'a, Message, Theme, Renderer> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { /// Creates a new [`Scrollable`]. - pub fn new(content: impl Into>) -> Self { + pub fn new( + content: impl Into>, + ) -> Self { Scrollable { id: None, width: Length::Shrink, @@ -86,10 +92,7 @@ where } /// Sets the style of the [`Scrollable`] . - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } @@ -198,11 +201,11 @@ pub enum Alignment { End, } -impl<'a, Message, Renderer> Widget - for Scrollable<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for Scrollable<'a, Message, Theme, Renderer> where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -324,7 +327,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -382,7 +385,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.content .as_widget_mut() .overlay( @@ -404,16 +407,17 @@ where } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> + From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, + Theme: StyleSheet + 'a, Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn from( - text_input: Scrollable<'a, Message, Renderer>, - ) -> Element<'a, Message, Renderer> { + text_input: Scrollable<'a, Message, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(text_input) } } @@ -841,18 +845,18 @@ pub fn mouse_interaction( } /// Draws a [`Scrollable`]. -pub fn draw( +pub fn draw( state: &State, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, layout: Layout<'_>, cursor: mouse::Cursor, direction: Direction, - style: &::Style, + style: &Theme::Style, draw_content: impl FnOnce(&mut Renderer, Layout<'_>, mouse::Cursor, &Rectangle), ) where + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { let bounds = layout.bounds(); let content_layout = layout.children().next().unwrap(); diff --git a/widget/src/shader.rs b/widget/src/shader.rs index 16b68c55e3..68112f833b 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -56,7 +56,8 @@ impl> Shader { } } -impl Widget for Shader +impl Widget + for Shader where P: Program, Renderer: pipeline::Renderer, @@ -150,7 +151,7 @@ where &self, tree: &widget::Tree, renderer: &mut Renderer, - _theme: &Renderer::Theme, + _theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: mouse::Cursor, @@ -166,14 +167,16 @@ where } } -impl<'a, Message, Renderer, P> From> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer, P> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, Renderer: pipeline::Renderer, P: Program + 'a, { - fn from(custom: Shader) -> Element<'a, Message, Renderer> { + fn from( + custom: Shader, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(custom) } } diff --git a/widget/src/slider.rs b/widget/src/slider.rs index 79b0a7d866..5c3b63841e 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -29,7 +29,7 @@ pub use iced_style::slider::{ /// # Example /// ```no_run /// # type Slider<'a, T, Message> = -/// # iced_widget::Slider<'a, Message, T, iced_widget::renderer::Renderer>; +/// # iced_widget::Slider<'a, Message, T, iced_widget::style::Theme>; /// # /// #[derive(Clone)] /// pub enum Message { @@ -43,10 +43,9 @@ pub use iced_style::slider::{ /// /// ![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, Renderer = crate::Renderer> +pub struct Slider<'a, T, Message, Theme = crate::Theme> where - Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { range: RangeInclusive, step: T, @@ -55,15 +54,14 @@ where on_release: Option, width: Length, height: f32, - style: ::Style, + style: Theme::Style, } -impl<'a, T, Message, Renderer> Slider<'a, T, Message, Renderer> +impl<'a, T, Message, Theme> Slider<'a, T, Message, Theme> where T: Copy + From + std::cmp::PartialOrd, Message: Clone, - Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, + Theme: StyleSheet, { /// The default height of a [`Slider`]. pub const DEFAULT_HEIGHT: f32 = 22.0; @@ -128,10 +126,7 @@ where } /// Sets the style of the [`Slider`]. - pub fn style( - mut self, - style: impl Into<::Style>, - ) -> Self { + pub fn style(mut self, style: impl Into) -> Self { self.style = style.into(); self } @@ -143,13 +138,13 @@ where } } -impl<'a, T, Message, Renderer> Widget - for Slider<'a, T, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> Widget + for Slider<'a, T, Message, Theme> where T: Copy + Into + num_traits::FromPrimitive, Message: Clone, + Theme: StyleSheet, Renderer: crate::core::Renderer, - Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -204,7 +199,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -234,17 +229,17 @@ where } } -impl<'a, T, Message, Renderer> From> - for Element<'a, Message, Renderer> +impl<'a, T, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where - T: 'a + Copy + Into + num_traits::FromPrimitive, - Message: 'a + Clone, - Renderer: 'a + crate::core::Renderer, - Renderer::Theme: StyleSheet, + T: Copy + Into + num_traits::FromPrimitive + 'a, + Message: Clone + 'a, + Theme: StyleSheet + 'a, + Renderer: crate::core::Renderer + 'a, { fn from( - slider: Slider<'a, T, Message, Renderer>, - ) -> Element<'a, Message, Renderer> { + slider: Slider<'a, T, Message, Theme>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(slider) } } @@ -338,29 +333,29 @@ where } /// Draws a [`Slider`]. -pub fn draw( - renderer: &mut R, +pub fn draw( + renderer: &mut Renderer, layout: Layout<'_>, cursor: mouse::Cursor, state: &State, value: T, range: &RangeInclusive, - style_sheet: &dyn StyleSheet