fix: prevent building overlay with stale layout

This commit is contained in:
Nick Senger 2022-05-10 17:18:08 -07:00
parent d4ed8afa1e
commit 3be8f6e989
No known key found for this signature in database
GPG key ID: F905159224DB77D8
2 changed files with 63 additions and 13 deletions

View file

@ -376,6 +376,38 @@ where
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
if self
.instance
.state
.borrow()
.as_ref()
.and_then(|state| state.borrow_cache().as_ref())
.and_then(|cache| cache.borrow_overlay().as_ref())
.is_none()
{
let component =
self.instance.state.take().unwrap().into_heads().component;
self.instance.state = RefCell::new(Some(
StateBuilder {
component,
message: PhantomData,
cache_builder: |state| {
Some(
CacheBuilder {
element: state.view(),
overlay_builder: |element| {
element.overlay(layout, renderer)
},
}
.build(),
)
},
}
.build(),
));
}
let event_status = self
.with_overlay_mut_maybe(|overlay| {
overlay.on_event(
@ -410,9 +442,7 @@ where
Some(
CacheBuilder {
element: state.view(),
overlay_builder: |element| {
element.overlay(layout, renderer)
},
overlay_builder: |_| None,
}
.build(),
)

View file

@ -415,6 +415,35 @@ where
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
if self
.overlay
.as_ref()
.and_then(|overlay| overlay.borrow_overlay().as_ref())
.is_none()
{
let overlay = self.overlay.take().unwrap().into_heads();
self.overlay = Some(
OverlayBuilder {
instance: overlay.instance,
instance_ref_builder: |instance| instance.state.borrow(),
tree: overlay.tree,
types: PhantomData,
overlay_builder: |instance, tree| {
instance
.as_ref()
.unwrap()
.borrow_element()
.as_ref()
.unwrap()
.as_widget()
.overlay(&mut tree.children[0], layout, renderer)
},
}
.build(),
);
}
let event_status = self
.with_overlay_mut_maybe(|overlay| {
overlay.on_event(
@ -464,16 +493,7 @@ where
instance_ref_builder: |instance| instance.state.borrow(),
tree: overlay.tree,
types: PhantomData,
overlay_builder: |instance, tree| {
instance
.as_ref()
.unwrap()
.borrow_element()
.as_ref()
.unwrap()
.as_widget()
.overlay(&mut tree.children[0], layout, renderer)
},
overlay_builder: |_, _| None,
}
.build(),
);