From cd448924ed102531b7cf5676968baedc392c862e Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sat, 6 Jan 2024 15:35:56 +0200 Subject: [PATCH] listing: add clear-selection command Add a command that performs what Escape does: clears the selection. Signed-off-by: Manos Pitsidianakis --- meli/docs/meli.1 | 2 ++ meli/src/command.rs | 5 +++++ meli/src/command/actions.rs | 1 + meli/src/command/parser.rs | 20 ++++++++++++++++++++ meli/src/mail/listing.rs | 13 +++++++++++++ 5 files changed, 41 insertions(+) diff --git a/meli/docs/meli.1 b/meli/docs/meli.1 index 55da3027..3d9bed92 100644 --- a/meli/docs/meli.1 +++ b/meli/docs/meli.1 @@ -452,6 +452,8 @@ Escape exits search results. select threads matching .Ar STRING query. +.It Cm clear-selection +Clear current selection. .It Cm set seen, set unseen Set seen status of message. .It Cm import Ar FILEPATH Ar MAILBOX_PATH diff --git a/meli/src/command.rs b/meli/src/command.rs index e30c6d1c..039c7ef9 100644 --- a/meli/src/command.rs +++ b/meli/src/command.rs @@ -340,6 +340,11 @@ define_commands!([ tokens: &[One(Literal("search")), One(RestOfStringValue)], parser: parser::search }, + { tags: ["clear-selection"], + desc: "clear-selection", + tokens: &[One(Literal("clear-selection"))], + parser: parser::select + }, { tags: ["select"], desc: "select , selects envelopes matching with given term", tokens: &[One(Literal("select")), One(RestOfStringValue)], diff --git a/meli/src/command/actions.rs b/meli/src/command/actions.rs index 12fcc560..1e6e6e69 100644 --- a/meli/src/command/actions.rs +++ b/meli/src/command/actions.rs @@ -59,6 +59,7 @@ pub enum ListingAction { OpenInNewTab, Tag(TagAction), Flag(FlagAction), + ClearSelection, ToggleThreadSnooze, } diff --git a/meli/src/command/parser.rs b/meli/src/command/parser.rs index 5cd663a6..a7a96067 100644 --- a/meli/src/command/parser.rs +++ b/meli/src/command/parser.rs @@ -464,6 +464,26 @@ pub fn search(input: &[u8]) -> IResult<&[u8], Result> { Ok((input, Ok(Listing(Search(String::from(string)))))) } pub fn select(input: &[u8]) -> IResult<&[u8], Result> { + #[inline] + fn clear_selection(input: &[u8]) -> Option>> { + if !input.trim().starts_with(b"clear-selection") { + return None; + } + #[inline] + fn inner(input: &[u8]) -> IResult<&[u8], Result> { + let mut check = arg_init! { min_arg:0, max_arg: 0, clear_selection}; + let (input, _) = tag("clear-selection")(input.ltrim())?; + arg_chk!(start check, input); + arg_chk!(finish check, input); + let (input, _) = eof(input)?; + Ok((input, Ok(Listing(ListingAction::ClearSelection)))) + } + Some(inner(input)) + } + if let Some(retval) = clear_selection(input) { + return retval; + } + let mut check = arg_init! { min_arg:1, max_arg: {u8::MAX}, select}; let (input, _) = tag("select")(input.trim())?; arg_chk!(start check, input); diff --git a/meli/src/mail/listing.rs b/meli/src/mail/listing.rs index 105d5661..db5b40c2 100644 --- a/meli/src/mail/listing.rs +++ b/meli/src/mail/listing.rs @@ -1677,6 +1677,19 @@ impl Component for Listing { self.component.row_updates().extend(row_updates); return true; } + Action::Listing(ListingAction::ClearSelection) => { + // Clear selection. + let row_updates: SmallVec<[EnvelopeHash; 8]> = + self.component.get_focused_items(context); + for h in &row_updates { + if let Some(val) = self.component.selection().get_mut(h) { + *val = false; + } + } + self.component.row_updates().extend(row_updates); + self.component.set_dirty(true); + return true; + } _ => {} }, UIEvent::Input(ref key)