egui_charts/ui/dialogs/templates/
mod.rs1mod 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}