diff --git a/crates/gpui/src/presenter.rs b/crates/gpui/src/presenter.rs index e4aae8fbd9..8cf9e99063 100644 --- a/crates/gpui/src/presenter.rs +++ b/crates/gpui/src/presenter.rs @@ -984,7 +984,7 @@ impl ChildView { } impl Element for ChildView { - type LayoutState = (); + type LayoutState = bool; type PaintState = (); fn layout( @@ -992,18 +992,27 @@ impl Element for ChildView { constraint: SizeConstraint, cx: &mut LayoutContext, ) -> (Vector2F, Self::LayoutState) { - let size = cx.layout(self.view.id(), constraint); - (size, ()) + if cx.rendered_views.contains_key(&self.view.id()) { + let size = cx.layout(self.view.id(), constraint); + (size, true) + } else { + log::error!("layout called on a view that was not rendered"); + (Vector2F::zero(), false) + } } fn paint( &mut self, bounds: RectF, visible_bounds: RectF, - _: &mut Self::LayoutState, + view_is_valid: &mut Self::LayoutState, cx: &mut PaintContext, - ) -> Self::PaintState { - cx.paint(self.view.id(), bounds.origin(), visible_bounds); + ) { + if *view_is_valid { + cx.paint(self.view.id(), bounds.origin(), visible_bounds); + } else { + log::error!("paint called on a view that was not rendered"); + } } fn dispatch_event( @@ -1011,11 +1020,16 @@ impl Element for ChildView { event: &Event, _: RectF, _: RectF, - _: &mut Self::LayoutState, + view_is_valid: &mut Self::LayoutState, _: &mut Self::PaintState, cx: &mut EventContext, ) -> bool { - cx.dispatch_event(self.view.id(), event) + if *view_is_valid { + cx.dispatch_event(self.view.id(), event) + } else { + log::error!("dispatch_event called on a view that was not rendered"); + false + } } fn rect_for_text_range( @@ -1023,11 +1037,15 @@ impl Element for ChildView { range_utf16: Range, _: RectF, _: RectF, - _: &Self::LayoutState, + view_is_valid: &Self::LayoutState, _: &Self::PaintState, cx: &MeasurementContext, ) -> Option { - cx.rect_for_text_range(self.view.id(), range_utf16) + if *view_is_valid { + cx.rect_for_text_range(self.view.id(), range_utf16) + } else { + None + } } fn debug(