gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5364Rust 86Markdown 12TOML 91841 Definiciones

fix measure with stretch

4ce3e47dcda6b6bc4b58cb82158aba9eae4872dd · por Emil Sjölander · (hace 7 años) · padre 059be099f · ver el árbol en este commit

Delta semántico · 3

src/algo.rs

tests/measure.rs

2 archivos · +65 −2

diff --git a/src/algo.rs b/src/algo.rs
index ffd03dec9..4a52786dd 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -250,11 +250,27 @@ fn compute_internal(
         //    is auto and not definite, in this calculation use fit-content as the
         //    flex item’s cross size. The flex base size is the item’s resulting main size.
 
+        let width: Number = if !child.size.width.is_defined()
+            && child.node.align_self(node) == style::AlignSelf::Stretch
+            && is_column
+        {
+            available_space.width
+        } else {
+            child.size.width
+        };
+
+        let height: Number =
+            if !child.size.height.is_defined() && child.node.align_self(node) == style::AlignSelf::Stretch && is_row {
+                available_space.height
+            } else {
+                child.size.height
+            };
+
         child.flex_basis = compute_internal(
             child.node,
             Size {
-                width: child.size.width.maybe_max(child.min_size.width).maybe_min(child.max_size.width),
-                height: child.size.height.maybe_max(child.min_size.height).maybe_min(child.max_size.height),
+                width: width.maybe_max(child.min_size.width).maybe_min(child.max_size.width),
+                height: height.maybe_max(child.min_size.height).maybe_min(child.max_size.height),
             },
             available_space,
             percent_calc_base_child,
diff --git a/tests/measure.rs b/tests/measure.rs
index b9bb9738d..c2c39d88c 100644
--- a/tests/measure.rs
+++ b/tests/measure.rs
@@ -224,6 +224,31 @@ mod measure {
         assert_eq!(layout.children[1].size.height, 100.0);
     }
 
+    #[test]
+    fn remeasure_child_after_stretching() {
+        let layout = stretch::compute(
+            &stretch::style::Node {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100.0),
+                    height: stretch::style::Dimension::Points(100.0),
+                },
+                children: vec![stretch::style::Node {
+                    measure: Some(Box::new(|constraint| {
+                        let height = constraint.height.or_else(50.0);
+                        let width = constraint.width.or_else(height);
+                        stretch::geometry::Size { width, height }
+                    })),
+                    ..Default::default()
+                }],
+                ..Default::default()
+            },
+            stretch::geometry::Size::undefined(),
+        );
+
+        assert_eq!(layout.children[0].size.width, 100.0);
+        assert_eq!(layout.children[0].size.height, 100.0);
+    }
+
     #[test]
     fn width_overrides_measure() {
         let layout = stretch::compute(
@@ -355,4 +380,26 @@ mod measure {
         assert_eq!(layout.children[0].size.width, 50.0);
         assert_eq!(layout.children[0].size.height, 50.0);
     }
+
+    #[test]
+    fn ignore_invalid_measure() {
+        let layout = stretch::compute(
+            &stretch::style::Node {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100.0),
+                    height: stretch::style::Dimension::Points(100.0),
+                },
+                children: vec![stretch::style::Node {
+                    flex_grow: 1.0,
+                    measure: Some(Box::new(|_| stretch::geometry::Size { width: 200.0, height: 200.0 })),
+                    ..Default::default()
+                }],
+                ..Default::default()
+            },
+            stretch::geometry::Size::undefined(),
+        );
+
+        assert_eq!(layout.children[0].size.width, 100.0);
+        assert_eq!(layout.children[0].size.height, 100.0);
+    }
 }