diff --git a/gpui/src/app.rs b/gpui/src/app.rs index 5b6d3d87a35aef0c0d38aeb346fcd532c41f1c26..3610957634b0bc7cf58ea634580ce1963f023e86 100644 --- a/gpui/src/app.rs +++ b/gpui/src/app.rs @@ -1431,7 +1431,8 @@ impl MutableAppContext { { let mut presenter = presenter.borrow_mut(); presenter.invalidate(invalidation, self); - let scene = presenter.build_scene(window.size(), window.scale_factor(), self); + let scene = + presenter.build_scene(window.size(), window.scale_factor(), false, self); window.present_scene(scene); } self.presenters_and_platform_windows @@ -1461,7 +1462,7 @@ impl MutableAppContext { .take(); let mut presenter = presenter.borrow_mut(); presenter.refresh(invalidation, self); - let scene = presenter.build_scene(window.size(), window.scale_factor(), self); + let scene = presenter.build_scene(window.size(), window.scale_factor(), true, self); window.present_scene(scene); } self.presenters_and_platform_windows = presenters; diff --git a/gpui/src/elements/list.rs b/gpui/src/elements/list.rs index a86d5d2f22216bdd3d92483d65abbd3e73d9ec9f..e207b4729755f68722dc89bb3c054a9ed0603836 100644 --- a/gpui/src/elements/list.rs +++ b/gpui/src/elements/list.rs @@ -98,7 +98,7 @@ impl Element for List { item_constraint.min.set_y(0.); item_constraint.max.set_y(f32::INFINITY); - if state.last_layout_width != Some(size.x()) { + if cx.refreshing || state.last_layout_width != Some(size.x()) { state.rendered_range = 0..0; state.items = SumTree::from_iter( (0..state.items.summary().count).map(|_| ListItem::Unrendered), @@ -578,7 +578,7 @@ mod tests { }); let mut list = List::new(state.clone()); - let (size, _) = list.layout(constraint, &mut presenter.build_layout_context(cx)); + let (size, _) = list.layout(constraint, &mut presenter.build_layout_context(false, cx)); assert_eq!(size, vec2f(100., 40.)); assert_eq!( state.0.borrow().items.summary(), @@ -601,7 +601,7 @@ mod tests { &mut presenter.build_event_context(cx), ); let (_, logical_scroll_top) = - list.layout(constraint, &mut presenter.build_layout_context(cx)); + list.layout(constraint, &mut presenter.build_layout_context(false, cx)); assert_eq!( logical_scroll_top, ListOffset { @@ -626,7 +626,7 @@ mod tests { ); let (size, logical_scroll_top) = - list.layout(constraint, &mut presenter.build_layout_context(cx)); + list.layout(constraint, &mut presenter.build_layout_context(false, cx)); assert_eq!(size, vec2f(100., 40.)); assert_eq!( state.0.borrow().items.summary(), @@ -738,7 +738,7 @@ mod tests { let mut list = List::new(state.clone()); let (size, logical_scroll_top) = list.layout( SizeConstraint::new(vec2f(0., 0.), vec2f(width, height)), - &mut presenter.build_layout_context(cx), + &mut presenter.build_layout_context(false, cx), ); assert_eq!(size, vec2f(width, height)); last_logical_scroll_top = Some(logical_scroll_top); diff --git a/gpui/src/presenter.rs b/gpui/src/presenter.rs index eddddea3424e947dd90701ddfe5b87e1400e0682..c0b26bbcc4449474fbbfe7d77ba72b9a5c31657f 100644 --- a/gpui/src/presenter.rs +++ b/gpui/src/presenter.rs @@ -97,12 +97,13 @@ impl Presenter { &mut self, window_size: Vector2F, scale_factor: f32, + refreshing: bool, cx: &mut MutableAppContext, ) -> Scene { let mut scene = Scene::new(scale_factor); if let Some(root_view_id) = cx.root_view_id(self.window_id) { - self.layout(window_size, cx); + self.layout(window_size, refreshing, cx); let mut paint_cx = PaintContext { scene: &mut scene, font_cache: &self.font_cache, @@ -123,20 +124,22 @@ impl Presenter { scene } - fn layout(&mut self, size: Vector2F, cx: &mut MutableAppContext) { + fn layout(&mut self, size: Vector2F, refreshing: bool, cx: &mut MutableAppContext) { if let Some(root_view_id) = cx.root_view_id(self.window_id) { - self.build_layout_context(cx) + self.build_layout_context(refreshing, cx) .layout(root_view_id, SizeConstraint::strict(size)); } } pub fn build_layout_context<'a>( &'a mut self, + refreshing: bool, cx: &'a mut MutableAppContext, ) -> LayoutContext<'a> { LayoutContext { rendered_views: &mut self.rendered_views, parents: &mut self.parents, + refreshing, font_cache: &self.font_cache, font_system: cx.platform().fonts(), text_layout_cache: &self.text_layout_cache, @@ -213,6 +216,7 @@ pub struct LayoutContext<'a> { rendered_views: &'a mut HashMap, parents: &'a mut HashMap, view_stack: Vec, + pub refreshing: bool, pub font_cache: &'a Arc, pub font_system: Arc, pub text_layout_cache: &'a TextLayoutCache,