@@ -1103,6 +1103,7 @@ impl Element for List {
);
state.items = new_items;
+ state.measuring_behavior.reset();
}
let padding = style
@@ -1348,6 +1349,41 @@ mod test {
assert_eq!(offset.offset_in_item, px(0.));
}
+ #[gpui::test]
+ fn test_measure_all_after_width_change(cx: &mut TestAppContext) {
+ let cx = cx.add_empty_window();
+
+ let state = ListState::new(10, crate::ListAlignment::Top, px(0.)).measure_all();
+
+ struct TestView(ListState);
+ impl Render for TestView {
+ fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
+ list(self.0.clone(), |_, _, _| {
+ div().h(px(50.)).w_full().into_any()
+ })
+ .w_full()
+ .h_full()
+ }
+ }
+
+ let view = cx.update(|_, cx| cx.new(|_| TestView(state.clone())));
+
+ // First draw at width 100: all 10 items measured (total 500px).
+ // Viewport is 200px, so max scroll offset should be 300px.
+ cx.draw(point(px(0.), px(0.)), size(px(100.), px(200.)), |_, _| {
+ view.clone().into_any_element()
+ });
+ assert_eq!(state.max_offset_for_scrollbar().y, px(300.));
+
+ // Second draw at a different width: items get invalidated.
+ // Without the fix, max_offset would drop because unmeasured items
+ // contribute 0 height.
+ cx.draw(point(px(0.), px(0.)), size(px(200.), px(200.)), |_, _| {
+ view.into_any_element()
+ });
+ assert_eq!(state.max_offset_for_scrollbar().y, px(300.));
+ }
+
#[gpui::test]
fn test_remeasure(cx: &mut TestAppContext) {
let cx = cx.add_empty_window();