feat(chrono): scrollable lapses list

This commit is contained in:
Pihkaal
2024-01-21 15:22:40 +01:00
parent c115e7b450
commit c011864ecf

View File

@@ -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)?;
} }