gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 501HTML 254C 19JavaScript 81412 Definiciones

Introduce geometry mapping

07d2791ab1cd0ffa79e93e56ed7bf68227ce782b · por Emil Sjölander · (hace 7 años) · padre d013b4ef6 · ver el árbol en este commit

Delta semántico · 4

src/algo.rs

src/geometry.rs

2 archivos · +26 −61

diff --git a/src/algo.rs b/src/algo.rs
index e7ea6ab32..65fdc2cad 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -118,26 +118,9 @@ fn compute_internal(
     let is_column = dir.is_column();
     let is_wrap_reverse = node.flex_wrap == FlexWrap::WrapReverse;
 
-    let margin = Rect {
-        start: node.margin.start.resolve(percent_calc_base).or_else(0.0),
-        end: node.margin.end.resolve(percent_calc_base).or_else(0.0),
-        top: node.margin.top.resolve(percent_calc_base).or_else(0.0),
-        bottom: node.margin.bottom.resolve(percent_calc_base).or_else(0.0),
-    };
-
-    let padding = Rect {
-        start: node.padding.start.resolve(percent_calc_base).or_else(0.0),
-        end: node.padding.end.resolve(percent_calc_base).or_else(0.0),
-        top: node.padding.top.resolve(percent_calc_base).or_else(0.0),
-        bottom: node.padding.bottom.resolve(percent_calc_base).or_else(0.0),
-    };
-
-    let border = Rect {
-        start: node.border.start.resolve(percent_calc_base).or_else(0.0),
-        end: node.border.end.resolve(percent_calc_base).or_else(0.0),
-        top: node.border.top.resolve(percent_calc_base).or_else(0.0),
-        bottom: node.border.bottom.resolve(percent_calc_base).or_else(0.0),
-    };
+    let margin = node.margin.map(&|n| n.resolve(percent_calc_base).or_else(0.0));
+    let padding = node.padding.map(&|n| n.resolve(percent_calc_base).or_else(0.0));
+    let border = node.border.map(&|n| n.resolve(percent_calc_base).or_else(0.0));
 
     let padding_border = Rect {
         start: padding.start + border.start,
@@ -179,48 +162,14 @@ fn compute_internal(
         .map(|child| FlexItem {
             node: child,
 
-            size: Size {
-                width: child.size.width.resolve(percent_calc_base_child),
-                height: child.size.height.resolve(percent_calc_base_child),
-            },
-
-            min_size: Size {
-                width: child.min_size.width.resolve(percent_calc_base_child),
-                height: child.min_size.height.resolve(percent_calc_base_child),
-            },
+            size: child.size.map(&|s| s.resolve(percent_calc_base_child)),
+            min_size: child.min_size.map(&|s| s.resolve(percent_calc_base_child)),
+            max_size: child.max_size.map(&|s| s.resolve(percent_calc_base_child)),
 
-            max_size: Size {
-                width: child.max_size.width.resolve(percent_calc_base_child),
-                height: child.max_size.height.resolve(percent_calc_base_child),
-            },
-
-            position: Rect {
-                start: child.position.start.resolve(percent_calc_base_child),
-                end: child.position.end.resolve(percent_calc_base_child),
-                top: child.position.top.resolve(percent_calc_base_child),
-                bottom: child.position.bottom.resolve(percent_calc_base_child),
-            },
-
-            margin: Rect {
-                start: child.margin.start.resolve(percent_calc_base_child).or_else(0.0),
-                end: child.margin.end.resolve(percent_calc_base_child).or_else(0.0),
-                top: child.margin.top.resolve(percent_calc_base_child).or_else(0.0),
-                bottom: child.margin.bottom.resolve(percent_calc_base_child).or_else(0.0),
-            },
-
-            padding: Rect {
-                start: child.padding.start.resolve(percent_calc_base_child).or_else(0.0),
-                end: child.padding.end.resolve(percent_calc_base_child).or_else(0.0),
-                top: child.padding.top.resolve(percent_calc_base_child).or_else(0.0),
-                bottom: child.padding.bottom.resolve(percent_calc_base_child).or_else(0.0),
-            },
-
-            border: Rect {
-                start: child.border.start.resolve(percent_calc_base_child).or_else(0.0),
-                end: child.border.end.resolve(percent_calc_base_child).or_else(0.0),
-                top: child.border.top.resolve(percent_calc_base_child).or_else(0.0),
-                bottom: child.border.bottom.resolve(percent_calc_base_child).or_else(0.0),
-            },
+            position: child.position.map(&|p| p.resolve(percent_calc_base_child)),
+            margin: child.margin.map(&|m| m.resolve(percent_calc_base_child).or_else(0.0)),
+            padding: child.padding.map(&|p| p.resolve(percent_calc_base_child).or_else(0.0)),
+            border: child.border.map(&|b| b.resolve(percent_calc_base_child).or_else(0.0)),
 
             flex_basis: 0.0,
             inner_flex_basis: 0.0,
diff --git a/src/geometry.rs b/src/geometry.rs
index c16ac19de..4e3ac2af5 100644
--- a/src/geometry.rs
+++ b/src/geometry.rs
@@ -10,6 +10,12 @@ pub struct Rect<T> {
     pub bottom: T,
 }
 
+impl<T> Rect<T> {
+    pub(crate) fn map<R>(self, f: &(Fn(T) -> R)) -> Rect<R> {
+        Rect { start: f(self.start), end: f(self.end), top: f(self.top), bottom: f(self.bottom) }
+    }
+}
+
 impl<T> Rect<T>
 where
     T: Add<Output = T> + Copy + Clone,
@@ -77,6 +83,10 @@ pub struct Size<T> {
 }
 
 impl<T> Size<T> {
+    pub(crate) fn map<R>(self, f: &(Fn(T) -> R)) -> Size<R> {
+        Size { width: f(self.width), height: f(self.height) }
+    }
+
     pub(crate) fn set_main(&mut self, direction: style::FlexDirection, value: T) {
         match direction {
             style::FlexDirection::Row | style::FlexDirection::RowReverse => self.width = value,
@@ -111,3 +121,9 @@ pub struct Point<T> {
     pub x: T,
     pub y: T,
 }
+
+impl<T> Point<T> {
+    pub(crate) fn map<R>(self, f: &(Fn(T) -> R)) -> Point<R> {
+        Point { x: f(self.x), y: f(self.y) }
+    }
+}