Make flex elements fill available space when they contain a float

Nathan Sobo and Antonio Scandurra created

Co-Authored-By: Antonio Scandurra <me@as-cii.com>

Change summary

crates/contacts_panel/src/contacts_panel.rs |  1 -
crates/gpui/src/elements/flex.rs            | 16 ++++++++++++----
2 files changed, 12 insertions(+), 5 deletions(-)

Detailed changes

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::<FlexParentData>()
-                .and_then(|metadata| metadata.flex.map(|(flex, _)| flex))
-            {
+            let metadata = child.metadata::<FlexParentData>();
+            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()));
         }