Skip to main content

egui_charts/ui/dialogs/templates/
mod.rs

1//! Named templates stored by the host, without accounts or a storage backend in the library.
2
3mod dialog;
4mod store;
5
6pub use dialog::TemplateDialog;
7pub use store::TemplateStore;
8
9pub use crate::drawings::DrawingTemplate;
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14    use crate::drawings::{ChartPoint, Drawing, DrawingToolType};
15    use crate::studies::{ConfiguredStudy, Indicator, StudyTemplate};
16
17    #[test]
18    fn templates_round_trip_settings_study_inputs_and_drawing_properties_without_geometry() {
19        let mut settings = crate::widget::settings::ChartSettingsState::default();
20        settings.margins.top_percent = 12.5;
21        let json = serde_json::to_string(&settings).unwrap();
22        assert_eq!(
23            serde_json::from_str::<crate::widget::settings::ChartSettingsState>(&json).unwrap(),
24            settings
25        );
26        let mut study = ConfiguredStudy::new(Box::new(crate::studies::SMA::new(7)));
27        let mut style = study.settings();
28        style.plots[0].color = egui::Color32::YELLOW;
29        study.apply_settings(&[], style.clone()).unwrap();
30        study.set_visible(false);
31        let recipe = StudyTemplate::from_study(&study);
32        let recipe: StudyTemplate =
33            serde_json::from_str(&serde_json::to_string(&recipe).unwrap()).unwrap();
34        let restored = recipe.create().unwrap();
35        assert_eq!(restored.inputs()[0].value, study.inputs()[0].value);
36        assert_eq!(restored.settings(), style);
37        assert!(!restored.is_visible());
38        let mut drawing = Drawing::new(17, DrawingToolType::TrendLine);
39        drawing.chart_points = vec![ChartPoint::new(3.0, 100.0), ChartPoint::new(5.0, 200.0)];
40        drawing.completed = true;
41        drawing.stored_id = Some("host-id".into());
42        drawing.notes = Some("note".into());
43        drawing.label = Some("name".into());
44        drawing.post = Some(crate::model::PostLink::new("https://example.invalid/a"));
45        drawing.screen_anchor = Some([0.25, 0.75]);
46        drawing.pane = Some(7);
47        drawing.folder = vec!["Analysis".into()];
48        let mut template = DrawingTemplate::from_drawing(&drawing);
49        template.settings.stroke_width = 4.0;
50        let template: DrawingTemplate =
51            serde_json::from_str(&serde_json::to_string(&template).unwrap()).unwrap();
52        assert!(template.settings.chart_points.is_empty());
53        assert!(template.settings.screen_anchor.is_none());
54        assert!(template.settings.pane.is_none());
55        assert!(template.settings.post.is_none());
56        assert!(template.settings.folder.is_empty());
57        drawing.pane = Some(9);
58        drawing.folder.push("Levels".into());
59        template.apply_to(&mut drawing).unwrap();
60        assert_eq!(drawing.stroke_width, 4.0);
61        assert_eq!(drawing.id, 17);
62        assert_eq!(drawing.stored_id.as_deref(), Some("host-id"));
63        assert_eq!(drawing.notes.as_deref(), Some("note"));
64        assert_eq!(drawing.label.as_deref(), Some("name"));
65        assert_eq!(
66            drawing.post,
67            Some(crate::model::PostLink::new("https://example.invalid/a"))
68        );
69        assert_eq!(drawing.chart_points.len(), 2);
70        assert_eq!(drawing.screen_anchor, Some([0.25, 0.75]));
71        assert_eq!(drawing.pane, Some(9));
72        assert_eq!(drawing.folder, ["Analysis", "Levels"]);
73        assert_eq!(drawing.chart_points[0].bar_idx, 3.0);
74        assert!(drawing.completed);
75    }
76}