listing: show auto-hide scrollbar in sidebar menu

Setting to turn it off is listing.show_menu_scrollbar.

Concerns #85 Accounts sidebar doesn't scroll
jmap-eventsource
Manos Pitsidianakis 2020-11-28 00:19:15 +02:00
parent b659749880
commit 8d9247e9a3
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
4 changed files with 77 additions and 0 deletions

View File

@ -843,6 +843,11 @@ Sets the string to print in the mailbox tree for a leaf level where its root has
.It Ic sidebar_divider Ar char .It Ic sidebar_divider Ar char
.Pq Em optional .Pq Em optional
Sets the character to print as the divider between the accounts list and the message list. Sets the character to print as the divider between the accounts list and the message list.
.It Ic show_menu_scrollbar Ar boolean
.Pq Em optional
Show auto-hiding scrollbar in accounts sidebar menu.
.\" default value
.Pq Em true
.El .El
.Ss Examples of sidebar mailbox tree customization .Ss Examples of sidebar mailbox tree customization
The default values The default values

View File

@ -474,6 +474,13 @@ enum MenuEntryCursor {
Mailbox(usize), Mailbox(usize),
} }
#[derive(PartialEq, Copy, Clone, Debug)]
enum ShowMenuScrollbar {
Never,
True,
False,
}
#[derive(Debug)] #[derive(Debug)]
pub struct Listing { pub struct Listing {
component: ListingComponent, component: ListingComponent,
@ -484,6 +491,8 @@ pub struct Listing {
cursor_pos: (usize, MenuEntryCursor), cursor_pos: (usize, MenuEntryCursor),
menu_cursor_pos: (usize, MenuEntryCursor), menu_cursor_pos: (usize, MenuEntryCursor),
menu_content: CellBuffer, menu_content: CellBuffer,
menu_scrollbar_show_timer: crate::jobs::Timer,
show_menu_scrollbar: ShowMenuScrollbar,
startup_checks_rate: RateLimit, startup_checks_rate: RateLimit,
id: ComponentId, id: ComponentId,
theme_default: ThemeAttribute, theme_default: ThemeAttribute,
@ -604,6 +613,14 @@ impl Component for Listing {
fn process_event(&mut self, event: &mut UIEvent, context: &mut Context) -> bool { fn process_event(&mut self, event: &mut UIEvent, context: &mut Context) -> bool {
match event { match event {
UIEvent::Timer(n) if *n == self.menu_scrollbar_show_timer.id() => {
if self.show_menu_scrollbar == ShowMenuScrollbar::True {
self.show_menu_scrollbar = ShowMenuScrollbar::False;
self.set_dirty(true);
self.menu_content.empty();
}
return true;
}
UIEvent::StartupCheck(ref f) => { UIEvent::StartupCheck(ref f) => {
if self.component.coordinates().1 == *f { if self.component.coordinates().1 == *f {
if !self.startup_checks_rate.tick() { if !self.startup_checks_rate.tick() {
@ -771,6 +788,10 @@ impl Component for Listing {
} }
UIEvent::Input(Key::Left) if self.menu_visibility => { UIEvent::Input(Key::Left) if self.menu_visibility => {
self.focus = ListingFocus::Menu; self.focus = ListingFocus::Menu;
if self.show_menu_scrollbar != ShowMenuScrollbar::Never {
self.menu_scrollbar_show_timer.rearm();
self.show_menu_scrollbar = ShowMenuScrollbar::True;
}
self.ratio = 50; self.ratio = 50;
self.set_dirty(true); self.set_dirty(true);
} }
@ -1241,6 +1262,10 @@ impl Component for Listing {
amount -= 1; amount -= 1;
} }
} }
if self.show_menu_scrollbar != ShowMenuScrollbar::Never {
self.menu_scrollbar_show_timer.rearm();
self.show_menu_scrollbar = ShowMenuScrollbar::True;
}
self.menu_content.empty(); self.menu_content.empty();
self.set_dirty(true); self.set_dirty(true);
return true; return true;
@ -1298,6 +1323,10 @@ impl Component for Listing {
} else { } else {
return true; return true;
} }
if self.show_menu_scrollbar != ShowMenuScrollbar::Never {
self.menu_scrollbar_show_timer.rearm();
self.show_menu_scrollbar = ShowMenuScrollbar::True;
}
self.menu_content.empty(); self.menu_content.empty();
return true; return true;
} }
@ -1347,6 +1376,10 @@ impl Component for Listing {
} }
_ => return false, _ => return false,
} }
if self.show_menu_scrollbar != ShowMenuScrollbar::Never {
self.menu_scrollbar_show_timer.rearm();
self.show_menu_scrollbar = ShowMenuScrollbar::True;
}
self.menu_content.empty(); self.menu_content.empty();
self.set_dirty(true); self.set_dirty(true);
@ -1518,6 +1551,11 @@ impl Listing {
cursor_pos: (0, MenuEntryCursor::Mailbox(0)), cursor_pos: (0, MenuEntryCursor::Mailbox(0)),
menu_cursor_pos: (0, MenuEntryCursor::Mailbox(0)), menu_cursor_pos: (0, MenuEntryCursor::Mailbox(0)),
menu_content: CellBuffer::new_with_context(0, 0, None, context), menu_content: CellBuffer::new_with_context(0, 0, None, context),
menu_scrollbar_show_timer: context.job_executor.clone().create_timer(
std::time::Duration::from_secs(0),
std::time::Duration::from_millis(1200),
),
show_menu_scrollbar: ShowMenuScrollbar::Never,
startup_checks_rate: RateLimit::new(2, 1000, context.job_executor.clone()), startup_checks_rate: RateLimit::new(2, 1000, context.job_executor.clone()),
theme_default: conf::value(context, "theme_default"), theme_default: conf::value(context, "theme_default"),
id: ComponentId::new_v4(), id: ComponentId::new_v4(),
@ -1599,6 +1637,22 @@ impl Listing {
(width - 1, std::cmp::min(skip_offset + rows, height - 1)), (width - 1, std::cmp::min(skip_offset + rows, height - 1)),
), ),
); );
if self.show_menu_scrollbar == ShowMenuScrollbar::True && total_height > rows {
ScrollBar::default().set_show_arrows(true).draw(
grid,
(
pos_inc(upper_left!(area), (width!(area), 0)),
bottom_right!(area),
),
context,
/* position */
skip_offset,
/* visible_rows */
rows,
/* length */
total_height,
);
}
context.dirty_areas.push_back(area); context.dirty_areas.push_back(area);
} }
@ -1925,6 +1979,12 @@ impl Listing {
self.menu_cursor_pos = self.cursor_pos; self.menu_cursor_pos = self.cursor_pos;
/* clear menu to force redraw */ /* clear menu to force redraw */
self.menu_content.empty(); self.menu_content.empty();
if *account_settings!(context[account_hash].listing.show_menu_scrollbar) {
self.show_menu_scrollbar = ShowMenuScrollbar::True;
self.menu_scrollbar_show_timer.rearm();
} else {
self.show_menu_scrollbar = ShowMenuScrollbar::Never;
}
} }
fn open_status(&mut self, account_idx: usize, context: &mut Context) { fn open_status(&mut self, account_idx: usize, context: &mut Context) {

View File

@ -57,6 +57,11 @@ pub struct ListingSettings {
#[serde(default = "zero_val", alias = "context-lines")] #[serde(default = "zero_val", alias = "context-lines")]
pub context_lines: usize, pub context_lines: usize,
///Show auto-hiding scrollbar in accounts sidebar menu.
///Default: True
#[serde(default = "true_val")]
pub show_menu_scrollbar: bool,
/// Datetime formatting passed verbatim to strftime(3). /// Datetime formatting passed verbatim to strftime(3).
/// Default: %Y-%m-%d %T /// Default: %Y-%m-%d %T
#[serde(default = "none", alias = "datetime-fmt")] #[serde(default = "none", alias = "datetime-fmt")]
@ -104,6 +109,7 @@ impl Default for ListingSettings {
fn default() -> Self { fn default() -> Self {
Self { Self {
context_lines: 0, context_lines: 0,
show_menu_scrollbar: true,
datetime_fmt: None, datetime_fmt: None,
recent_dates: true, recent_dates: true,
filter: None, filter: None,
@ -124,6 +130,7 @@ impl DotAddressable for ListingSettings {
let tail = &path[1..]; let tail = &path[1..];
match *field { match *field {
"context_lines" => self.context_lines.lookup(field, tail), "context_lines" => self.context_lines.lookup(field, tail),
"show_menu_scrollbar" => self.show_menu_scrollbar.lookup(field, tail),
"datetime_fmt" => self.datetime_fmt.lookup(field, tail), "datetime_fmt" => self.datetime_fmt.lookup(field, tail),
"recent_dates" => self.recent_dates.lookup(field, tail), "recent_dates" => self.recent_dates.lookup(field, tail),
"filter" => self.filter.lookup(field, tail), "filter" => self.filter.lookup(field, tail),

View File

@ -102,6 +102,10 @@ pub struct ListingSettingsOverride {
#[serde(alias = "context-lines")] #[serde(alias = "context-lines")]
#[serde(default)] #[serde(default)]
pub context_lines: Option<usize>, pub context_lines: Option<usize>,
#[doc = "Show auto-hiding scrollbar in accounts sidebar menu."]
#[doc = "Default: True"]
#[serde(default)]
pub show_menu_scrollbar: Option<bool>,
#[doc = " Datetime formatting passed verbatim to strftime(3)."] #[doc = " Datetime formatting passed verbatim to strftime(3)."]
#[doc = " Default: %Y-%m-%d %T"] #[doc = " Default: %Y-%m-%d %T"]
#[serde(alias = "datetime-fmt")] #[serde(alias = "datetime-fmt")]
@ -139,6 +143,7 @@ impl Default for ListingSettingsOverride {
fn default() -> Self { fn default() -> Self {
ListingSettingsOverride { ListingSettingsOverride {
context_lines: None, context_lines: None,
show_menu_scrollbar: None,
datetime_fmt: None, datetime_fmt: None,
recent_dates: None, recent_dates: None,
filter: None, filter: None,