tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 1077HTML 1008Markdown 12TOML 83209 Definiciones

Add support for column/row reverse

469d0bd38d435558e900be41313853a5096a8a3b · por Emil Sjölander · (hace 7 años) · padre 88e25bbbb · ver el árbol en este commit

Delta semántico · 2

src/algo.rs

src/style.rs

2 archivos · +67 −38

diff --git a/src/algo.rs b/src/algo.rs
index 1f935bd10..fbd119cb0 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -868,16 +868,21 @@ fn compute_internal(
         } else {
             let num_items = line.items.len();
             let mut is_first = true;
+            let layout_reverse = node.flex_direction.is_reverse();
 
-            for child in &mut line.items {
+            let justify_item = |child: &mut FlexItem| {
                 child.offset_main = match node.justify_content {
-                    style::JustifyContent::FlexStart => 0.0,
+                    style::JustifyContent::FlexStart => if layout_reverse && is_first {
+                        free_space
+                    } else {
+                        0.0
+                    },
                     style::JustifyContent::Center => if is_first {
                         free_space / 2.0
                     } else {
                         0.0
                     },
-                    style::JustifyContent::FlexEnd => if is_first {
+                    style::JustifyContent::FlexEnd => if is_first && !layout_reverse {
                         free_space
                     } else {
                         0.0
@@ -896,6 +901,12 @@ fn compute_internal(
                 };
 
                 is_first = false;
+            };
+
+            if layout_reverse {
+                line.items.iter_mut().rev().for_each(justify_item);
+            } else {
+                line.items.iter_mut().for_each(justify_item);
             }
         }
     }
@@ -1042,46 +1053,60 @@ fn compute_internal(
             let layout_line = |line: &mut FlexLine| {
                 let mut children: Vec<layout::Node> = vec![];
                 let mut total_offset_main = padding_main_start + border_main_start;
-
-                for child in &mut line.items {
-                    let result = compute_internal(
-                        child.node,
-                        if node.flex_direction.is_row() { child.target_main_size } else { child.target_cross_size },
-                        if node.flex_direction.is_row() { child.target_cross_size } else { child.target_main_size },
-                        if node.flex_direction.is_row() { container_main_size } else { container_cross_size },
-                        if node.flex_direction.is_row() { container_cross_size } else { container_main_size },
-                        percent_calc_base_child,
-                    );
-
-                    let offset_main = {
-                        total_offset_main
-                            + child.offset_main
-                            + child.main_margin_start
-                            + (child.node.main_start(node.flex_direction).resolve(percent_calc_base_child, 0.0)
-                                - child.node.main_end(node.flex_direction).resolve(percent_calc_base_child, 0.0))
+                let line_offset_cross = line.offset_cross;
+
+                {
+                    let layout_item = |child: &mut FlexItem| {
+                        let result = compute_internal(
+                            child.node,
+                            if node.flex_direction.is_row() { child.target_main_size } else { child.target_cross_size },
+                            if node.flex_direction.is_row() { child.target_cross_size } else { child.target_main_size },
+                            if node.flex_direction.is_row() { container_main_size } else { container_cross_size },
+                            if node.flex_direction.is_row() { container_cross_size } else { container_main_size },
+                            percent_calc_base_child,
+                        );
+
+                        let offset_main = {
+                            total_offset_main
+                                + child.offset_main
+                                + child.main_margin_start
+                                + (child.node.main_start(node.flex_direction).resolve(percent_calc_base_child, 0.0)
+                                    - child.node.main_end(node.flex_direction).resolve(percent_calc_base_child, 0.0))
+                        };
+
+                        let offset_cross = {
+                            total_offset_cross
+                                + child.offset_cross
+                                + line_offset_cross
+                                + child.cross_margin_start
+                                + (child.node.cross_start(node.flex_direction).resolve(percent_calc_base_child, 0.0)
+                                    - child.node.cross_end(node.flex_direction).resolve(percent_calc_base_child, 0.0))
+                        };
+
+                        children.push(layout::Node {
+                            width: result.size.width,
+                            height: result.size.height,
+                            x: if node.flex_direction.is_row() { offset_main } else { offset_cross },
+                            y: if node.flex_direction.is_column() { offset_main } else { offset_cross },
+                            children: result.children,
+                        });
+
+                        total_offset_main = offset_main + result.size.main(node.flex_direction) + child.main_margin_end;
                     };
 
-                    let offset_cross = {
-                        total_offset_cross
-                            + child.offset_cross
-                            + line.offset_cross
-                            + child.cross_margin_start
-                            + (child.node.cross_start(node.flex_direction).resolve(percent_calc_base_child, 0.0)
-                                - child.node.cross_end(node.flex_direction).resolve(percent_calc_base_child, 0.0))
-                    };
+                    if node.flex_direction.is_reverse() {
+                        line.items.iter_mut().rev().for_each(layout_item);
+                    } else {
+                        line.items.iter_mut().for_each(layout_item);
+                    }
+                }
 
-                    children.push(layout::Node {
-                        width: result.size.width,
-                        height: result.size.height,
-                        x: if node.flex_direction.is_row() { offset_main } else { offset_cross },
-                        y: if node.flex_direction.is_column() { offset_main } else { offset_cross },
-                        children: result.children,
-                    });
+                total_offset_cross += line_offset_cross + line.cross_size;
 
-                    total_offset_main = offset_main + result.size.main(node.flex_direction) + child.main_margin_end;
+                if node.flex_direction.is_reverse() {
+                    children.reverse();
                 }
-
-                total_offset_cross += line.offset_cross + line.cross_size;
+                
                 lines.push(children);
             };
 
diff --git a/src/style.rs b/src/style.rs
index 3dd781c64..93d5b4ba8 100644
--- a/src/style.rs
+++ b/src/style.rs
@@ -92,6 +92,10 @@ impl FlexDirection {
     pub(crate) fn is_column(self) -> bool {
         self == FlexDirection::Column || self == FlexDirection::ColumnReverse
     }
+
+    pub(crate) fn is_reverse(self) -> bool {
+        self == FlexDirection::RowReverse || self == FlexDirection::ColumnReverse
+    }
 }
 
 #[derive(Copy, Clone, PartialEq, Debug)]