Skip to main content

flowsurface_data/layout/
presets.rs

1use 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}