ui: fix mailbox length count

embed
Manos Pitsidianakis 2019-02-10 21:06:30 +02:00
parent 5c45910426
commit 4be5b1a868
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
2 changed files with 28 additions and 39 deletions

View File

@ -1115,7 +1115,7 @@ impl Threads {
}
pub fn len(&self) -> usize {
self.thread_nodes.len()
self.hash_set.len()
}
pub fn root_len(&self) -> usize {

View File

@ -36,7 +36,7 @@ pub struct ThreadListing {
/// Cache current view.
content: CellBuffer,
locations: Vec<(usize, usize)>,
locations: Vec<EnvelopeHash>,
/// If we must redraw on next redraw event
dirty: bool,
/// If `self.view` exists or not.
@ -117,6 +117,7 @@ impl ThreadListing {
self.length = mailbox.collection.threads.len();
self.content = CellBuffer::new(MAX_COLS, self.length + 1, Cell::with_char(' '));
self.locations.clear();
if self.length == 0 {
write_string_to_grid(
&format!("Folder `{}` is empty.", mailbox.folder.name()),
@ -135,19 +136,18 @@ impl ThreadListing {
let threads = &mailbox.collection.threads;
threads.sort_by(self.sort, self.subsort, &mailbox.collection);
let thread_nodes: &Vec<ThreadNode> = &threads.thread_nodes();
self.locations = threads.threads_iter().collect();
let mut iter = self.locations.iter().peekable();
let mut iter = threads.threads_iter().peekable();
/* This is just a desugared for loop so that we can use .peek() */
let mut idx = 0;
while let Some((indentation, i)) = iter.next() {
let thread_node = &thread_nodes[*i];
let thread_node = &thread_nodes[i];
if *indentation == 0 {
if indentation == 0 {
thread_idx += 1;
}
match iter.peek() {
Some((x, _)) if *x == *indentation => {
Some((x, _)) if *x == indentation => {
indentations.pop();
indentations.push(true);
}
@ -156,12 +156,13 @@ impl ThreadListing {
indentations.push(false);
}
}
if threads.has_sibling(*i) {
if threads.has_sibling(i) {
indentations.pop();
indentations.push(true);
}
if thread_node.has_message() {
let envelope: &Envelope = &mailbox.collection[&thread_node.message().unwrap()];
self.locations.push(envelope.hash());
let fg_color = if !envelope.is_seen() {
Color::Byte(0)
} else {
@ -178,8 +179,8 @@ impl ThreadListing {
&ThreadListing::make_thread_entry(
envelope,
idx,
*indentation,
*i,
indentation,
i,
threads,
&indentations,
self.length,
@ -196,6 +197,7 @@ impl ThreadListing {
self.content[(x, idx)].set_bg(bg_color);
}
} else {
self.locations.push(0);
for x in 0..MAX_COLS {
self.content[(x, idx)].set_ch(' ');
self.content[(x, idx)].set_bg(Color::Default);
@ -203,11 +205,11 @@ impl ThreadListing {
}
match iter.peek() {
Some((x, _)) if *x > *indentation => {
Some((x, _)) if *x > indentation => {
indentations.push(false);
}
Some((x, _)) if *x < *indentation => {
for _ in 0..(*indentation - *x) {
Some((x, _)) if *x < indentation => {
for _ in 0..(indentation - *x) {
indentations.pop();
}
}
@ -224,10 +226,8 @@ impl ThreadListing {
if mailbox.len() == 0 {
return;
}
if let Some(hash) =
mailbox.collection.threads.thread_nodes()[self.locations[idx].1].message()
{
let envelope: &Envelope = &mailbox.collection[&hash];
if self.locations[idx] != 0 {
let envelope: &Envelope = &mailbox.collection[&self.locations[idx]];
let fg_color = if !envelope.is_seen() {
Color::Byte(0)
@ -258,10 +258,8 @@ impl ThreadListing {
return;
}
if let Some(hash) =
mailbox.collection.threads.thread_nodes()[self.locations[idx].1].message()
{
let envelope: &Envelope = &mailbox.collection[&hash];
if self.locations[idx] != 0 {
let envelope: &Envelope = &mailbox.collection[&self.locations[idx]];
let fg_color = if !envelope.is_seen() {
Color::Byte(0)
@ -456,20 +454,11 @@ impl Component for ThreadListing {
let idx = self.cursor_pos.2;
{
let has_message: bool = {
let account = &context.accounts[self.cursor_pos.0];
let mailbox = &account[self.cursor_pos.1].as_ref().unwrap();
mailbox.collection.threads.thread_nodes()
[self.locations[self.new_cursor_pos.2].1]
.message()
.is_some()
};
if !has_message {
self.dirty = false;
/* Draw the entire list */
return self.draw_list(grid, area, context);
}
let has_message: bool = self.locations[self.new_cursor_pos.2] > 0;
if !has_message {
self.dirty = false;
/* Draw the entire list */
return self.draw_list(grid, area, context);
}
/* Mark message as read */
@ -480,8 +469,8 @@ impl Component for ThreadListing {
let account = &mut context.accounts[self.cursor_pos.0];
let (hash, is_seen) = {
let mailbox = &mut account[self.cursor_pos.1].as_mut().unwrap();
let envelope: &mut Envelope =
mailbox.thread_to_mail_mut(self.locations[self.new_cursor_pos.2].1);
let envelope: &Envelope =
&mailbox.collection[&self.locations[self.new_cursor_pos.2]];
(envelope.hash(), envelope.is_seen())
};
if !is_seen {
@ -495,7 +484,7 @@ impl Component for ThreadListing {
};
let mailbox = &mut account[self.cursor_pos.1].as_mut().unwrap();
let envelope: &mut Envelope =
mailbox.thread_to_mail_mut(self.locations[self.new_cursor_pos.2].1);
mailbox.collection.get_mut(&self.locations[self.new_cursor_pos.2]).unwrap();
envelope.set_seen(op).unwrap();
true
} else {
@ -547,7 +536,7 @@ impl Component for ThreadListing {
let coordinates = (
self.cursor_pos.0,
self.cursor_pos.1,
mailbox.threaded_mail(self.locations[self.cursor_pos.2].1),
self.locations[self.cursor_pos.2],
);
self.view = Some(MailView::new(coordinates, None, None));
}