listing: extract common FlagString logic

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/372/head
Manos Pitsidianakis 2 months ago
parent 475609fe92
commit 35a9f33aab
No known key found for this signature in database
GPG Key ID: 7729C7707F7E09D0

@ -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<Color>; 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,

@ -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,

@ -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,

@ -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,

@ -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,

Loading…
Cancel
Save