diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-10-28 16:49:41 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-10-31 08:57:44 +0100 |
| commit | 66ad023519e5250f88f9066a2607efe5442a7b76 (patch) | |
| tree | b858ec6e488edb4cdd639fd4078adab42c00c33f /src/model/resolve.rs | |
| parent | 95e9134a3c7d7a14d8c8928413fdffc665671895 (diff) | |
Split up some files
Diffstat (limited to 'src/model/resolve.rs')
| -rw-r--r-- | src/model/resolve.rs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/model/resolve.rs b/src/model/resolve.rs new file mode 100644 index 00000000..1ca4be69 --- /dev/null +++ b/src/model/resolve.rs @@ -0,0 +1,84 @@ +use super::{Smart, StyleChain}; +use crate::geom::{Abs, Axes, Corners, Em, Length, Numeric, Rel, Sides}; +use crate::library::text::TextNode; + +/// A property that is resolved with other properties from the style chain. +pub trait Resolve { + /// The type of the resolved output. + type Output; + + /// Resolve the value using the style chain. + fn resolve(self, styles: StyleChain) -> Self::Output; +} + +impl Resolve for Em { + type Output = Abs; + + fn resolve(self, styles: StyleChain) -> Self::Output { + if self.is_zero() { + Abs::zero() + } else { + self.at(styles.get(TextNode::SIZE)) + } + } +} + +impl Resolve for Length { + type Output = Abs; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.abs + self.em.resolve(styles) + } +} + +impl<T: Resolve> Resolve for Option<T> { + type Output = Option<T::Output>; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.map(|v| v.resolve(styles)) + } +} + +impl<T: Resolve> Resolve for Smart<T> { + type Output = Smart<T::Output>; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.map(|v| v.resolve(styles)) + } +} + +impl<T: Resolve> Resolve for Axes<T> { + type Output = Axes<T::Output>; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.map(|v| v.resolve(styles)) + } +} + +impl<T: Resolve> Resolve for Sides<T> { + type Output = Sides<T::Output>; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.map(|v| v.resolve(styles)) + } +} + +impl<T: Resolve> Resolve for Corners<T> { + type Output = Corners<T::Output>; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.map(|v| v.resolve(styles)) + } +} + +impl<T> Resolve for Rel<T> +where + T: Resolve + Numeric, + <T as Resolve>::Output: Numeric, +{ + type Output = Rel<<T as Resolve>::Output>; + + fn resolve(self, styles: StyleChain) -> Self::Output { + self.map(|abs| abs.resolve(styles)) + } +} |
