|
24 | 24 | state: RefCell::new(Some(
|
25 | 25 | StateBuilder {
|
26 | 26 | component: Box::new(component),
|
| 27 | + overlay_events: None, |
27 | 28 | cache_builder: |state| {
|
28 | 29 | Some(
|
29 | 30 | CacheBuilder {
|
@@ -55,6 +56,7 @@ struct Instance<'a, Message, Renderer, Event> {
|
55 | 56 | #[self_referencing]
|
56 | 57 | struct State<'a, Message: 'a, Renderer: 'a, Event: 'a> {
|
57 | 58 | component: Box<dyn Component<Message, Renderer, Event = Event> + 'a>,
|
| 59 | + overlay_events: Option<Vec<Event>>, |
58 | 60 |
|
59 | 61 | #[borrows(mut component)]
|
60 | 62 | #[covariant]
|
@@ -103,6 +105,17 @@ impl<'a, Message, Renderer, Event> Instance<'a, Message, Renderer, Event> {
|
103 | 105 | result
|
104 | 106 | })
|
105 | 107 | }
|
| 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 | + } |
106 | 119 | }
|
107 | 120 |
|
108 | 121 | impl<'a, Message, Renderer, Event> Widget<Message, Renderer>
|
@@ -135,7 +148,9 @@ where
|
135 | 148 | clipboard: &mut dyn Clipboard,
|
136 | 149 | shell: &mut Shell<'_, Message>,
|
137 | 150 | ) -> 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(); |
139 | 154 | let mut local_shell = Shell::new(&mut local_messages);
|
140 | 155 |
|
141 | 156 | let event_status = self.with_element_mut(|element| {
|
@@ -168,6 +183,7 @@ where
|
168 | 183 | *self.state.borrow_mut() = Some(
|
169 | 184 | StateBuilder {
|
170 | 185 | component,
|
| 186 | + overlay_events: None, |
171 | 187 | cache_builder: |state| {
|
172 | 188 | Some(
|
173 | 189 | CacheBuilder {
|
@@ -371,36 +387,9 @@ where
|
371 | 387 | });
|
372 | 388 |
|
373 | 389 | 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 | + }); |
404 | 393 | }
|
405 | 394 |
|
406 | 395 | event_status
|
|
0 commit comments