summaryrefslogtreecommitdiffstats
path: root/native/src/user_interface.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/user_interface.rs')
-rw-r--r--native/src/user_interface.rs54
1 files changed, 44 insertions, 10 deletions
diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs
index f44ed1fb..5d24bf4f 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};
+use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size};
use std::hash::Hasher;
@@ -179,7 +179,7 @@ where
/// let event_statuses = user_interface.update(
/// &events,
/// cursor_position,
- /// &renderer,
+ /// &mut renderer,
/// &mut clipboard,
/// &mut messages
/// );
@@ -196,16 +196,18 @@ where
&mut self,
events: &[Event],
cursor_position: Point,
- renderer: &Renderer,
+ renderer: &mut Renderer,
clipboard: &mut dyn Clipboard,
messages: &mut Vec<Message>,
) -> Vec<event::Status> {
let (base_cursor, overlay_statuses) = if let Some(mut overlay) =
self.root.overlay(Layout::new(&self.base.layout))
{
- let layer = Self::overlay_layer(
+ let bounds = self.bounds;
+
+ let mut layer = Self::overlay_layer(
self.overlay.take(),
- self.bounds,
+ bounds,
&mut overlay,
renderer,
);
@@ -214,14 +216,27 @@ where
.iter()
.cloned()
.map(|event| {
- overlay.on_event(
+ let mut shell = Shell::new(messages);
+
+ let event_status = overlay.on_event(
event,
Layout::new(&layer.layout),
cursor_position,
renderer,
clipboard,
- messages,
- )
+ &mut shell,
+ );
+
+ shell.with_invalid_layout(|| {
+ layer = Self::overlay_layer(
+ None,
+ bounds,
+ &mut overlay,
+ renderer,
+ );
+ });
+
+ event_status
})
.collect();
@@ -245,15 +260,34 @@ where
.cloned()
.zip(overlay_statuses.into_iter())
.map(|(event, overlay_status)| {
+ let mut shell = Shell::new(messages);
+
let event_status = self.root.widget.on_event(
event,
Layout::new(&self.base.layout),
base_cursor,
renderer,
clipboard,
- messages,
+ &mut shell,
);
+ shell.with_invalid_layout(|| {
+ let hash = {
+ let hasher = &mut crate::Hasher::default();
+ self.root.hash_layout(hasher);
+
+ hasher.finish()
+ };
+
+ let layout = renderer.layout(
+ &self.root,
+ &layout::Limits::new(Size::ZERO, self.bounds),
+ );
+
+ self.base = Layer { layout, hash };
+ self.overlay = None;
+ });
+
event_status.merge(overlay_status)
})
.collect()
@@ -313,7 +347,7 @@ where
/// let event_statuses = user_interface.update(
/// &events,
/// cursor_position,
- /// &renderer,
+ /// &mut renderer,
/// &mut clipboard,
/// &mut messages
/// );