flowsurface_data/layout/
presets.rs1use crate::chart::kline::{ChartPreset, SettingsSnapshot};
2use crate::layout::MAX_NAME_LENGTH;
3use uuid::Uuid;
4
5#[derive(Default)]
6pub struct Library {
7 presets: Vec<ChartPreset>,
8}
9
10#[derive(Debug, Clone)]
11pub enum Command {
12 Create {
13 name: String,
14 settings: Box<SettingsSnapshot>,
15 },
16 Save {
17 id: Uuid,
18 settings: Box<SettingsSnapshot>,
19 },
20 Rename {
21 id: Uuid,
22 name: String,
23 },
24 Duplicate(Uuid),
25 Remove(Uuid),
26 Reorder {
27 index: usize,
28 target: usize,
29 },
30}
31
32impl Library {
33 pub fn from_config(presets: Vec<ChartPreset>) -> Self {
34 Self {
35 presets: presets
36 .into_iter()
37 .map(|mut preset| {
38 preset.settings = preset.settings.normalized_preset();
39 preset
40 })
41 .collect(),
42 }
43 }
44
45 pub fn entries(&self) -> &[ChartPreset] {
46 &self.presets
47 }
48
49 pub fn get(&self, id: Option<Uuid>) -> Option<&ChartPreset> {
50 self.presets.iter().find(|preset| Some(preset.id) == id)
51 }
52
53 pub fn unique_name(&self, proposed: &str, except: Option<Uuid>) -> String {
54 crate::util::unique_name(
55 if proposed.trim().is_empty() {
56 "Preset"
57 } else {
58 proposed
59 },
60 self.presets
61 .iter()
62 .filter(|preset| Some(preset.id) != except)
63 .map(|preset| preset.name.as_str()),
64 MAX_NAME_LENGTH,
65 )
66 }
67
68 fn get_mut(&mut self, id: Uuid) -> Result<&mut ChartPreset, String> {
69 self.presets
70 .iter_mut()
71 .find(|preset| preset.id == id)
72 .ok_or_else(|| "This preset no longer exists.".to_owned())
73 }
74
75 fn add(&mut self, name: &str, settings: SettingsSnapshot) -> Uuid {
76 let id = Uuid::new_v4();
77 self.presets.push(ChartPreset {
78 id,
79 name: self.unique_name(name, None),
80 settings: settings.normalized_preset(),
81 });
82 id
83 }
84
85 pub fn update(&mut self, command: Command) -> Result<Option<Uuid>, String> {
86 match command {
87 Command::Create { name, settings } => {
88 if name.trim().is_empty() {
89 return Err("Enter a preset name.".into());
90 }
91 Ok(Some(self.add(&name, *settings)))
92 }
93 Command::Save { id, settings } => {
94 self.get_mut(id)?.settings = settings.normalized_preset();
95 Ok(None)
96 }
97 Command::Rename { id, name } => {
98 if name.trim().is_empty() {
99 return Err("Enter a preset name.".into());
100 }
101 let name = self.unique_name(&name, Some(id));
102 self.get_mut(id)?.name = name;
103 Ok(None)
104 }
105 Command::Duplicate(id) => {
106 let preset = self.get(Some(id)).ok_or("This preset no longer exists.")?;
107 let name = format!("{} copy", preset.name);
108 self.add(&name, preset.settings.clone());
109 Ok(None)
110 }
111 Command::Remove(id) => {
112 self.get_mut(id)?;
113 self.presets.retain(|preset| preset.id != id);
114 Ok(None)
115 }
116 Command::Reorder { index, target } => {
117 crate::util::reorder_vec(&mut self.presets, index, target)
118 .ok_or("This preset order is no longer available.")?;
119 Ok(None)
120 }
121 }
122 }
123}