aboutsummaryrefslogtreecommitdiff
path: root/src/event.rs
blob: 7e0db3ed64f3c1a72fdf303279427703b0ffa6ea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use std::{error::Error, time::Duration};

use crossterm::event::{KeyCode, KeyModifiers, poll, read};
use tokio::sync::mpsc::Sender;

use crate::app::TICK_RATE;

#[derive(PartialEq)]
pub enum Event {
    Terminate,
    KeyPress(char),
    Backspace,
    Render,
    ForceRender,
}

// TODO
// - [ ] Pause on focus lost
// - [ ] Invalidate on paste
pub async fn handle_input(sender: &Sender<Event>) -> Result<(), Box<dyn Error>> {
    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::Resize(_, _) => sender.send(Event::ForceRender).await?,
            crossterm::event::Event::Key(key_event) => {
                match (key_event.code, key_event.modifiers) {
                    (KeyCode::Char('c'), KeyModifiers::CONTROL) => {
                        sender.send(Event::Terminate).await?
                    }
                    (KeyCode::Backspace, _) => sender.send(Event::Backspace).await?,
                    (KeyCode::Char(c), _) => sender.send(Event::KeyPress(c)).await?,
                    _ => (),
                }
            }
            _ => (),
        }
    }
    return Ok(());
}
XMR address: 854DmXNrxULU3ZFJVs4Wc8PFhbq29RhqHhY8W6cdWrtFN3qmooKyyeYPcDzZTNRxphhJ5UzASQfAdEMwSteVqymk28aLhqj