diff options
Diffstat (limited to 'src/model')
| -rw-r--r-- | src/model/layout.rs | 6 | ||||
| -rw-r--r-- | src/model/styles.rs | 31 |
2 files changed, 33 insertions, 4 deletions
diff --git a/src/model/layout.rs b/src/model/layout.rs index 51154286..3b82ddc2 100644 --- a/src/model/layout.rs +++ b/src/model/layout.rs @@ -8,8 +8,10 @@ use std::sync::Arc; use super::{Barrier, NodeId, Resolve, StyleChain, StyleEntry}; use crate::diag::TypResult; use crate::eval::{RawAlign, RawLength}; -use crate::frame::{Element, Frame, Geometry}; -use crate::geom::{Align, Length, Paint, Point, Relative, Sides, Size, Spec, Stroke}; +use crate::frame::{Element, Frame}; +use crate::geom::{ + Align, Geometry, Length, Paint, Point, Relative, Sides, Size, Spec, Stroke, +}; use crate::library::graphics::MoveNode; use crate::library::layout::{AlignNode, PadNode}; use crate::util::Prehashed; diff --git a/src/model/styles.rs b/src/model/styles.rs index eb7a7053..ae4c1586 100644 --- a/src/model/styles.rs +++ b/src/model/styles.rs @@ -7,8 +7,8 @@ use std::sync::Arc; use super::{Content, Show, ShowNode}; use crate::diag::{At, TypResult}; -use crate::eval::{Args, Func, Node, Smart, Value}; -use crate::geom::{Numeric, Relative, Sides, Spec}; +use crate::eval::{Args, Func, Node, RawLength, Smart, Value}; +use crate::geom::{Length, Numeric, Relative, Sides, Spec}; use crate::library::layout::PageNode; use crate::library::structure::{EnumNode, ListNode}; use crate::library::text::{FontFamily, ParNode, TextNode}; @@ -459,6 +459,33 @@ where } } +impl<T> Fold for Sides<T> +where + T: Fold, +{ + type Output = Sides<T::Output>; + + fn fold(self, outer: Self::Output) -> Self::Output { + self.zip(outer, |inner, outer, _| inner.fold(outer)) + } +} + +impl Fold for Sides<Option<Relative<Length>>> { + type Output = Sides<Relative<Length>>; + + fn fold(self, outer: Self::Output) -> Self::Output { + self.zip(outer, |inner, outer, _| inner.unwrap_or(outer)) + } +} + +impl Fold for Sides<Option<Smart<Relative<RawLength>>>> { + type Output = Sides<Smart<Relative<RawLength>>>; + + fn fold(self, outer: Self::Output) -> Self::Output { + self.zip(outer, |inner, outer, _| inner.unwrap_or(outer)) + } +} + /// A scoped property barrier. /// /// Barriers interact with [scoped](StyleMap::scoped) styles: A scoped style |
