use super::key::{Key, KeyEvent, Modifiers};
use super::mouse::{MouseButton, MouseEvent, MouseEventKind};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Event {
Key(KeyEvent),
Mouse(MouseEvent),
Resize(u16, u16),
FocusGained,
FocusLost,
Paste(String),
}
impl Event {
pub fn char(c: char) -> Self {
Self::Key(KeyEvent::char(c))
}
pub fn char_with(c: char, modifiers: Modifiers) -> Self {
let mut ke = KeyEvent::char(c);
ke.modifiers |= modifiers;
Self::Key(ke)
}
pub fn key(key: Key) -> Self {
Self::Key(KeyEvent::new(key))
}
pub fn key_with(key: Key, modifiers: Modifiers) -> Self {
let mut ev = KeyEvent::new(key);
ev.modifiers |= modifiers;
Self::Key(ev)
}
pub fn ctrl(c: char) -> Self {
Self::Key(KeyEvent::ctrl(c))
}
pub fn alt(c: char) -> Self {
Self::Key(KeyEvent {
code: Key::Char(c.to_ascii_lowercase()),
modifiers: Modifiers::ALT,
kind: super::key::KeyEventKind::Press,
raw_char: Some(c),
})
}
pub fn click(x: u16, y: u16) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::Down(MouseButton::Left),
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn click_button(x: u16, y: u16, button: MouseButton) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::Down(button),
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn mouse_up(x: u16, y: u16) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::Up(MouseButton::Left),
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn mouse_move(x: u16, y: u16) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::Moved,
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn mouse_drag(x: u16, y: u16, button: MouseButton) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::Drag(button),
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn scroll_up(x: u16, y: u16) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::ScrollUp,
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn scroll_down(x: u16, y: u16) -> Self {
Self::Mouse(MouseEvent {
kind: MouseEventKind::ScrollDown,
column: x,
row: y,
modifiers: Modifiers::NONE,
})
}
pub fn is_key(&self) -> bool {
matches!(self, Event::Key(_))
}
pub fn is_mouse(&self) -> bool {
matches!(self, Event::Mouse(_))
}
pub fn as_key(&self) -> Option<&KeyEvent> {
match self {
Event::Key(e) => Some(e),
_ => None,
}
}
pub fn as_mouse(&self) -> Option<&MouseEvent> {
match self {
Event::Mouse(e) => Some(e),
_ => None,
}
}
pub fn kind_name(&self) -> &'static str {
match self {
Event::Key(_) => "Key",
Event::Mouse(_) => "Mouse",
Event::Resize(_, _) => "Resize",
Event::FocusGained => "FocusGained",
Event::FocusLost => "FocusLost",
Event::Paste(_) => "Paste",
}
}
}
impl From<KeyEvent> for Event {
fn from(event: KeyEvent) -> Self {
Event::Key(event)
}
}
impl From<MouseEvent> for Event {
fn from(event: MouseEvent) -> Self {
Event::Mouse(event)
}
}
#[derive(Clone, Debug)]
pub struct KeyEventBuilder {
key: Option<Key>,
modifiers: Modifiers,
kind: super::key::KeyEventKind,
}
impl Default for KeyEventBuilder {
fn default() -> Self {
Self {
key: None,
modifiers: Modifiers::NONE,
kind: super::key::KeyEventKind::Press,
}
}
}
impl KeyEventBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn code(mut self, key: Key) -> Self {
self.key = Some(key);
self
}
pub fn char(mut self, c: char) -> Self {
self.key = Some(Key::Char(c));
self
}
pub fn ctrl(mut self) -> Self {
self.modifiers |= Modifiers::CONTROL;
self
}
pub fn alt(mut self) -> Self {
self.modifiers |= Modifiers::ALT;
self
}
pub fn shift(mut self) -> Self {
self.modifiers |= Modifiers::SHIFT;
self
}
pub fn modifiers(mut self, modifiers: Modifiers) -> Self {
self.modifiers = modifiers;
self
}
pub fn kind(mut self, kind: super::key::KeyEventKind) -> Self {
self.kind = kind;
self
}
pub fn build(self) -> KeyEvent {
let key = self.key.unwrap_or(Key::Esc);
KeyEvent {
code: key,
modifiers: self.modifiers,
kind: self.kind,
raw_char: match key {
Key::Char(c) => Some(c),
_ => None,
},
}
}
pub fn into_event(self) -> Event {
Event::Key(self.build())
}
}
#[derive(Clone, Debug)]
pub struct MouseEventBuilder {
kind: MouseEventKind,
column: u16,
row: u16,
modifiers: Modifiers,
}
impl MouseEventBuilder {
pub fn new() -> Self {
Self {
kind: MouseEventKind::Moved,
column: 0,
row: 0,
modifiers: Modifiers::NONE,
}
}
pub fn at(mut self, x: u16, y: u16) -> Self {
self.column = x;
self.row = y;
self
}
pub fn click(mut self) -> Self {
self.kind = MouseEventKind::Down(MouseButton::Left);
self
}
pub fn right_click(mut self) -> Self {
self.kind = MouseEventKind::Down(MouseButton::Right);
self
}
pub fn middle_click(mut self) -> Self {
self.kind = MouseEventKind::Down(MouseButton::Middle);
self
}
pub fn up(mut self) -> Self {
self.kind = MouseEventKind::Up(MouseButton::Left);
self
}
pub fn drag(mut self) -> Self {
self.kind = MouseEventKind::Drag(MouseButton::Left);
self
}
pub fn scroll_up(mut self) -> Self {
self.kind = MouseEventKind::ScrollUp;
self
}
pub fn scroll_down(mut self) -> Self {
self.kind = MouseEventKind::ScrollDown;
self
}
pub fn ctrl(mut self) -> Self {
self.modifiers |= Modifiers::CONTROL;
self
}
pub fn alt(mut self) -> Self {
self.modifiers |= Modifiers::ALT;
self
}
pub fn shift(mut self) -> Self {
self.modifiers |= Modifiers::SHIFT;
self
}
pub fn build(self) -> MouseEvent {
MouseEvent {
kind: self.kind,
column: self.column,
row: self.row,
modifiers: self.modifiers,
}
}
pub fn into_event(self) -> Event {
Event::Mouse(self.build())
}
}
impl Default for MouseEventBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests;