diff options
Diffstat (limited to 'native/src')
| -rw-r--r-- | native/src/element.rs | 57 | ||||
| -rw-r--r-- | native/src/lib.rs | 16 | ||||
| -rw-r--r-- | native/src/mouse_cursor.rs | 35 | ||||
| -rw-r--r-- | native/src/renderer.rs | 16 | ||||
| -rw-r--r-- | native/src/user_interface.rs | 62 | ||||
| -rw-r--r-- | native/src/widget.rs | 17 | ||||
| -rw-r--r-- | native/src/widget/button.rs | 8 | ||||
| -rw-r--r-- | native/src/widget/checkbox.rs | 8 | ||||
| -rw-r--r-- | native/src/widget/column.rs | 34 | ||||
| -rw-r--r-- | native/src/widget/image.rs | 13 | ||||
| -rw-r--r-- | native/src/widget/radio.rs | 8 | ||||
| -rw-r--r-- | native/src/widget/row.rs | 34 | ||||
| -rw-r--r-- | native/src/widget/slider.rs | 8 | ||||
| -rw-r--r-- | native/src/widget/text.rs | 12 | 
14 files changed, 179 insertions, 149 deletions
| diff --git a/native/src/element.rs b/native/src/element.rs index dd5ce621..417e3463 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -1,8 +1,6 @@  use stretch::{geometry, result}; -use crate::{ -    renderer, Color, Event, Hasher, Layout, MouseCursor, Node, Point, Widget, -}; +use crate::{renderer, Color, Event, Hasher, Layout, Node, Point, Widget};  /// A generic [`Widget`].  /// @@ -27,7 +25,10 @@ impl<'a, Message, Renderer> std::fmt::Debug for Element<'a, Message, Renderer> {      }  } -impl<'a, Message, Renderer> Element<'a, Message, Renderer> { +impl<'a, Message, Renderer> Element<'a, Message, Renderer> +where +    Renderer: crate::Renderer, +{      /// Create a new [`Element`] containing the given [`Widget`].      ///      /// [`Element`]: struct.Element.html @@ -40,6 +41,15 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {          }      } +    pub fn draw( +        &self, +        renderer: &mut Renderer, +        layout: Layout<'_>, +        cursor_position: Point, +    ) -> Renderer::Primitive { +        self.widget.draw(renderer, layout, cursor_position) +    } +      /// Applies a transformation to the produced message of the [`Element`].      ///      /// This method is useful when you want to decouple different parts of your @@ -102,10 +112,21 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {      /// #      /// # mod iced_wgpu {      /// #     use iced_native::{ -    /// #         button, Button, MouseCursor, Node, Point, Rectangle, Style, Layout +    /// #         button, row, Button, Node, Point, Rectangle, Style, Layout, Row      /// #     };      /// #     pub struct Renderer;      /// # +    /// #     impl iced_native::Renderer for Renderer { type Primitive = (); } +    /// # +    /// #     impl iced_native::row::Renderer for Renderer { +    /// #         fn draw<Message>( +    /// #             &mut self, +    /// #             _column: &Row<'_, Message, Self>, +    /// #             _layout: Layout<'_>, +    /// #             _cursor_position: Point, +    /// #         ) {} +    /// #     } +    /// #      /// #     impl button::Renderer for Renderer {      /// #         fn node<Message>(&self, _button: &Button<'_, Message>) -> Node {      /// #             Node::new(Style::default()) @@ -116,9 +137,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {      /// #             _button: &Button<'_, Message>,      /// #             _layout: Layout<'_>,      /// #             _cursor_position: Point, -    /// #         ) -> MouseCursor { -    /// #             MouseCursor::OutOfBounds -    /// #         } +    /// #         ) {}      /// #     }      /// # }      /// # @@ -268,6 +287,7 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {  impl<'a, A, B, Renderer> Widget<B, Renderer> for Map<'a, A, B, Renderer>  where      A: Copy, +    Renderer: crate::Renderer,  {      fn node(&self, renderer: &mut Renderer) -> Node {          self.widget.node(renderer) @@ -300,7 +320,7 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { +    ) -> Renderer::Primitive {          self.widget.draw(renderer, layout, cursor_position)      } @@ -309,14 +329,14 @@ where      }  } -struct Explain<'a, Message, Renderer: renderer::Debugger> { +struct Explain<'a, Message, Renderer: crate::Renderer> {      element: Element<'a, Message, Renderer>,      color: Color,  }  impl<'a, Message, Renderer> std::fmt::Debug for Explain<'a, Message, Renderer>  where -    Renderer: renderer::Debugger, +    Renderer: crate::Renderer,  {      fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {          f.debug_struct("Explain") @@ -327,7 +347,7 @@ where  impl<'a, Message, Renderer> Explain<'a, Message, Renderer>  where -    Renderer: renderer::Debugger, +    Renderer: crate::Renderer,  {      fn new(element: Element<'a, Message, Renderer>, color: Color) -> Self {          Explain { element, color } @@ -337,7 +357,7 @@ where  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Explain<'a, Message, Renderer>  where -    Renderer: renderer::Debugger, +    Renderer: crate::Renderer + renderer::Debugger,  {      fn node(&self, renderer: &mut Renderer) -> Node {          self.element.widget.node(renderer) @@ -360,10 +380,13 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { -        renderer.explain(&layout, self.color); - -        self.element.widget.draw(renderer, layout, cursor_position) +    ) -> Renderer::Primitive { +        renderer.explain( +            self.element.widget.as_ref(), +            layout, +            cursor_position, +            self.color, +        )      }      fn hash_layout(&self, state: &mut Hasher) { diff --git a/native/src/lib.rs b/native/src/lib.rs index 39da4943..6067f49d 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -77,12 +77,15 @@  //! #  //! # mod iced_wgpu {  //! #     use iced_native::{ -//! #         button, text, Button, Text, -//! #         MouseCursor, Node, Point, Rectangle, Style, Color, Layout +//! #         button, text, Button, Text, Node, Point, Rectangle, Style, Color, Layout  //! #     };  //! #  //! #     pub struct Renderer {}  //! # +//! #     impl iced_native::Renderer for Renderer { +//! #         type Primitive = (); +//! #     } +//! #  //! #     impl button::Renderer for Renderer {  //! #         fn node<Message>(  //! #             &self, @@ -96,9 +99,7 @@  //! #             _button: &Button<'_, Message>,  //! #             _layout: Layout<'_>,  //! #             _cursor_position: Point, -//! #         ) -> MouseCursor { -//! #             MouseCursor::OutOfBounds -//! #         } +//! #         ) {}  //! #     }  //! #  //! #     impl text::Renderer for Renderer { @@ -192,7 +193,7 @@  //! [documentation]: https://docs.rs/iced  //! [examples]: https://github.com/hecrj/iced/tree/master/examples  //! [`UserInterface`]: struct.UserInterface.html -#![deny(missing_docs)] +//#![deny(missing_docs)]  #![deny(missing_debug_implementations)]  #![deny(unused_results)]  #![deny(unsafe_code)] @@ -205,7 +206,6 @@ mod element;  mod event;  mod hasher;  mod layout; -mod mouse_cursor;  mod node;  mod style;  mod user_interface; @@ -221,8 +221,8 @@ pub use element::Element;  pub use event::Event;  pub use hasher::Hasher;  pub use layout::Layout; -pub use mouse_cursor::MouseCursor;  pub use node::Node; +pub use renderer::Renderer;  pub use style::Style;  pub use user_interface::{Cache, UserInterface};  pub use widget::*; diff --git a/native/src/mouse_cursor.rs b/native/src/mouse_cursor.rs deleted file mode 100644 index 4ef6361a..00000000 --- a/native/src/mouse_cursor.rs +++ /dev/null @@ -1,35 +0,0 @@ -/// The state of the mouse cursor. -#[derive(Debug, Eq, PartialEq, Clone, Copy)] -pub enum MouseCursor { -    /// The cursor is out of the bounds of the user interface. -    OutOfBounds, - -    /// The cursor is over a non-interactive widget. -    Idle, - -    /// The cursor is over a clickable widget. -    Pointer, - -    /// The cursor is over a busy widget. -    Working, - -    /// The cursor is over a grabbable widget. -    Grab, - -    /// The cursor is grabbing a widget. -    Grabbing, -} - -#[cfg(feature = "winit")] -impl From<MouseCursor> for winit::window::CursorIcon { -    fn from(mouse_cursor: MouseCursor) -> winit::window::CursorIcon { -        match mouse_cursor { -            MouseCursor::OutOfBounds => winit::window::CursorIcon::Default, -            MouseCursor::Idle => winit::window::CursorIcon::Default, -            MouseCursor::Pointer => winit::window::CursorIcon::Hand, -            MouseCursor::Working => winit::window::CursorIcon::Progress, -            MouseCursor::Grab => winit::window::CursorIcon::Grab, -            MouseCursor::Grabbing => winit::window::CursorIcon::Grabbing, -        } -    } -} diff --git a/native/src/renderer.rs b/native/src/renderer.rs index 2244f00b..d16a0289 100644 --- a/native/src/renderer.rs +++ b/native/src/renderer.rs @@ -17,12 +17,16 @@  //! [`text::Renderer`]: ../widget/text/trait.Renderer.html  //! [`Checkbox`]: ../widget/checkbox/struct.Checkbox.html  //! [`checkbox::Renderer`]: ../widget/checkbox/trait.Renderer.html -use crate::{Color, Layout}; +use crate::{Color, Layout, Point, Widget}; + +pub trait Renderer { +    type Primitive; +}  /// A renderer able to graphically explain a [`Layout`].  ///  /// [`Layout`]: ../struct.Layout.html -pub trait Debugger { +pub trait Debugger: Renderer {      /// Explains the [`Layout`] of an [`Element`] for debugging purposes.      ///      /// This will be called when [`Element::explain`] has been used. It should @@ -34,5 +38,11 @@ pub trait Debugger {      /// [`Layout`]: struct.Layout.html      /// [`Element`]: struct.Element.html      /// [`Element::explain`]: struct.Element.html#method.explain -    fn explain(&mut self, layout: &Layout<'_>, color: Color); +    fn explain<Message>( +        &mut self, +        widget: &dyn Widget<Message, Self>, +        layout: Layout<'_>, +        cursor_position: Point, +        color: Color, +    ) -> Self::Primitive;  } diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 4bfacb2e..812ad598 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,7 +1,7 @@ -use crate::{input::mouse, Column, Element, Event, Layout, MouseCursor, Point}; +use crate::{input::mouse, Element, Event, Layout, Point};  use std::hash::Hasher; -use stretch::result; +use stretch::{geometry, result};  /// A set of interactive graphical elements with a specific [`Layout`].  /// @@ -19,7 +19,10 @@ pub struct UserInterface<'a, Message, Renderer> {      cursor_position: Point,  } -impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> { +impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> +where +    Renderer: crate::Renderer, +{      /// Builds a user interface for an [`Element`].      ///      /// It is able to avoid expensive computations when using a [`Cache`] @@ -44,6 +47,19 @@ impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> {      /// #     impl Renderer {      /// #         pub fn new() -> Self { Renderer }      /// #     } +    /// # +    /// #     impl iced_native::Renderer for Renderer { type Primitive = (); } +    /// # +    /// #     impl iced_native::column::Renderer for Renderer { +    /// #         fn draw<Message>( +    /// #             &mut self, +    /// #             _column: &iced_native::Column<'_, Message, Self>, +    /// #             _layout: iced_native::Layout<'_>, +    /// #             _cursor_position: iced_native::Point, +    /// #         ) -> Self::Primitive { +    /// #             () +    /// #         } +    /// #     }      /// # }      /// #      /// # use iced_native::Column; @@ -127,6 +143,19 @@ impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> {      /// #     impl Renderer {      /// #         pub fn new() -> Self { Renderer }      /// #     } +    /// # +    /// #     impl iced_native::Renderer for Renderer { type Primitive = (); } +    /// # +    /// #     impl iced_native::column::Renderer for Renderer { +    /// #         fn draw<Message>( +    /// #             &mut self, +    /// #             _column: &iced_native::Column<'_, Message, Self>, +    /// #             _layout: iced_native::Layout<'_>, +    /// #             _cursor_position: iced_native::Point, +    /// #         ) -> Self::Primitive { +    /// #             () +    /// #         } +    /// #     }      /// # }      /// #      /// # use iced_native::Column; @@ -212,6 +241,19 @@ impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> {      /// #     impl Renderer {      /// #         pub fn new() -> Self { Renderer }      /// #     } +    /// # +    /// #     impl iced_native::Renderer for Renderer { type Primitive = (); } +    /// # +    /// #     impl iced_native::column::Renderer for Renderer { +    /// #         fn draw<Message>( +    /// #             &mut self, +    /// #             _column: &iced_native::Column<'_, Message, Self>, +    /// #             _layout: iced_native::Layout<'_>, +    /// #             _cursor_position: iced_native::Point, +    /// #         ) -> Self::Primitive { +    /// #             () +    /// #         } +    /// #     }      /// # }      /// #      /// # use iced_native::Column; @@ -254,7 +296,7 @@ impl<'a, Message, Renderer> UserInterface<'a, Message, Renderer> {      ///     // Flush rendering operations...      /// }      /// ``` -    pub fn draw(&self, renderer: &mut Renderer) -> MouseCursor { +    pub fn draw(&self, renderer: &mut Renderer) -> Renderer::Primitive {          self.root.widget.draw(              renderer,              Layout::new(&self.layout), @@ -295,14 +337,16 @@ impl Cache {      /// [`Cache`]: struct.Cache.html      /// [`UserInterface`]: struct.UserInterface.html      pub fn new() -> Cache { -        let root: Element<'_, (), ()> = Column::new().into(); +        use crate::{Node, Style}; -        let hasher = &mut crate::Hasher::default(); -        root.hash_layout(hasher); +        let empty_node = Node::new(Style::default());          Cache { -            hash: hasher.finish(), -            layout: root.compute_layout(&mut ()), +            hash: 0, +            layout: empty_node +                .0 +                .compute_layout(geometry::Size::undefined()) +                .unwrap(),              cursor_position: Point::new(0.0, 0.0),          }      } diff --git a/native/src/widget.rs b/native/src/widget.rs index 9b770454..eff098a6 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -20,13 +20,12 @@  //!  //! [`Widget`]: trait.Widget.html  //! [renderer]: ../renderer/index.html -mod column; -mod row; -  pub mod button;  pub mod checkbox; +pub mod column;  pub mod image;  pub mod radio; +pub mod row;  pub mod slider;  pub mod text; @@ -47,7 +46,7 @@ pub use slider::Slider;  #[doc(no_inline)]  pub use text::Text; -use crate::{Event, Hasher, Layout, MouseCursor, Node, Point}; +use crate::{Event, Hasher, Layout, Node, Point};  /// A component that displays information and allows interaction.  /// @@ -56,7 +55,10 @@ use crate::{Event, Hasher, Layout, MouseCursor, Node, Point};  ///  /// [`Widget`]: trait.Widget.html  /// [`Element`]: ../struct.Element.html -pub trait Widget<Message, Renderer>: std::fmt::Debug { +pub trait Widget<Message, Renderer>: std::fmt::Debug +where +    Renderer: crate::Renderer, +{      /// Returns the [`Node`] of the [`Widget`].      ///      /// This [`Node`] is used by the runtime to compute the [`Layout`] of the @@ -69,16 +71,13 @@ pub trait Widget<Message, Renderer>: std::fmt::Debug {      /// Draws the [`Widget`] using the associated `Renderer`.      /// -    /// It must return the [`MouseCursor`] state for the [`Widget`]. -    ///      /// [`Widget`]: trait.Widget.html -    /// [`MouseCursor`]: ../enum.MouseCursor.html      fn draw(          &self,          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor; +    ) -> Renderer::Primitive;      /// Computes the _layout_ hash of the [`Widget`].      /// diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 7b5c4a86..5ae4e045 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -7,7 +7,7 @@  //! [`Class`]: enum.Class.html  use crate::input::{mouse, ButtonState}; -use crate::{Element, Event, Hasher, Layout, MouseCursor, Node, Point, Widget}; +use crate::{Element, Event, Hasher, Layout, Node, Point, Widget};  use std::hash::Hash;  pub use iced_core::button::*; @@ -63,7 +63,7 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { +    ) -> Renderer::Primitive {          renderer.draw(&self, layout, cursor_position)      } @@ -81,7 +81,7 @@ where  ///  /// [`Button`]: struct.Button.html  /// [renderer]: ../../renderer/index.html -pub trait Renderer { +pub trait Renderer: crate::Renderer {      /// Creates a [`Node`] for the provided [`Button`].      ///      /// [`Node`]: ../../struct.Node.html @@ -96,7 +96,7 @@ pub trait Renderer {          button: &Button<'_, Message>,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor; +    ) -> Self::Primitive;  }  impl<'a, Message, Renderer> From<Button<'a, Message>> diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index 3e307f64..1954305a 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -2,7 +2,7 @@  use std::hash::Hash;  use crate::input::{mouse, ButtonState}; -use crate::{Element, Event, Hasher, Layout, MouseCursor, Node, Point, Widget}; +use crate::{Element, Event, Hasher, Layout, Node, Point, Widget};  pub use iced_core::Checkbox; @@ -43,7 +43,7 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { +    ) -> Renderer::Primitive {          renderer.draw(&self, layout, cursor_position)      } @@ -59,7 +59,7 @@ where  ///  /// [`Checkbox`]: struct.Checkbox.html  /// [renderer]: ../../renderer/index.html -pub trait Renderer { +pub trait Renderer: crate::Renderer {      /// Creates a [`Node`] for the provided [`Checkbox`].      ///      /// [`Node`]: ../../struct.Node.html @@ -80,7 +80,7 @@ pub trait Renderer {          checkbox: &Checkbox<Message>,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor; +    ) -> Self::Primitive;  }  impl<'a, Message, Renderer> From<Checkbox<Message>> diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index 9da2e161..6228d711 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -1,8 +1,6 @@  use std::hash::Hash; -use crate::{ -    Element, Event, Hasher, Layout, MouseCursor, Node, Point, Style, Widget, -}; +use crate::{Element, Event, Hasher, Layout, Node, Point, Style, Widget};  /// A container that distributes its contents vertically.  pub type Column<'a, Message, Renderer> = @@ -10,6 +8,8 @@ pub type Column<'a, Message, Renderer> =  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Column<'a, Message, Renderer> +where +    Renderer: self::Renderer,  {      fn node(&self, renderer: &mut Renderer) -> Node {          let mut children: Vec<Node> = self @@ -70,21 +70,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { -        let mut cursor = MouseCursor::OutOfBounds; - -        self.children.iter().zip(layout.children()).for_each( -            |(child, layout)| { -                let new_cursor = -                    child.widget.draw(renderer, layout, cursor_position); - -                if new_cursor != MouseCursor::OutOfBounds { -                    cursor = new_cursor; -                } -            }, -        ); - -        cursor +    ) -> Renderer::Primitive { +        renderer.draw(&self, layout, cursor_position)      }      fn hash_layout(&self, state: &mut Hasher) { @@ -104,10 +91,19 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      }  } +pub trait Renderer: crate::Renderer + Sized { +    fn draw<Message>( +        &mut self, +        row: &Column<'_, Message, Self>, +        layout: Layout<'_>, +        cursor_position: Point, +    ) -> Self::Primitive; +} +  impl<'a, Message, Renderer> From<Column<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where -    Renderer: 'a, +    Renderer: 'a + self::Renderer,      Message: 'static,  {      fn from( diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs index 81f99acb..2bce36c2 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -1,6 +1,6 @@  //! Display images in your user interface. -use crate::{Element, Hasher, Layout, MouseCursor, Node, Point, Widget}; +use crate::{Element, Hasher, Layout, Node, Point, Widget};  use std::hash::Hash; @@ -20,10 +20,8 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          _cursor_position: Point, -    ) -> MouseCursor { -        renderer.draw(&self, layout); - -        MouseCursor::OutOfBounds +    ) -> Renderer::Primitive { +        renderer.draw(&self, layout)      }      fn hash_layout(&self, state: &mut Hasher) { @@ -40,7 +38,7 @@ where  ///  /// [`Image`]: struct.Image.html  /// [renderer]: ../../renderer/index.html -pub trait Renderer<I> { +pub trait Renderer<I>: crate::Renderer {      /// Creates a [`Node`] for the provided [`Image`].      ///      /// You should probably keep the original aspect ratio, if possible. @@ -52,7 +50,8 @@ pub trait Renderer<I> {      /// Draws an [`Image`].      ///      /// [`Image`]: struct.Image.html -    fn draw(&mut self, image: &Image<I>, layout: Layout<'_>); +    fn draw(&mut self, image: &Image<I>, layout: Layout<'_>) +        -> Self::Primitive;  }  impl<'a, I, Message, Renderer> From<Image<I>> for Element<'a, Message, Renderer> diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 33d42e61..1bc052aa 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -1,6 +1,6 @@  //! Create choices using radio buttons.  use crate::input::{mouse, ButtonState}; -use crate::{Element, Event, Hasher, Layout, MouseCursor, Node, Point, Widget}; +use crate::{Element, Event, Hasher, Layout, Node, Point, Widget};  use std::hash::Hash; @@ -40,7 +40,7 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { +    ) -> Renderer::Primitive {          renderer.draw(&self, layout, cursor_position)      } @@ -56,7 +56,7 @@ where  ///  /// [`Radio`]: struct.Radio.html  /// [renderer]: ../../renderer/index.html -pub trait Renderer { +pub trait Renderer: crate::Renderer {      /// Creates a [`Node`] for the provided [`Radio`].      ///      /// [`Node`]: ../../struct.Node.html @@ -77,7 +77,7 @@ pub trait Renderer {          radio: &Radio<Message>,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor; +    ) -> Self::Primitive;  }  impl<'a, Message, Renderer> From<Radio<Message>> diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 3cd451b7..9d023210 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -1,8 +1,6 @@  use std::hash::Hash; -use crate::{ -    Element, Event, Hasher, Layout, MouseCursor, Node, Point, Style, Widget, -}; +use crate::{Element, Event, Hasher, Layout, Node, Point, Style, Widget};  /// A container that distributes its contents horizontally.  pub type Row<'a, Message, Renderer> = @@ -10,6 +8,8 @@ pub type Row<'a, Message, Renderer> =  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Row<'a, Message, Renderer> +where +    Renderer: self::Renderer,  {      fn node(&self, renderer: &mut Renderer) -> Node {          let mut children: Vec<Node> = self @@ -70,21 +70,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { -        let mut cursor = MouseCursor::OutOfBounds; - -        self.children.iter().zip(layout.children()).for_each( -            |(child, layout)| { -                let new_cursor = -                    child.widget.draw(renderer, layout, cursor_position); - -                if new_cursor != MouseCursor::OutOfBounds { -                    cursor = new_cursor; -                } -            }, -        ); - -        cursor +    ) -> Renderer::Primitive { +        renderer.draw(&self, layout, cursor_position)      }      fn hash_layout(&self, state: &mut Hasher) { @@ -105,10 +92,19 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      }  } +pub trait Renderer: crate::Renderer + Sized { +    fn draw<Message>( +        &mut self, +        row: &Row<'_, Message, Self>, +        layout: Layout<'_>, +        cursor_position: Point, +    ) -> Self::Primitive; +} +  impl<'a, Message, Renderer> From<Row<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where -    Renderer: 'a, +    Renderer: 'a + self::Renderer,      Message: 'static,  {      fn from(row: Row<'a, Message, Renderer>) -> Element<'a, Message, Renderer> { diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index 481296bd..77095cb7 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -7,7 +7,7 @@  use std::hash::Hash;  use crate::input::{mouse, ButtonState}; -use crate::{Element, Event, Hasher, Layout, MouseCursor, Node, Point, Widget}; +use crate::{Element, Event, Hasher, Layout, Node, Point, Widget};  pub use iced_core::slider::*; @@ -71,7 +71,7 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor { +    ) -> Renderer::Primitive {          renderer.draw(&self, layout, cursor_position)      } @@ -87,7 +87,7 @@ where  ///  /// [`Slider`]: struct.Slider.html  /// [renderer]: ../../renderer/index.html -pub trait Renderer { +pub trait Renderer: crate::Renderer {      /// Creates a [`Node`] for the provided [`Radio`].      ///      /// [`Node`]: ../../struct.Node.html @@ -111,7 +111,7 @@ pub trait Renderer {          slider: &Slider<'_, Message>,          layout: Layout<'_>,          cursor_position: Point, -    ) -> MouseCursor; +    ) -> Self::Primitive;  }  impl<'a, Message, Renderer> From<Slider<'a, Message>> diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs index 5ca6ebf3..a032b4fc 100644 --- a/native/src/widget/text.rs +++ b/native/src/widget/text.rs @@ -1,5 +1,5 @@  //! Write some text for your users to read. -use crate::{Element, Hasher, Layout, MouseCursor, Node, Point, Widget}; +use crate::{Element, Hasher, Layout, Node, Point, Widget};  use std::hash::Hash; @@ -18,10 +18,8 @@ where          renderer: &mut Renderer,          layout: Layout<'_>,          _cursor_position: Point, -    ) -> MouseCursor { -        renderer.draw(&self, layout); - -        MouseCursor::OutOfBounds +    ) -> Renderer::Primitive { +        renderer.draw(&self, layout)      }      fn hash_layout(&self, state: &mut Hasher) { @@ -40,7 +38,7 @@ where  /// [`Text`]: struct.Text.html  /// [renderer]: ../../renderer/index.html  /// [`UserInterface`]: ../../struct.UserInterface.html -pub trait Renderer { +pub trait Renderer: crate::Renderer {      /// Creates a [`Node`] with the given [`Style`] for the provided [`Text`]      /// contents and size.      /// @@ -66,7 +64,7 @@ pub trait Renderer {      /// [`Text`]: struct.Text.html      /// [`HorizontalAlignment`]: enum.HorizontalAlignment.html      /// [`VerticalAlignment`]: enum.VerticalAlignment.html -    fn draw(&mut self, text: &Text, layout: Layout<'_>); +    fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Primitive;  }  impl<'a, Message, Renderer> From<Text> for Element<'a, Message, Renderer> | 
