Skip to main content

mimick/settings_window/
actions_ui.rs

1use 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: &gtk::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}