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 futures::future::try_join_all;
|
||||||
use melib::{
|
use melib::{
|
||||||
backends::EnvelopeHashBatch, mbox::MboxMetadata, utils::datetime, FlagOp, UnixTimestamp,
|
backends::EnvelopeHashBatch, mbox::MboxMetadata, utils::datetime, Flag, FlagOp, UnixTimestamp,
|
||||||
};
|
};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
|
@ -456,6 +456,86 @@ column_str!(struct SubjectString(String));
|
||||||
column_str!(struct FlagString(String));
|
column_str!(struct FlagString(String));
|
||||||
column_str!(struct TagString(String, SmallVec<[Option<Color>; 8]>));
|
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)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
struct MailboxMenuEntry {
|
struct MailboxMenuEntry {
|
||||||
depth: usize,
|
depth: usize,
|
||||||
|
|
|
@ -972,96 +972,19 @@ impl CompactListing {
|
||||||
} else {
|
} else {
|
||||||
SubjectString(subject)
|
SubjectString(subject)
|
||||||
},
|
},
|
||||||
flag: FlagString(format!(
|
flag: FlagString::new(
|
||||||
"{flag_passed}{flag_replied}{flag_seen}{flag_trashed}{flag_draft}{flag_flagged} \
|
flags,
|
||||||
{selected}{snoozed}{unseen}{attachments}{whitespace}",
|
self.rows
|
||||||
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
|
.selection
|
||||||
.get(&root_envelope.hash())
|
.get(&root_envelope.hash())
|
||||||
.cloned()
|
.cloned()
|
||||||
.unwrap_or(false)
|
.unwrap_or(false),
|
||||||
{
|
thread.snoozed(),
|
||||||
mailbox_settings!(
|
thread.unseen() > 0,
|
||||||
context[self.cursor_pos.0][&self.cursor_pos.1]
|
thread.has_attachments(),
|
||||||
.listing
|
context,
|
||||||
.selected_flag
|
(self.cursor_pos.0, self.cursor_pos.1),
|
||||||
)
|
),
|
||||||
.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 {
|
|
||||||
""
|
|
||||||
},
|
|
||||||
)),
|
|
||||||
from: FromString(Address::display_name_slice(from)),
|
from: FromString(Address::display_name_slice(from)),
|
||||||
tags: TagString(tags_string, colors),
|
tags: TagString(tags_string, colors),
|
||||||
highlight_self,
|
highlight_self,
|
||||||
|
|
|
@ -755,11 +755,19 @@ impl ConversationsListing {
|
||||||
} else {
|
} else {
|
||||||
subject
|
subject
|
||||||
}),
|
}),
|
||||||
flag: FlagString(format!(
|
flag: FlagString::new(
|
||||||
"{}{}",
|
root_envelope.flags(),
|
||||||
if thread.has_attachments() { "📎" } else { "" },
|
self.rows
|
||||||
if thread.snoozed() { "💤" } else { "" }
|
.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)),
|
from: FromString(Address::display_name_slice(from)),
|
||||||
tags: TagString(tags_string, colors),
|
tags: TagString(tags_string, colors),
|
||||||
highlight_self: false,
|
highlight_self: false,
|
||||||
|
|
|
@ -685,53 +685,15 @@ impl PlainListing {
|
||||||
EntryStrings {
|
EntryStrings {
|
||||||
date: DateString(self.format_date(context, e.date())),
|
date: DateString(self.format_date(context, e.date())),
|
||||||
subject: SubjectString(subject),
|
subject: SubjectString(subject),
|
||||||
flag: FlagString(format!(
|
flag: FlagString::new(
|
||||||
"{selected}{unseen}{attachments}{whitespace}",
|
e.flags(),
|
||||||
selected = if self.rows.selection.get(&e.hash()).cloned().unwrap_or(false) {
|
self.rows.selection.get(&e.hash()).cloned().unwrap_or(false),
|
||||||
mailbox_settings!(
|
/* snoozed */ false,
|
||||||
context[self.cursor_pos.0][&self.cursor_pos.1]
|
!e.is_seen(),
|
||||||
.listing
|
e.has_attachments(),
|
||||||
.selected_flag
|
context,
|
||||||
)
|
(self.cursor_pos.0, self.cursor_pos.1),
|
||||||
.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 {
|
|
||||||
""
|
|
||||||
},
|
|
||||||
)),
|
|
||||||
from: FromString(Address::display_name_slice(e.from())),
|
from: FromString(Address::display_name_slice(e.from())),
|
||||||
tags: TagString(tags, colors),
|
tags: TagString(tags, colors),
|
||||||
highlight_self: false,
|
highlight_self: false,
|
||||||
|
|
|
@ -864,53 +864,15 @@ impl ThreadListing {
|
||||||
EntryStrings {
|
EntryStrings {
|
||||||
date: DateString(self.format_date(context, e.date())),
|
date: DateString(self.format_date(context, e.date())),
|
||||||
subject: SubjectString(subject),
|
subject: SubjectString(subject),
|
||||||
flag: FlagString(format!(
|
flag: FlagString::new(
|
||||||
"{selected}{unseen}{attachments}{whitespace}",
|
e.flags(),
|
||||||
selected = if self.rows.selection.get(&e.hash()).cloned().unwrap_or(false) {
|
self.rows.selection.get(&e.hash()).cloned().unwrap_or(false),
|
||||||
mailbox_settings!(
|
/* snoozed */ false,
|
||||||
context[self.cursor_pos.0][&self.cursor_pos.1]
|
!e.is_seen(),
|
||||||
.listing
|
e.has_attachments(),
|
||||||
.selected_flag
|
context,
|
||||||
)
|
(self.cursor_pos.0, self.cursor_pos.1),
|
||||||
.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 {
|
|
||||||
""
|
|
||||||
},
|
|
||||||
)),
|
|
||||||
from: FromString(Address::display_name_slice(e.from())),
|
from: FromString(Address::display_name_slice(e.from())),
|
||||||
tags: TagString(tags, colors),
|
tags: TagString(tags, colors),
|
||||||
highlight_self: false,
|
highlight_self: false,
|
||||||
|
|
Loading…
Reference in New Issue