diff --git a/crates/collab_ui/src/notifications/incoming_call_notification.rs b/crates/collab_ui/src/notifications/incoming_call_notification.rs index f66194c52a0006c46c37cba2514e505c4ee5ec9b..32a8f19e30d1af14ef0147f7930a0276e4a52532 100644 --- a/crates/collab_ui/src/notifications/incoming_call_notification.rs +++ b/crates/collab_ui/src/notifications/incoming_call_notification.rs @@ -125,7 +125,7 @@ impl Render for IncomingCallNotification { cx.set_rem_size(ui_font_size); - div().size_full().font(ui_font).child( + h_flex().flex_grow().size_full().font(ui_font).child( CollabNotification::new( self.state.call.calling_user.avatar_uri.clone(), Button::new("accept", "Accept").on_click({ diff --git a/crates/collab_ui/src/notifications/project_shared_notification.rs b/crates/collab_ui/src/notifications/project_shared_notification.rs index b8ceefcd765f4e1797bcf1584ac93594a1fffdaa..af138f086ba6cf57fe6b4cfd21c1b7cc9819f74b 100644 --- a/crates/collab_ui/src/notifications/project_shared_notification.rs +++ b/crates/collab_ui/src/notifications/project_shared_notification.rs @@ -129,7 +129,7 @@ impl Render for ProjectSharedNotification { cx.set_rem_size(ui_font_size); - div().size_full().font(ui_font).child( + h_flex().flex_grow().size_full().font(ui_font).child( CollabNotification::new( self.owner.avatar_uri.clone(), Button::new("open", "Open").on_click(cx.listener(move |this, _event, cx| { diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 4be449f3cdee12fd88aece382920c1bb18f4ea1c..791a70608bc5dbcc5fc4360b085485327d038efa 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -848,7 +848,7 @@ impl CompletionsMenu { .flex_1() .px_1p5() .py_1() - .min_w(px(260.)) + .min_w(px(160.)) .max_w(px(640.)) .w(px(500.)) .overflow_y_scroll() @@ -910,7 +910,7 @@ impl CompletionsMenu { None }; - div().min_w(px(220.)).max_w(px(540.)).child( + h_flex().flex_grow().w_full().min_w(px(120.)).child( ListItem::new(mat.candidate_id) .inset(true) .selected(item_ix == selected_item) @@ -925,7 +925,7 @@ impl CompletionsMenu { ) .map(|task| task.detach_and_log_err(cx)); })) - .child(h_flex().overflow_hidden().child(completion_label)) + .child(h_flex().flex_grow().child(completion_label)) .end_slot::
(documentation_label), ) }) @@ -934,7 +934,9 @@ impl CompletionsMenu { ) .max_h(max_height) .track_scroll(self.scroll_handle.clone()) - .with_width_from_item(widest_completion_ix); + .with_width_from_item(widest_completion_ix) + .use_max_height() + .use_max_width(); Popover::new() .child(list) @@ -1076,8 +1078,11 @@ impl CodeActionsMenu { let item_ix = range.start + ix; let selected = selected_item == item_ix; let colors = cx.theme().colors(); - div() + h_flex() + .flex_grow() + .w_full() .px_2() + .min_w(px(120.)) .text_color(colors.text) .when(selected, |style| { style @@ -1121,6 +1126,8 @@ impl CodeActionsMenu { .max_by_key(|(_, action)| action.lsp_action.title.chars().count()) .map(|(ix, _)| ix), ) + .use_max_width() + .use_max_height() .into_any_element(); if self.deployed_from_indicator { diff --git a/crates/gpui/src/elements/uniform_list.rs b/crates/gpui/src/elements/uniform_list.rs index ce32b993a5592732f763712b84fa33f24e2738f4..deca91fd1d9baf9c52d2b04d4b74481f08e01734 100644 --- a/crates/gpui/src/elements/uniform_list.rs +++ b/crates/gpui/src/elements/uniform_list.rs @@ -56,6 +56,8 @@ where ..Default::default() }, scroll_handle: None, + use_max_width: false, + use_max_height: false, } } @@ -64,6 +66,8 @@ pub struct UniformList { id: ElementId, item_count: usize, item_to_measure_index: usize, + use_max_width: bool, + use_max_height: bool, render_items: Box Fn(Range, &'a mut WindowContext) -> SmallVec<[AnyElement; 64]>>, interactivity: Interactivity, @@ -280,19 +284,40 @@ impl UniformList { self } + /// Forces the list to use the `AvailableSpace::MaxContent` for its items width during laying out. + pub fn use_max_width(mut self) -> Self { + self.use_max_width = true; + self + } + + /// Forces the list to use the `AvailableSpace::MaxContent` for its items' height during laying out. + pub fn use_max_height(mut self) -> Self { + self.use_max_height = true; + self + } + fn measure_item(&self, list_width: Option, cx: &mut ElementContext) -> Size { if self.item_count == 0 { return Size::default(); } + let width_default = if self.use_max_width { + AvailableSpace::MaxContent + } else { + AvailableSpace::MinContent + }; + let height_default = if self.use_max_height { + AvailableSpace::MaxContent + } else { + AvailableSpace::MinContent + }; + let item_ix = cmp::min(self.item_to_measure_index, self.item_count - 1); let mut items = (self.render_items)(item_ix..item_ix + 1, cx); let mut item_to_measure = items.pop().unwrap(); let available_space = size( - list_width.map_or(AvailableSpace::MinContent, |width| { - AvailableSpace::Definite(width) - }), - AvailableSpace::MinContent, + list_width.map_or(width_default, AvailableSpace::Definite), + height_default, ); item_to_measure.measure(available_space, cx) } diff --git a/crates/ui/src/components/list/list_item.rs b/crates/ui/src/components/list/list_item.rs index f23de39253e510c9b064af9bc081d7f0fd463c67..b4586f89995c3b344ff044d954888e9f05022b77 100644 --- a/crates/ui/src/components/list/list_item.rs +++ b/crates/ui/src/components/list/list_item.rs @@ -149,6 +149,7 @@ impl ParentElement for ListItem { impl RenderOnce for ListItem { fn render(self, cx: &mut WindowContext) -> impl IntoElement { h_flex() + .flex_grow() .id(self.id) .w_full() .relative()