Skip to content

Commit e81620c

Browse files
committed
feat: search in Recents and Trash
1 parent 3ecdb59 commit e81620c

File tree

4 files changed

+436
-249
lines changed

4 files changed

+436
-249
lines changed

src/app.rs

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ use crate::{
9494
},
9595
spawn_detached::spawn_detached,
9696
tab::{
97-
self, HOVER_DURATION, HeadingOptions, ItemMetadata, Location, SORT_OPTION_FALLBACK, Tab,
97+
self, HOVER_DURATION, HeadingOptions, ItemMetadata, Location, SORT_OPTION_FALLBACK,
98+
SearchLocation, Tab,
9899
},
99100
zoom::{zoom_in_view, zoom_out_view, zoom_to_default},
100101
};
@@ -1362,7 +1363,9 @@ impl App {
13621363
.iter()
13631364
.filter_map(|entity| {
13641365
let tab = self.tab_model.data::<Tab>(entity)?;
1365-
(tab.location == Location::Trash).then_some((entity, Location::Trash))
1366+
tab.location
1367+
.is_trash()
1368+
.then_some((entity, tab.location.clone()))
13661369
})
13671370
.collect();
13681371

@@ -1373,31 +1376,15 @@ impl App {
13731376
Task::batch(commands)
13741377
}
13751378

1376-
/// Refresh all tabs that are opened in [`Location::Recents`].
1377-
fn refresh_recents_tabs(&mut self) -> Task<Message> {
1378-
let commands: Box<[_]> = self
1379-
.tab_model
1380-
.iter()
1381-
.filter_map(|entity| {
1382-
let tab = self.tab_model.data::<Tab>(entity)?;
1383-
(tab.location == Location::Recents).then_some(entity)
1384-
})
1385-
.collect();
1386-
1387-
let commands = commands
1388-
.into_iter()
1389-
.map(|entity| self.update_tab(entity, Location::Recents, None));
1390-
1391-
Task::batch(commands)
1392-
}
1393-
13941379
fn rescan_recents(&mut self) -> Task<Message> {
13951380
let needs_reload: Box<[_]> = self
13961381
.tab_model
13971382
.iter()
13981383
.filter_map(|entity| {
13991384
let tab = self.tab_model.data::<Tab>(entity)?;
1400-
(tab.location == Location::Recents).then_some((entity, Location::Recents))
1385+
tab.location
1386+
.is_recents()
1387+
.then_some((entity, tab.location.clone()))
14011388
})
14021389
.collect();
14031390

@@ -1431,19 +1418,35 @@ impl App {
14311418
let mut title_location_opt = None;
14321419
if let Some(tab) = self.tab_model.data_mut::<Tab>(tab) {
14331420
let location_opt = match term_opt {
1434-
Some(term) => tab.location.path_opt().map(|path| {
1435-
(
1436-
Location::Search(
1437-
path.clone(),
1438-
term,
1439-
tab.config.show_hidden,
1440-
Instant::now(),
1441-
),
1442-
true,
1443-
)
1444-
}),
1421+
Some(term) => {
1422+
let search_location = if let Some(path) = tab.location.path_opt() {
1423+
Some(SearchLocation::Path(path.clone()))
1424+
} else if tab.location.is_recents() {
1425+
Some(SearchLocation::Recents)
1426+
} else if tab.location.is_trash() {
1427+
Some(SearchLocation::Trash)
1428+
} else {
1429+
None
1430+
};
1431+
1432+
search_location.map(|search_location| {
1433+
return (
1434+
Location::Search(
1435+
search_location,
1436+
term,
1437+
tab.config.show_hidden,
1438+
Instant::now(),
1439+
),
1440+
true,
1441+
);
1442+
})
1443+
}
14451444
None => match &tab.location {
1446-
Location::Search(path, ..) => Some((Location::Path(path.clone()), false)),
1445+
Location::Search(search_location, ..) => match search_location {
1446+
SearchLocation::Path(path) => Some((Location::Path(path.clone()), false)),
1447+
SearchLocation::Recents => Some((Location::Recents, false)),
1448+
SearchLocation::Trash => Some((Location::Trash, false)),
1449+
},
14471450
_ => None,
14481451
},
14491452
};
@@ -1586,7 +1589,7 @@ impl App {
15861589

15871590
nav_model = nav_model.insert(|b| {
15881591
b.text(fl!("trash"))
1589-
.icon(icon::icon(tab::trash_icon_symbolic(16)))
1592+
.icon(icon::icon(tab::trash_helpers::trash_icon_symbolic(16)))
15901593
.data(Location::Trash)
15911594
.divider_above()
15921595
});
@@ -2774,7 +2777,7 @@ impl Application for App {
27742777
Message::Delete(entity_opt) => {
27752778
let entity = entity_opt.unwrap_or_else(|| self.tab_model.active());
27762779
if let Some(tab) = self.tab_model.data::<Tab>(entity) {
2777-
if tab.location == Location::Trash {
2780+
if tab.location.is_trash() {
27782781
if let Some(items) = tab.items_opt() {
27792782
let mut trash_items = Vec::new();
27802783
for item in items {
@@ -3916,7 +3919,7 @@ impl Application for App {
39163919
return self.operation(Operation::RemoveFromRecents { paths });
39173920
}
39183921
Message::RescanRecents => {
3919-
return self.refresh_recents_tabs();
3922+
return self.rescan_recents();
39203923
}
39213924
Message::RescanTrash => {
39223925
// Update trash icon if empty/full
@@ -3926,8 +3929,10 @@ impl Application for App {
39263929
.is_some_and(|loc| matches!(loc, Location::Trash))
39273930
});
39283931
if let Some(entity) = maybe_entity {
3929-
self.nav_model
3930-
.icon_set(entity, icon::icon(tab::trash_icon_symbolic(16)));
3932+
self.nav_model.icon_set(
3933+
entity,
3934+
icon::icon(tab::trash_helpers::trash_icon_symbolic(16)),
3935+
);
39313936
}
39323937

39333938
return Task::batch([self.rescan_trash(), self.update_desktop()]);

src/dialog.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::{
4848
localize::LANGUAGE_SORTER,
4949
menu,
5050
mounter::{MOUNTERS, MounterItem, MounterItems, MounterKey, MounterMessage},
51-
tab::{self, ItemMetadata, Location, Tab},
51+
tab::{self, ItemMetadata, Location, SearchLocation, Tab},
5252
zoom::{zoom_in_view, zoom_out_view, zoom_to_default},
5353
};
5454

@@ -779,19 +779,35 @@ impl App {
779779

780780
fn search_set(&mut self, term_opt: Option<String>) -> Task<Message> {
781781
let location_opt = match term_opt {
782-
Some(term) => self.tab.location.path_opt().map(|path| {
783-
(
784-
Location::Search(
785-
path.clone(),
786-
term,
787-
self.tab.config.show_hidden,
788-
Instant::now(),
789-
),
790-
true,
791-
)
792-
}),
782+
Some(term) => {
783+
let search_location = if let Some(path) = self.tab.location.path_opt() {
784+
Some(SearchLocation::Path(path.clone()))
785+
} else if self.tab.location.is_recents() {
786+
Some(SearchLocation::Recents)
787+
} else if self.tab.location.is_trash() {
788+
Some(SearchLocation::Trash)
789+
} else {
790+
None
791+
};
792+
793+
search_location.map(|search_location| {
794+
return (
795+
Location::Search(
796+
search_location,
797+
term,
798+
self.tab.config.show_hidden,
799+
Instant::now(),
800+
),
801+
true,
802+
);
803+
})
804+
}
793805
None => match &self.tab.location {
794-
Location::Search(path, ..) => Some((Location::Path(path.clone()), false)),
806+
Location::Search(search_location, ..) => match search_location {
807+
SearchLocation::Path(path) => Some((Location::Path(path.clone()), false)),
808+
SearchLocation::Recents => Some((Location::Recents, false)),
809+
SearchLocation::Trash => Some((Location::Trash, false)),
810+
},
795811
_ => None,
796812
},
797813
};

src/menu.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::{
2222
app::{Action, Message},
2323
config::Config,
2424
fl,
25-
tab::{self, HeadingOptions, Location, LocationMenuAction, Tab},
25+
tab::{self, HeadingOptions, Location, LocationMenuAction, SearchLocation, Tab},
2626
};
2727

2828
static MENU_ID: LazyLock<cosmic::widget::Id> =
@@ -118,7 +118,9 @@ pub fn context_menu<'a>(
118118
selected_dir += 1;
119119
}
120120
match &item.location_opt {
121-
Some(Location::Trash) => selected_trash_only = true,
121+
Some(Location::Trash) | Some(Location::Search(SearchLocation::Trash, ..)) => {
122+
selected_trash_only = true
123+
}
122124
Some(Location::Path(path)) => {
123125
if selected == 1
124126
&& path.extension().and_then(|s| s.to_str()) == Some("desktop")
@@ -154,7 +156,8 @@ pub fn context_menu<'a>(
154156
tab::Mode::App | tab::Mode::Desktop,
155157
Location::Desktop(..)
156158
| Location::Path(..)
157-
| Location::Search(..)
159+
| Location::Search(SearchLocation::Path(..), ..)
160+
| Location::Search(SearchLocation::Recents, ..)
158161
| Location::Recents
159162
| Location::Network(_, _, Some(_)),
160163
) => {
@@ -188,7 +191,7 @@ pub fn context_menu<'a>(
188191
.push(menu_item(fl!("open-in-terminal"), Action::OpenTerminal).into());
189192
}
190193
}
191-
if matches!(tab.location, Location::Search(..) | Location::Recents) {
194+
if tab.location.is_recents() {
192195
children.push(
193196
menu_item(fl!("open-item-location"), Action::OpenItemLocation).into(),
194197
);
@@ -227,7 +230,7 @@ pub fn context_menu<'a>(
227230
children.push(menu_item(fl!("add-to-sidebar"), Action::AddToSidebar).into());
228231
}
229232
children.push(divider::horizontal::light().into());
230-
if matches!(tab.location, Location::Recents) {
233+
if tab.location.is_recents() {
231234
children.push(
232235
menu_item(fl!("remove-from-recents"), Action::RemoveFromRecents).into(),
233236
);
@@ -287,15 +290,16 @@ pub fn context_menu<'a>(
287290
tab::Mode::Dialog(dialog_kind),
288291
Location::Desktop(..)
289292
| Location::Path(..)
290-
| Location::Search(..)
293+
| Location::Search(SearchLocation::Path(..), ..)
294+
| Location::Search(SearchLocation::Recents, ..)
291295
| Location::Recents
292296
| Location::Network(_, _, Some(_)),
293297
) => {
294298
if selected > 0 {
295299
if selected_dir == 1 && selected == 1 || selected_dir == 0 {
296300
children.push(menu_item(fl!("open"), Action::Open).into());
297301
}
298-
if matches!(tab.location, Location::Search(..) | Location::Recents) {
302+
if matches!(tab.location, Location::Search(..)) || tab.location.is_recents() {
299303
children.push(
300304
menu_item(fl!("open-item-location"), Action::OpenItemLocation).into(),
301305
);
@@ -334,7 +338,7 @@ pub fn context_menu<'a>(
334338
children.push(sort_item(fl!("sort-by-size"), HeadingOptions::Size));
335339
}
336340
}
337-
(_, Location::Trash) => {
341+
(_, Location::Trash | Location::Search(SearchLocation::Trash, ..)) => {
338342
if tab.mode.multiple() {
339343
children.push(menu_item(fl!("select-all"), Action::SelectAll).into());
340344
}
@@ -393,7 +397,7 @@ pub fn dialog_menu(
393397
Action::SetSort(sort, dir),
394398
)
395399
};
396-
let in_trash = tab.location == Location::Trash;
400+
let in_trash = tab.location.is_trash();
397401

398402
let mut selected_gallery = 0;
399403
if let Some(items) = tab.items_opt() {
@@ -542,7 +546,7 @@ pub fn menu_bar<'a>(
542546
Action::SetSort(sort, dir),
543547
)
544548
};
545-
let in_trash = tab_opt.is_some_and(|tab| tab.location == Location::Trash);
549+
let in_trash = tab_opt.is_some_and(|tab| tab.location.is_trash());
546550

547551
let mut selected_dir = 0;
548552
let mut selected = 0;

0 commit comments

Comments
 (0)