summaryrefslogtreecommitdiff
path: root/src/layout/document.rs
blob: c2d7b38bb89fa287f73ca9db71bf583a800c3c7c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use super::*;

/// The top-level layout node.
#[derive(Debug, Clone, PartialEq)]
pub struct Document {
    pub runs: Vec<Pages>,
}

impl Document {
    /// Layout the document.
    pub async fn layout(&self, ctx: &mut LayoutContext) -> Vec<BoxLayout> {
        let mut layouts = vec![];
        for run in &self.runs {
            layouts.extend(run.layout(ctx).await);
        }
        layouts
    }
}

/// A variable-length run of pages that all have the same properties.
#[derive(Debug, Clone, PartialEq)]
pub struct Pages {
    /// The size of the pages.
    pub size: Size,
    /// The layout node that produces the actual pages.
    pub child: LayoutNode,
}

impl Pages {
    /// Layout the page run.
    pub async fn layout(&self, ctx: &mut LayoutContext) -> Vec<BoxLayout> {
        let constraints = LayoutConstraints {
            spaces: vec![LayoutSpace { base: self.size, size: self.size }],
            repeat: true,
        };

        self.child
            .layout(ctx, constraints)
            .await
            .into_iter()
            .filter_map(|item| match item {
                LayoutItem::Spacing(_) => None,
                LayoutItem::Box(layout, _) => Some(layout),
            })
            .collect()
    }
}