Change summary
crates/gpui/src/app.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
Detailed changes
@@ -7044,4 +7044,73 @@ mod tests {
cx.simulate_window_activation(Some(window_3));
assert_eq!(mem::take(&mut *events.borrow_mut()), []);
}
+
+ #[crate::test(self)]
+ fn test_child_view(cx: &mut MutableAppContext) {
+ struct Child {
+ rendered: Rc<Cell<bool>>,
+ dropped: Rc<Cell<bool>>,
+ }
+
+ impl super::Entity for Child {
+ type Event = ();
+ }
+
+ impl super::View for Child {
+ fn ui_name() -> &'static str {
+ "child view"
+ }
+
+ fn render(&mut self, _: &mut RenderContext<Self>) -> ElementBox {
+ self.rendered.set(true);
+ Empty::new().boxed()
+ }
+ }
+
+ impl Drop for Child {
+ fn drop(&mut self) {
+ self.dropped.set(true);
+ }
+ }
+
+ struct Parent {
+ child: Option<ViewHandle<Child>>,
+ }
+
+ impl super::Entity for Parent {
+ type Event = ();
+ }
+
+ impl super::View for Parent {
+ fn ui_name() -> &'static str {
+ "parent view"
+ }
+
+ fn render(&mut self, cx: &mut RenderContext<Self>) -> ElementBox {
+ if let Some(child) = self.child.as_ref() {
+ ChildView::new(child, cx).boxed()
+ } else {
+ Empty::new().boxed()
+ }
+ }
+ }
+
+ let child_rendered = Rc::new(Cell::new(false));
+ let child_dropped = Rc::new(Cell::new(false));
+ let (_, root_view) = cx.add_window(Default::default(), |cx| Parent {
+ child: Some(cx.add_view(|_| Child {
+ rendered: child_rendered.clone(),
+ dropped: child_dropped.clone(),
+ })),
+ });
+ assert!(child_rendered.take());
+ assert!(!child_dropped.take());
+
+ root_view.update(cx, |view, cx| {
+ view.child.take();
+ cx.notify();
+ });
+ assert!(!child_rendered.take());
+ assert!(child_dropped.take());
+ }
}