feat: clear filter in multi-select download screen function

This commit is contained in:
Michel de Graaf
2025-11-12 01:52:27 +01:00
parent 689e667ade
commit 5a28452c02
+36 -17
View File
@@ -926,6 +926,11 @@ impl FileSelector {
KeyCode::Char('/') => { KeyCode::Char('/') => {
self.is_searching = true; self.is_searching = true;
} }
KeyCode::Char('c') => {
// Clear filter
self.search_query.clear();
self.apply_filter();
}
KeyCode::Up | KeyCode::Char('k') => self.select_previous(), KeyCode::Up | KeyCode::Char('k') => self.select_previous(),
KeyCode::Down | KeyCode::Char('j') => self.select_next(), KeyCode::Down | KeyCode::Char('j') => self.select_next(),
KeyCode::Home | KeyCode::Char('g') => self.select_first(), KeyCode::Home | KeyCode::Char('g') => self.select_first(),
@@ -1018,6 +1023,7 @@ impl FileSelector {
let (table_area, info_area) = if self.is_searching let (table_area, info_area) = if self.is_searching
|| !self.selected_indices.is_empty() || !self.selected_indices.is_empty()
|| !self.search_query.is_empty()
{ {
let chunks = let chunks =
Layout::vertical([Constraint::Min(0), Constraint::Length(3)]) Layout::vertical([Constraint::Min(0), Constraint::Length(3)])
@@ -1048,6 +1054,12 @@ impl FileSelector {
self.items.len(), self.items.len(),
self.all_items.len() self.all_items.len()
) )
} else if !self.search_query.is_empty() {
format!(
"Multi-select files to download ({} selected, {} filtered, Space: toggle, a: select-all, A: deselect-all, Enter: download, Esc/q: cancel, /: modify filter, c: clear filter)",
self.selected_indices.len(),
self.items.len()
)
} else { } else {
format!( format!(
"Multi-select files to download ({} selected, Space: toggle, a: select-all, A: deselect-all, Enter: download, Esc/q: cancel, /: search)", "Multi-select files to download ({} selected, Space: toggle, a: select-all, A: deselect-all, Enter: download, Esc/q: cancel, /: search)",
@@ -1182,28 +1194,35 @@ impl FileSelector {
} }
if let Some(info_area) = info_area { if let Some(info_area) = info_area {
let info_text = if self.is_searching { let (info_text, title, color) = if self.is_searching {
format!("Search: {}", self.search_query) (
format!("Search: {}", self.search_query),
"Filter",
Color::Yellow,
)
} else if !self.search_query.is_empty() {
(
format!(
"Current filter: {} (press / to modify, c to clear)",
self.search_query
),
"Filter",
Color::Cyan,
)
} else { } else {
format!( (
"{} file(s) selected for download", format!(
self.selected_indices.len() "{} file(s) selected for download",
self.selected_indices.len()
),
"Selection",
Color::Green,
) )
}; };
let info_widget = Paragraph::new(info_text) let info_widget = Paragraph::new(info_text)
.block(Block::default().borders(Borders::ALL).title( .block(Block::default().borders(Borders::ALL).title(title))
if self.is_searching { .style(Style::default().fg(color));
"Filter"
} else {
"Selection"
},
))
.style(Style::default().fg(if self.is_searching {
Color::Yellow
} else {
Color::Green
}));
frame.render_widget(info_widget, info_area); frame.render_widget(info_widget, info_area);
} }