pixels_graphics_lib/
utilities.rs

1use crate::prelude::winit;
2use winit::keyboard::KeyCode;
3
4pub mod virtual_key_codes {
5    use super::*;
6
7    pub const ALL_KEYS: [KeyCode; 96] = [
8        KeyCode::KeyA,
9        KeyCode::KeyB,
10        KeyCode::KeyC,
11        KeyCode::KeyD,
12        KeyCode::KeyE,
13        KeyCode::KeyF,
14        KeyCode::KeyG,
15        KeyCode::KeyH,
16        KeyCode::KeyI,
17        KeyCode::KeyJ,
18        KeyCode::KeyK,
19        KeyCode::KeyL,
20        KeyCode::KeyM,
21        KeyCode::KeyN,
22        KeyCode::KeyO,
23        KeyCode::KeyP,
24        KeyCode::KeyQ,
25        KeyCode::KeyR,
26        KeyCode::KeyS,
27        KeyCode::KeyT,
28        KeyCode::KeyU,
29        KeyCode::KeyV,
30        KeyCode::KeyW,
31        KeyCode::KeyX,
32        KeyCode::KeyY,
33        KeyCode::KeyZ,
34        KeyCode::ArrowUp,
35        KeyCode::ArrowLeft,
36        KeyCode::ArrowRight,
37        KeyCode::ArrowDown,
38        KeyCode::Digit0,
39        KeyCode::Digit1,
40        KeyCode::Digit2,
41        KeyCode::Digit3,
42        KeyCode::Digit4,
43        KeyCode::Digit5,
44        KeyCode::Digit6,
45        KeyCode::Digit7,
46        KeyCode::Digit8,
47        KeyCode::Digit9,
48        KeyCode::Numpad0,
49        KeyCode::Numpad1,
50        KeyCode::Numpad2,
51        KeyCode::Numpad3,
52        KeyCode::Numpad4,
53        KeyCode::Numpad5,
54        KeyCode::Numpad6,
55        KeyCode::Numpad7,
56        KeyCode::Numpad8,
57        KeyCode::Numpad9,
58        KeyCode::ShiftLeft,
59        KeyCode::ShiftRight,
60        KeyCode::AltLeft,
61        KeyCode::AltRight,
62        KeyCode::SuperLeft,
63        KeyCode::SuperRight,
64        KeyCode::ControlLeft,
65        KeyCode::ControlRight,
66        KeyCode::Space,
67        KeyCode::Enter,
68        KeyCode::Tab,
69        KeyCode::Backspace,
70        KeyCode::Delete,
71        KeyCode::Escape,
72        KeyCode::Home,
73        KeyCode::End,
74        KeyCode::PageUp,
75        KeyCode::PageDown,
76        KeyCode::Minus,
77        KeyCode::NumpadAdd,
78        KeyCode::NumpadSubtract,
79        KeyCode::NumpadDecimal,
80        KeyCode::NumpadDivide,
81        KeyCode::NumpadStar,
82        KeyCode::Semicolon,
83        KeyCode::Equal,
84        KeyCode::NumpadEqual,
85        KeyCode::BracketLeft,
86        KeyCode::BracketRight,
87        KeyCode::Comma,
88        KeyCode::Period,
89        KeyCode::Slash,
90        KeyCode::Quote,
91        KeyCode::Backslash,
92        KeyCode::F1,
93        KeyCode::F2,
94        KeyCode::F3,
95        KeyCode::F4,
96        KeyCode::F5,
97        KeyCode::F6,
98        KeyCode::F7,
99        KeyCode::F8,
100        KeyCode::F9,
101        KeyCode::F10,
102        KeyCode::F11,
103        KeyCode::F12,
104    ];
105
106    pub const FUNCTION: [KeyCode; 12] = [
107        KeyCode::F1,
108        KeyCode::F2,
109        KeyCode::F3,
110        KeyCode::F4,
111        KeyCode::F5,
112        KeyCode::F6,
113        KeyCode::F7,
114        KeyCode::F8,
115        KeyCode::F9,
116        KeyCode::F10,
117        KeyCode::F11,
118        KeyCode::F12,
119    ];
120
121    pub const LETTERS: [KeyCode; 26] = [
122        KeyCode::KeyA,
123        KeyCode::KeyB,
124        KeyCode::KeyC,
125        KeyCode::KeyD,
126        KeyCode::KeyE,
127        KeyCode::KeyF,
128        KeyCode::KeyG,
129        KeyCode::KeyH,
130        KeyCode::KeyI,
131        KeyCode::KeyJ,
132        KeyCode::KeyK,
133        KeyCode::KeyL,
134        KeyCode::KeyM,
135        KeyCode::KeyN,
136        KeyCode::KeyO,
137        KeyCode::KeyP,
138        KeyCode::KeyQ,
139        KeyCode::KeyR,
140        KeyCode::KeyS,
141        KeyCode::KeyT,
142        KeyCode::KeyU,
143        KeyCode::KeyV,
144        KeyCode::KeyW,
145        KeyCode::KeyX,
146        KeyCode::KeyY,
147        KeyCode::KeyZ,
148    ];
149    pub const ARROWS: [KeyCode; 4] = [
150        KeyCode::ArrowUp,
151        KeyCode::ArrowLeft,
152        KeyCode::ArrowRight,
153        KeyCode::ArrowDown,
154    ];
155    pub const NUMBERS: [KeyCode; 20] = [
156        KeyCode::Digit0,
157        KeyCode::Digit1,
158        KeyCode::Digit2,
159        KeyCode::Digit3,
160        KeyCode::Digit4,
161        KeyCode::Digit5,
162        KeyCode::Digit6,
163        KeyCode::Digit7,
164        KeyCode::Digit8,
165        KeyCode::Digit9,
166        KeyCode::Numpad0,
167        KeyCode::Numpad1,
168        KeyCode::Numpad2,
169        KeyCode::Numpad3,
170        KeyCode::Numpad4,
171        KeyCode::Numpad5,
172        KeyCode::Numpad6,
173        KeyCode::Numpad7,
174        KeyCode::Numpad8,
175        KeyCode::Numpad9,
176    ];
177    pub const MODIFIERS: [KeyCode; 8] = [
178        KeyCode::ShiftLeft,
179        KeyCode::ShiftRight,
180        KeyCode::AltLeft,
181        KeyCode::AltRight,
182        KeyCode::SuperLeft,
183        KeyCode::SuperRight,
184        KeyCode::ControlLeft,
185        KeyCode::ControlRight,
186    ];
187    pub const TYPING: [KeyCode; 5] = [
188        KeyCode::Space,
189        KeyCode::Enter,
190        KeyCode::Tab,
191        KeyCode::Backspace,
192        KeyCode::Delete,
193    ];
194    pub const NAVIGATION: [KeyCode; 5] = [
195        KeyCode::Escape,
196        KeyCode::Home,
197        KeyCode::End,
198        KeyCode::PageUp,
199        KeyCode::PageDown,
200    ];
201    pub const SYMBOLS: [KeyCode; 16] = [
202        KeyCode::Minus,
203        KeyCode::NumpadAdd,
204        KeyCode::NumpadSubtract,
205        KeyCode::NumpadDecimal,
206        KeyCode::NumpadDivide,
207        KeyCode::NumpadStar,
208        KeyCode::Semicolon,
209        KeyCode::Equal,
210        KeyCode::NumpadEqual,
211        KeyCode::BracketLeft,
212        KeyCode::BracketRight,
213        KeyCode::Comma,
214        KeyCode::Period,
215        KeyCode::Slash,
216        KeyCode::Quote,
217        KeyCode::Backslash,
218    ];
219}
220
221/// Converts key code to char
222///
223/// Passing `KeyCode::A, false` returns `Some('a')` and `KeyCode::A, true` returns `Some('A')`
224///
225/// # Arguments
226/// * `shift` - If shift is being held down
227pub fn key_press_to_char(code: KeyCode, shift: bool) -> Option<char> {
228    key_code_to_char(code).map(|(c1, c2)| if shift { c2 } else { c1 })
229}
230
231/// Convert key code to (char, shifted char)
232/// So `KeyCode::Key1` (the `1` key) returns `('1', '!')` and KeyCode::A (the `A` key) returns `('a', 'A')`
233pub fn key_code_to_char(code: KeyCode) -> Option<(char, char)> {
234    match code {
235        KeyCode::Digit1 => Some(('1', '!')),
236        KeyCode::Digit2 => Some(('2', '@')),
237        KeyCode::Digit3 => Some(('3', '£')),
238        KeyCode::Digit4 => Some(('4', '$')),
239        KeyCode::Digit5 => Some(('5', '%')),
240        KeyCode::Digit6 => Some(('6', '^')),
241        KeyCode::Digit7 => Some(('7', '&')),
242        KeyCode::Digit8 => Some(('8', '*')),
243        KeyCode::Digit9 => Some(('9', '(')),
244        KeyCode::Digit0 => Some(('0', ')')),
245        KeyCode::Numpad1 => Some(('1', '1')),
246        KeyCode::Numpad2 => Some(('2', '2')),
247        KeyCode::Numpad3 => Some(('3', '3')),
248        KeyCode::Numpad4 => Some(('4', '4')),
249        KeyCode::Numpad5 => Some(('5', '5')),
250        KeyCode::Numpad6 => Some(('6', '6')),
251        KeyCode::Numpad7 => Some(('7', '7')),
252        KeyCode::Numpad8 => Some(('8', '8')),
253        KeyCode::Numpad9 => Some(('9', '9')),
254        KeyCode::Numpad0 => Some(('0', '0')),
255        KeyCode::KeyA => Some(('a', 'A')),
256        KeyCode::KeyB => Some(('b', 'B')),
257        KeyCode::KeyC => Some(('c', 'C')),
258        KeyCode::KeyD => Some(('d', 'D')),
259        KeyCode::KeyE => Some(('e', 'E')),
260        KeyCode::KeyF => Some(('f', 'F')),
261        KeyCode::KeyG => Some(('g', 'G')),
262        KeyCode::KeyH => Some(('h', 'H')),
263        KeyCode::KeyI => Some(('i', 'I')),
264        KeyCode::KeyJ => Some(('j', 'J')),
265        KeyCode::KeyK => Some(('k', 'K')),
266        KeyCode::KeyL => Some(('l', 'L')),
267        KeyCode::KeyM => Some(('m', 'M')),
268        KeyCode::KeyN => Some(('n', 'N')),
269        KeyCode::KeyO => Some(('o', 'O')),
270        KeyCode::KeyP => Some(('p', 'P')),
271        KeyCode::KeyQ => Some(('q', 'Q')),
272        KeyCode::KeyR => Some(('r', 'R')),
273        KeyCode::KeyS => Some(('s', 'S')),
274        KeyCode::KeyT => Some(('t', 'T')),
275        KeyCode::KeyU => Some(('u', 'U')),
276        KeyCode::KeyV => Some(('v', 'V')),
277        KeyCode::KeyW => Some(('w', 'W')),
278        KeyCode::KeyX => Some(('x', 'X')),
279        KeyCode::KeyY => Some(('y', 'Y')),
280        KeyCode::KeyZ => Some(('z', 'Z')),
281        KeyCode::Space => Some((' ', ' ')),
282        KeyCode::NumpadAdd => Some(('+', '+')),
283        KeyCode::NumpadDivide => Some(('/', '/')),
284        KeyCode::NumpadDecimal => Some(('.', '.')),
285        KeyCode::NumpadComma => Some((',', ',')),
286        KeyCode::NumpadEqual => Some(('=', '=')),
287        KeyCode::NumpadMultiply => Some(('*', '*')),
288        KeyCode::NumpadSubtract => Some(('-', '-')),
289        KeyCode::Quote => Some(('\'', '"')),
290        KeyCode::Backslash => Some(('\\', '|')),
291        KeyCode::Comma => Some((',', '<')),
292        KeyCode::Equal => Some(('=', '+')),
293        KeyCode::BracketLeft => Some(('[', '{')),
294        KeyCode::Minus => Some(('-', '_')),
295        KeyCode::Period => Some(('.', '>')),
296        KeyCode::Semicolon => Some((';', ':')),
297        KeyCode::Slash => Some(('/', '?')),
298        _ => None,
299    }
300}