From 7e76cb7a4ad1403f3711a0dc7ed5b4d1edb61d92 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Fri, 3 May 2019 23:49:25 +0300 Subject: [PATCH] ui: align columns in CompactListing --- ui/src/components/mail/listing/compact.rs | 101 ++++++++++++++++++---- 1 file changed, 86 insertions(+), 15 deletions(-) diff --git a/ui/src/components/mail/listing/compact.rs b/ui/src/components/mail/listing/compact.rs index a0d45028..85c3de94 100644 --- a/ui/src/components/mail/listing/compact.rs +++ b/ui/src/components/mail/listing/compact.rs @@ -21,6 +21,7 @@ use super::*; use components::utilities::PageMovement; +use std::cmp; //use melib::mailbox::backends::BackendOp; @@ -57,21 +58,18 @@ impl fmt::Display for MailboxView { impl MailboxView { /// Helper function to format entry strings for CompactListing */ /* TODO: Make this configurable */ - fn make_entry_string(e: &Envelope, len: usize, idx: usize) -> String { + fn make_entry_string(e: &Envelope, len: usize, idx: usize) -> (String, String, String) { if len > 0 { - format!( - "{} {} {:.85} ({})", - idx, - &MailboxView::format_date(e), - e.subject(), - len + ( + idx.to_string(), + MailboxView::format_date(e), + format!("{} ({})", e.subject(), len), ) } else { - format!( - "{} {} {:.85}", - idx, - &MailboxView::format_date(e), - e.subject(), + ( + idx.to_string(), + MailboxView::format_date(e), + e.subject().to_string(), ) } } @@ -153,6 +151,9 @@ impl MailboxView { return; } let threads = &mailbox.collection.threads; + let mut rows = Vec::with_capacity(1024); + let mut min_width = (0, 0, 0); + threads.sort_by(self.sort, self.subsort, &mailbox.collection); for (idx, root_idx) in threads.root_iter().enumerate() { let thread_node = &threads.thread_nodes()[root_idx]; @@ -177,6 +178,51 @@ impl MailboxView { panic!(); } let root_envelope: &Envelope = &mailbox.collection[&i]; + let strings = MailboxView::make_entry_string(root_envelope, thread_node.len(), idx); + min_width.0 = cmp::max(min_width.0, strings.0.len()); /* index */ + min_width.1 = cmp::max(min_width.1, strings.1.split_graphemes().len()); /* date */ + min_width.2 = cmp::max(min_width.2, strings.2.split_graphemes().len()); /* subject */ + rows.push(strings); + self.order.insert(i, idx); + } + let widths: (usize, usize, usize); + let column_sep: usize; + + if MAX_COLS >= min_width.0 + min_width.1 + min_width.2 { + widths = min_width; + column_sep = 2; + } else { + let width = MAX_COLS - 3 - min_width.0; + widths = ( + min_width.0, + cmp::min(min_width.1, width / 3), + cmp::min(min_width.2, (2 * width) / 3), + ); + column_sep = 1; + } + + for ((idx, root_idx), strings) in threads.root_iter().enumerate().zip(rows) { + let thread_node = &threads.thread_nodes()[root_idx]; + let i = if let Some(i) = thread_node.message() { + i + } else { + let mut iter_ptr = thread_node.children()[0]; + while threads.thread_nodes()[iter_ptr].message().is_none() { + iter_ptr = threads.thread_nodes()[iter_ptr].children()[0]; + } + threads.thread_nodes()[iter_ptr].message().unwrap() + }; + if !mailbox.collection.contains_key(&i) { + debug!("key = {}", i); + debug!( + "name = {} {}", + mailbox.name(), + context.accounts[self.cursor_pos.0].name() + ); + debug!("{:#?}", context.accounts); + + panic!(); + } let fg_color = if thread_node.has_unseen() { Color::Byte(0) } else { @@ -189,14 +235,39 @@ impl MailboxView { } else { Color::Default }; - let (x, _) = write_string_to_grid( - &MailboxView::make_entry_string(root_envelope, thread_node.len(), idx), + write_string_to_grid( + &strings.0, &mut self.content, fg_color, bg_color, - ((0, idx), (MAX_COLS - 1, idx)), + ((0, idx), (widths.0, idx)), false, ); + let mut x = widths.0 + column_sep; + for x in widths.0..x { + self.content[(x, idx)].set_bg(bg_color); + } + write_string_to_grid( + &strings.1, + &mut self.content, + fg_color, + bg_color, + ((x, idx), (widths.1 + x, idx)), + false, + ); + for x in widths.1 + x..widths.1 + column_sep + 1 { + self.content[(x, idx)].set_bg(bg_color); + } + x += widths.1 + column_sep + 1; + let (x, _) = write_string_to_grid( + &strings.2, + &mut self.content, + fg_color, + bg_color, + ((x, idx), (widths.2 + x, idx)), + false, + ); + self.order.insert(i, idx); for x in x..MAX_COLS {