use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers};
use std::time::Duration;
pub fn poll_event(timeout: Duration) -> std::io::Result<Option<Event>> {
if event::poll(timeout)? {
Ok(Some(event::read()?))
} else {
Ok(None)
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum KeyAction {
Up,
Down,
Left,
Right,
Enter,
Escape,
Restack,
RestackAll,
Submit,
OpenPr,
NewBranch,
Delete,
Rename,
Search,
Help,
Quit,
ReorderMode,
MoveUp,
MoveDown,
Char(char),
Backspace,
Home,
End,
Tab,
None,
}
impl From<KeyEvent> for KeyAction {
fn from(key: KeyEvent) -> Self {
if key.modifiers.contains(KeyModifiers::CONTROL) {
if let KeyCode::Char('c') = key.code {
return KeyAction::Quit;
}
}
if key.modifiers.contains(KeyModifiers::SHIFT) {
match key.code {
KeyCode::Char('R') | KeyCode::Char('r') => return KeyAction::RestackAll,
KeyCode::Char('K') | KeyCode::Char('k') => return KeyAction::MoveUp,
KeyCode::Char('J') | KeyCode::Char('j') => return KeyAction::MoveDown,
KeyCode::Up => return KeyAction::MoveUp,
KeyCode::Down => return KeyAction::MoveDown,
_ => {}
}
}
match key.code {
KeyCode::Up => KeyAction::Up,
KeyCode::Down => KeyAction::Down,
KeyCode::Left => KeyAction::Left,
KeyCode::Right => KeyAction::Right,
KeyCode::Enter => KeyAction::Enter,
KeyCode::Esc => KeyAction::Escape,
KeyCode::Home => KeyAction::Home,
KeyCode::End => KeyAction::End,
KeyCode::Tab => KeyAction::Tab,
KeyCode::Char('k') => KeyAction::Up,
KeyCode::Char('j') => KeyAction::Down,
KeyCode::Char('r') => KeyAction::Restack,
KeyCode::Char('s') => KeyAction::Submit,
KeyCode::Char('p') => KeyAction::OpenPr,
KeyCode::Char('n') => KeyAction::NewBranch,
KeyCode::Char('d') => KeyAction::Delete,
KeyCode::Char('e') => KeyAction::Rename,
KeyCode::Char('/') => KeyAction::Search,
KeyCode::Char('?') => KeyAction::Help,
KeyCode::Char('q') => KeyAction::Quit,
KeyCode::Char('o') => KeyAction::ReorderMode,
KeyCode::Char(c) => KeyAction::Char(c),
KeyCode::Backspace => KeyAction::Backspace,
_ => KeyAction::None,
}
}
}