From a7d11944039a1b5ea5b72256e8d15367d99e6010 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 5 Oct 2019 03:56:18 +0200 Subject: Add `Renderer` and `Primitive` concepts --- native/src/element.rs | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index dd5ce621..4ea2379f 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 @@ -102,10 +103,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, MouseCursor, 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( + /// # &mut self, + /// # _column: &Row<'_, Message, Self>, + /// # _layout: Layout<'_>, + /// # _cursor_position: Point, + /// # ) {} + /// # } + /// # /// # impl button::Renderer for Renderer { /// # fn node(&self, _button: &Button<'_, Message>) -> Node { /// # Node::new(Style::default()) @@ -116,9 +128,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { /// # _button: &Button<'_, Message>, /// # _layout: Layout<'_>, /// # _cursor_position: Point, - /// # ) -> MouseCursor { - /// # MouseCursor::OutOfBounds - /// # } + /// # ) {} /// # } /// # } /// # @@ -268,6 +278,7 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { impl<'a, A, B, Renderer> Widget 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 +311,7 @@ where renderer: &mut Renderer, layout: Layout<'_>, cursor_position: Point, - ) -> MouseCursor { + ) -> Renderer::Primitive { self.widget.draw(renderer, layout, cursor_position) } @@ -309,14 +320,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 +338,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 +348,7 @@ where impl<'a, Message, Renderer> Widget 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 +371,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) { -- cgit From a90f7fcb987f667a80038a5e72f379abbd59d932 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 5 Oct 2019 03:58:23 +0200 Subject: Move `MouseCursor` to `iced_wgpu` --- native/src/element.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index 4ea2379f..8d14070a 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -103,7 +103,7 @@ where /// # /// # mod iced_wgpu { /// # use iced_native::{ - /// # button, row, Button, MouseCursor, Node, Point, Rectangle, Style, Layout, Row + /// # button, row, Button, Node, Point, Rectangle, Style, Layout, Row /// # }; /// # pub struct Renderer; /// # -- cgit From 0c3f78713d24b263e94cf6aebb8862926feaff23 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 5 Oct 2019 05:12:36 +0200 Subject: Draft basic text rendering using `wgpu_glyph` --- native/src/element.rs | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index 8d14070a..417e3463 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -41,6 +41,15 @@ where } } + 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 -- cgit From 10e10e5e06841574425d2633f1c2916733f7b4ff Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 8 Oct 2019 03:13:41 +0200 Subject: Make `iced_core::Button` customizable Now it supports: - Any kind of content - Custom border radius - Custom background --- native/src/element.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index 417e3463..cf96b7ea 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -41,6 +41,10 @@ where } } + pub fn node(&self, renderer: &Renderer) -> Node { + self.widget.node(renderer) + } + pub fn draw( &self, renderer: &mut Renderer, @@ -97,22 +101,22 @@ where /// /// ``` /// # mod counter { - /// # use iced_native::{button, Button}; + /// # use iced_native::{text, Text}; /// # /// # #[derive(Debug, Clone, Copy)] /// # pub enum Message {} - /// # pub struct Counter(button::State); + /// # pub struct Counter; /// # /// # impl Counter { - /// # pub fn view(&mut self) -> Button { - /// # Button::new(&mut self.0, "_") + /// # pub fn view(&mut self) -> Text { + /// # Text::new("") /// # } /// # } /// # } /// # /// # mod iced_wgpu { /// # use iced_native::{ - /// # button, row, Button, Node, Point, Rectangle, Style, Layout, Row + /// # text, row, Text, Node, Point, Rectangle, Style, Layout, Row /// # }; /// # pub struct Renderer; /// # @@ -127,16 +131,15 @@ where /// # ) {} /// # } /// # - /// # impl button::Renderer for Renderer { - /// # fn node(&self, _button: &Button<'_, Message>) -> Node { + /// # impl text::Renderer for Renderer { + /// # fn node(&self, _text: &Text) -> Node { /// # Node::new(Style::default()) /// # } /// # - /// # fn draw( + /// # fn draw( /// # &mut self, - /// # _button: &Button<'_, Message>, + /// # _text: &Text, /// # _layout: Layout<'_>, - /// # _cursor_position: Point, /// # ) {} /// # } /// # } @@ -289,7 +292,7 @@ where A: Copy, Renderer: crate::Renderer, { - fn node(&self, renderer: &mut Renderer) -> Node { + fn node(&self, renderer: &Renderer) -> Node { self.widget.node(renderer) } @@ -359,7 +362,7 @@ impl<'a, Message, Renderer> Widget where Renderer: crate::Renderer + renderer::Debugger, { - fn node(&self, renderer: &mut Renderer) -> Node { + fn node(&self, renderer: &Renderer) -> Node { self.element.widget.node(renderer) } -- cgit From 8846a239cf14edd464b1d09f6d6d57ad9b5c9fc7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 11 Oct 2019 22:15:39 +0200 Subject: Rename `Renderer::Primitive` to `Renderer::Output` --- native/src/element.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index cf96b7ea..899089b3 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -50,7 +50,7 @@ where renderer: &mut Renderer, layout: Layout<'_>, cursor_position: Point, - ) -> Renderer::Primitive { + ) -> Renderer::Output { self.widget.draw(renderer, layout, cursor_position) } @@ -120,7 +120,7 @@ where /// # }; /// # pub struct Renderer; /// # - /// # impl iced_native::Renderer for Renderer { type Primitive = (); } + /// # impl iced_native::Renderer for Renderer { type Output = (); } /// # /// # impl iced_native::row::Renderer for Renderer { /// # fn draw( @@ -323,7 +323,7 @@ where renderer: &mut Renderer, layout: Layout<'_>, cursor_position: Point, - ) -> Renderer::Primitive { + ) -> Renderer::Output { self.widget.draw(renderer, layout, cursor_position) } @@ -383,7 +383,7 @@ where renderer: &mut Renderer, layout: Layout<'_>, cursor_position: Point, - ) -> Renderer::Primitive { + ) -> Renderer::Output { renderer.explain( self.element.widget.as_ref(), layout, -- cgit From c63bdacaad7d923358863e3b6b2524893788d91c Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 11 Oct 2019 23:45:01 +0200 Subject: Make `Renderer` immutable in `UserInterface::build` --- native/src/element.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index 899089b3..bbedd942 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -247,10 +247,7 @@ where } } - pub(crate) fn compute_layout( - &self, - renderer: &mut Renderer, - ) -> result::Layout { + pub(crate) fn compute_layout(&self, renderer: &Renderer) -> result::Layout { let node = self.widget.node(renderer); node.0.compute_layout(geometry::Size::undefined()).unwrap() -- cgit