summaryrefslogtreecommitdiff
path: root/src/library/columns.rs
diff options
context:
space:
mode:
authorMartin Haug <mhaug@live.de>2021-12-27 13:41:57 +0100
committerMartin Haug <mhaug@live.de>2021-12-27 13:41:57 +0100
commitee12bf67161f20983eeaf90ddbcd2d6a849f47ba (patch)
tree8ee45ff3bc35900a9b457e3274049cc580010f39 /src/library/columns.rs
parent7efdcdf2472257102c6b4b30bf285e2058924070 (diff)
Iterate over target regions instead in columns loop
Diffstat (limited to 'src/library/columns.rs')
-rw-r--r--src/library/columns.rs76
1 files changed, 37 insertions, 39 deletions
diff --git a/src/library/columns.rs b/src/library/columns.rs
index 3109eda3..779617ed 100644
--- a/src/library/columns.rs
+++ b/src/library/columns.rs
@@ -81,7 +81,10 @@ impl Layout for ColumnsNode {
(size, gutter)
});
- let frames = self.child.layout(ctx, &pod);
+ // We reverse the frames so they can be used as a stack.
+ let mut frames = self.child.layout(ctx, &pod);
+ frames.reverse();
+
let dir = ctx.styles.get(ParNode::DIR);
// Dealing with infinite height areas here.
@@ -95,8 +98,6 @@ impl Layout for ColumnsNode {
regions.current.y
};
- let mut regions = regions.clone();
-
let to = |cursor: Length, width: Length, regions: &Regions| {
if dir.is_positive() {
cursor
@@ -108,47 +109,44 @@ impl Layout for ColumnsNode {
let mut res = vec![];
let mut frame = Frame::new(Spec::new(regions.current.x, height));
-
- for (i, child_frame) in frames.into_iter().enumerate() {
- let region = i / columns;
- let size = std::iter::once(&first)
- .chain(sizes.iter())
- .nth(i)
- .copied()
- .unwrap_or_else(|| last_column_gutter.unwrap().0);
-
- frame.push_frame(
- Point::new(to(cursor, size.x, &regions), Length::zero()),
- child_frame.item,
- );
-
- cursor += size.x;
-
- if i % columns == columns - 1 {
- // Refresh column height for non-infinite regions here.
- let height = if regions.current.y.is_infinite() {
- height
- } else {
- regions.current.y
+ let total_regions = (frames.len() as f32 / columns as f32).ceil() as usize;
+
+ for (i, (current, base)) in regions.iter().take(total_regions).enumerate() {
+ for col in 0 .. columns {
+ let total_col = i * columns + col;
+ let child_frame = match frames.pop() {
+ Some(frame) => frame.item,
+ None => break,
};
- regions.next();
- let old_frame = std::mem::replace(
- &mut frame,
- Frame::new(Spec::new(regions.current.x, height)),
- );
- res.push(old_frame.constrain(Constraints::tight(&regions)));
- cursor = Length::zero();
- } else {
- cursor += gutters
- .get(region)
+ let size = std::iter::once(&first)
+ .chain(sizes.iter())
+ .nth(total_col)
.copied()
- .unwrap_or_else(|| last_column_gutter.unwrap().1);
+ .unwrap_or_else(|| last_column_gutter.unwrap().0);
+
+ frame.push_frame(
+ Point::new(to(cursor, size.x, &regions), Length::zero()),
+ child_frame,
+ );
+
+ cursor += size.x
+ + gutters
+ .get(i)
+ .copied()
+ .unwrap_or_else(|| last_column_gutter.unwrap().1)
}
- }
- if !frame.elements.is_empty() {
- res.push(frame.constrain(Constraints::tight(&regions)));
+ let old_frame = std::mem::replace(
+ &mut frame,
+ Frame::new(Spec::new(regions.current.x, height)),
+ );
+
+ let mut cts = Constraints::new(regions.expand);
+ cts.base = base.map(Some);
+ cts.exact = current.map(Some);
+ res.push(old_frame.constrain(cts));
+ cursor = Length::zero();
}
res