From c011864ecf38a6cf8d45833e952a9c7ceb882159 Mon Sep 17 00:00:00 2001 From: Pihkaal Date: Sun, 21 Jan 2024 15:22:40 +0100 Subject: [PATCH] feat(chrono): scrollable lapses list --- src/modes/chrono.rs | 55 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/src/modes/chrono.rs b/src/modes/chrono.rs index 80c5ade..cb0d62e 100644 --- a/src/modes/chrono.rs +++ b/src/modes/chrono.rs @@ -28,6 +28,8 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> { let start_time = time::Instant::now(); let mut lapses: Vec = vec![]; + let mut scroll_offset: usize = 0; + let mut quit = false; while !quit { // Handle events @@ -50,6 +52,25 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> { }; 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))?; // Render - render_frame(&config, start_time, &lapses)?; + render_frame(&config, start_time, &lapses, &mut scroll_offset)?; config.color.update(); @@ -73,7 +94,12 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> { return Ok(()); } -fn render_frame(config: &Config, start_time: time::Instant, lapses: &Vec) -> io::Result<()> { +fn render_frame( + config: &Config, + start_time: time::Instant, + lapses: &Vec, + scroll_offset: &mut usize, +) -> io::Result<()> { let color = config.color.get_value(); // Display time @@ -83,13 +109,32 @@ fn render_frame(config: &Config, start_time: time::Instant, lapses: &Vec) // Display lapses let (width, height) = terminal::size()?; 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 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; rendering::draw_text(&lapse, x, y + i as u16, color)?; }