1extern crate device_query;
2extern crate eframe;
3extern crate egui;
4extern crate once_cell;
5
6pub mod helper;
7pub mod keycodes;
8pub mod widget;
9
10pub use keycodes::*;
11pub use widget::*;
12
13#[derive(Clone, Hash)]
14pub struct KeyBind {
15 pub key: Option<KeyCode>,
16 pub modifiers: Vec<KeyModifier>,
17}
18
19impl KeyBind {
20 pub fn new(key: Option<KeyCode>, modifiers: Vec<KeyModifier>) -> Self {
21 Self { key, modifiers }
22 }
23
24 pub fn empty() -> Self {
25 Self {
26 key: None,
27 modifiers: vec![],
28 }
29 }
30
31 pub fn serialize(&mut self) -> String {
32 match &self.key {
33 Some(k) => {
34 let mut prefix = String::with_capacity(self.modifiers.len());
35
36 self.modifiers.sort();
37
38 for modifier in &self.modifiers {
39 prefix.push(modifier.serialize());
40 }
41
42 return format!("{}{}", prefix, k.serialize());
43 }
44
45 None => "...".to_string(),
46 }
47 }
48
49 pub fn deserialize(data: String) -> Result<Self, ()> {
50 let mut result: Result<Self, ()> = Err(());
51
52 let mut modifiers: Vec<KeyModifier> = vec![];
53
54 for (i, ch) in data.chars().enumerate() {
55 let deserialized_modifier = KeyModifier::deserialize(ch);
56
57 match deserialized_modifier {
58 Ok(modifier) => modifiers.push(modifier),
59
60 Err(_) => {
61 let name_slice = &data[i..data.len()];
62
63 let deserialized_key = KeyCode::deserialize(name_slice.to_string());
64
65 match deserialized_key {
66 Ok(key) => {
67 let mods = if key.is_some() { modifiers } else { vec![] };
68
69 result = Ok(Self::new(key, mods));
70 }
71
72 _ => (),
73 }
74
75 break;
76 }
77 }
78 }
79
80 result
81 }
82}