diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-02-24 19:15:49 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-02-24 19:15:49 +0100 |
| commit | ecd2bca606c0533ec6426b03fc216df256d43c3f (patch) | |
| tree | 9a347db382f94e4d7807af5776cb060fa5bf65ba /src/library/list.rs | |
| parent | 49c0bac44dda8be643480df2c4e68623eeec91bd (diff) | |
List above & below
Diffstat (limited to 'src/library/list.rs')
| -rw-r--r-- | src/library/list.rs | 97 |
1 files changed, 58 insertions, 39 deletions
diff --git a/src/library/list.rs b/src/library/list.rs index b757e4b2..baa8a0c9 100644 --- a/src/library/list.rs +++ b/src/library/list.rs @@ -33,9 +33,13 @@ impl<const L: ListKind> ListNode<L> { /// The spacing between the list items of a non-wide list. pub const SPACING: Linear = Linear::zero(); /// The indentation of each item's label. - pub const LABEL_INDENT: Linear = Relative::new(0.0).into(); + pub const INDENT: Linear = Relative::new(0.0).into(); /// The space between the label and the body of each item. pub const BODY_INDENT: Linear = Relative::new(0.5).into(); + /// The extra padding above the list. + pub const ABOVE: Length = Length::zero(); + /// The extra padding below the list. + pub const BELOW: Length = Length::zero(); fn construct(_: &mut Context, args: &mut Args) -> TypResult<Template> { Ok(Template::show(Self { @@ -52,54 +56,69 @@ impl<const L: ListKind> ListNode<L> { impl<const L: ListKind> Show for ListNode<L> { fn show(&self, ctx: &mut Context, styles: StyleChain) -> TypResult<Template> { - if let Some(template) = styles.show( + let template = if let Some(template) = styles.show( self, ctx, self.items.iter().map(|item| Value::Template((*item.body).clone())), )? { - return Ok(template); - } + template + } else { + let mut children = vec![]; + let mut number = self.start; + + let label = styles.get_ref(Self::LABEL); + + for item in &self.items { + number = item.number.unwrap_or(number); + if L == UNORDERED { + number = 1; + } + + children.push(LayoutNode::default()); + children.push(label.resolve(ctx, L, number)?.pack()); + children.push(LayoutNode::default()); + children.push((*item.body).clone().pack()); + number += 1; + } - let mut children = vec![]; - let mut number = self.start; + let em = styles.get(TextNode::SIZE).abs; + let leading = styles.get(ParNode::LEADING); + let spacing = if self.wide { + styles.get(ParNode::SPACING) + } else { + styles.get(Self::SPACING) + }; + + let gutter = (leading + spacing).resolve(em); + let indent = styles.get(Self::INDENT).resolve(em); + let body_indent = styles.get(Self::BODY_INDENT).resolve(em); + + Template::block(GridNode { + tracks: Spec::with_x(vec![ + TrackSizing::Linear(indent.into()), + TrackSizing::Auto, + TrackSizing::Linear(body_indent.into()), + TrackSizing::Auto, + ]), + gutter: Spec::with_y(vec![TrackSizing::Linear(gutter.into())]), + children, + }) + }; - let label = styles.get_ref(Self::LABEL); + let mut seq = vec![]; + let above = styles.get(Self::ABOVE); + if !above.is_zero() { + seq.push(Template::Vertical(above.into())); + } - for item in &self.items { - number = item.number.unwrap_or(number); - if L == UNORDERED { - number = 1; - } + seq.push(template); - children.push(LayoutNode::default()); - children.push(label.resolve(ctx, L, number)?.pack()); - children.push(LayoutNode::default()); - children.push((*item.body).clone().pack()); - number += 1; + let below = styles.get(Self::BELOW); + if !below.is_zero() { + seq.push(Template::Vertical(below.into())); } - let em = styles.get(TextNode::SIZE).abs; - let leading = styles.get(ParNode::LEADING); - let spacing = if self.wide { - styles.get(ParNode::SPACING) - } else { - styles.get(Self::SPACING) - }; - - let gutter = (leading + spacing).resolve(em); - let label_indent = styles.get(Self::LABEL_INDENT).resolve(em); - let body_indent = styles.get(Self::BODY_INDENT).resolve(em); - - Ok(Template::block(GridNode { - tracks: Spec::with_x(vec![ - TrackSizing::Linear(label_indent.into()), - TrackSizing::Auto, - TrackSizing::Linear(body_indent.into()), - TrackSizing::Auto, - ]), - gutter: Spec::with_y(vec![TrackSizing::Linear(gutter.into())]), - children, - })) + Ok(Template::sequence(seq)) } } |
