egui_charts/drawings/domain/
template.rs1#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
7pub struct DrawingTemplate {
8 pub settings: crate::drawings::Drawing,
10}
11
12impl DrawingTemplate {
13 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 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 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}