Fix responsive, component, and lazy always returning an overlay

This commit is contained in:
Héctor Ramón Jiménez 2024-10-04 17:05:32 +02:00
parent fca5d8038a
commit d057b16153
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
3 changed files with 78 additions and 59 deletions

View file

@ -270,29 +270,40 @@ where
renderer: &Renderer, renderer: &Renderer,
translation: Vector, translation: Vector,
) -> Option<overlay::Element<'_, Message, Theme, Renderer>> { ) -> Option<overlay::Element<'_, Message, Theme, Renderer>> {
let overlay = Overlay(Some( let overlay = InnerBuilder {
InnerBuilder { cell: self.element.borrow().as_ref().unwrap().clone(),
cell: self.element.borrow().as_ref().unwrap().clone(), element: self
element: self .element
.element .borrow()
.borrow() .as_ref()
.as_ref() .unwrap()
.unwrap() .borrow_mut()
.borrow_mut() .take()
.take() .unwrap(),
.unwrap(), tree: &mut tree.children[0],
tree: &mut tree.children[0], overlay_builder: |element, tree| {
overlay_builder: |element, tree| { element
element .as_widget_mut()
.as_widget_mut() .overlay(tree, layout, renderer, translation)
.overlay(tree, layout, renderer, translation) .map(|overlay| RefCell::new(Nested::new(overlay)))
.map(|overlay| RefCell::new(Nested::new(overlay))) },
}, }
} .build();
.build(),
));
Some(overlay::Element::new(Box::new(overlay))) #[allow(clippy::redundant_closure_for_method_calls)]
if overlay.with_overlay(|overlay| overlay.is_some()) {
Some(overlay::Element::new(Box::new(Overlay(Some(overlay)))))
} else {
let heads = overlay.into_heads();
// - You may not like it, but this is what peak performance looks like
// - TODO: Get rid of ouroboros, for good
// - What?!
*self.element.borrow().as_ref().unwrap().borrow_mut() =
Some(heads.element);
None
}
} }
} }

View file

@ -446,44 +446,48 @@ where
) -> Option<overlay::Element<'b, Message, Theme, Renderer>> { ) -> Option<overlay::Element<'b, Message, Theme, Renderer>> {
self.rebuild_element_if_necessary(); self.rebuild_element_if_necessary();
let tree = tree let state = tree.state.downcast_mut::<Rc<RefCell<Option<Tree>>>>();
.state let tree = state.borrow_mut().take().unwrap();
.downcast_mut::<Rc<RefCell<Option<Tree>>>>()
.borrow_mut()
.take()
.unwrap();
let overlay = Overlay(Some( let overlay = InnerBuilder {
InnerBuilder { instance: self,
instance: self, tree,
tree, types: PhantomData,
types: PhantomData, overlay_builder: |instance, tree| {
overlay_builder: |instance, tree| { instance.state.get_mut().as_mut().unwrap().with_element_mut(
instance.state.get_mut().as_mut().unwrap().with_element_mut( move |element| {
move |element| { element
element .as_mut()
.as_mut() .unwrap()
.unwrap() .as_widget_mut()
.as_widget_mut() .overlay(
.overlay( &mut tree.children[0],
&mut tree.children[0], layout,
layout, renderer,
renderer, translation,
translation, )
) .map(|overlay| RefCell::new(Nested::new(overlay)))
.map(|overlay| { },
RefCell::new(Nested::new(overlay)) )
}) },
}, }
) .build();
},
}
.build(),
));
Some(overlay::Element::new(Box::new(OverlayInstance { #[allow(clippy::redundant_closure_for_method_calls)]
overlay: Some(overlay), if overlay.with_overlay(|overlay| overlay.is_some()) {
}))) Some(overlay::Element::new(Box::new(OverlayInstance {
overlay: Some(Overlay(Some(overlay))), // Beautiful, I know
})))
} else {
let heads = overlay.into_heads();
// - You may not like it, but this is what peak performance looks like
// - TODO: Get rid of ouroboros, for good
// - What?!
*state.borrow_mut() = Some(heads.tree);
None
}
} }
} }

View file

@ -320,7 +320,11 @@ where
} }
.build(); .build();
Some(overlay::Element::new(Box::new(overlay))) if overlay.with_overlay(|(overlay, _layout)| overlay.is_some()) {
Some(overlay::Element::new(Box::new(overlay)))
} else {
None
}
} }
} }