Skip to main content

easyofd_reader/model/
template_page_entity.rs

1//! 页面模板对象实体。
2//!
3//! 对应 Java: org.ofdrw.reader.model.TemplatePageEntity
4
5/// 模板页面的 Z 序(绘制顺序)。
6///
7/// 对应 Java: `org.ofdrw.core.basicStructure.pageObj.layer.Type`
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub enum TemplateZOrder {
10    /// 背景层(最先绘制)。
11    Background,
12    /// 主体层。
13    Body,
14    /// 前景层(最后绘制)。
15    Foreground,
16}
17
18impl TemplateZOrder {
19    /// 返回排序值(越小越先绘制)。
20    #[must_use]
21    pub fn order(&self) -> i32 {
22        match self {
23            Self::Background => 0,
24            Self::Body => 1,
25            Self::Foreground => 2,
26        }
27    }
28}
29
30/// 页面模板对象实体,描述一个模板页面的元数据和内容引用。
31///
32/// 对应 Java: `org.ofdrw.reader.model.TemplatePageEntity`
33#[derive(Debug, Clone)]
34pub struct TemplatePageEntity {
35    /// 模板 ID。
36    pub id: String,
37    /// 模板页名称(可选)。
38    pub name: Option<String>,
39    /// 模板页面的 Z 序(绘制顺序)。
40    pub z_order: TemplateZOrder,
41    /// 指向模板页内容描述文件的路径。
42    pub base_loc: String,
43}
44
45impl TemplatePageEntity {
46    /// 创建新的模板页面实体。
47    #[must_use]
48    pub fn new(
49        id: impl Into<String>,
50        z_order: TemplateZOrder,
51        base_loc: impl Into<String>,
52    ) -> Self {
53        Self {
54            id: id.into(),
55            name: None,
56            z_order,
57            base_loc: base_loc.into(),
58        }
59    }
60
61    /// 设置模板页名称。
62    #[must_use]
63    pub fn with_name(mut self, name: impl Into<String>) -> Self {
64        self.name = Some(name.into());
65        self
66    }
67
68    /// 设置 Z 序。
69    pub fn set_z_order(&mut self, z_order: TemplateZOrder) {
70        self.z_order = z_order;
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    #[test]
79    fn test_template_z_order_ordering() {
80        assert!(TemplateZOrder::Background.order() < TemplateZOrder::Body.order());
81        assert!(TemplateZOrder::Body.order() < TemplateZOrder::Foreground.order());
82    }
83
84    #[test]
85    fn test_template_page_entity_new() {
86        let entity =
87            TemplatePageEntity::new("tpl_0", TemplateZOrder::Body, "Pages/Page_0/Content.xml");
88        assert_eq!(entity.id, "tpl_0");
89        assert_eq!(entity.z_order, TemplateZOrder::Body);
90        assert_eq!(entity.base_loc, "Pages/Page_0/Content.xml");
91        assert!(entity.name.is_none());
92    }
93
94    #[test]
95    fn test_template_page_entity_with_name() {
96        let entity = TemplatePageEntity::new("tpl_1", TemplateZOrder::Background, "tpl.xml")
97            .with_name("Header Template");
98        assert_eq!(entity.name.as_deref(), Some("Header Template"));
99    }
100
101    #[test]
102    fn test_template_page_entity_set_z_order() {
103        let mut entity = TemplatePageEntity::new("tpl_0", TemplateZOrder::Body, "tpl.xml");
104        entity.set_z_order(TemplateZOrder::Foreground);
105        assert_eq!(entity.z_order, TemplateZOrder::Foreground);
106    }
107}