Don't use stale layout when view cache is invalidated in GPUI (#7914)

Antonio Scandurra and Nathan created

When a view is invalidated, we want to participate in Taffy layout with
an accurate style rather than the dummy style we use when a view is
cached. Previously, we only detected invalidation during paint. This
adds logic to layout as well to avoid using the dummy style when dirty.

Release Notes:

- N/A

---------

Co-authored-by: Nathan <nathan@zed.dev>

Change summary

crates/gpui/src/view.rs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)

Detailed changes

crates/gpui/src/view.rs 🔗

@@ -282,7 +282,10 @@ impl Element for AnyView {
         cx: &mut ElementContext,
     ) -> (LayoutId, Self::State) {
         cx.with_view_id(self.entity_id(), |cx| {
-            if self.cache {
+            if self.cache
+                && !cx.window.dirty_views.contains(&self.entity_id())
+                && !cx.window.refreshing
+            {
                 if let Some(state) = state {
                     let layout_id = cx.request_layout(&state.root_style, None);
                     return (layout_id, state);
@@ -313,8 +316,6 @@ impl Element for AnyView {
                     && cache_key.content_mask == cx.content_mask()
                     && cache_key.stacking_order == *cx.stacking_order()
                     && cache_key.text_style == cx.text_style()
-                    && !cx.window.dirty_views.contains(&self.entity_id())
-                    && !cx.window.refreshing
                 {
                     cx.reuse_view(state.next_stacking_order_id);
                     return;