use crossterm::event::{KeyCode, MouseButton};
use std::rc::Rc;
use crate::pos::{Pos, X, Y};
use super::FrameInput;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Event {
Redraw,
Close,
MouseOutside,
MouseMove(Pos),
MouseDown(MouseButton, Pos),
MouseUp(MouseButton, Pos),
KeyPress(KeyCode),
KeyRelease(KeyCode),
Paste(Rc<str>),
}
crate::seal!(Event);
impl Default for Event {
fn default() -> Self {
Self::Redraw
}
}
macro_rules! split {
($fn:ident, $field:ident, $pos:ty) => {
fn $fn(self, mid: $pos) -> (Self, Self) {
match self {
Self::MouseMove(pos) => {
if pos.$field < mid {
(self, Self::MouseOutside)
} else {
(Self::MouseOutside, Self::MouseMove(pos - mid))
}
}
Self::MouseDown(b, pos) => {
if pos.$field < mid {
(self, Self::MouseOutside)
} else {
(Self::MouseOutside, Self::MouseDown(b, pos - mid))
}
}
Self::MouseUp(b, pos) => {
if pos.$field < mid {
(self, Self::MouseOutside)
} else {
(Self::MouseOutside, Self::MouseUp(b, pos - mid))
}
}
other => (other.clone(), other.clone()),
}
}
};
}
impl FrameInput for Event {
split!(split_h, x, X);
split!(split_v, y, Y);
}