summaryrefslogtreecommitdiffstats
path: root/native/src/user_interface.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-05-13 19:07:54 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-05-13 19:07:54 +0200
commit296e157dcf2efe1ae52ae6cc35060b2f0cf212bf (patch)
treef4d3c8a5307e4171d33cfda555aff7545bc46315 /native/src/user_interface.rs
parent4c98de0a53b9a59a3a03cee0c5d7ce34ac434067 (diff)
downloadiced-296e157dcf2efe1ae52ae6cc35060b2f0cf212bf.tar.gz
iced-296e157dcf2efe1ae52ae6cc35060b2f0cf212bf.tar.bz2
iced-296e157dcf2efe1ae52ae6cc35060b2f0cf212bf.zip
Relayout base layer when layout is invalidated from an overlay
Diffstat (limited to 'native/src/user_interface.rs')
-rw-r--r--native/src/user_interface.rs67
1 files changed, 45 insertions, 22 deletions
diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs
index f80786aa..785ee56a 100644
--- a/native/src/user_interface.rs
+++ b/native/src/user_interface.rs
@@ -177,40 +177,61 @@ where
clipboard: &mut dyn Clipboard,
messages: &mut Vec<Message>,
) -> (State, Vec<event::Status>) {
+ use std::mem::ManuallyDrop;
+
let mut state = State::Updated;
+ let mut manual_overlay = ManuallyDrop::new(
+ self.root.overlay(Layout::new(&self.base), renderer),
+ );
- let (base_cursor, overlay_statuses) = if let Some(mut overlay) =
- self.root.overlay(Layout::new(&self.base), renderer)
- {
+ let (base_cursor, overlay_statuses) = if manual_overlay.is_some() {
let bounds = self.bounds;
+
+ let mut overlay = manual_overlay.as_mut().unwrap();
let mut layout = overlay.layout(renderer, bounds);
+ let mut event_statuses = Vec::new();
- let event_statuses = events
- .iter()
- .cloned()
- .map(|event| {
- let mut shell = Shell::new(messages);
+ for event in events.iter().cloned() {
+ let mut shell = Shell::new(messages);
- let event_status = overlay.on_event(
- event,
- Layout::new(&layout),
- cursor_position,
- renderer,
- clipboard,
- &mut shell,
+ let event_status = overlay.on_event(
+ event,
+ Layout::new(&layout),
+ cursor_position,
+ renderer,
+ clipboard,
+ &mut shell,
+ );
+
+ event_statuses.push(event_status);
+
+ if shell.is_layout_invalid() {
+ let _ = ManuallyDrop::into_inner(manual_overlay);
+
+ self.base = renderer.layout(
+ &self.root,
+ &layout::Limits::new(Size::ZERO, self.bounds),
+ );
+
+ manual_overlay = ManuallyDrop::new(
+ self.root.overlay(Layout::new(&self.base), renderer),
);
+ if manual_overlay.is_none() {
+ break;
+ }
+
+ overlay = manual_overlay.as_mut().unwrap();
+
shell.revalidate_layout(|| {
layout = overlay.layout(renderer, bounds);
});
+ }
- if shell.are_widgets_invalid() {
- state = State::Outdated;
- }
-
- event_status
- })
- .collect();
+ if shell.are_widgets_invalid() {
+ state = State::Outdated;
+ }
+ }
let base_cursor = if layout.bounds().contains(cursor_position) {
// TODO: Type-safe cursor availability
@@ -226,6 +247,8 @@ where
(cursor_position, vec![event::Status::Ignored; events.len()])
};
+ let _ = ManuallyDrop::into_inner(manual_overlay);
+
let event_statuses = events
.iter()
.cloned()