use crate::WhichKeyState;
use crossterm::event::{Event, KeyEvent};
use super::event_result::EventResult;
use super::keymap_ext::CrosstermKeymapExt;
pub trait CrosstermStateExt<S, A, C> {
fn handle_event(&mut self, event: Event) -> EventResult<A>;
}
impl<S, A, C> CrosstermStateExt<S, A, C> for WhichKeyState<KeyEvent, S, A, C>
where
S: Clone + Ord + PartialEq + Send + Sync + 'static,
A: Clone + Send + Sync + 'static,
C: Clone + std::fmt::Display + 'static,
{
fn handle_event(&mut self, event: Event) -> EventResult<A> {
match event {
Event::Key(key) => {
let result = self.handle_key(key);
EventResult::Key(result)
}
Event::Mouse(mouse) => {
let action = self
.keymap()
.mouse_handler()
.and_then(|h| h(mouse, self.scope()));
EventResult::Mouse(action)
}
Event::Resize(cols, rows) => {
let action = self
.keymap()
.resize_handler()
.and_then(|h| h(cols, rows, self.scope()));
EventResult::Resize(action)
}
Event::FocusGained => {
let action = self
.keymap()
.focus_gained_handler()
.and_then(|h| h(self.scope()));
EventResult::FocusGained(action)
}
Event::FocusLost => {
let action = self
.keymap()
.focus_lost_handler()
.and_then(|h| h(self.scope()));
EventResult::FocusLost(action)
}
_ => EventResult::Unhandled,
}
}
}