From 3ffa7393f0632d9ee5dd9c821685a1a033d5c0ab Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 12 Feb 2023 18:58:39 +0100 Subject: Make all nodes block-level --- library/src/layout/stack.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'library/src/layout/stack.rs') diff --git a/library/src/layout/stack.rs b/library/src/layout/stack.rs index 5c1a471c..35a0ff6f 100644 --- a/library/src/layout/stack.rs +++ b/library/src/layout/stack.rs @@ -169,7 +169,7 @@ enum StackItem { /// Fractional spacing between other items. Fractional(Fr), /// A frame for a layouted block. - Frame(Frame, Align), + Frame(Frame, Axes), } impl<'a> StackLayouter<'a> { @@ -239,7 +239,7 @@ impl<'a> StackLayouter<'a> { styles.get(AlignNode::ALIGNS) }; - let align = aligns.get(self.axis).resolve(styles); + let aligns = aligns.resolve(styles); let fragment = block.layout(vt, styles, self.regions)?; let len = fragment.len(); for (i, frame) in fragment.into_iter().enumerate() { @@ -257,7 +257,7 @@ impl<'a> StackLayouter<'a> { self.used.main += gen.main; self.used.cross.set_max(gen.cross); - self.items.push(StackItem::Frame(frame, align)); + self.items.push(StackItem::Frame(frame, aligns)); if i + 1 < len { self.finish_region(); @@ -291,24 +291,30 @@ impl<'a> StackLayouter<'a> { match item { StackItem::Absolute(v) => cursor += v, StackItem::Fractional(v) => cursor += v.share(self.fr, remaining), - StackItem::Frame(frame, align) => { + StackItem::Frame(frame, aligns) => { if self.dir.is_positive() { - ruler = ruler.max(align); + ruler = ruler.max(aligns.get(self.axis)); } else { - ruler = ruler.min(align); + ruler = ruler.min(aligns.get(self.axis)); } - // Align along the block axis. + // Align along the main axis. let parent = size.get(self.axis); let child = frame.size().get(self.axis); - let block = ruler.position(parent - self.used.main) + let main = ruler.position(parent - self.used.main) + if self.dir.is_positive() { cursor } else { self.used.main - child - cursor }; - let pos = Gen::new(Abs::zero(), block).to_point(self.axis); + // Align along the cross axis. + let other = self.axis.other(); + let cross = aligns + .get(other) + .position(size.get(other) - frame.size().get(other)); + + let pos = Gen::new(cross, main).to_point(self.axis); cursor += child; output.push_frame(pos, frame); } -- cgit v1.2.3