Tweaked the key mappings so that it is now easier to change key mappings and update the corresponding UI elements as well

This commit is contained in:
2023-08-08 10:50:07 -06:00
parent 74011b9ab3
commit 5602fc4341
16 changed files with 469 additions and 206 deletions
+24 -2
View File
@@ -1,13 +1,13 @@
use std::fmt;
use std::fmt::{Display, Formatter};
use crossterm::event::{KeyCode, KeyEvent};
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
#[cfg(test)]
#[path = "key_tests.rs"]
mod key_tests;
#[derive(Debug, PartialEq, Eq)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Key {
Up,
Down,
@@ -18,7 +18,9 @@ pub enum Key {
Backspace,
Home,
End,
Tab,
Delete,
Ctrl(char),
Char(char),
Unknown,
}
@@ -27,6 +29,18 @@ impl Display for Key {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match *self {
Key::Char(c) => write!(f, "<{}>", c),
Key::Ctrl(c) => write!(f, "<Ctrl-{}>", c),
Key::Up => write!(f, "<↑>"),
Key::Down => write!(f, "<↓>"),
Key::Left => write!(f, "<←>"),
Key::Right => write!(f, "<→>"),
Key::Enter => write!(f, "<enter>"),
Key::Esc => write!(f, "<esc>"),
Key::Backspace => write!(f, "<backspace>"),
Key::Home => write!(f, "<home>"),
Key::End => write!(f, "<end>"),
Key::Tab => write!(f, "<tab>"),
Key::Delete => write!(f, "<del>"),
_ => write!(f, "<{:?}>", self),
}
}
@@ -61,6 +75,9 @@ impl From<KeyEvent> for Key {
KeyEvent {
code: KeyCode::End, ..
} => Key::End,
KeyEvent {
code: KeyCode::Tab, ..
} => Key::Tab,
KeyEvent {
code: KeyCode::Delete,
..
@@ -72,6 +89,11 @@ impl From<KeyEvent> for Key {
KeyEvent {
code: KeyCode::Esc, ..
} => Key::Esc,
KeyEvent {
code: KeyCode::Char(c),
modifiers: KeyModifiers::CONTROL,
..
} => Key::Ctrl(c),
KeyEvent {
code: KeyCode::Char(c),
..
+36 -9
View File
@@ -1,18 +1,27 @@
#[cfg(test)]
mod tests {
use crossterm::event::{KeyCode, KeyEvent};
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers};
use pretty_assertions::{assert_eq, assert_str_eq};
use rstest::rstest;
use crate::event::key::Key;
#[test]
fn test_key_formatter() {
assert_str_eq!(format!("{}", Key::Esc), "<Esc>");
}
#[test]
fn test_key_formatter_char() {
assert_str_eq!(format!("{}", Key::Char('q')), "<q>");
#[rstest]
#[case(Key::Up, "")]
#[case(Key::Down, "")]
#[case(Key::Left, "")]
#[case(Key::Right, "")]
#[case(Key::Enter, "enter")]
#[case(Key::Esc, "esc")]
#[case(Key::Backspace, "backspace")]
#[case(Key::Home, "home")]
#[case(Key::End, "end")]
#[case(Key::Tab, "tab")]
#[case(Key::Delete, "del")]
#[case(Key::Char('q'), "q")]
#[case(Key::Ctrl('q'), "Ctrl-q")]
fn test_key_formatter(#[case] key: Key, #[case] expected_str: &str) {
assert_str_eq!(format!("{}", key), format!("<{}>", expected_str));
}
#[test]
@@ -53,6 +62,11 @@ mod tests {
assert_eq!(Key::from(KeyEvent::from(KeyCode::End)), Key::End);
}
#[test]
fn test_key_from_tab() {
assert_eq!(Key::from(KeyEvent::from(KeyCode::Tab)), Key::Tab);
}
#[test]
fn test_key_from_delete() {
assert_eq!(Key::from(KeyEvent::from(KeyCode::Delete)), Key::Delete);
@@ -76,6 +90,19 @@ mod tests {
)
}
#[test]
fn test_key_from_ctrl() {
assert_eq!(
Key::from(KeyEvent {
code: KeyCode::Char('c'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE
}),
Key::Ctrl('c')
);
}
#[test]
fn test_key_from_unknown() {
assert_eq!(Key::from(KeyEvent::from(KeyCode::Pause)), Key::Unknown);