From 3f968b8c876b7c2351232856887fb9c3e3db3130 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 00:09:52 +0100 Subject: Make `Widget::on_event` return an `event::Status` --- native/src/user_interface.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 504dbe0f..2ac4db0f 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -242,7 +242,7 @@ where }; for event in events { - self.root.widget.on_event( + let _ = self.root.widget.on_event( event.clone(), Layout::new(&self.base.layout), base_cursor, -- cgit From 6e9bd0d9d1dc9a98645d427d62b8413273dc6efd Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 01:29:11 +0100 Subject: Make `Overlay::on_event` return `event::Status` --- native/src/user_interface.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 2ac4db0f..6da46115 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -216,7 +216,7 @@ where ); for event in events { - overlay.on_event( + let _ = overlay.on_event( event.clone(), Layout::new(&layer.layout), cursor_position, -- cgit From 33d80b5a0b8b5b2837c99be2a152bdeb73ca60c8 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 02:00:08 +0100 Subject: Return `event::Status` in `UserInterface::update` --- native/src/user_interface.rs | 97 +++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 46 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 6da46115..793d341c 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::{Clipboard, Element, Event, Layout, Point, Rectangle, Size}; +use crate::{Clipboard, Element, Layout, Point, Rectangle, Size}; use std::hash::Hasher; @@ -169,9 +170,10 @@ where /// /// // Initialize our event storage /// let mut events = Vec::new(); + /// let mut messages = Vec::new(); /// /// loop { - /// // Process system events... + /// // Obtain system events... /// /// let mut user_interface = UserInterface::build( /// counter.view(), @@ -180,32 +182,34 @@ where /// &mut renderer, /// ); /// - /// // Update the user interface - /// let messages = user_interface.update( - /// &events, - /// cursor_position, - /// None, - /// &renderer, - /// ); + /// for event in events.drain(..) { + /// // Update the user interface + /// let _event_status = user_interface.update( + /// event, + /// cursor_position, + /// None, + /// &renderer, + /// &mut messages + /// ); + /// } /// /// cache = user_interface.into_cache(); /// /// // Process the produced messages - /// for message in messages { + /// for message in messages.drain(..) { /// counter.update(message); /// } /// } /// ``` pub fn update( &mut self, - events: &[Event], + event: Event, cursor_position: Point, clipboard: Option<&dyn Clipboard>, renderer: &Renderer, - ) -> Vec { - let mut messages = Vec::new(); - - let base_cursor = if let Some(mut overlay) = + messages: &mut Vec, + ) -> event::Status { + let (base_cursor, overlay_status) = if let Some(mut overlay) = self.root.overlay(Layout::new(&self.base.layout)) { let layer = Self::overlay_layer( @@ -215,16 +219,14 @@ where renderer, ); - for event in events { - let _ = overlay.on_event( - event.clone(), - Layout::new(&layer.layout), - cursor_position, - &mut messages, - renderer, - clipboard, - ); - } + let event_status = overlay.on_event( + event.clone(), + Layout::new(&layer.layout), + cursor_position, + messages, + renderer, + clipboard, + ); let base_cursor = if layer.layout.bounds().contains(cursor_position) { @@ -236,23 +238,21 @@ where self.overlay = Some(layer); - base_cursor + (base_cursor, event_status) } else { - cursor_position + (cursor_position, event::Status::Ignored) }; - for event in events { - let _ = self.root.widget.on_event( - event.clone(), - Layout::new(&self.base.layout), - base_cursor, - &mut messages, - renderer, - clipboard, - ); - } + let event_status = self.root.widget.on_event( + event, + Layout::new(&self.base.layout), + base_cursor, + messages, + renderer, + clipboard, + ); - messages + event_status.merge(overlay_status) } /// Draws the [`UserInterface`] with the provided [`Renderer`]. @@ -293,9 +293,10 @@ where /// let mut window_size = Size::new(1024.0, 768.0); /// let mut cursor_position = Point::default(); /// let mut events = Vec::new(); + /// let mut messages = Vec::new(); /// /// loop { - /// // Process system events... + /// // Obtain system events... /// /// let mut user_interface = UserInterface::build( /// counter.view(), @@ -304,19 +305,23 @@ where /// &mut renderer, /// ); /// - /// let messages = user_interface.update( - /// &events, - /// cursor_position, - /// None, - /// &renderer, - /// ); + /// for event in events.drain(..) { + /// // Update the user interface + /// let _event_status = user_interface.update( + /// event, + /// cursor_position, + /// None, + /// &renderer, + /// &mut messages + /// ); + /// } /// /// // Draw the user interface /// let mouse_cursor = user_interface.draw(&mut renderer, cursor_position); /// /// cache = user_interface.into_cache(); /// - /// for message in messages { + /// for message in messages.drain(..) { /// counter.update(message); /// } /// -- cgit From bf2d2561b8dde3e160438428b59c03c38a5f752a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 02:51:26 +0100 Subject: Batch event processing in `UserInterface::update` --- native/src/user_interface.rs | 95 ++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 43 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 793d341c..31bb6b99 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -182,16 +182,14 @@ where /// &mut renderer, /// ); /// - /// for event in events.drain(..) { - /// // Update the user interface - /// let _event_status = user_interface.update( - /// event, - /// cursor_position, - /// None, - /// &renderer, - /// &mut messages - /// ); - /// } + /// // Update the user interface + /// let event_statuses = user_interface.update( + /// &events, + /// cursor_position, + /// None, + /// &renderer, + /// &mut messages + /// ); /// /// cache = user_interface.into_cache(); /// @@ -203,13 +201,13 @@ where /// ``` pub fn update( &mut self, - event: Event, + events: &[Event], cursor_position: Point, clipboard: Option<&dyn Clipboard>, renderer: &Renderer, messages: &mut Vec, - ) -> event::Status { - let (base_cursor, overlay_status) = if let Some(mut overlay) = + ) -> Vec { + let (base_cursor, overlay_statuses) = if let Some(mut overlay) = self.root.overlay(Layout::new(&self.base.layout)) { let layer = Self::overlay_layer( @@ -219,14 +217,20 @@ where renderer, ); - let event_status = overlay.on_event( - event.clone(), - Layout::new(&layer.layout), - cursor_position, - messages, - renderer, - clipboard, - ); + let event_statuses = events + .iter() + .cloned() + .map(|event| { + overlay.on_event( + event, + Layout::new(&layer.layout), + cursor_position, + messages, + renderer, + clipboard, + ) + }) + .collect(); let base_cursor = if layer.layout.bounds().contains(cursor_position) { @@ -238,21 +242,28 @@ where self.overlay = Some(layer); - (base_cursor, event_status) + (base_cursor, event_statuses) } else { - (cursor_position, event::Status::Ignored) + (cursor_position, vec![event::Status::Ignored; events.len()]) }; - let event_status = self.root.widget.on_event( - event, - Layout::new(&self.base.layout), - base_cursor, - messages, - renderer, - clipboard, - ); - - event_status.merge(overlay_status) + events + .iter() + .cloned() + .zip(overlay_statuses.into_iter()) + .map(|(event, overlay_status)| { + let event_status = self.root.widget.on_event( + event, + Layout::new(&self.base.layout), + base_cursor, + messages, + renderer, + clipboard, + ); + + event_status.merge(overlay_status) + }) + .collect() } /// Draws the [`UserInterface`] with the provided [`Renderer`]. @@ -305,16 +316,14 @@ where /// &mut renderer, /// ); /// - /// for event in events.drain(..) { - /// // Update the user interface - /// let _event_status = user_interface.update( - /// event, - /// cursor_position, - /// None, - /// &renderer, - /// &mut messages - /// ); - /// } + /// // Update the user interface + /// let event_statuses = user_interface.update( + /// &events, + /// cursor_position, + /// None, + /// &renderer, + /// &mut messages + /// ); /// /// // Draw the user interface /// let mouse_cursor = user_interface.draw(&mut renderer, cursor_position); -- cgit