tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5544Rust 88Markdown 11TOML 91926 Definitions

Fix Percent height values, which were using parent width.

ba2d829025f59e7c8125d61401e1741b4c914d0b · by Dusty DeWeese · (5 years ago) · parent 99f31a127 · browse the tree at this commit

Semantic delta · 2

src/algo.rs

src/geometry.rs

2 files · +19 −7

diff --git a/src/algo.rs b/src/algo.rs
index e22c21244..26cf003f2 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -156,9 +156,9 @@ impl Forest {
         let is_column = dir.is_column();
         let is_wrap_reverse = self.nodes[node].style.flex_wrap == FlexWrap::WrapReverse;
 
-        let margin = self.nodes[node].style.margin.map(|n| n.resolve(parent_size.width).or_else(0.0));
-        let padding = self.nodes[node].style.padding.map(|n| n.resolve(parent_size.width).or_else(0.0));
-        let border = self.nodes[node].style.border.map(|n| n.resolve(parent_size.width).or_else(0.0));
+        let margin = self.nodes[node].style.margin.zip_size(parent_size, |n, s| n.resolve(s).or_else(0.0));
+        let padding = self.nodes[node].style.padding.zip_size(parent_size, |n, s| n.resolve(s).or_else(0.0));
+        let border = self.nodes[node].style.border.zip_size(parent_size, |n, s| n.resolve(s).or_else(0.0));
 
         let padding_border = Rect {
             start: padding.start + border.start,
@@ -228,10 +228,10 @@ impl Forest {
                 min_size: child_style.min_size.resolve(node_inner_size),
                 max_size: child_style.max_size.resolve(node_inner_size),
 
-                position: child_style.position.map(|p| p.resolve(node_inner_size.width)),
-                margin: child_style.margin.map(|m| m.resolve(node_inner_size.width).or_else(0.0)),
-                padding: child_style.padding.map(|p| p.resolve(node_inner_size.width).or_else(0.0)),
-                border: child_style.border.map(|b| b.resolve(node_inner_size.width).or_else(0.0)),
+                position: child_style.position.zip_size(node_inner_size, |p, s| p.resolve(s)),
+                margin: child_style.margin.zip_size(node_inner_size, |m, s| m.resolve(s).or_else(0.0)),
+                padding: child_style.padding.zip_size(node_inner_size, |p, s| p.resolve(s).or_else(0.0)),
+                border: child_style.border.zip_size(node_inner_size, |b, s| b.resolve(s).or_else(0.0)),
 
                 flex_basis: 0.0,
                 inner_flex_basis: 0.0,
diff --git a/src/geometry.rs b/src/geometry.rs
index f5471e4b6..3d84476ef 100644
--- a/src/geometry.rs
+++ b/src/geometry.rs
@@ -22,6 +22,18 @@ impl<T> Rect<T> {
     {
         Rect { start: f(self.start), end: f(self.end), top: f(self.top), bottom: f(self.bottom) }
     }
+    pub(crate) fn zip_size<R, F, U>(self, size: Size<U>, f: F) -> Rect<R>
+    where
+        F: Fn(T, U) -> R,
+        U: Copy
+    {
+        Rect {
+            start: f(self.start, size.width),
+            end: f(self.end, size.width),
+            top: f(self.top, size.height),
+            bottom: f(self.bottom, size.height)
+        }
+    }
 }
 
 impl<T> Rect<T>