use {
crate::crossterm::{
self,
event::{
Event,
KeyModifiers,
MouseButton,
MouseEvent,
MouseEventKind,
},
},
crokey::KeyCombination,
std::time::Instant,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TimedEvent {
pub time: Instant,
pub event: crossterm::event::Event,
pub double_click: bool,
pub key_combination: Option<KeyCombination>,
}
impl TimedEvent {
pub fn new(event: Event) -> Self {
Self {
time: Instant::now(),
event,
double_click: false,
key_combination: None,
}
}
pub fn as_click(&self) -> Option<(u16, u16)> {
match self.event {
Event::Mouse(MouseEvent {
kind: MouseEventKind::Up(MouseButton::Left),
column,
row,
modifiers: KeyModifiers::NONE,
}) if !self.double_click => Some((column, row)),
_ => None,
}
}
pub fn is_key<K: Into<KeyCombination>>(&self, key: K) -> bool {
let key = key.into();
if self.key_combination == Some(key) {
return true;
}
if let Event::Key(k) = &self.event {
let self_key: KeyCombination = (*k).into();
if self_key == key {
return true;
}
}
false
}
}