diff --git a/meli/src/mail/listing.rs b/meli/src/mail/listing.rs index eb3f9713..1b3e41e1 100644 --- a/meli/src/mail/listing.rs +++ b/meli/src/mail/listing.rs @@ -31,7 +31,7 @@ use std::{ use futures::future::try_join_all; use melib::{ - backends::EnvelopeHashBatch, mbox::MboxMetadata, utils::datetime, FlagOp, UnixTimestamp, + backends::EnvelopeHashBatch, mbox::MboxMetadata, utils::datetime, Flag, FlagOp, UnixTimestamp, }; use smallvec::SmallVec; @@ -456,6 +456,86 @@ column_str!(struct SubjectString(String)); column_str!(struct FlagString(String)); column_str!(struct TagString(String, SmallVec<[Option; 8]>)); +impl FlagString { + pub(self) fn new( + flags: Flag, + is_selected: bool, + is_snoozed: bool, + is_unseen: bool, + has_attachments: bool, + context: &Context, + coordinates: (AccountHash, MailboxHash), + ) -> Self { + Self(format!( + "{flag_passed}{flag_replied}{flag_seen}{flag_trashed}{flag_draft}{flag_flagged} \ + {selected}{snoozed}{unseen}{attachments}{whitespace}", + flag_passed = Some("P") + .filter(|_| flags.contains(Flag::PASSED)) + .unwrap_or_default(), + flag_replied = Some("R") + .filter(|_| flags.contains(Flag::REPLIED)) + .unwrap_or_default(), + flag_seen = Some("S") + .filter(|_| flags.contains(Flag::SEEN)) + .unwrap_or_default(), + flag_trashed = Some("T") + .filter(|_| flags.contains(Flag::TRASHED)) + .unwrap_or_default(), + flag_draft = Some("D") + .filter(|_| flags.contains(Flag::DRAFT)) + .unwrap_or_default(), + flag_flagged = Some("F") + .filter(|_| flags.contains(Flag::FLAGGED)) + .unwrap_or_default(), + selected = if is_selected { + mailbox_settings!(context[coordinates.0][&coordinates.1].listing.selected_flag) + .as_ref() + .map(|s| s.as_str()) + .unwrap_or(DEFAULT_SELECTED_FLAG) + } else { + "" + }, + snoozed = if is_snoozed { + mailbox_settings!( + context[coordinates.0][&coordinates.1] + .listing + .thread_snoozed_flag + ) + .as_ref() + .map(|s| s.as_str()) + .unwrap_or(DEFAULT_SNOOZED_FLAG) + } else { + "" + }, + unseen = if is_unseen { + mailbox_settings!(context[coordinates.0][&coordinates.1].listing.unseen_flag) + .as_ref() + .map(|s| s.as_str()) + .unwrap_or(DEFAULT_UNSEEN_FLAG) + } else { + "" + }, + attachments = if has_attachments { + mailbox_settings!( + context[coordinates.0][&coordinates.1] + .listing + .attachment_flag + ) + .as_ref() + .map(|s| s.as_str()) + .unwrap_or(DEFAULT_ATTACHMENT_FLAG) + } else { + "" + }, + whitespace = if is_selected || is_unseen || is_snoozed || has_attachments { + " " + } else { + "" + }, + )) + } +} + #[derive(Clone, Copy, Debug)] struct MailboxMenuEntry { depth: usize, diff --git a/meli/src/mail/listing/compact.rs b/meli/src/mail/listing/compact.rs index 411b1b15..a1f8de81 100644 --- a/meli/src/mail/listing/compact.rs +++ b/meli/src/mail/listing/compact.rs @@ -972,96 +972,19 @@ impl CompactListing { } else { SubjectString(subject) }, - flag: FlagString(format!( - "{flag_passed}{flag_replied}{flag_seen}{flag_trashed}{flag_draft}{flag_flagged} \ - {selected}{snoozed}{unseen}{attachments}{whitespace}", - flag_passed = Some("P") - .filter(|_| flags.contains(Flag::PASSED)) - .unwrap_or_default(), - flag_replied = Some("R") - .filter(|_| flags.contains(Flag::REPLIED)) - .unwrap_or_default(), - flag_seen = Some("S") - .filter(|_| flags.contains(Flag::SEEN)) - .unwrap_or_default(), - flag_trashed = Some("T") - .filter(|_| flags.contains(Flag::TRASHED)) - .unwrap_or_default(), - flag_draft = Some("D") - .filter(|_| flags.contains(Flag::DRAFT)) - .unwrap_or_default(), - flag_flagged = Some("F") - .filter(|_| flags.contains(Flag::FLAGGED)) - .unwrap_or_default(), - selected = if self - .rows - .selection - .get(&root_envelope.hash()) - .cloned() - .unwrap_or(false) - { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .selected_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_SELECTED_FLAG) - } else { - "" - }, - snoozed = if thread.snoozed() { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .thread_snoozed_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_SNOOZED_FLAG) - } else { - "" - }, - unseen = if thread.unseen() > 0 { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .unseen_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_UNSEEN_FLAG) - } else { - "" - }, - attachments = if thread.has_attachments() { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .attachment_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_ATTACHMENT_FLAG) - } else { - "" - }, - whitespace = if self - .rows + flag: FlagString::new( + flags, + self.rows .selection .get(&root_envelope.hash()) .cloned() - .unwrap_or(false) - || thread.unseen() > 0 - || thread.snoozed() - || thread.has_attachments() - { - " " - } else { - "" - }, - )), + .unwrap_or(false), + thread.snoozed(), + thread.unseen() > 0, + thread.has_attachments(), + context, + (self.cursor_pos.0, self.cursor_pos.1), + ), from: FromString(Address::display_name_slice(from)), tags: TagString(tags_string, colors), highlight_self, diff --git a/meli/src/mail/listing/conversations.rs b/meli/src/mail/listing/conversations.rs index ec124012..21c67b46 100644 --- a/meli/src/mail/listing/conversations.rs +++ b/meli/src/mail/listing/conversations.rs @@ -755,11 +755,19 @@ impl ConversationsListing { } else { subject }), - flag: FlagString(format!( - "{}{}", - if thread.has_attachments() { "📎" } else { "" }, - if thread.snoozed() { "💤" } else { "" } - )), + flag: FlagString::new( + root_envelope.flags(), + self.rows + .selection + .get(&root_envelope.hash()) + .cloned() + .unwrap_or(false), + thread.snoozed(), + thread.unseen() > 0, + thread.has_attachments(), + context, + (self.cursor_pos.0, self.cursor_pos.1), + ), from: FromString(Address::display_name_slice(from)), tags: TagString(tags_string, colors), highlight_self: false, diff --git a/meli/src/mail/listing/plain.rs b/meli/src/mail/listing/plain.rs index be7141de..bebe0dfb 100644 --- a/meli/src/mail/listing/plain.rs +++ b/meli/src/mail/listing/plain.rs @@ -685,53 +685,15 @@ impl PlainListing { EntryStrings { date: DateString(self.format_date(context, e.date())), subject: SubjectString(subject), - flag: FlagString(format!( - "{selected}{unseen}{attachments}{whitespace}", - selected = if self.rows.selection.get(&e.hash()).cloned().unwrap_or(false) { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .selected_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_SELECTED_FLAG) - } else { - "" - }, - unseen = if !e.is_seen() { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .unseen_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_UNSEEN_FLAG) - } else { - "" - }, - attachments = if e.has_attachments() { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .attachment_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_ATTACHMENT_FLAG) - } else { - "" - }, - whitespace = if self.rows.selection.get(&e.hash()).cloned().unwrap_or(false) - || !e.is_seen() - || e.has_attachments() - { - " " - } else { - "" - }, - )), + flag: FlagString::new( + e.flags(), + self.rows.selection.get(&e.hash()).cloned().unwrap_or(false), + /* snoozed */ false, + !e.is_seen(), + e.has_attachments(), + context, + (self.cursor_pos.0, self.cursor_pos.1), + ), from: FromString(Address::display_name_slice(e.from())), tags: TagString(tags, colors), highlight_self: false, diff --git a/meli/src/mail/listing/thread.rs b/meli/src/mail/listing/thread.rs index 1b1cee03..318d6dd7 100644 --- a/meli/src/mail/listing/thread.rs +++ b/meli/src/mail/listing/thread.rs @@ -864,53 +864,15 @@ impl ThreadListing { EntryStrings { date: DateString(self.format_date(context, e.date())), subject: SubjectString(subject), - flag: FlagString(format!( - "{selected}{unseen}{attachments}{whitespace}", - selected = if self.rows.selection.get(&e.hash()).cloned().unwrap_or(false) { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .selected_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_SELECTED_FLAG) - } else { - "" - }, - unseen = if !e.is_seen() { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .unseen_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_UNSEEN_FLAG) - } else { - "" - }, - attachments = if e.has_attachments() { - mailbox_settings!( - context[self.cursor_pos.0][&self.cursor_pos.1] - .listing - .attachment_flag - ) - .as_ref() - .map(|s| s.as_str()) - .unwrap_or(super::DEFAULT_ATTACHMENT_FLAG) - } else { - "" - }, - whitespace = if self.rows.selection.get(&e.hash()).cloned().unwrap_or(false) - || !e.is_seen() - || e.has_attachments() - { - " " - } else { - "" - }, - )), + flag: FlagString::new( + e.flags(), + self.rows.selection.get(&e.hash()).cloned().unwrap_or(false), + /* snoozed */ false, + !e.is_seen(), + e.has_attachments(), + context, + (self.cursor_pos.0, self.cursor_pos.1), + ), from: FromString(Address::display_name_slice(e.from())), tags: TagString(tags, colors), highlight_self: false,