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>