feat(chrono): scrollable lapses list
This commit is contained in:
@@ -28,6 +28,8 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> {
|
|||||||
let start_time = time::Instant::now();
|
let start_time = time::Instant::now();
|
||||||
let mut lapses: Vec<Lapse> = vec![];
|
let mut lapses: Vec<Lapse> = vec![];
|
||||||
|
|
||||||
|
let mut scroll_offset: usize = 0;
|
||||||
|
|
||||||
let mut quit = false;
|
let mut quit = false;
|
||||||
while !quit {
|
while !quit {
|
||||||
// Handle events
|
// Handle events
|
||||||
@@ -50,6 +52,25 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
lapses.push(Lapse { time, delta });
|
lapses.push(Lapse { time, delta });
|
||||||
|
|
||||||
|
scroll_offset = 0;
|
||||||
|
}
|
||||||
|
// Handle scroll in lapses list
|
||||||
|
KeyCode::Down => {
|
||||||
|
scroll_offset = min(scroll_offset + 1, lapses.len());
|
||||||
|
}
|
||||||
|
KeyCode::Up => {
|
||||||
|
scroll_offset = if scroll_offset == 0 {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
scroll_offset - 1
|
||||||
|
};
|
||||||
|
}
|
||||||
|
KeyCode::PageDown => {
|
||||||
|
scroll_offset = lapses.len();
|
||||||
|
}
|
||||||
|
KeyCode::PageUp => {
|
||||||
|
scroll_offset = 0;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
@@ -61,7 +82,7 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> {
|
|||||||
queue!(stdout, terminal::Clear(ClearType::All))?;
|
queue!(stdout, terminal::Clear(ClearType::All))?;
|
||||||
|
|
||||||
// Render
|
// Render
|
||||||
render_frame(&config, start_time, &lapses)?;
|
render_frame(&config, start_time, &lapses, &mut scroll_offset)?;
|
||||||
|
|
||||||
config.color.update();
|
config.color.update();
|
||||||
|
|
||||||
@@ -73,7 +94,12 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_frame(config: &Config, start_time: time::Instant, lapses: &Vec<Lapse>) -> io::Result<()> {
|
fn render_frame(
|
||||||
|
config: &Config,
|
||||||
|
start_time: time::Instant,
|
||||||
|
lapses: &Vec<Lapse>,
|
||||||
|
scroll_offset: &mut usize,
|
||||||
|
) -> io::Result<()> {
|
||||||
let color = config.color.get_value();
|
let color = config.color.get_value();
|
||||||
|
|
||||||
// Display time
|
// Display time
|
||||||
@@ -83,13 +109,32 @@ fn render_frame(config: &Config, start_time: time::Instant, lapses: &Vec<Lapse>)
|
|||||||
// Display lapses
|
// Display lapses
|
||||||
let (width, height) = terminal::size()?;
|
let (width, height) = terminal::size()?;
|
||||||
let y = height / 2 + symbols::SYMBOL_HEIGHT as u16 / 2 + 2;
|
let y = height / 2 + symbols::SYMBOL_HEIGHT as u16 / 2 + 2;
|
||||||
let max_items = min(10, height - y) as usize;
|
let max_items = min(10, height - y - 1) as usize;
|
||||||
|
|
||||||
for (i, lapse) in lapses.iter().rev().take(max_items).enumerate() {
|
if lapses.len() <= max_items {
|
||||||
|
*scroll_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if lapses.len() > max_items && *scroll_offset > lapses.len() - max_items {
|
||||||
|
*scroll_offset = lapses.len() - max_items;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i, lapse) in lapses
|
||||||
|
.iter()
|
||||||
|
.rev()
|
||||||
|
.skip(*scroll_offset)
|
||||||
|
.take(max_items)
|
||||||
|
.enumerate()
|
||||||
|
{
|
||||||
let delta = utils::format_duration(lapse.delta);
|
let delta = utils::format_duration(lapse.delta);
|
||||||
let time = utils::format_duration(lapse.time);
|
let time = utils::format_duration(lapse.time);
|
||||||
|
|
||||||
let lapse = format!("#0{} -- +{} -- {}", lapses.len() - i, delta, time);
|
let lapse = format!(
|
||||||
|
"#{:02} -- +{} -- {}",
|
||||||
|
lapses.len() - i - *scroll_offset,
|
||||||
|
delta,
|
||||||
|
time
|
||||||
|
);
|
||||||
let x = width / 2 - (lapse.len() as u16) / 2;
|
let x = width / 2 - (lapse.len() as u16) / 2;
|
||||||
rendering::draw_text(&lapse, x, y + i as u16, color)?;
|
rendering::draw_text(&lapse, x, y + i as u16, color)?;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user