Skip to main content

egui_charts/drawings/domain/
template.rs

1//! Reusable drawing properties without geometry or record identity.
2
3/// Drawing properties without anchors or record identity. Apply to an existing drawing of the
4/// same type; its coordinates, closed outline, name, notes, layer, post link and persistence identity
5/// stay intact.
6#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
7pub struct DrawingTemplate {
8    /// Tool and reusable properties. Serialization omits anchors and record identity.
9    pub settings: crate::drawings::Drawing,
10}
11
12impl DrawingTemplate {
13    /// Capture the properties of a selected drawing.
14    pub fn from_drawing(drawing: &crate::drawings::Drawing) -> Self {
15        let mut settings = drawing.clone();
16        settings.id = 0;
17        settings.stored_id = None;
18        settings.created_at = None;
19        settings.notes = None;
20        settings.label = None;
21        settings.post = None;
22        settings.points.clear();
23        settings.chart_points.clear();
24        settings.level_ys.clear();
25        settings.screen_anchor = None;
26        settings.pane = None;
27        settings.group = None;
28        settings.folder.clear();
29        settings.selectable = true;
30        settings.saveable = true;
31        settings.listed = true;
32        settings.completed = false;
33        Self { settings }
34    }
35
36    /// Apply properties without moving or replacing the selected drawing. Hosts wrap this edit
37    /// in their drawing manager's `edit_drawing` to retain undo and persistence notifications.
38    pub fn apply_to(&self, drawing: &mut crate::drawings::Drawing) -> Result<(), &'static str> {
39        if self.settings.tool_type != drawing.tool_type
40            || self.settings.custom_tool != drawing.custom_tool
41        {
42            return Err("Select a drawing of the template's type");
43        }
44        // The checks a saved drawing passes on load, as defaults come from saved settings.
45        if crate::drawings::persistence::drawing_to_stored(&self.settings, |_| 0)
46            .invalid_field()
47            .is_some()
48        {
49            return Err("Invalid drawing template dimensions");
50        }
51        *drawing = crate::drawings::Drawing {
52            id: drawing.id,
53            stored_id: drawing.stored_id.clone(),
54            created_at: drawing.created_at,
55            notes: drawing.notes.clone(),
56            label: drawing.label.clone(),
57            post: drawing.post.clone(),
58            points: drawing.points.clone(),
59            chart_points: drawing.chart_points.clone(),
60            level_ys: drawing.level_ys.clone(),
61            completed: drawing.completed,
62            screen_anchor: drawing.screen_anchor,
63            pane: drawing.pane,
64            group: drawing.group.clone(),
65            folder: drawing.folder.clone(),
66            selectable: drawing.selectable,
67            saveable: drawing.saveable,
68            listed: drawing.listed,
69            closed: drawing.closed,
70            z_order: drawing.z_order,
71            ..self.settings.clone()
72        };
73        Ok(())
74    }
75}