1use {
2 crate::{
3 data::{Directory, Note},
4 types::{DirectoryId, NoteId},
5 },
6 strum_macros::Display,
7};
8
9#[derive(Clone, Debug, Display)]
10pub enum Event {
11 #[strum(to_string = "Key::{0}")]
12 Key(KeyEvent),
13
14 #[strum(to_string = "Entry::{0}")]
15 Entry(EntryEvent),
16
17 #[strum(to_string = "Notebook::{0}")]
18 Notebook(NotebookEvent),
19
20 Cancel,
21}
22
23#[derive(Clone, Debug, Display)]
24pub enum EntryEvent {
25 OpenMemory,
26 OpenCsv(String),
27 OpenJson(String),
28 OpenFile(String),
29 OpenGit {
30 path: String,
31 remote: String,
32 branch: String,
33 },
34 OpenMongo {
35 conn_str: String,
36 db_name: String,
37 },
38}
39
40#[derive(Clone, Debug, Display)]
41pub enum NotebookEvent {
42 OpenDirectory(DirectoryId),
43 CloseDirectory(DirectoryId),
44
45 SelectNote(Note),
46 SelectDirectory(Directory),
47
48 RenameNote(String),
49 RenameDirectory(String),
50
51 RemoveNote,
52 RemoveDirectory,
53
54 ShowNoteActionsDialog,
55 CloseNoteActionsDialog,
56
57 ShowDirectoryActionsDialog,
58 CloseDirectoryActionsDialog,
59
60 AddNote(String),
61 AddDirectory(String),
62
63 MoveNote(DirectoryId),
64 MoveDirectory(DirectoryId),
65
66 OpenNote,
67 EditNote,
68 ViewNote,
69
70 UpdateNoteContent { note_id: NoteId, content: String },
71
72 CloseEntryDialog,
73}
74
75#[derive(Clone, Copy, Debug, Display)]
76pub enum KeyEvent {
77 A,
78 B,
79 C,
80 D,
81 E,
82 G,
83 H,
84 I,
85 J,
86 K,
87 L,
88 M,
89 N,
90 O,
91 P,
92 S,
93 T,
94 U,
95 V,
96 W,
97 X,
98 Y,
99 Z,
100 CapA,
101 CapG,
102 CapH,
103 CapI,
104 CapJ,
105 CapK,
106 CapL,
107 CapO,
108 CapS,
109 CapU,
110 CapX,
111 CtrlH,
112 CtrlR,
113 DollarSign,
114 Caret,
115 QuestionMark,
116 AngleBracketOpen,
117 AngleBracketClose,
118 Num(NumKey),
119 Left,
120 Right,
121 Up,
122 Down,
123 Space,
124 Enter,
125 Tab,
126 Tilde,
127 Dot,
128 Dash,
129 Esc,
130}
131
132#[derive(Clone, Copy, Debug, Display)]
133pub enum NumKey {
134 One,
135 Two,
136 Three,
137 Four,
138 Five,
139 Six,
140 Seven,
141 Eight,
142 Nine,
143 Zero,
144}
145
146impl From<EntryEvent> for Event {
147 fn from(event: EntryEvent) -> Self {
148 Self::Entry(event)
149 }
150}
151
152impl From<NotebookEvent> for Event {
153 fn from(event: NotebookEvent) -> Self {
154 Self::Notebook(event)
155 }
156}
157
158impl From<KeyEvent> for Event {
159 fn from(event: KeyEvent) -> Self {
160 Self::Key(event)
161 }
162}
163
164impl From<NumKey> for KeyEvent {
165 fn from(num_key: NumKey) -> Self {
166 KeyEvent::Num(num_key)
167 }
168}
169
170impl From<NumKey> for usize {
171 fn from(num_key: NumKey) -> Self {
172 match num_key {
173 NumKey::One => 1,
174 NumKey::Two => 2,
175 NumKey::Three => 3,
176 NumKey::Four => 4,
177 NumKey::Five => 5,
178 NumKey::Six => 6,
179 NumKey::Seven => 7,
180 NumKey::Eight => 8,
181 NumKey::Nine => 9,
182 NumKey::Zero => 0,
183 }
184 }
185}
186
187impl std::ops::Add<usize> for NumKey {
188 type Output = usize;
189
190 fn add(self, rhs: usize) -> Self::Output {
191 let n = usize::from(self).saturating_add(rhs);
192
193 if n > u16::MAX as usize {
194 u16::MAX as usize
195 } else {
196 n
197 }
198 }
199}