Preserve stacking order ID order when reusing cached view state

Co-Authored-By: Antonio Scandurra <antonio@zed.dev>
This commit is contained in:
Julia 2024-01-22 10:50:52 -05:00
parent 831769ce8c
commit 455d5eeb89
2 changed files with 8 additions and 2 deletions

View file

@ -23,6 +23,7 @@ impl<V> Sealed for View<V> {}
#[doc(hidden)] #[doc(hidden)]
pub struct AnyViewState { pub struct AnyViewState {
root_style: Style, root_style: Style,
next_stacking_order_id: u16,
cache_key: Option<ViewCacheKey>, cache_key: Option<ViewCacheKey>,
element: Option<AnyElement>, element: Option<AnyElement>,
} }
@ -292,6 +293,7 @@ impl Element for AnyView {
let root_style = cx.layout_style(layout_id).unwrap().clone(); let root_style = cx.layout_style(layout_id).unwrap().clone();
let state = AnyViewState { let state = AnyViewState {
root_style, root_style,
next_stacking_order_id: 0,
cache_key: None, cache_key: None,
element: Some(element), element: Some(element),
}; };
@ -314,7 +316,7 @@ impl Element for AnyView {
&& !cx.window.dirty_views.contains(&self.entity_id()) && !cx.window.dirty_views.contains(&self.entity_id())
&& !cx.window.refreshing && !cx.window.refreshing
{ {
cx.reuse_view(); cx.reuse_view(state.next_stacking_order_id);
return; return;
} }
} }
@ -326,6 +328,7 @@ impl Element for AnyView {
element.draw(bounds.origin, bounds.size.into(), cx); element.draw(bounds.origin, bounds.size.into(), cx);
} }
state.next_stacking_order_id = cx.window.next_frame.next_stacking_order_id;
state.cache_key = Some(ViewCacheKey { state.cache_key = Some(ViewCacheKey {
bounds, bounds,
stacking_order: cx.stacking_order().clone(), stacking_order: cx.stacking_order().clone(),

View file

@ -292,7 +292,7 @@ impl<'a> VisualContext for ElementContext<'a> {
} }
impl<'a> ElementContext<'a> { impl<'a> ElementContext<'a> {
pub(crate) fn reuse_view(&mut self) { pub(crate) fn reuse_view(&mut self, next_stacking_order_id: u16) {
let view_id = self.parent_view_id(); let view_id = self.parent_view_id();
let grafted_view_ids = self let grafted_view_ids = self
.cx .cx
@ -333,6 +333,9 @@ impl<'a> ElementContext<'a> {
self.window.next_frame.requested_cursor_style = Some(style); self.window.next_frame.requested_cursor_style = Some(style);
} }
} }
debug_assert!(next_stacking_order_id >= self.window.next_frame.next_stacking_order_id);
self.window.next_frame.next_stacking_order_id = next_stacking_order_id;
} }
pub fn with_text_style<F, R>(&mut self, style: Option<TextStyleRefinement>, f: F) -> R pub fn with_text_style<F, R>(&mut self, style: Option<TextStyleRefinement>, f: F) -> R