egui_keybinds/
lib.rs

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}