listing: extract common FlagString logic
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>pull/372/head
parent
475609fe92
commit
35a9f33aab
|
@ -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
|
||||
flag: FlagString::new(
|
||||
flags,
|
||||
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
|
||||
.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…
Reference in New Issue