Skip to main content

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