pub use crossterm::event::{
KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers, MouseButton, MouseEventKind,
};
use crate::render::{Position, Size};
pub enum Event {
Key(KeyEvent),
Mouse(MouseEvent),
GotFocus,
LostFocus,
}
pub enum TerminalEvent {
App(Event),
Resize(Size),
}
impl TryFrom<crossterm::event::Event> for TerminalEvent {
type Error = ();
fn try_from(value: crossterm::event::Event) -> Result<Self, Self::Error> {
match value {
crossterm::event::Event::FocusGained => Ok(TerminalEvent::App(Event::GotFocus)),
crossterm::event::Event::FocusLost => Ok(TerminalEvent::App(Event::LostFocus)),
crossterm::event::Event::Key(key_event) => {
Ok(TerminalEvent::App(Event::Key(key_event)))
}
crossterm::event::Event::Mouse(mouse_event) => {
Ok(TerminalEvent::App(Event::Mouse(mouse_event.into())))
}
crossterm::event::Event::Resize(width, height) => {
Ok(TerminalEvent::Resize(Size::new(width, height)))
}
_ => Err(()),
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub struct MouseEvent {
pub kind: MouseEventKind,
pub position: Position,
pub modifiers: KeyModifiers,
}
impl From<crossterm::event::MouseEvent> for MouseEvent {
fn from(value: crossterm::event::MouseEvent) -> Self {
MouseEvent {
position: Position::new(value.column, value.row),
kind: value.kind,
modifiers: value.modifiers,
}
}
}
pub enum EventStatus {
Ignored,
Handled,
}