use std::{io, process::exit, sync::mpsc::Receiver};
use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
pub enum EventSummary {
Continue,
UpdateQuery(bool),
Select,
Quit,
}
use crate::{MovementType, PickerState};
pub fn process_events(
term: &mut PickerState,
events: &Receiver<Event>,
) -> Result<EventSummary, io::Error> {
let mut update_query = false;
let mut append = true;
for event in events.try_iter() {
match event {
Event::Key(KeyEvent {
modifiers: KeyModifiers::CONTROL,
code: KeyCode::Char('c') | KeyCode::Char('C'),
..
}) => {
exit(1);
}
Event::Key(
KeyEvent {
modifiers: KeyModifiers::CONTROL,
code: KeyCode::Char('e'),
..
}
| KeyEvent {
modifiers: KeyModifiers::NONE,
code: KeyCode::Home,
..
},
) => term.shift(MovementType::Start),
Event::Key(
KeyEvent {
modifiers: KeyModifiers::CONTROL,
code: KeyCode::Char('a'),
..
}
| KeyEvent {
modifiers: KeyModifiers::NONE,
code: KeyCode::End,
..
},
) => term.shift(MovementType::End),
Event::Key(KeyEvent {
kind: KeyEventKind::Press,
code,
..
}) => {
match code {
KeyCode::Char(ch) => {
update_query = true;
append &= term.query.cursor_at_end();
term.insert_char(ch);
}
KeyCode::Enter => return Ok(EventSummary::Select),
KeyCode::Up => {
term.incr_selection();
}
KeyCode::Down => {
update_query = true;
term.decr_selection();
}
KeyCode::Left => {
term.shift(MovementType::Left);
}
KeyCode::Right => {
term.shift(MovementType::Right);
}
KeyCode::Backspace => {
update_query = true;
append = false;
term.delete_char();
}
KeyCode::Esc => return Ok(EventSummary::Quit),
_ => {}
}
}
Event::Resize(width, height) => {
term.resize(width, height);
}
Event::Paste(contents) => {
update_query = true;
append &= term.query.cursor_at_end();
term.paste(&contents);
}
_ => {}
}
}
Ok(if update_query {
EventSummary::UpdateQuery(append)
} else {
EventSummary::Continue
})
}