From 0cdf17216f47312f634d2dea8db237118ede72ce Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 16 Nov 2021 18:15:47 +0100 Subject: [PATCH] Abstraction for fr resolving --- src/geom/fr.rs | 10 ++++++++++ src/library/flow.rs | 7 ++----- src/library/grid.rs | 16 ++++------------ src/library/par.rs | 7 +------ src/library/shape.rs | 8 ++------ src/library/stack.rs | 7 ++----- 6 files changed, 21 insertions(+), 34 deletions(-) diff --git a/src/geom/fr.rs b/src/geom/fr.rs index c16a4d038..28d53d8fd 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 25162d198..9fe8b95d5 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 62c10e5a1..c9accffb2 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 d0f310160..64b68c686 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 ecf21dc97..407d5974d 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 b97964dbb..61406e8ea 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);