mirror of
https://github.com/penpot/penpot.git
synced 2026-05-24 09:23:40 +00:00
🔧 Add forward children iterator for flex layout
Avoid Vec allocation + reverse for reversed flex layouts. The new children_ids_iter_forward returns children in original order, eliminating the need to collect and reverse.
This commit is contained in:
parent
8ef6600cdc
commit
c87ffdcd30
@ -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<dyn Iterator<Item = &Uuid> + '_> {
|
||||||
|
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(
|
pub fn all_children(
|
||||||
&self,
|
&self,
|
||||||
shapes: ShapesPoolRef,
|
shapes: ShapesPoolRef,
|
||||||
|
|||||||
@ -184,15 +184,18 @@ fn initialize_tracks(
|
|||||||
) -> Vec<TrackData> {
|
) -> Vec<TrackData> {
|
||||||
let mut tracks = Vec::<TrackData>::new();
|
let mut tracks = Vec::<TrackData>::new();
|
||||||
let mut current_track = TrackData::default();
|
let mut current_track = TrackData::default();
|
||||||
let mut children = shape.children_ids(true);
|
|
||||||
let mut first = true;
|
let mut first = true;
|
||||||
|
|
||||||
if flex_data.is_reverse() {
|
// When is_reverse() is true, we need forward order (children_ids_iter_forward).
|
||||||
children.reverse();
|
// When is_reverse() is false, we need reversed order (children_ids_iter).
|
||||||
}
|
let children_iter: Box<dyn Iterator<Item = Uuid>> = 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() {
|
for child_id in children_iter {
|
||||||
let Some(child) = shapes.get(child_id) else {
|
let Some(child) = shapes.get(&child_id) else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user