Skip to main content

mimick/library/
search_filters.rs

1use libadwaita::prelude::*;
2
3pub struct FilterWidgets {
4    pub revealer: gtk::Revealer,
5    pub filename_row: libadwaita::EntryRow,
6    pub description_row: libadwaita::EntryRow,
7    pub ocr_row: libadwaita::EntryRow,
8    pub type_row: libadwaita::ComboRow,
9    pub favorite_row: libadwaita::SwitchRow,
10    pub archived_row: libadwaita::SwitchRow,
11    pub motion_row: libadwaita::SwitchRow,
12    pub not_in_album_row: libadwaita::SwitchRow,
13    pub with_deleted_row: libadwaita::SwitchRow,
14    pub visibility_row: libadwaita::ComboRow,
15    pub rating_row: libadwaita::ComboRow,
16    pub taken_after_row: libadwaita::EntryRow,
17    pub taken_before_row: libadwaita::EntryRow,
18    pub created_after_row: libadwaita::EntryRow,
19    pub created_before_row: libadwaita::EntryRow,
20    pub make_row: libadwaita::EntryRow,
21    pub model_row: libadwaita::EntryRow,
22    pub lens_row: libadwaita::EntryRow,
23    pub country_row: libadwaita::EntryRow,
24    pub state_row: libadwaita::EntryRow,
25    pub city_row: libadwaita::EntryRow,
26}
27
28pub(super) fn build_text_group() -> (
29    libadwaita::PreferencesGroup,
30    libadwaita::EntryRow,
31    libadwaita::EntryRow,
32    libadwaita::EntryRow,
33) {
34    let group = libadwaita::PreferencesGroup::builder()
35        .title("Text")
36        .build();
37    let filename = libadwaita::EntryRow::builder()
38        .title("Filename contains")
39        .build();
40    let desc = libadwaita::EntryRow::builder()
41        .title("Description contains")
42        .build();
43    let ocr = libadwaita::EntryRow::builder()
44        .title("OCR text contains")
45        .build();
46    group.add(&filename);
47    group.add(&desc);
48    group.add(&ocr);
49    (group, filename, desc, ocr)
50}
51
52fn combo_row(title: &str, items: &[&str]) -> libadwaita::ComboRow {
53    libadwaita::ComboRow::builder()
54        .title(title)
55        .model(&gtk::StringList::new(items))
56        .build()
57}
58
59#[allow(clippy::type_complexity)]
60pub(super) fn build_flags_group() -> (
61    libadwaita::PreferencesGroup,
62    libadwaita::ComboRow,
63    libadwaita::SwitchRow,
64    libadwaita::SwitchRow,
65    libadwaita::SwitchRow,
66    libadwaita::SwitchRow,
67    libadwaita::SwitchRow,
68    libadwaita::ComboRow,
69    libadwaita::ComboRow,
70) {
71    fn switch(t: &str) -> libadwaita::SwitchRow {
72        libadwaita::SwitchRow::builder().title(t).build()
73    }
74
75    let group = libadwaita::PreferencesGroup::builder()
76        .title("Type and flags")
77        .build();
78    let type_row = combo_row("Asset type", &["Any", "Image only", "Video only"]);
79    let fav = switch("Favourites only");
80    let archived = switch("Archived only");
81    let motion = switch("Motion photos only");
82    let not_album = switch("Not in any album");
83    let deleted = switch("Include deleted");
84    let vis = combo_row(
85        "Visibility",
86        &["Any", "Timeline", "Archive", "Hidden", "Locked"],
87    );
88    let rating = combo_row("Minimum rating", &["Any", "1+", "2+", "3+", "4+", "5"]);
89    group.add(&type_row);
90    group.add(&fav);
91    group.add(&archived);
92    group.add(&motion);
93    group.add(&not_album);
94    group.add(&deleted);
95    group.add(&vis);
96    group.add(&rating);
97    (
98        group, type_row, fav, archived, motion, not_album, deleted, vis, rating,
99    )
100}
101
102pub(super) fn build_date_group() -> (
103    libadwaita::PreferencesGroup,
104    libadwaita::EntryRow,
105    libadwaita::EntryRow,
106    libadwaita::EntryRow,
107    libadwaita::EntryRow,
108) {
109    let group = libadwaita::PreferencesGroup::builder()
110        .title("Date range")
111        .description("e.g. 2024-01-15")
112        .build();
113    let taken_after = libadwaita::EntryRow::builder().title("Taken after").build();
114    let taken_before = libadwaita::EntryRow::builder()
115        .title("Taken before")
116        .build();
117    let created_after = libadwaita::EntryRow::builder()
118        .title("Created after")
119        .build();
120    let created_before = libadwaita::EntryRow::builder()
121        .title("Created before")
122        .build();
123    group.add(&taken_after);
124    group.add(&taken_before);
125    group.add(&created_after);
126    group.add(&created_before);
127    (
128        group,
129        taken_after,
130        taken_before,
131        created_after,
132        created_before,
133    )
134}
135
136pub(super) fn build_camera_group() -> (
137    libadwaita::PreferencesGroup,
138    libadwaita::EntryRow,
139    libadwaita::EntryRow,
140    libadwaita::EntryRow,
141) {
142    let group = libadwaita::PreferencesGroup::builder()
143        .title("Camera")
144        .build();
145    let make = libadwaita::EntryRow::builder().title("Make").build();
146    let model = libadwaita::EntryRow::builder().title("Model").build();
147    let lens = libadwaita::EntryRow::builder().title("Lens model").build();
148    group.add(&make);
149    group.add(&model);
150    group.add(&lens);
151    (group, make, model, lens)
152}
153
154pub(super) fn build_location_group() -> (
155    libadwaita::PreferencesGroup,
156    libadwaita::EntryRow,
157    libadwaita::EntryRow,
158    libadwaita::EntryRow,
159) {
160    let group = libadwaita::PreferencesGroup::builder()
161        .title("Location")
162        .build();
163    let country = libadwaita::EntryRow::builder().title("Country").build();
164    let state = libadwaita::EntryRow::builder()
165        .title("State / region")
166        .build();
167    let city = libadwaita::EntryRow::builder().title("City").build();
168    group.add(&country);
169    group.add(&state);
170    group.add(&city);
171    (group, country, state, city)
172}