feat(chrono): implement pause

This commit is contained in:
Pihkaal
2024-01-21 16:26:04 +01:00
parent c011864ecf
commit 0564a01015

View File

@@ -2,7 +2,7 @@ use std::{
cmp::min, cmp::min,
io::{self, Write}, io::{self, Write},
thread, thread,
time::{self, Duration}, time::{Duration, Instant},
}; };
use crossterm::{ use crossterm::{
@@ -18,16 +18,52 @@ use crate::{
}; };
struct Lapse { struct Lapse {
pub time: time::Duration, pub time: Duration,
pub delta: time::Duration, pub delta: Duration,
}
struct Chronometer {
start_time: Option<Instant>,
paused_duration: Duration,
}
impl Chronometer {
fn new() -> Self {
Chronometer {
start_time: None,
paused_duration: Duration::from_secs(0),
}
}
fn start(&mut self) {
self.start_time = Some(Instant::now());
}
fn toggle_pause(&mut self) {
if let Some(start_time) = self.start_time {
self.paused_duration += Instant::now().duration_since(start_time);
self.start_time = None;
} else {
self.start_time = Some(Instant::now());
}
}
fn elapsed(&self) -> Duration {
if let Some(start_time) = self.start_time {
Instant::now().duration_since(start_time) + self.paused_duration
} else {
self.paused_duration
}
}
} }
pub fn main_loop(config: &mut Config) -> io::Result<()> { pub fn main_loop(config: &mut Config) -> io::Result<()> {
let mut stdout = io::stdout(); let mut stdout = io::stdout();
let start_time = time::Instant::now(); let mut chronometer = Chronometer::new();
let mut lapses: Vec<Lapse> = vec![]; chronometer.start();
let mut lapses: Vec<Lapse> = vec![];
let mut scroll_offset: usize = 0; let mut scroll_offset: usize = 0;
let mut quit = false; let mut quit = false;
@@ -42,11 +78,15 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> {
quit = true; quit = true;
} }
} }
// Handle lapse // Handle pause
KeyCode::Char(' ') => { KeyCode::Char(' ') => {
let time = start_time.elapsed(); chronometer.toggle_pause();
}
// Handle lapses
KeyCode::Char('l') => {
let time = chronometer.elapsed();
let delta = if let Some(last_lap) = lapses.last() { let delta = if let Some(last_lap) = lapses.last() {
time::Duration::from_secs(time.as_secs() - last_lap.time.as_secs()) Duration::from_secs(time.as_secs() - last_lap.time.as_secs())
} else { } else {
time time
}; };
@@ -82,7 +122,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, &mut scroll_offset)?; render_frame(&config, chronometer.elapsed(), &lapses, &mut scroll_offset)?;
config.color.update(); config.color.update();
@@ -96,14 +136,14 @@ pub fn main_loop(config: &mut Config) -> io::Result<()> {
fn render_frame( fn render_frame(
config: &Config, config: &Config,
start_time: time::Instant, time: Duration,
lapses: &Vec<Lapse>, lapses: &Vec<Lapse>,
scroll_offset: &mut usize, scroll_offset: &mut usize,
) -> io::Result<()> { ) -> io::Result<()> {
let color = config.color.get_value(); let color = config.color.get_value();
// Display time // Display time
let elapsed = utils::format_duration(start_time.elapsed()); let elapsed = utils::format_duration(time);
rendering::draw_time(&elapsed, color)?; rendering::draw_time(&elapsed, color)?;
// Display lapses // Display lapses