implement parsing of modifier+key combinations

This commit is contained in:
Henrik Friedrichsen
2019-04-05 00:19:39 +02:00
parent 990ba1fa29
commit 14c909862f

View File

@@ -273,7 +273,11 @@ impl CommandManager {
kb.extend(keybindings.unwrap_or_default());
for (k, v) in kb {
Self::register_keybinding(this.clone(), cursive, Self::parse_keybinding(k), v);
if let Some(binding) = Self::parse_keybinding(&k) {
Self::register_keybinding(this.clone(), cursive, binding, v);
} else {
error!("Could not parse keybinding: \"{}\"", &k);
}
}
}
@@ -314,8 +318,8 @@ impl CommandManager {
kb
}
fn parse_keybinding(kb: String) -> cursive::event::Event {
match kb.as_ref() {
fn parse_key(key: &str) -> Event {
match key {
"Enter" => Event::Key(Key::Enter),
"Tab" => Event::Key(Key::Tab),
"Backspace" => Event::Key(Key::Backspace),
@@ -348,4 +352,24 @@ impl CommandManager {
s => Event::Char(s.chars().next().unwrap()),
}
}
fn parse_keybinding(kb: &str) -> Option<cursive::event::Event> {
let mut split = kb.split('+');
if split.clone().count() == 2 {
let modifier = split.next().unwrap();
let key = split.next().unwrap();
if let Event::Key(parsed) = Self::parse_key(key) {
match modifier {
"Shift" => Some(Event::Shift(parsed)),
"Alt" => Some(Event::Alt(parsed)),
"Ctrl" => Some(Event::Ctrl(parsed)),
_ => None,
}
} else {
None
}
} else {
Some(Self::parse_key(&kb))
}
}
}