diff options
author | 2021-12-13 16:12:47 -0800 | |
---|---|---|
committer | 2021-12-13 16:52:31 -0800 | |
commit | aa09bd4a981cfe0e11a21220193e823f48cdf450 (patch) | |
tree | 876219070b5970ab3f954a7b26cfb933bd2bdf53 /lazy | |
parent | 48b2264bc6026e4b4b00791fef5ce34d464abc17 (diff) | |
download | iced-aa09bd4a981cfe0e11a21220193e823f48cdf450.tar.gz iced-aa09bd4a981cfe0e11a21220193e823f48cdf450.tar.bz2 iced-aa09bd4a981cfe0e11a21220193e823f48cdf450.zip |
fix: process component overlay events together with those of the original element
Diffstat (limited to 'lazy')
-rw-r--r-- | lazy/src/component.rs | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/lazy/src/component.rs b/lazy/src/component.rs index 9b036b61..998e2198 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -24,6 +24,7 @@ where state: RefCell::new(Some( StateBuilder { component: Box::new(component), + overlay_events: None, cache_builder: |state| { Some( CacheBuilder { @@ -55,6 +56,7 @@ struct Instance<'a, Message, Renderer, Event> { #[self_referencing] struct State<'a, Message: 'a, Renderer: 'a, Event: 'a> { component: Box<dyn Component<Message, Renderer, Event = Event> + 'a>, + overlay_events: Option<Vec<Event>>, #[borrows(mut component)] #[covariant] @@ -103,6 +105,17 @@ impl<'a, Message, Renderer, Event> Instance<'a, Message, Renderer, Event> { result }) } + + fn with_overlay_events_mut<T>( + &self, + f: impl FnOnce(&mut Option<Vec<Event>>) -> T, + ) -> T { + self.state + .borrow_mut() + .as_mut() + .unwrap() + .with_overlay_events_mut(f) + } } impl<'a, Message, Renderer, Event> Widget<Message, Renderer> @@ -135,7 +148,9 @@ where clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, ) -> event::Status { - let mut local_messages = Vec::new(); + let mut local_messages = self + .with_overlay_events_mut(|overlay_events| overlay_events.take()) + .unwrap_or_default(); let mut local_shell = Shell::new(&mut local_messages); let event_status = self.with_element_mut(|element| { @@ -168,6 +183,7 @@ where *self.state.borrow_mut() = Some( StateBuilder { component, + overlay_events: None, cache_builder: |state| { Some( CacheBuilder { @@ -371,36 +387,9 @@ where }); if !local_messages.is_empty() { - let mut component = - self.instance.state.take().unwrap().into_heads().component; - - for message in local_messages - .into_iter() - .filter_map(|message| component.update(message)) - { - shell.publish(message); - } - - self.instance.state = RefCell::new(Some( - StateBuilder { - component, - cache_builder: |state| { - Some( - CacheBuilder { - element: state.view(), - message: PhantomData, - overlay_builder: |element| { - element.overlay(layout) - }, - } - .build(), - ) - }, - } - .build(), - )); - - shell.invalidate_layout(); + self.instance.with_overlay_events_mut(|overlay_events| { + *overlay_events = Some(local_messages) + }); } event_status |