use command queues

This commit is contained in:
Dr. Matthias Ratajczak
2023-03-01 17:55:03 +01:00
parent 9d2dcfe4d7
commit 90fdbbb905
2 changed files with 18 additions and 16 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ edition = "2021"
version = "0.1.0" version = "0.1.0"
[dependencies] [dependencies]
futures = { default-features = false, version = "0.3" } futures = { version = "0.3", default-features = false }
crossterm = { version = "0.26", default-features = false, features = ["event-stream"] } crossterm = { version = "0.26", default-features = false, features = ["event-stream"] }
tokio = { version = "1.25", default-features = false, features = ["time", "macros", "rt"] } tokio = { version = "1.25", default-features = false, features = ["time", "macros", "rt"] }
+17 -15
View File
@@ -2,7 +2,7 @@ use std::io::{stdout, Stdout, Write};
use std::process::Command; use std::process::Command;
use std::time::Duration; use std::time::Duration;
use crossterm::cursor; use crossterm::{cursor, QueueableCommand};
use crossterm::{ use crossterm::{
cursor::MoveTo, cursor::MoveTo,
event::{Event, EventStream, KeyCode, KeyModifiers}, event::{Event, EventStream, KeyCode, KeyModifiers},
@@ -15,36 +15,37 @@ use tokio::time::sleep;
const ONE_SECOND: Duration = Duration::from_secs(1); const ONE_SECOND: Duration = Duration::from_secs(1);
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]
async fn main() { async fn main() -> Result<()> {
let timer = Pomodoro::new(); let timer = Pomodoro::new();
let timer_task = tokio::spawn(async move { timer.main_loop().await }); let timer_task = tokio::spawn(async move { timer.main_loop().await });
let ui_task = tokio::spawn(async move { Ui::main_loop().await }); let ui_task = tokio::spawn(async move { Ui::main_loop().await });
tokio::select! ( tokio::select! (
_ = timer_task => (), result = timer_task => result??,
_ = ui_task => (), result = ui_task => result??,
); );
Ui::clear_terminal().unwrap(); Ui::clear_terminal()?;
Ok(())
} }
struct Ui; struct Ui;
impl Ui { impl Ui {
async fn main_loop() { async fn main_loop() -> Result<()> {
let mut reader = EventStream::new(); let mut reader = EventStream::new();
loop { loop {
enable_raw_mode().unwrap(); enable_raw_mode()?;
stdout().execute(cursor::Hide).unwrap(); stdout().execute(cursor::Hide)?;
if let Some(Ok(Event::Key(key_event))) = reader.next().await { if let Some(Ok(Event::Key(key_event))) = reader.next().await {
if Self::is_char_q(key_event) || Self::is_ctrl_c(&key_event) { if Self::is_char_q(key_event) || Self::is_ctrl_c(&key_event) {
disable_raw_mode().unwrap(); disable_raw_mode()?;
stdout().execute(cursor::Show).unwrap(); stdout().execute(cursor::Show)?;
return; return Ok(());
} }
} }
} }
@@ -60,9 +61,10 @@ impl Ui {
fn clear_terminal() -> Result<()> { fn clear_terminal() -> Result<()> {
let mut stdout = stdout(); let mut stdout = stdout();
stdout.execute(terminal::Clear(terminal::ClearType::All))?; stdout.queue(terminal::Clear(terminal::ClearType::All))?;
stdout.execute(terminal::Clear(terminal::ClearType::Purge))?; stdout.queue(terminal::Clear(terminal::ClearType::Purge))?;
stdout.execute(MoveTo(0, 0))?; stdout.queue(MoveTo(0, 0))?;
stdout.flush()?;
Ok(()) Ok(())
} }
} }
@@ -97,7 +99,7 @@ impl Pomodoro {
self.interval_idx + 1, self.interval_idx + 1,
self.intervals.len() self.intervals.len()
)?; )?;
self.stdout.execute(MoveTo(0, 1))?; self.stdout.queue(MoveTo(0, 1))?;
write!(self.stdout, "remaining: {}", format(self.remaining))?; write!(self.stdout, "remaining: {}", format(self.remaining))?;
self.stdout.flush()?; self.stdout.flush()?;
Ok(()) Ok(())