cadmus_core/view/settings_editor/kinds/
import.rs

1//! Setting kinds for the Import category.
2
3use super::{SettingData, SettingIdentity, SettingKind, ToggleSettings, WidgetKind};
4use crate::fl;
5use crate::settings::Settings;
6use crate::view::{Bus, Event, ToggleEvent};
7
8/// Import on startup toggle setting
9pub struct ImportStartupTrigger;
10
11impl SettingKind for ImportStartupTrigger {
12    fn identity(&self) -> SettingIdentity {
13        SettingIdentity::ImportStartupTrigger
14    }
15
16    fn label(&self, _settings: &Settings) -> String {
17        fl!("settings-import-startup-trigger")
18    }
19
20    fn fetch(&self, settings: &Settings) -> SettingData {
21        SettingData {
22            value: settings.import.startup_trigger.to_string(),
23            widget: WidgetKind::Toggle {
24                left_label: fl!("settings-general-toggle-on"),
25                right_label: fl!("settings-general-toggle-off"),
26                enabled: settings.import.startup_trigger,
27                tap_event: Event::Toggle(ToggleEvent::Setting(
28                    ToggleSettings::ImportStartupTrigger,
29                )),
30            },
31        }
32    }
33
34    fn handle(&self, evt: &Event, settings: &mut Settings, _bus: &mut Bus) -> Option<String> {
35        if let Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportStartupTrigger)) = evt {
36            settings.import.startup_trigger = !settings.import.startup_trigger;
37            return Some(settings.import.startup_trigger.to_string());
38        }
39        None
40    }
41}
42
43/// Sync metadata toggle setting
44pub struct ImportSyncMetadata;
45
46impl SettingKind for ImportSyncMetadata {
47    fn identity(&self) -> SettingIdentity {
48        SettingIdentity::ImportSyncMetadata
49    }
50
51    fn label(&self, _settings: &Settings) -> String {
52        fl!("settings-import-sync-metadata")
53    }
54
55    fn fetch(&self, settings: &Settings) -> SettingData {
56        SettingData {
57            value: settings.import.sync_metadata.to_string(),
58            widget: WidgetKind::Toggle {
59                left_label: fl!("settings-general-toggle-on"),
60                right_label: fl!("settings-general-toggle-off"),
61                enabled: settings.import.sync_metadata,
62                tap_event: Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportSyncMetadata)),
63            },
64        }
65    }
66
67    fn handle(&self, evt: &Event, settings: &mut Settings, _bus: &mut Bus) -> Option<String> {
68        if let Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportSyncMetadata)) = evt {
69            settings.import.sync_metadata = !settings.import.sync_metadata;
70            return Some(settings.import.sync_metadata.to_string());
71        }
72        None
73    }
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79    use crate::settings::Settings;
80    use crate::view::settings_editor::kinds::ToggleSettings;
81    use crate::view::{Bus, Event, ToggleEvent};
82    use std::collections::VecDeque;
83
84    mod import_startup_trigger {
85        use super::*;
86
87        #[test]
88        fn handle_toggle_disables_when_enabled() {
89            let setting = ImportStartupTrigger;
90            let mut settings = Settings::default();
91            settings.import.startup_trigger = true;
92            let mut bus: Bus = VecDeque::new();
93            let event = Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportStartupTrigger));
94
95            let result = setting.handle(&event, &mut settings, &mut bus);
96
97            assert!(result.is_some());
98            assert!(!settings.import.startup_trigger);
99        }
100
101        #[test]
102        fn handle_toggle_enables_when_disabled() {
103            let setting = ImportStartupTrigger;
104            let mut settings = Settings::default();
105            settings.import.startup_trigger = false;
106            let mut bus: Bus = VecDeque::new();
107            let event = Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportStartupTrigger));
108
109            let result = setting.handle(&event, &mut settings, &mut bus);
110
111            assert!(result.is_some());
112            assert!(settings.import.startup_trigger);
113        }
114
115        #[test]
116        fn handle_returns_none_for_wrong_event() {
117            let setting = ImportStartupTrigger;
118            let mut settings = Settings::default();
119            let mut bus: Bus = VecDeque::new();
120            use crate::view::EntryId;
121
122            let result = setting.handle(&Event::Select(EntryId::About), &mut settings, &mut bus);
123
124            assert!(result.is_none());
125        }
126
127        #[test]
128        fn handle_returns_none_for_wrong_toggle() {
129            let setting = ImportStartupTrigger;
130            let mut settings = Settings::default();
131            let mut bus: Bus = VecDeque::new();
132
133            let result = setting.handle(
134                &Event::Toggle(ToggleEvent::Setting(ToggleSettings::SleepCover)),
135                &mut settings,
136                &mut bus,
137            );
138
139            assert!(result.is_none());
140        }
141    }
142
143    mod import_sync_metadata {
144        use super::*;
145
146        #[test]
147        fn handle_toggle_disables_when_enabled() {
148            let setting = ImportSyncMetadata;
149            let mut settings = Settings::default();
150            settings.import.sync_metadata = true;
151            let mut bus: Bus = VecDeque::new();
152            let event = Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportSyncMetadata));
153
154            let result = setting.handle(&event, &mut settings, &mut bus);
155
156            assert!(result.is_some());
157            assert!(!settings.import.sync_metadata);
158        }
159
160        #[test]
161        fn handle_toggle_enables_when_disabled() {
162            let setting = ImportSyncMetadata;
163            let mut settings = Settings::default();
164            settings.import.sync_metadata = false;
165            let mut bus: Bus = VecDeque::new();
166            let event = Event::Toggle(ToggleEvent::Setting(ToggleSettings::ImportSyncMetadata));
167
168            let result = setting.handle(&event, &mut settings, &mut bus);
169
170            assert!(result.is_some());
171            assert!(settings.import.sync_metadata);
172        }
173
174        #[test]
175        fn handle_returns_none_for_wrong_event() {
176            let setting = ImportSyncMetadata;
177            let mut settings = Settings::default();
178            let mut bus: Bus = VecDeque::new();
179            use crate::view::EntryId;
180
181            let result = setting.handle(&Event::Select(EntryId::About), &mut settings, &mut bus);
182
183            assert!(result.is_none());
184        }
185
186        #[test]
187        fn handle_returns_none_for_wrong_toggle() {
188            let setting = ImportSyncMetadata;
189            let mut settings = Settings::default();
190            let mut bus: Bus = VecDeque::new();
191
192            let result = setting.handle(
193                &Event::Toggle(ToggleEvent::Setting(ToggleSettings::SleepCover)),
194                &mut settings,
195                &mut bus,
196            );
197
198            assert!(result.is_none());
199        }
200    }
201}