mimick/settings_window/
actions_ui.rs1use adw::prelude::*;
2use gtk::Button;
3use libadwaita as adw;
4
5pub struct ActionsWidgets {
6 pub sync_now_btn: Button,
7 pub pause_btn: Button,
8 pub queue_btn: Button,
9 pub export_btn: Button,
10 pub clear_cache_btn: Button,
11 pub quit_btn: Button,
12}
13
14pub fn build_actions_group(
15 status_page: &adw::PreferencesPage,
16 settings_page: &adw::PreferencesPage,
17) -> ActionsWidgets {
18 let controls_group = adw::PreferencesGroup::builder().title("Actions").build();
19 status_page.add(&controls_group);
20
21 let actions_flow = action_flow(true, 4);
22 controls_group.add(&actions_flow);
23
24 let sync_now_btn = flow_button(&actions_flow, "Sync Now", Some("suggested-action"), None);
25 let pause_btn = flow_button(&actions_flow, "Pause", None, None);
26 let queue_btn = flow_button(&actions_flow, "Queue Inspector", None, None);
27 let export_btn = flow_button(&actions_flow, "Export Diagnostics", None, None);
28 let clear_cache_btn = flow_button(
29 &actions_flow,
30 "Clear Cache",
31 None,
32 Some(
33 "Removes all on-disk caches: thumbnails, decoded RAW previews, \
34 EXIF, video, and preview files.",
35 ),
36 );
37
38 let app_group = adw::PreferencesGroup::builder()
39 .title("Application")
40 .build();
41 settings_page.add(&app_group);
42
43 let row = adw::ActionRow::builder()
44 .title("Close Application")
45 .subtitle("Stop syncing and exit Mimick completely")
46 .build();
47
48 let quit_btn = Button::builder()
49 .label("Quit")
50 .css_classes(vec!["destructive-action".to_string()])
51 .valign(gtk::Align::Center)
52 .build();
53 row.add_suffix(&quit_btn);
54 app_group.add(&row);
55
56 ActionsWidgets {
57 sync_now_btn,
58 pause_btn,
59 queue_btn,
60 export_btn,
61 clear_cache_btn,
62 quit_btn,
63 }
64}
65
66fn action_flow(homogeneous: bool, max_children_per_line: u32) -> gtk::FlowBox {
67 gtk::FlowBox::builder()
68 .homogeneous(homogeneous)
69 .min_children_per_line(1)
70 .max_children_per_line(max_children_per_line)
71 .selection_mode(gtk::SelectionMode::None)
72 .row_spacing(8)
73 .column_spacing(8)
74 .margin_top(6)
75 .margin_bottom(6)
76 .build()
77}
78
79fn flow_button(
80 flow: >k::FlowBox,
81 label: &str,
82 css_class: Option<&str>,
83 tooltip: Option<&str>,
84) -> Button {
85 let mut builder = Button::builder().label(label).hexpand(true);
86 if let Some(css_class) = css_class {
87 builder = builder.css_classes(vec![css_class.to_string()]);
88 }
89 if let Some(tooltip) = tooltip {
90 builder = builder.tooltip_text(tooltip);
91 }
92 let button = builder.build();
93 flow.insert(&button, -1);
94 button
95}