CompactListing: add row_attr macro

Add macro to calculate theme attribute for given thread row
master
Manos Pitsidianakis 2020-07-17 00:04:26 +03:00
parent 5e1fa2d8d7
commit 1bac926bdc
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
1 changed files with 105 additions and 94 deletions

View File

@ -45,6 +45,75 @@ macro_rules! address_list {
}}; }};
} }
macro_rules! row_attr {
($color_cache:expr, $even: expr, $unseen:expr, $highlighted:expr, $selected:expr) => {{
let fg = if $unseen {
if $even {
$color_cache.even_unseen.fg
} else {
$color_cache.odd_unseen.fg
}
} else if $highlighted {
if $even {
$color_cache.even_highlighted.fg
} else {
$color_cache.odd_highlighted.fg
}
} else if $even {
$color_cache.even.fg
} else {
$color_cache.odd.fg
};
let bg = if $highlighted {
if $even {
$color_cache.even_highlighted.bg
} else {
$color_cache.odd_highlighted.bg
}
} else if $selected {
if $even {
$color_cache.even_selected.bg
} else {
$color_cache.odd_selected.bg
}
} else if $unseen {
if $even {
$color_cache.even_unseen.bg
} else {
$color_cache.odd_unseen.bg
}
} else if $even {
$color_cache.even.bg
} else {
$color_cache.odd.bg
};
let attrs = if $highlighted {
if $even {
$color_cache.even_highlighted.attrs
} else {
$color_cache.odd_highlighted.attrs
}
} else if $selected {
if $even {
$color_cache.even_selected.attrs
} else {
$color_cache.odd_selected.attrs
}
} else if $unseen {
if $even {
$color_cache.even_unseen.attrs
} else {
$color_cache.odd_unseen.attrs
}
} else if $even {
$color_cache.even.attrs
} else {
$color_cache.odd.attrs
};
ThemeAttribute { fg, bg, attrs }
}};
}
/// A list of all mail (`Envelope`s) in a `Mailbox`. On `\n` it opens the `Envelope` content in a /// A list of all mail (`Envelope`s) in a `Mailbox`. On `\n` it opens the `Envelope` content in a
/// `ThreadView`. /// `ThreadView`.
#[derive(Debug)] #[derive(Debug)]
@ -396,70 +465,13 @@ impl ListingTrait for CompactListing {
let threads = &account.collection.threads[&self.cursor_pos.1]; let threads = &account.collection.threads[&self.cursor_pos.1];
let thread = threads.thread_ref(thread_hash); let thread = threads.thread_ref(thread_hash);
let fg_color = if thread.unseen() > 0 { let row_attr = row_attr!(
if idx % 2 == 0 { self.color_cache,
self.color_cache.even_unseen.fg idx % 2 == 0,
} else { thread.unseen() > 0,
self.color_cache.odd_unseen.fg self.cursor_pos.2 == idx,
} self.selection[&thread_hash]
} else if self.cursor_pos.2 == idx { );
if idx % 2 == 0 {
self.color_cache.even_highlighted.fg
} else {
self.color_cache.odd_highlighted.fg
}
} else if idx % 2 == 0 {
self.color_cache.even.fg
} else {
self.color_cache.odd.fg
};
let bg_color = if self.cursor_pos.2 == idx {
if idx % 2 == 0 {
self.color_cache.even_highlighted.bg
} else {
self.color_cache.odd_highlighted.bg
}
} else if self.selection[&thread_hash] {
if idx % 2 == 0 {
self.color_cache.even_selected.bg
} else {
self.color_cache.odd_selected.bg
}
} else if thread.unseen() > 0 {
if idx % 2 == 0 {
self.color_cache.even_unseen.bg
} else {
self.color_cache.odd_unseen.bg
}
} else if idx % 2 == 0 {
self.color_cache.even.bg
} else {
self.color_cache.odd.bg
};
let attrs = if self.cursor_pos.2 == idx {
if idx % 2 == 0 {
self.color_cache.even_highlighted.attrs
} else {
self.color_cache.odd_highlighted.attrs
}
} else if self.selection[&thread_hash] {
if idx % 2 == 0 {
self.color_cache.even_selected.attrs
} else {
self.color_cache.odd_selected.attrs
}
} else if thread.unseen() > 0 {
if idx % 2 == 0 {
self.color_cache.even_unseen.attrs
} else {
self.color_cache.odd_unseen.attrs
}
} else if idx % 2 == 0 {
self.color_cache.even.attrs
} else {
self.color_cache.odd.attrs
};
let (upper_left, bottom_right) = area; let (upper_left, bottom_right) = area;
let x = get_x(upper_left) let x = get_x(upper_left)
+ self.data_columns.widths[0] + self.data_columns.widths[0]
@ -471,7 +483,10 @@ impl ListingTrait for CompactListing {
get_x(upper_left)..(get_x(bottom_right) + 1), get_x(upper_left)..(get_x(bottom_right) + 1),
get_y(upper_left), get_y(upper_left),
) { ) {
grid[c].set_fg(fg_color).set_bg(bg_color).set_attrs(attrs); grid[c]
.set_fg(row_attr.fg)
.set_bg(row_attr.bg)
.set_attrs(row_attr.attrs);
} }
copy_area( copy_area(
@ -484,7 +499,7 @@ impl ListingTrait for CompactListing {
), ),
); );
for c in grid.row_iter(x..(self.data_columns.widths[3] + x), get_y(upper_left)) { for c in grid.row_iter(x..(self.data_columns.widths[3] + x), get_y(upper_left)) {
grid[c].set_bg(bg_color).set_attrs(attrs); grid[c].set_bg(row_attr.bg).set_attrs(row_attr.attrs);
} }
} }
@ -669,25 +684,25 @@ impl ListingTrait for CompactListing {
} }
} }
let account = &context.accounts[self.cursor_pos.0];
let threads = &account.collection.threads[&self.cursor_pos.1];
for r in 0..cmp::min(self.length - top_idx, rows) { for r in 0..cmp::min(self.length - top_idx, rows) {
let (fg_color, bg_color) = { let thread_hash = self.get_thread_under_cursor(r + top_idx);
let thread_hash = self.get_thread_under_cursor(r + top_idx); let row_attr = row_attr!(
self.color_cache,
let c = &self.data_columns.columns[0][(0, r + top_idx)]; (r + top_idx) % 2 == 0,
if self.selection[&thread_hash] { threads.thread_ref(thread_hash).unseen() > 0,
(c.fg(), self.color_cache.selected.bg) self.cursor_pos.2 == (r + top_idx),
} else { self.selection[&thread_hash]
(c.fg(), c.bg()) );
}
};
change_colors( change_colors(
grid, grid,
( (
pos_inc(upper_left, (0, r)), pos_inc(upper_left, (0, r)),
(flag_x.saturating_sub(1), get_y(upper_left) + r), (flag_x.saturating_sub(1), get_y(upper_left) + r),
), ),
fg_color, row_attr.fg,
bg_color, row_attr.bg,
); );
for x in flag_x for x in flag_x
..std::cmp::min( ..std::cmp::min(
@ -695,7 +710,7 @@ impl ListingTrait for CompactListing {
flag_x + 2 + self.data_columns.widths[3], flag_x + 2 + self.data_columns.widths[3],
) )
{ {
grid[(x, get_y(upper_left) + r)].set_bg(bg_color); grid[(x, get_y(upper_left) + r)].set_bg(row_attr.bg);
} }
change_colors( change_colors(
grid, grid,
@ -706,8 +721,8 @@ impl ListingTrait for CompactListing {
), ),
(get_x(bottom_right), get_y(upper_left) + r), (get_x(bottom_right), get_y(upper_left) + r),
), ),
fg_color, row_attr.fg,
bg_color, row_attr.bg,
); );
} }
@ -1121,7 +1136,7 @@ impl CompactListing {
let threads = &account.collection.threads[&self.cursor_pos.1]; let threads = &account.collection.threads[&self.cursor_pos.1];
for ((idx, (thread, root_env_hash)), strings) in for ((idx, (thread_hash, root_env_hash)), strings) in
self.rows.iter().skip(start).take(end - start + 1) self.rows.iter().skip(start).take(end - start + 1)
{ {
let idx = *idx; let idx = *idx;
@ -1136,18 +1151,14 @@ impl CompactListing {
panic!(); panic!();
} }
let thread = threads.thread_ref(*thread); let thread = threads.thread_ref(*thread_hash);
let row_attr = if thread.unseen() > 0 { let row_attr = row_attr!(
if idx % 2 == 0 { self.color_cache,
self.color_cache.even_unseen idx % 2 == 0,
} else { thread.unseen() > 0,
self.color_cache.odd_unseen self.cursor_pos.2 == idx,
} self.selection[thread_hash]
} else if idx % 2 == 0 { );
self.color_cache.even
} else {
self.color_cache.odd
};
let (x, _) = write_string_to_grid( let (x, _) = write_string_to_grid(
&idx.to_string(), &idx.to_string(),
&mut self.data_columns.columns[0], &mut self.data_columns.columns[0],