diff options
author | 2022-05-13 19:07:54 +0200 | |
---|---|---|
committer | 2022-05-13 19:07:54 +0200 | |
commit | 296e157dcf2efe1ae52ae6cc35060b2f0cf212bf (patch) | |
tree | f4d3c8a5307e4171d33cfda555aff7545bc46315 /native/src/user_interface.rs | |
parent | 4c98de0a53b9a59a3a03cee0c5d7ce34ac434067 (diff) | |
download | iced-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.rs | 67 |
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() |