diff --git a/meli/src/mail/listing.rs b/meli/src/mail/listing.rs index 0566de6e..478eb60f 100644 --- a/meli/src/mail/listing.rs +++ b/meli/src/mail/listing.rs @@ -20,7 +20,7 @@ */ use std::{ - collections::{BTreeSet, HashMap, HashSet}, + collections::{BTreeMap, BTreeSet, HashMap, HashSet}, convert::TryFrom, fs::File, future::Future, @@ -488,7 +488,7 @@ column_str!(struct SubjectString(String)); column_str!(struct FlagString(String)); column_str!(struct TagString(String, SmallVec<[Option; 8]>)); -#[derive(Debug)] +#[derive(Debug, Copy, Clone)] struct MailboxMenuEntry { depth: usize, indentation: u32, @@ -496,6 +496,7 @@ struct MailboxMenuEntry { visible: bool, collapsed: bool, mailbox_hash: MailboxHash, + index_style: Option, } #[derive(Debug)] @@ -1196,6 +1197,12 @@ impl Component for Listing { } }) .collect::<_>(); + let previous_index_styles: BTreeMap = self.accounts + [account_index] + .entries + .iter() + .filter_map(|e| Some((e.mailbox_hash, e.index_style?))) + .collect::<_>(); self.accounts[account_index].entries = context.accounts[&*account_hash] .list_mailboxes() .into_iter() @@ -1215,6 +1222,7 @@ impl Component for Listing { } else { previous_collapsed_mailboxes.contains(&f.hash) }, + index_style: previous_index_styles.get(&f.hash).copied(), }) .collect::<_>(); self.menu.grid_mut().empty(); @@ -1245,6 +1253,12 @@ impl Component for Listing { } }) .collect::<_>(); + let previous_index_styles: BTreeMap = self.accounts + [account_index] + .entries + .iter() + .filter_map(|e| Some((e.mailbox_hash, e.index_style?))) + .collect::<_>(); self.accounts[account_index].entries = context.accounts[&*account_hash] .list_mailboxes() .into_iter() @@ -1260,6 +1274,7 @@ impl Component for Listing { mailbox_hash: f.hash, visible: true, collapsed: previous_collapsed_mailboxes.contains(&f.hash), + index_style: previous_index_styles.get(&f.hash).copied(), }) .collect::<_>(); let mut fallback = 0; @@ -1595,19 +1610,19 @@ impl Component for Listing { match event { UIEvent::Action(ref action) => match action { Action::Listing(ListingAction::SetPlain) => { - self.set_style(IndexStyle::Plain, context); + self.set_index_style(IndexStyle::Plain, context); return true; } Action::Listing(ListingAction::SetThreaded) => { - self.set_style(IndexStyle::Threaded, context); + self.set_index_style(IndexStyle::Threaded, context); return true; } Action::Listing(ListingAction::SetCompact) => { - self.set_style(IndexStyle::Compact, context); + self.set_index_style(IndexStyle::Compact, context); return true; } Action::Listing(ListingAction::SetConversations) => { - self.set_style(IndexStyle::Conversations, context); + self.set_index_style(IndexStyle::Conversations, context); return true; } Action::Listing(ListingAction::Import(file_path, mailbox_path)) => { @@ -2489,6 +2504,7 @@ impl Listing { mailbox_hash: f.hash, visible: true, collapsed: a[&f.hash].conf.collapsed, + index_style: a[&f.hash].conf.conf_override().listing.index_style, }) .collect::<_>(); @@ -2677,6 +2693,7 @@ impl Listing { mailbox_hash, visible: _, collapsed, + index_style: _, }, ) in self.accounts[aidx].entries.iter().enumerate() { @@ -3011,6 +3028,12 @@ impl Listing { } }) .collect::<_>(); + let previous_index_styles: BTreeMap = self.accounts + [self.cursor_pos.account] + .entries + .iter() + .filter_map(|e| Some((e.mailbox_hash, e.index_style?))) + .collect::<_>(); self.accounts[self.cursor_pos.account].entries = context.accounts[self.cursor_pos.account] .list_mailboxes() .into_iter() @@ -3032,13 +3055,17 @@ impl Listing { } else { previous_collapsed_mailboxes.contains(&f.hash) }, + index_style: previous_index_styles.get(&f.hash).copied(), }) .collect::<_>(); match self.cursor_pos.menu { MenuEntryCursor::Mailbox(idx) => { - /* Account might have no mailboxes yet if it's offline */ - if let Some(MailboxMenuEntry { mailbox_hash, .. }) = - self.accounts[self.cursor_pos.account].entries.get(idx) + // Account might have no mailboxes yet if it's offline + if let Some(MailboxMenuEntry { + mailbox_hash, + index_style, + .. + }) = self.accounts[self.cursor_pos.account].entries.get(idx) { self.component .process_event(&mut UIEvent::VisibilityChange(false), context); @@ -3046,9 +3073,10 @@ impl Listing { .set_coordinates((account_hash, *mailbox_hash)); self.component.refresh_mailbox(context, true); - let index_style = - mailbox_settings!(context[account_hash][mailbox_hash].listing.index_style); - self.set_style(*index_style, context); + // Check if per-mailbox configuration overrides general configuration + let index_style_override = + *mailbox_settings!(context[account_hash][mailbox_hash].listing.index_style); + self.set_index_style(index_style.unwrap_or(index_style_override), context); } else if !matches!(self.component, ListingComponent::Offline(_)) { self.component.unrealize(context); self.component = @@ -3095,7 +3123,7 @@ impl Listing { !matches!(self.component.focus(), Focus::EntryFullscreen) && self.menu_visibility } - fn set_style(&mut self, new_style: IndexStyle, context: &mut Context) { + fn set_index_style(&mut self, new_style: IndexStyle, context: &mut Context) { let old = match new_style { IndexStyle::Conversations | IndexStyle::Threaded | IndexStyle::Plain => { if matches!(self.component, Plain(_)) { @@ -3139,6 +3167,11 @@ impl Listing { // // coordinates)), //} }; + if let MenuEntryCursor::Mailbox(idx) = self.cursor_pos.menu { + if let Some(mbox_entry) = self.accounts[self.cursor_pos.account].entries.get_mut(idx) { + mbox_entry.index_style = Some(new_style); + } + } self.component .process_event(&mut UIEvent::VisibilityChange(true), context); old.unrealize(context);