1use crate::geometry::CoordPair;
2
3pub(crate) mod native_ext;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub enum Key {
7 Char(char),
8 Up,
9 Down,
10 Left,
11 Right,
12 Esc,
13 Enter,
14 Backspace,
15 Delete,
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
19pub struct KeyEvent {
20 pub main_key: Key,
21 pub ctrl: bool,
22 pub alt: bool,
23 pub shift: bool,
24}
25
26impl KeyEvent {
27 pub fn new(main_key: Key) -> Self {
28 Self { main_key, ctrl: false, alt: false, shift: false }
29 }
30
31 pub fn with_ctrl(mut self, pressed: bool) -> Self {
32 self.ctrl = pressed;
33 self
34 }
35
36 pub fn with_alt(mut self, pressed: bool) -> Self {
37 self.alt = pressed;
38 self
39 }
40
41 pub fn with_shift(mut self, pressed: bool) -> Self {
42 self.shift = pressed;
43 self
44 }
45}
46
47impl From<Key> for KeyEvent {
48 fn from(main_key: Key) -> Self {
49 Self::new(main_key)
50 }
51}
52
53#[derive(Debug, Clone, PartialEq, Eq)]
54pub struct PasteEvent {
55 pub data: String,
56}
57
58#[derive(Debug, Clone, PartialEq, Eq)]
59pub enum Event {
60 Key(KeyEvent),
61 Paste(PasteEvent),
62}
63
64impl From<KeyEvent> for Event {
65 fn from(event: KeyEvent) -> Self {
66 Event::Key(event)
67 }
68}
69
70impl From<Key> for Event {
71 fn from(event: Key) -> Self {
72 Event::Key(event.into())
73 }
74}
75
76impl From<PasteEvent> for Event {
77 fn from(event: PasteEvent) -> Self {
78 Event::Paste(event)
79 }
80}
81
82#[derive(Debug, Clone, Copy, PartialEq, Eq)]
83pub struct ResizeEvent {
84 pub size: CoordPair,
85}
86
87#[derive(Debug, Clone, PartialEq, Eq)]
88pub enum InternalEvent {
89 External(Event),
90 Resize(ResizeEvent),
91}
92
93impl From<Event> for InternalEvent {
94 fn from(event: Event) -> Self {
95 Self::External(event)
96 }
97}
98
99impl From<KeyEvent> for InternalEvent {
100 fn from(event: KeyEvent) -> Self {
101 Self::External(event.into())
102 }
103}
104
105impl From<Key> for InternalEvent {
106 fn from(event: Key) -> Self {
107 Self::External(Event::from(event))
108 }
109}
110
111impl From<PasteEvent> for InternalEvent {
112 fn from(event: PasteEvent) -> Self {
113 Self::External(event.into())
114 }
115}
116
117impl From<ResizeEvent> for InternalEvent {
118 fn from(event: ResizeEvent) -> Self {
119 Self::Resize(event)
120 }
121}