diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-11-25 20:51:16 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-11-25 20:51:16 +0100 |
| commit | 393d74f9bb0d4c71a69108d5be261103c39f47f3 (patch) | |
| tree | a1d4219de2d8fbec1a16ac3760a95e0b7c9529c5 /src/library/stack.rs | |
| parent | 304d9dd1107504f3925c2593dd279ea6616defab (diff) | |
Layout improvements
Diffstat (limited to 'src/library/stack.rs')
| -rw-r--r-- | src/library/stack.rs | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/library/stack.rs b/src/library/stack.rs index d0d5225e..a6878bd6 100644 --- a/src/library/stack.rs +++ b/src/library/stack.rs @@ -66,7 +66,7 @@ impl Layout for StackNode { ctx: &mut LayoutContext, regions: &Regions, ) -> Vec<Constrained<Rc<Frame>>> { - StackLayouter::new(self, regions.clone()).layout(ctx) + StackLayouter::new(self, regions).layout(ctx) } } @@ -96,7 +96,7 @@ struct StackLayouter<'a> { axis: SpecAxis, /// Whether the stack should expand to fill the region. expand: Spec<bool>, - /// The region to layout into. + /// The regions to layout children into. regions: Regions, /// The full size of `regions.current` that was available before we started /// subtracting. @@ -123,17 +123,21 @@ enum StackItem { impl<'a> StackLayouter<'a> { /// Create a new stack layouter. - fn new(stack: &'a StackNode, mut regions: Regions) -> Self { - // Disable expansion along the block axis for children. + fn new(stack: &'a StackNode, regions: &Regions) -> Self { let axis = stack.dir.axis(); let expand = regions.expand; + let full = regions.current; + + + // Disable expansion along the block axis for children. + let mut regions = regions.clone(); regions.expand.set(axis, false); Self { stack, axis, expand, - full: regions.current, + full, regions, used: Gen::zero(), fr: Fractional::zero(), @@ -145,6 +149,10 @@ impl<'a> StackLayouter<'a> { /// Layout all children. fn layout(mut self, ctx: &mut LayoutContext) -> Vec<Constrained<Rc<Frame>>> { for child in &self.stack.children { + if self.regions.is_full() { + self.finish_region(); + } + match *child { StackChild::Spacing(Spacing::Linear(v)) => { self.layout_absolute(v); @@ -167,10 +175,10 @@ impl<'a> StackLayouter<'a> { fn layout_absolute(&mut self, amount: Linear) { // Resolve the linear, limiting it to the remaining available space. let remaining = self.regions.current.get_mut(self.axis); - let resolved = amount.resolve(self.full.get(self.axis)); + let resolved = amount.resolve(self.regions.base.get(self.axis)); let limited = resolved.min(*remaining); *remaining -= limited; - self.used.block += limited; + self.used.main += limited; self.items.push(StackItem::Absolute(resolved)); } @@ -187,9 +195,9 @@ impl<'a> StackLayouter<'a> { for (i, frame) in frames.into_iter().enumerate() { // Grow our size, shrink the region and save the frame for later. let size = frame.item.size.to_gen(self.axis); - self.used.block += size.block; - self.used.inline.set_max(size.inline); - *self.regions.current.get_mut(self.axis) -= size.block; + self.used.main += size.main; + self.used.cross.set_max(size.cross); + *self.regions.current.get_mut(self.axis) -= size.main; self.items.push(StackItem::Frame(frame.item, align)); if i + 1 < len { @@ -210,13 +218,13 @@ impl<'a> StackLayouter<'a> { // Expand fully if there are fr spacings. let full = self.full.get(self.axis); - let remaining = full - self.used.block; + let remaining = full - self.used.main; if self.fr.get() > 0.0 && full.is_finite() { - self.used.block = full; + self.used.main = full; size.set(self.axis, full); } - let mut output = Frame::new(size, size.h); + let mut output = Frame::new(size); let mut before = Length::zero(); let mut ruler: Align = self.stack.dir.start().into(); @@ -239,11 +247,11 @@ impl<'a> StackLayouter<'a> { // Align along the block axis. let parent = size.get(self.axis); let child = frame.size.get(self.axis); - let block = ruler.resolve(parent - self.used.block) + let block = ruler.resolve(parent - self.used.main) + if self.stack.dir.is_positive() { before } else { - self.used.block - child - before + self.used.main - child - before }; let pos = Gen::new(Length::zero(), block).to_point(self.axis); |
