diff --git a/render-wasm/src/shapes.rs b/render-wasm/src/shapes.rs index 48c3bda1c7..1edb377e35 100644 --- a/render-wasm/src/shapes.rs +++ b/render-wasm/src/shapes.rs @@ -1119,6 +1119,25 @@ impl Shape { } } + /// Returns children in forward (non-reversed) order - useful for layout calculations + pub fn children_ids_iter_forward(&self, include_hidden: bool) -> Box + '_> { + if include_hidden { + return Box::new(self.children.iter()); + } + + if let Type::Bool(_) = self.shape_type { + Box::new([].iter()) + } else if let Type::Group(group) = self.shape_type { + if group.masked { + Box::new(self.children.iter().skip(1)) + } else { + Box::new(self.children.iter()) + } + } else { + Box::new(self.children.iter()) + } + } + pub fn all_children( &self, shapes: ShapesPoolRef, diff --git a/render-wasm/src/shapes/modifiers/flex_layout.rs b/render-wasm/src/shapes/modifiers/flex_layout.rs index 6377379306..74159dd2e7 100644 --- a/render-wasm/src/shapes/modifiers/flex_layout.rs +++ b/render-wasm/src/shapes/modifiers/flex_layout.rs @@ -184,15 +184,18 @@ fn initialize_tracks( ) -> Vec { let mut tracks = Vec::::new(); let mut current_track = TrackData::default(); - let mut children = shape.children_ids(true); let mut first = true; - if flex_data.is_reverse() { - children.reverse(); - } + // When is_reverse() is true, we need forward order (children_ids_iter_forward). + // When is_reverse() is false, we need reversed order (children_ids_iter). + let children_iter: Box> = if flex_data.is_reverse() { + Box::new(shape.children_ids_iter_forward(true).copied()) + } else { + Box::new(shape.children_ids_iter(true).copied()) + }; - for child_id in children.iter() { - let Some(child) = shapes.get(child_id) else { + for child_id in children_iter { + let Some(child) = shapes.get(&child_id) else { continue; };