summaryrefslogtreecommitdiff
path: root/src/layout/stack.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout/stack.rs')
-rw-r--r--src/layout/stack.rs31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/layout/stack.rs b/src/layout/stack.rs
index 2a0b2806..fa5fd584 100644
--- a/src/layout/stack.rs
+++ b/src/layout/stack.rs
@@ -62,6 +62,8 @@ struct StackLayouter<'a> {
ruler: Align,
/// The constraints for the current region.
constraints: Constraints,
+ /// Whether the last region can fit all the remaining content.
+ overflowing: bool,
/// Offset, alignment and frame for all children that fit into the current
/// region. The exact positions are not known yet.
frames: Vec<(Length, Gen<Align>, Rc<Frame>)>,
@@ -87,11 +89,12 @@ impl<'a> StackLayouter<'a> {
stack,
main,
expand,
- constraints: Constraints::new(regions.expand),
regions,
full,
used: Gen::zero(),
ruler: Align::Start,
+ constraints: Constraints::new(expand),
+ overflowing: false,
frames: vec![],
finished: vec![],
}
@@ -142,10 +145,16 @@ impl<'a> StackLayouter<'a> {
}
// Find a fitting region.
- while !self.regions.current.get(self.main).fits(size.main)
- && !self.regions.in_full_last()
- {
- self.constraints.max.get_mut(self.main).set_min(size.main);
+ while !self.regions.current.get(self.main).fits(size.main) {
+ if self.regions.in_full_last() {
+ self.overflowing = true;
+ break;
+ }
+
+ self.constraints
+ .max
+ .get_mut(self.main)
+ .set_min(self.used.main + size.main);
self.finish_region();
}
@@ -188,7 +197,9 @@ impl<'a> StackLayouter<'a> {
// Make sure the stack's size satisfies the aspect ratio.
if let Some(aspect) = self.stack.aspect {
- self.constraints.exact = self.regions.current.to_spec().map(Some);
+ self.constraints.exact = self.full.to_spec().map(Some);
+ self.constraints.min = Spec::splat(None);
+ self.constraints.max = Spec::splat(None);
let width = size
.width
.max(aspect.into_inner() * size.height)
@@ -198,6 +209,12 @@ impl<'a> StackLayouter<'a> {
size = Size::new(width, width / aspect.into_inner());
}
+ if self.overflowing {
+ self.constraints.min.vertical = None;
+ self.constraints.max.vertical = None;
+ self.constraints.exact = self.full.to_spec().map(Some);
+ }
+
let mut output = Frame::new(size, size.height);
let mut first = true;
@@ -244,6 +261,6 @@ impl<'a> StackLayouter<'a> {
self.used = Gen::zero();
self.ruler = Align::Start;
self.finished.push(output.constrain(self.constraints));
- self.constraints = Constraints::new(self.regions.expand);
+ self.constraints = Constraints::new(expand);
}
}