Save last layout width in `List` to avoid unnecessary re-renders

Antonio Scandurra created

Change summary

gpui/src/elements/list.rs | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)

Detailed changes

gpui/src/elements/list.rs 🔗

@@ -17,7 +17,7 @@ pub struct List {
 #[derive(Clone)]
 pub struct ListState(Rc<RefCell<StateInner>>);
 
-#[derive(Clone, Copy, Eq, PartialEq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
 pub enum Orientation {
     Top,
     Bottom,
@@ -47,6 +47,16 @@ enum ListItem {
     Removed(f32),
 }
 
+impl std::fmt::Debug for ListItem {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Self::Unrendered => write!(f, "Unrendered"),
+            Self::Rendered(_) => f.debug_tuple("Rendered").finish(),
+            Self::Removed(height) => f.debug_tuple("Removed").field(height).finish(),
+        }
+    }
+}
+
 #[derive(Clone, Debug, Default, PartialEq)]
 struct ListItemSummary {
     count: usize,
@@ -228,7 +238,8 @@ impl Element for List {
         drop(cursor);
         state.items = new_items;
         state.rendered_range = new_rendered_range_start..new_rendered_range_end;
-        (constraint.max, scroll_top)
+        state.last_layout_width = Some(size.x());
+        (size, scroll_top)
     }
 
     fn paint(&mut self, bounds: RectF, scroll_top: &mut ScrollTop, cx: &mut PaintContext) {