diff --git a/crates/gpui/src/elements/uniform_list.rs b/crates/gpui/src/elements/uniform_list.rs index c320f2662e..de217a017c 100644 --- a/crates/gpui/src/elements/uniform_list.rs +++ b/crates/gpui/src/elements/uniform_list.rs @@ -44,7 +44,7 @@ pub struct LayoutState { pub struct UniformList { state: UniformListState, item_count: usize, - append_items: Box, &mut Vec, &mut LayoutContext) -> bool>, + append_items: Box, &mut Vec, &mut LayoutContext)>, padding_top: f32, padding_bottom: f32, get_width_from_item: Option, @@ -70,9 +70,6 @@ impl UniformList { cx.render(&handle, |view, cx| { append_items(view, range, items, cx); }); - true - } else { - false } }), padding_top: 0., @@ -172,40 +169,51 @@ impl Element for UniformList { ); } + let no_items = ( + constraint.min, + LayoutState { + item_height: 0., + scroll_max: 0., + items: Default::default(), + }, + ); + if self.item_count == 0 { - return ( - constraint.min, - LayoutState { - item_height: 0., - scroll_max: 0., - items: Default::default(), - }, - ); + return no_items; } let mut items = Vec::new(); let mut size = constraint.max; let mut item_size; let sample_item_ix; - let mut sample_item; + let sample_item; if let Some(sample_ix) = self.get_width_from_item { (self.append_items)(sample_ix..sample_ix + 1, &mut items, cx); sample_item_ix = sample_ix; - sample_item = items.pop().unwrap(); - item_size = sample_item.layout(constraint, cx); - size.set_x(item_size.x()); + + if let Some(mut item) = items.pop() { + item_size = item.layout(constraint, cx); + size.set_x(item_size.x()); + sample_item = item; + } else { + return no_items; + } } else { (self.append_items)(0..1, &mut items, cx); sample_item_ix = 0; - sample_item = items.pop().unwrap(); - item_size = sample_item.layout( - SizeConstraint::new( - vec2f(constraint.max.x(), 0.0), - vec2f(constraint.max.x(), f32::INFINITY), - ), - cx, - ); - item_size.set_x(size.x()); + if let Some(mut item) = items.pop() { + item_size = item.layout( + SizeConstraint::new( + vec2f(constraint.max.x(), 0.0), + vec2f(constraint.max.x(), f32::INFINITY), + ), + cx, + ); + item_size.set_x(size.x()); + sample_item = item + } else { + return no_items; + } } let item_constraint = SizeConstraint {