Skip to content

Commit aa09bd4

Browse files
committed
fix: process component overlay events together with those of the original element
1 parent 48b2264 commit aa09bd4

File tree

1 file changed

+20
-31
lines changed

1 file changed

+20
-31
lines changed

lazy/src/component.rs

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ where
2424
state: RefCell::new(Some(
2525
StateBuilder {
2626
component: Box::new(component),
27+
overlay_events: None,
2728
cache_builder: |state| {
2829
Some(
2930
CacheBuilder {
@@ -55,6 +56,7 @@ struct Instance<'a, Message, Renderer, Event> {
5556
#[self_referencing]
5657
struct State<'a, Message: 'a, Renderer: 'a, Event: 'a> {
5758
component: Box<dyn Component<Message, Renderer, Event = Event> + 'a>,
59+
overlay_events: Option<Vec<Event>>,
5860

5961
#[borrows(mut component)]
6062
#[covariant]
@@ -103,6 +105,17 @@ impl<'a, Message, Renderer, Event> Instance<'a, Message, Renderer, Event> {
103105
result
104106
})
105107
}
108+
109+
fn with_overlay_events_mut<T>(
110+
&self,
111+
f: impl FnOnce(&mut Option<Vec<Event>>) -> T,
112+
) -> T {
113+
self.state
114+
.borrow_mut()
115+
.as_mut()
116+
.unwrap()
117+
.with_overlay_events_mut(f)
118+
}
106119
}
107120

108121
impl<'a, Message, Renderer, Event> Widget<Message, Renderer>
@@ -135,7 +148,9 @@ where
135148
clipboard: &mut dyn Clipboard,
136149
shell: &mut Shell<'_, Message>,
137150
) -> event::Status {
138-
let mut local_messages = Vec::new();
151+
let mut local_messages = self
152+
.with_overlay_events_mut(|overlay_events| overlay_events.take())
153+
.unwrap_or_default();
139154
let mut local_shell = Shell::new(&mut local_messages);
140155

141156
let event_status = self.with_element_mut(|element| {
@@ -168,6 +183,7 @@ where
168183
*self.state.borrow_mut() = Some(
169184
StateBuilder {
170185
component,
186+
overlay_events: None,
171187
cache_builder: |state| {
172188
Some(
173189
CacheBuilder {
@@ -371,36 +387,9 @@ where
371387
});
372388

373389
if !local_messages.is_empty() {
374-
let mut component =
375-
self.instance.state.take().unwrap().into_heads().component;
376-
377-
for message in local_messages
378-
.into_iter()
379-
.filter_map(|message| component.update(message))
380-
{
381-
shell.publish(message);
382-
}
383-
384-
self.instance.state = RefCell::new(Some(
385-
StateBuilder {
386-
component,
387-
cache_builder: |state| {
388-
Some(
389-
CacheBuilder {
390-
element: state.view(),
391-
message: PhantomData,
392-
overlay_builder: |element| {
393-
element.overlay(layout)
394-
},
395-
}
396-
.build(),
397-
)
398-
},
399-
}
400-
.build(),
401-
));
402-
403-
shell.invalidate_layout();
390+
self.instance.with_overlay_events_mut(|overlay_events| {
391+
*overlay_events = Some(local_messages)
392+
});
404393
}
405394

406395
event_status

0 commit comments

Comments
 (0)