From 3c6073f6b08a7e812e2f1f22bb3882427e980663 Mon Sep 17 00:00:00 2001 From: Mroik Date: Mon, 27 Jan 2025 15:36:57 +0100 Subject: Implement input handling --- src/app.rs | 45 +++++++++++++++++++++++++++++++++++++++++++-- src/event.rs | 6 +++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/app.rs b/src/app.rs index 87caf62..f0ffff0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,15 +1,23 @@ -use std::io::{stdout, Stdout}; +use std::{ + error::Error, + io::{stdout, Stdout}, + time::Duration, +}; +use crossterm::event::{poll, read, KeyCode, KeyModifiers}; use rand::Rng; use tokio::sync::mpsc::{channel, Receiver, Sender}; use crate::event::Event; +const TICK_RATE: u64 = 1000 / 20; + pub struct App { stdout: Stdout, quote: Vec, event_tx: Sender, event_rx: Receiver, + running: bool, } impl App { @@ -22,10 +30,43 @@ impl App { quote: quotes[chosen].clone(), event_rx, event_tx, + running: false, } } - pub fn run() { + pub async fn run(&mut self) { todo!() } + + // TODO + // - [ ] Pause on focus lost + // - [ ] Invalidate on paste + async fn handle_input(&mut self) -> Result<(), Box> { + while self.running { + if poll(Duration::from_millis(TICK_RATE))? { + match read()? { + //crossterm::event::Event::FocusGained => todo!(), + //crossterm::event::Event::FocusLost => todo!(), + //crossterm::event::Event::Paste(_) => todo!(), + crossterm::event::Event::Key(key_event) => { + if key_event.code == KeyCode::Char('c') + && key_event.modifiers == KeyModifiers::CONTROL + { + self.event_tx.send(Event::Terminate).await?; + continue; + } + if key_event.code == KeyCode::Backspace { + self.event_tx.send(Event::Backspace).await?; + continue; + } + if let KeyCode::Char(c) = key_event.code { + self.event_tx.send(Event::KeyPress(c)).await?; + } + } + _ => (), + } + } + } + return Ok(()); + } } diff --git a/src/event.rs b/src/event.rs index 7c470eb..1320c68 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1 +1,5 @@ -pub enum Event {} +pub enum Event { + Terminate, + KeyPress(char), + Backspace, +} -- cgit v1.3