diff --git a/src/filter.rs b/src/filter.rs index 68dea80..24b3e69 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -66,6 +66,7 @@ impl FilteredView { Key::Enter if !self.items.is_empty() => None, // Otherwise, no items found. Key::Enter => Some(State::Error("No items".into())), + Key::Tab => Some(State::Active), // Ignore spaces passing through. Key::Char(' ') => { self.input.delete_left(); diff --git a/src/multiselect.rs b/src/multiselect.rs index ea1a10d..5a29a98 100644 --- a/src/multiselect.rs +++ b/src/multiselect.rs @@ -157,6 +157,15 @@ impl PromptInteraction> for MultiSelect { self.page.start = self.cursor - self.page.height + 1; } } + Key::Tab => { + let any_selected = self.items.iter().any(|item| item.borrow().selected); + + let target_state = !any_selected; + + for item in &self.items { + item.borrow_mut().selected = target_state; + } + } Key::Char(' ') => { let mut item = self.filter.items()[self.cursor].borrow_mut(); item.selected = !item.selected; @@ -236,7 +245,7 @@ impl PromptInteraction> for MultiSelect { theme.format_footer_with_message( &state.into(), &format!( - "{not_rendered_items} selected item{s} not displayed", + "{not_rendered_items} selected item{s} not displayed - Tab: toggle all", s = if not_rendered_items > 1 { "s" } else { "" } ), )