From eef99f059d3ef53acbbeaeff4b0d93a62d1be4bb Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 10 May 2022 06:14:30 -0600 Subject: [PATCH] Make flex elements fill available space when they contain a float Co-Authored-By: Antonio Scandurra --- crates/contacts_panel/src/contacts_panel.rs | 1 - crates/gpui/src/elements/flex.rs | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/crates/contacts_panel/src/contacts_panel.rs b/crates/contacts_panel/src/contacts_panel.rs index 16daa1a7de..b75444785b 100644 --- a/crates/contacts_panel/src/contacts_panel.rs +++ b/crates/contacts_panel/src/contacts_panel.rs @@ -378,7 +378,6 @@ impl ContactsPanel { .contained() .with_style(theme.edit_contact.container) .aligned() - .flex_float() .boxed() }) .on_click(move |_, cx| { diff --git a/crates/gpui/src/elements/flex.rs b/crates/gpui/src/elements/flex.rs index 3384b20019..3f42f98407 100644 --- a/crates/gpui/src/elements/flex.rs +++ b/crates/gpui/src/elements/flex.rs @@ -117,14 +117,15 @@ impl Element for Flex { ) -> (Vector2F, Self::LayoutState) { let mut total_flex = None; let mut fixed_space = 0.0; + let mut contains_float = false; let cross_axis = self.axis.invert(); let mut cross_axis_max: f32 = 0.0; for child in &mut self.children { - if let Some(flex) = child - .metadata::() - .and_then(|metadata| metadata.flex.map(|(flex, _)| flex)) - { + let metadata = child.metadata::(); + contains_float |= metadata.map_or(false, |metadata| metadata.float); + + if let Some(flex) = metadata.and_then(|metadata| metadata.flex.map(|(flex, _)| flex)) { *total_flex.get_or_insert(0.) += flex; } else { let child_constraint = match self.axis { @@ -177,6 +178,13 @@ impl Element for Flex { } }; + if contains_float { + match self.axis { + Axis::Horizontal => size.set_x(size.x().max(constraint.max.x())), + Axis::Vertical => size.set_y(size.y().max(constraint.max.y())), + } + } + if constraint.min.x().is_finite() { size.set_x(size.x().max(constraint.min.x())); }