diff options
author | Shav Kinderlehrer <[email protected]> | 2024-03-06 14:14:07 -0500 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2024-03-06 14:14:07 -0500 |
commit | c2acb446e7868b67e5743d54cee5c64c469e5a18 (patch) | |
tree | 0a0243b2d064fe2d1d6acf2a21ea93a40ad9a02a /src/keys/key_commands.rs | |
parent | a5dbccee4f22de991e33449ae1d1835269c6075d (diff) | |
download | molehole-c2acb446e7868b67e5743d54cee5c64c469e5a18.tar.gz molehole-c2acb446e7868b67e5743d54cee5c64c469e5a18.zip |
Add keyboard commands
Diffstat (limited to 'src/keys/key_commands.rs')
-rw-r--r-- | src/keys/key_commands.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/keys/key_commands.rs b/src/keys/key_commands.rs new file mode 100644 index 0000000..6124560 --- /dev/null +++ b/src/keys/key_commands.rs @@ -0,0 +1,56 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + +use crate::app_action::AppAction; + +#[derive(Default, Clone)] +pub struct KeyCommand { + pub key_code: String, + pub description: String, + pub action: Option<AppAction>, +} + +impl std::fmt::Display for KeyCommand { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}\t{}", self.key_code, self.description) + } +} + +pub fn serialize_key_event(event: KeyEvent) -> String { + let mut modifiers = Vec::with_capacity(3); + if event.modifiers.intersects(KeyModifiers::CONTROL) { + modifiers.push("ctrl"); + } + if event.modifiers.intersects(KeyModifiers::SUPER) + || event.modifiers.intersects(KeyModifiers::HYPER) + || event.modifiers.intersects(KeyModifiers::META) + { + modifiers.push("super"); + } + if event.modifiers.intersects(KeyModifiers::ALT) { + modifiers.push("alt"); + } + + let char; + let key = match event.code { + KeyCode::Backspace => "del", + KeyCode::Enter => "enter", + KeyCode::Left => "left", + KeyCode::Right => "right", + KeyCode::Up => "up", + KeyCode::Down => "down", + KeyCode::Tab => "tab", + KeyCode::Delete => "del", + KeyCode::Char(c) if c == ' ' => "space", + KeyCode::Char(c) => { + char = c.to_string(); + &char + } + KeyCode::Esc => "esc", + _ => "", + }; + let separator = if modifiers.len() > 0 { "-" } else { "" }; + let serialized_event = + format!("{}{}{}", modifiers.join("-"), separator, key); + + serialized_event +} |