From 7354f68b3ca345767de3f09dccddf168493977bf Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Jan 2023 02:59:08 +0100 Subject: Draft `Shell:request_redraw` API ... and implement `TextInput` cursor blink :tada: --- native/src/user_interface.rs | 46 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 2b43829d..49a6b00e 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -7,6 +7,8 @@ use crate::renderer; use crate::widget; use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; +use std::time::Instant; + /// A set of interactive graphical elements with a specific [`Layout`]. /// /// It can be updated and drawn. @@ -188,7 +190,9 @@ where ) -> (State, Vec) { use std::mem::ManuallyDrop; - let mut state = State::Updated; + let mut outdated = false; + let mut redraw_requested_at = None; + let mut manual_overlay = ManuallyDrop::new(self.root.as_widget_mut().overlay( &mut self.state, @@ -217,6 +221,16 @@ where event_statuses.push(event_status); + match (redraw_requested_at, shell.redraw_requested_at()) { + (None, Some(at)) => { + redraw_requested_at = Some(at); + } + (Some(current), Some(new)) if new < current => { + redraw_requested_at = Some(new); + } + _ => {} + } + if shell.is_layout_invalid() { let _ = ManuallyDrop::into_inner(manual_overlay); @@ -244,7 +258,7 @@ where } if shell.are_widgets_invalid() { - state = State::Outdated; + outdated = true; } } @@ -289,6 +303,16 @@ where self.overlay = None; } + match (redraw_requested_at, shell.redraw_requested_at()) { + (None, Some(at)) => { + redraw_requested_at = Some(at); + } + (Some(current), Some(new)) if new < current => { + redraw_requested_at = Some(new); + } + _ => {} + } + shell.revalidate_layout(|| { self.base = renderer.layout( &self.root, @@ -299,14 +323,23 @@ where }); if shell.are_widgets_invalid() { - state = State::Outdated; + outdated = true; } event_status.merge(overlay_status) }) .collect(); - (state, event_statuses) + ( + if outdated { + State::Outdated + } else { + State::Updated { + redraw_requested_at, + } + }, + event_statuses, + ) } /// Draws the [`UserInterface`] with the provided [`Renderer`]. @@ -559,5 +592,8 @@ pub enum State { /// The [`UserInterface`] is up-to-date and can be reused without /// rebuilding. - Updated, + Updated { + /// The [`Instant`] when a redraw should be performed. + redraw_requested_at: Option, + }, } -- cgit From e2ddef74387bcd81859b56e47316c47d7b739a01 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Jan 2023 05:18:25 +0100 Subject: Replace `Option` with `RedrawRequest` enum --- native/src/user_interface.rs | 23 ++++++++++------------- 1 file changed, 10 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 49a6b00e..025f28a1 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -5,10 +5,9 @@ use crate::layout; use crate::mouse; use crate::renderer; use crate::widget; +use crate::window; use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; -use std::time::Instant; - /// A set of interactive graphical elements with a specific [`Layout`]. /// /// It can be updated and drawn. @@ -191,7 +190,7 @@ where use std::mem::ManuallyDrop; let mut outdated = false; - let mut redraw_requested_at = None; + let mut redraw_request = None; let mut manual_overlay = ManuallyDrop::new(self.root.as_widget_mut().overlay( @@ -221,12 +220,12 @@ where event_statuses.push(event_status); - match (redraw_requested_at, shell.redraw_requested_at()) { + match (redraw_request, shell.redraw_request()) { (None, Some(at)) => { - redraw_requested_at = Some(at); + redraw_request = Some(at); } (Some(current), Some(new)) if new < current => { - redraw_requested_at = Some(new); + redraw_request = Some(new); } _ => {} } @@ -303,12 +302,12 @@ where self.overlay = None; } - match (redraw_requested_at, shell.redraw_requested_at()) { + match (redraw_request, shell.redraw_request()) { (None, Some(at)) => { - redraw_requested_at = Some(at); + redraw_request = Some(at); } (Some(current), Some(new)) if new < current => { - redraw_requested_at = Some(new); + redraw_request = Some(new); } _ => {} } @@ -334,9 +333,7 @@ where if outdated { State::Outdated } else { - State::Updated { - redraw_requested_at, - } + State::Updated { redraw_request } }, event_statuses, ) @@ -594,6 +591,6 @@ pub enum State { /// rebuilding. Updated { /// The [`Instant`] when a redraw should be performed. - redraw_requested_at: Option, + redraw_request: Option, }, } -- cgit From 9fe46de13f86967543de8f00b5a4f9e45d8f5bcf Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 14 Jan 2023 00:49:58 +0100 Subject: Bump versions :tada: --- 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 025f28a1..29cc3472 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -19,8 +19,8 @@ use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; /// The [`integration_opengl`] & [`integration_wgpu`] examples use a /// [`UserInterface`] to integrate Iced in an existing graphical application. /// -/// [`integration_opengl`]: https://github.com/iced-rs/iced/tree/0.6/examples/integration_opengl -/// [`integration_wgpu`]: https://github.com/iced-rs/iced/tree/0.6/examples/integration_wgpu +/// [`integration_opengl`]: https://github.com/iced-rs/iced/tree/0.7/examples/integration_opengl +/// [`integration_wgpu`]: https://github.com/iced-rs/iced/tree/0.7/examples/integration_wgpu #[allow(missing_debug_implementations)] pub struct UserInterface<'a, Message, Renderer> { root: Element<'a, Message, Renderer>, -- cgit