summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-11-16 18:15:47 +0100
committerLaurenz <laurmaedje@gmail.com>2021-11-16 18:15:47 +0100
commit0cdf17216f47312f634d2dea8db237118ede72ce (patch)
tree1aa53f44f12da2f4473e72f166ecca380e72b4bb
parent79638d4bbdc140a8dca0ccfdf70ffd607d5da251 (diff)
Abstraction for fr resolving
-rw-r--r--src/geom/fr.rs10
-rw-r--r--src/library/flow.rs7
-rw-r--r--src/library/grid.rs16
-rw-r--r--src/library/par.rs7
-rw-r--r--src/library/shape.rs8
-rw-r--r--src/library/stack.rs7
6 files changed, 21 insertions, 34 deletions
diff --git a/src/geom/fr.rs b/src/geom/fr.rs
index c16a4d03..28d53d8f 100644
--- a/src/geom/fr.rs
+++ b/src/geom/fr.rs
@@ -34,6 +34,16 @@ impl Fractional {
pub fn abs(self) -> Self {
Self::new(self.get().abs())
}
+
+ /// Resolve this fractionals share in the remaining space.
+ pub fn resolve(self, total: Self, remaining: Length) -> Length {
+ let ratio = self / total;
+ if ratio.is_finite() && remaining.is_finite() {
+ ratio * remaining
+ } else {
+ Length::zero()
+ }
+ }
}
impl Debug for Fractional {
diff --git a/src/library/flow.rs b/src/library/flow.rs
index 25162d19..9fe8b95d 100644
--- a/src/library/flow.rs
+++ b/src/library/flow.rs
@@ -179,7 +179,7 @@ impl<'a> FlowLayouter<'a> {
// the region expands.
let size = Size::new(
if self.expand.x { self.full.w } else { self.used.w },
- if self.expand.y || (!self.fr.is_zero() && self.full.h.is_finite()) {
+ if self.expand.y || (self.fr.get() > 0.0 && self.full.h.is_finite()) {
self.full.h
} else {
self.used.h
@@ -196,11 +196,8 @@ impl<'a> FlowLayouter<'a> {
match item {
FlowItem::Absolute(v) => before += v,
FlowItem::Fractional(v) => {
- let ratio = v / self.fr;
let remaining = self.full.h - self.used.h;
- if remaining.is_finite() && ratio.is_finite() {
- before += ratio * remaining;
- }
+ before += v.resolve(self.fr, remaining);
}
FlowItem::Frame(frame, align) => {
ruler = ruler.max(align);
diff --git a/src/library/grid.rs b/src/library/grid.rs
index 62c10e5a..c9accffb 100644
--- a/src/library/grid.rs
+++ b/src/library/grid.rs
@@ -314,10 +314,7 @@ impl<'a> GridLayouter<'a> {
fn grow_fractional_columns(&mut self, remaining: Length, fr: Fractional) {
for (&col, rcol) in self.cols.iter().zip(&mut self.rcols) {
if let TrackSizing::Fractional(v) = col {
- let ratio = v / fr;
- if ratio.is_finite() {
- *rcol = ratio * remaining;
- }
+ *rcol = v.resolve(fr, remaining);
}
}
}
@@ -547,7 +544,7 @@ impl<'a> GridLayouter<'a> {
// Determine the size of the grid in this region, expanding fully if
// there are fr rows.
let mut size = self.used;
- if !self.fr.is_zero() && self.full.is_finite() {
+ if self.fr.get() > 0.0 && self.full.is_finite() {
size.h = self.full;
self.cts.exact.y = Some(self.full);
} else {
@@ -563,14 +560,9 @@ impl<'a> GridLayouter<'a> {
let frame = match row {
Row::Frame(frame) => frame,
Row::Fr(v, y) => {
- let ratio = v / self.fr;
let remaining = self.full - self.used.h;
- if remaining.is_finite() && ratio.is_finite() {
- let resolved = ratio * remaining;
- self.layout_single_row(ctx, resolved, y)
- } else {
- continue;
- }
+ let height = v.resolve(self.fr, remaining);
+ self.layout_single_row(ctx, height, y)
}
};
diff --git a/src/library/par.rs b/src/library/par.rs
index d0f31016..64b68c68 100644
--- a/src/library/par.rs
+++ b/src/library/par.rs
@@ -498,12 +498,7 @@ impl<'a> LineLayout<'a> {
match *item {
ParItem::Absolute(v) => offset += v,
- ParItem::Fractional(v) => {
- let ratio = v / self.fr;
- if remaining.is_finite() && ratio.is_finite() {
- offset += ratio * remaining;
- }
- }
+ ParItem::Fractional(v) => offset += v.resolve(self.fr, remaining),
ParItem::Text(ref shaped, align) => position(shaped.build(), align),
ParItem::Frame(ref frame, align) => position(frame.clone(), align),
}
diff --git a/src/library/shape.rs b/src/library/shape.rs
index ecf21dc9..407d5974 100644
--- a/src/library/shape.rs
+++ b/src/library/shape.rs
@@ -147,7 +147,7 @@ impl Layout for ShapeNode {
} else {
let default = Length::pt(30.0);
let size = Size::new(
- if regions.expand.x && regions.current.w.is_finite() {
+ if regions.expand.x {
regions.current.w
} else {
match self.kind {
@@ -155,11 +155,7 @@ impl Layout for ShapeNode {
ShapeKind::Rect | ShapeKind::Ellipse => 1.5 * default,
}
},
- if regions.expand.y && regions.current.h.is_finite() {
- regions.current.h
- } else {
- default
- },
+ if regions.expand.y { regions.current.h } else { default },
);
Frame::new(size, size.h)
diff --git a/src/library/stack.rs b/src/library/stack.rs
index b97964db..61406e8e 100644
--- a/src/library/stack.rs
+++ b/src/library/stack.rs
@@ -204,7 +204,7 @@ impl<'a> StackLayouter<'a> {
// Expand fully if there are fr spacings.
let full = self.full.get(self.axis);
- if !self.fr.is_zero() && full.is_finite() {
+ if self.fr.get() > 0.0 && full.is_finite() {
size.set(self.axis, full);
}
@@ -216,11 +216,8 @@ impl<'a> StackLayouter<'a> {
match item {
StackItem::Absolute(v) => before += v,
StackItem::Fractional(v) => {
- let ratio = v / self.fr;
let remaining = self.full.get(self.axis) - self.used.block;
- if remaining.is_finite() && ratio.is_finite() {
- before += ratio * remaining;
- }
+ before += v.resolve(self.fr, remaining)
}
StackItem::Frame(frame) => {
let parent = size.get(self.axis);