From 49dbf2c14658cb5f2aafdbb75d826d8ba8fedc31 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 9 Jun 2020 15:45:57 +0200 Subject: Request a redraw only on relevant events --- native/src/program/state.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'native/src/program/state.rs') diff --git a/native/src/program/state.rs b/native/src/program/state.rs index 8716d8b9..bb428198 100644 --- a/native/src/program/state.rs +++ b/native/src/program/state.rs @@ -88,6 +88,13 @@ where self.queued_messages.push(message); } + /// Returns whether the event queue of the [`State`] is empty or not. + /// + /// [`State`]: struct.State.html + pub fn is_queue_empty(&self) -> bool { + self.queued_events.is_empty() && self.queued_messages.is_empty() + } + /// Processes all the queued events and messages, rebuilding and redrawing /// the widgets of the linked [`Program`] if necessary. /// @@ -102,10 +109,6 @@ where renderer: &mut P::Renderer, debug: &mut Debug, ) -> Option> { - if self.queued_events.is_empty() && self.queued_messages.is_empty() { - return None; - } - let mut user_interface = build_user_interface( &mut self.program, self.cache.take().unwrap(), -- cgit From f30a666dc81fdc85d225dc83f1a33e32d5dccbd2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 23 Jun 2020 06:44:34 +0200 Subject: Decouple `cursor_position` from `Cache` Instead, we ask explicitly for it in the different `update` and `draw` methods. This way, the runtime can derive the logical position of the cursor from the source of truth. --- native/src/program/state.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'native/src/program/state.rs') diff --git a/native/src/program/state.rs b/native/src/program/state.rs index bb428198..fdc42e8b 100644 --- a/native/src/program/state.rs +++ b/native/src/program/state.rs @@ -1,5 +1,5 @@ use crate::{ - Cache, Clipboard, Command, Debug, Event, Program, Renderer, Size, + Cache, Clipboard, Command, Debug, Event, Point, Program, Renderer, Size, UserInterface, }; @@ -31,6 +31,7 @@ where pub fn new( mut program: P, bounds: Size, + cursor_position: Point, renderer: &mut P::Renderer, debug: &mut Debug, ) -> Self { @@ -43,7 +44,7 @@ where ); debug.draw_started(); - let primitive = user_interface.draw(renderer); + let primitive = user_interface.draw(renderer, cursor_position); debug.draw_finished(); let cache = Some(user_interface.into_cache()); @@ -104,8 +105,9 @@ where /// [`Program`]: trait.Program.html pub fn update( &mut self, - clipboard: Option<&dyn Clipboard>, bounds: Size, + cursor_position: Point, + clipboard: Option<&dyn Clipboard>, renderer: &mut P::Renderer, debug: &mut Debug, ) -> Option> { @@ -120,6 +122,7 @@ where debug.event_processing_started(); let mut messages = user_interface.update( self.queued_events.drain(..), + cursor_position, clipboard, renderer, ); @@ -128,7 +131,7 @@ where if messages.is_empty() { debug.draw_started(); - self.primitive = user_interface.draw(renderer); + self.primitive = user_interface.draw(renderer, cursor_position); debug.draw_finished(); self.cache = Some(user_interface.into_cache()); @@ -159,7 +162,7 @@ where ); debug.draw_started(); - self.primitive = user_interface.draw(renderer); + self.primitive = user_interface.draw(renderer, cursor_position); debug.draw_finished(); self.cache = Some(user_interface.into_cache()); -- cgit