From 03b34931383e701c39c653a7662a616fe21a0947 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 14 Oct 2021 16:07:22 +0700 Subject: Remove trait-specific draw logic in `iced_native` --- native/src/user_interface.rs | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 8e0d7d1c..187c469a 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -329,11 +329,7 @@ where /// // Flush rendering operations... /// } /// ``` - pub fn draw( - &mut self, - renderer: &mut Renderer, - cursor_position: Point, - ) -> Renderer::Output { + pub fn draw(&mut self, renderer: &mut Renderer, cursor_position: Point) { let viewport = Rectangle::with_size(self.bounds); let overlay = if let Some(mut overlay) = @@ -348,40 +344,36 @@ where let overlay_bounds = layer.layout.bounds(); - let overlay_primitives = overlay.draw( - renderer, - &Renderer::Defaults::default(), - Layout::new(&layer.layout), - cursor_position, - ); + renderer.with_layer(overlay_bounds, |renderer| { + overlay.draw( + renderer, + &Renderer::Defaults::default(), + Layout::new(&layer.layout), + cursor_position, + ); + }); self.overlay = Some(layer); - Some((overlay_primitives, overlay_bounds)) + Some(overlay_bounds) } else { None }; - if let Some((overlay_primitives, overlay_bounds)) = overlay { + if let Some(overlay_bounds) = overlay { let base_cursor = if overlay_bounds.contains(cursor_position) { Point::new(-1.0, -1.0) } else { cursor_position }; - let base_primitives = self.root.widget.draw( + self.root.widget.draw( renderer, &Renderer::Defaults::default(), Layout::new(&self.base.layout), base_cursor, &viewport, ); - - renderer.overlay( - base_primitives, - overlay_primitives, - overlay_bounds, - ) } else { self.root.widget.draw( renderer, @@ -389,7 +381,7 @@ where Layout::new(&self.base.layout), cursor_position, &viewport, - ) + ); } } -- cgit From 3a0c503db99eb3d45ac971132904df419ee566b6 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 14 Oct 2021 16:59:19 +0700 Subject: Implement `Widget::draw` for `Text` --- native/src/user_interface.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 187c469a..c80aaf44 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -330,6 +330,9 @@ where /// } /// ``` pub fn draw(&mut self, renderer: &mut Renderer, cursor_position: Point) { + // TODO: Move to shell level (?) + renderer.clear(); + let viewport = Rectangle::with_size(self.bounds); let overlay = if let Some(mut overlay) = -- cgit From dfceee99aad9462f09ca61081e68e1decb2fed92 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 14 Oct 2021 17:15:29 +0700 Subject: Implement `Widget::draw` for `Scrollable` Rendering the scroller is still WIP --- native/src/user_interface.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index c80aaf44..eb57670d 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,7 +1,7 @@ use crate::event::{self, Event}; use crate::layout; use crate::overlay; -use crate::{Clipboard, Element, Layout, Point, Rectangle, Size}; +use crate::{Clipboard, Element, Layout, Point, Rectangle, Size, Vector}; use std::hash::Hasher; @@ -347,14 +347,18 @@ where let overlay_bounds = layer.layout.bounds(); - renderer.with_layer(overlay_bounds, |renderer| { - overlay.draw( - renderer, - &Renderer::Defaults::default(), - Layout::new(&layer.layout), - cursor_position, - ); - }); + renderer.with_layer( + overlay_bounds, + Vector::new(0, 0), + |renderer| { + overlay.draw( + renderer, + &Renderer::Defaults::default(), + Layout::new(&layer.layout), + cursor_position, + ); + }, + ); self.overlay = Some(layer); -- cgit From edea093350e1b576e2b7db50c525e7fa5c3bea9f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 18 Oct 2021 15:19:04 +0700 Subject: Move `Defaults` from `iced_graphics` to `iced_native` --- native/src/user_interface.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index eb57670d..2f76c084 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,6 +1,7 @@ use crate::event::{self, Event}; use crate::layout; use crate::overlay; +use crate::renderer; use crate::{Clipboard, Element, Layout, Point, Rectangle, Size, Vector}; use std::hash::Hasher; @@ -353,7 +354,7 @@ where |renderer| { overlay.draw( renderer, - &Renderer::Defaults::default(), + &renderer::Style::default(), Layout::new(&layer.layout), cursor_position, ); @@ -376,7 +377,7 @@ where self.root.widget.draw( renderer, - &Renderer::Defaults::default(), + &renderer::Style::default(), Layout::new(&self.base.layout), base_cursor, &viewport, @@ -384,7 +385,7 @@ where } else { self.root.widget.draw( renderer, - &Renderer::Defaults::default(), + &renderer::Style::default(), Layout::new(&self.base.layout), cursor_position, &viewport, -- cgit From be97a5d502df8c8b23704f5a8a0d425f4eff2215 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 18 Oct 2021 16:43:18 +0700 Subject: Introduce `mouse_interaction` method to `Widget` trait --- native/src/user_interface.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 2f76c084..d9338524 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,5 +1,6 @@ use crate::event::{self, Event}; use crate::layout; +use crate::mouse; use crate::overlay; use crate::renderer; use crate::{Clipboard, Element, Layout, Point, Rectangle, Size, Vector}; @@ -330,7 +331,11 @@ where /// // Flush rendering operations... /// } /// ``` - pub fn draw(&mut self, renderer: &mut Renderer, cursor_position: Point) { + pub fn draw( + &mut self, + renderer: &mut Renderer, + cursor_position: Point, + ) -> mouse::Interaction { // TODO: Move to shell level (?) renderer.clear(); @@ -346,6 +351,12 @@ where renderer, ); + let mouse_interaction = overlay.mouse_interaction( + Layout::new(&layer.layout), + &viewport, + cursor_position, + ); + let overlay_bounds = layer.layout.bounds(); renderer.with_layer( @@ -363,12 +374,12 @@ where self.overlay = Some(layer); - Some(overlay_bounds) + Some((overlay_bounds, mouse_interaction)) } else { None }; - if let Some(overlay_bounds) = overlay { + if let Some((overlay_bounds, overlay_interaction)) = overlay { let base_cursor = if overlay_bounds.contains(cursor_position) { Point::new(-1.0, -1.0) } else { @@ -382,6 +393,8 @@ where base_cursor, &viewport, ); + + overlay_interaction } else { self.root.widget.draw( renderer, @@ -390,6 +403,12 @@ where cursor_position, &viewport, ); + + self.root.widget.mouse_interaction( + Layout::new(&self.base.layout), + &viewport, + cursor_position, + ) } } -- cgit From 4a11cbd99445338619dfaf1f327dbc25b2983cb7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 25 Oct 2021 16:16:35 +0700 Subject: Implement `Widget::mouse_interaction` for `PaneGrid` ... and fix rendering of drag interaction in `PaneGrid` by introducing an explicit `with_translation` method to `Renderer` and simplifying the `with_layer` and `Clip` primitive. --- native/src/user_interface.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index d9338524..c3a8394c 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -3,7 +3,7 @@ use crate::layout; use crate::mouse; use crate::overlay; use crate::renderer; -use crate::{Clipboard, Element, Layout, Point, Rectangle, Size, Vector}; +use crate::{Clipboard, Element, Layout, Point, Rectangle, Size}; use std::hash::Hasher; @@ -359,18 +359,14 @@ where let overlay_bounds = layer.layout.bounds(); - renderer.with_layer( - overlay_bounds, - Vector::new(0, 0), - |renderer| { - overlay.draw( - renderer, - &renderer::Style::default(), - Layout::new(&layer.layout), - cursor_position, - ); - }, - ); + renderer.with_layer(overlay_bounds, |renderer| { + overlay.draw( + renderer, + &renderer::Style::default(), + Layout::new(&layer.layout), + cursor_position, + ); + }); self.overlay = Some(layer); -- cgit From 9c7e340b28d11ede50b494f5341acd94673feb5d Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 28 Oct 2021 16:43:16 +0700 Subject: Fix overlay layering in `UserInterface::draw` ... by properly implementing the Painter's algorithm. --- native/src/user_interface.rs | 84 +++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 32 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index c3a8394c..ac7fa367 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -341,7 +341,7 @@ where let viewport = Rectangle::with_size(self.bounds); - let overlay = if let Some(mut overlay) = + if let Some(mut overlay) = self.root.overlay(Layout::new(&self.base.layout)) { let layer = Self::overlay_layer( @@ -351,32 +351,12 @@ where renderer, ); - let mouse_interaction = overlay.mouse_interaction( - Layout::new(&layer.layout), - &viewport, - cursor_position, - ); - - let overlay_bounds = layer.layout.bounds(); - - renderer.with_layer(overlay_bounds, |renderer| { - overlay.draw( - renderer, - &renderer::Style::default(), - Layout::new(&layer.layout), - cursor_position, - ); - }); - self.overlay = Some(layer); - - Some((overlay_bounds, mouse_interaction)) - } else { - None }; - if let Some((overlay_bounds, overlay_interaction)) = overlay { - let base_cursor = if overlay_bounds.contains(cursor_position) { + if let Some(layer) = &self.overlay { + let base_cursor = if layer.layout.bounds().contains(cursor_position) + { Point::new(-1.0, -1.0) } else { cursor_position @@ -389,8 +369,6 @@ where base_cursor, &viewport, ); - - overlay_interaction } else { self.root.widget.draw( renderer, @@ -399,13 +377,55 @@ where cursor_position, &viewport, ); + }; - self.root.widget.mouse_interaction( - Layout::new(&self.base.layout), - &viewport, - cursor_position, - ) - } + let base_interaction = self.root.widget.mouse_interaction( + Layout::new(&self.base.layout), + &viewport, + cursor_position, + ); + + let Self { + overlay, + root, + base, + .. + } = self; + + // TODO: Currently, we need to call Widget::overlay twice to + // implement the painter's algorithm properly. + // + // Once we have a proper persistent widget tree, we should be able to + // avoid this additional call. + overlay + .as_ref() + .and_then(|layer| { + root.overlay(Layout::new(&base.layout)).map(|overlay| { + let overlay_interaction = overlay.mouse_interaction( + Layout::new(&layer.layout), + &viewport, + cursor_position, + ); + + let overlay_bounds = layer.layout.bounds(); + + renderer.with_layer(viewport, |renderer| { + overlay.draw( + renderer, + &renderer::Style::default(), + Layout::new(&layer.layout), + cursor_position, + ); + }); + + if overlay_bounds.contains(cursor_position) { + overlay_interaction + } else { + base_interaction + } + }) + }) + .unwrap_or(base_interaction) } /// Relayouts and returns a new [`UserInterface`] using the provided -- cgit From 0aafcde0ef1533c9eeba0379de8c0082e30c7504 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 31 Oct 2021 15:35:12 +0700 Subject: Remove `widget` module re-exports in `iced_native` --- native/src/user_interface.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index ac7fa367..a25fb0c4 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -49,7 +49,7 @@ where /// # pub use iced_native::renderer::Null as Renderer; /// # } /// # - /// # use iced_native::Column; + /// # use iced_native::widget::Column; /// # /// # pub struct Counter; /// # @@ -143,7 +143,7 @@ where /// # pub use iced_native::renderer::Null as Renderer; /// # } /// # - /// # use iced_native::Column; + /// # use iced_native::widget::Column; /// # /// # pub struct Counter; /// # @@ -279,7 +279,7 @@ where /// # pub use iced_native::renderer::Null as Renderer; /// # } /// # - /// # use iced_native::Column; + /// # use iced_native::widget::Column; /// # /// # pub struct Counter; /// # -- cgit From 631e95ee0be01dc7f5e5183e1429972aee37787f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 2 Nov 2021 15:03:29 +0700 Subject: Move `viewport` argument to last position in `mouse_interaction` methods This keeps the order of the arguments consistent with `draw`. --- native/src/user_interface.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index a25fb0c4..39cac559 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -381,8 +381,8 @@ where let base_interaction = self.root.widget.mouse_interaction( Layout::new(&self.base.layout), - &viewport, cursor_position, + &viewport, ); let Self { @@ -403,8 +403,8 @@ where root.overlay(Layout::new(&base.layout)).map(|overlay| { let overlay_interaction = overlay.mouse_interaction( Layout::new(&layer.layout), - &viewport, cursor_position, + &viewport, ); let overlay_bounds = layer.layout.bounds(); -- cgit