Skip to main content

rgx/input/
mod.rs

1pub mod editor;
2
3use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum Action {
7    InsertChar(char),
8    InsertNewline,
9    DeleteBack,
10    DeleteForward,
11    MoveCursorLeft,
12    MoveCursorRight,
13    MoveCursorHome,
14    MoveCursorEnd,
15    MoveCursorWordLeft,
16    MoveCursorWordRight,
17    ScrollUp,
18    ScrollDown,
19    SwitchPanel,
20    SwitchEngine,
21    ToggleCaseInsensitive,
22    ToggleMultiLine,
23    ToggleDotAll,
24    ToggleUnicode,
25    ToggleExtended,
26    ShowHelp,
27    Undo,
28    Redo,
29    HistoryPrev,
30    HistoryNext,
31    CopyMatch,
32    ToggleWhitespace,
33    OutputAndQuit,
34    SaveWorkspace,
35    OpenRecipes,
36    Benchmark,
37    Quit,
38    None,
39}
40
41pub fn key_to_action(key: KeyEvent) -> Action {
42    match key.code {
43        KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
44        KeyCode::Char('q') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
45        KeyCode::Esc => Action::Quit,
46        KeyCode::Tab => Action::SwitchPanel,
47        KeyCode::Char('e') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::SwitchEngine,
48        KeyCode::Char('z') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Undo,
49        KeyCode::Char('Z')
50            if key
51                .modifiers
52                .contains(KeyModifiers::CONTROL | KeyModifiers::SHIFT) =>
53        {
54            Action::Redo
55        }
56        KeyCode::Char('y') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::CopyMatch,
57        KeyCode::Char('w') if key.modifiers.contains(KeyModifiers::CONTROL) => {
58            Action::ToggleWhitespace
59        }
60        KeyCode::Char('o') if key.modifiers.contains(KeyModifiers::CONTROL) => {
61            Action::OutputAndQuit
62        }
63        KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::CONTROL) => {
64            Action::SaveWorkspace
65        }
66        KeyCode::Char('r') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::OpenRecipes,
67        KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Benchmark,
68        KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::ALT) => {
69            Action::ToggleCaseInsensitive
70        }
71        KeyCode::Char('m') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleMultiLine,
72        KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleDotAll,
73        KeyCode::Char('u') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleUnicode,
74        KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleExtended,
75        KeyCode::Up if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryPrev,
76        KeyCode::Down if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryNext,
77        KeyCode::F(1) => Action::ShowHelp,
78        KeyCode::Char(c) => Action::InsertChar(c),
79        KeyCode::Enter => Action::InsertNewline,
80        KeyCode::Backspace => Action::DeleteBack,
81        KeyCode::Delete => Action::DeleteForward,
82        KeyCode::Left if key.modifiers.contains(KeyModifiers::CONTROL) => {
83            Action::MoveCursorWordLeft
84        }
85        KeyCode::Right if key.modifiers.contains(KeyModifiers::CONTROL) => {
86            Action::MoveCursorWordRight
87        }
88        KeyCode::Left => Action::MoveCursorLeft,
89        KeyCode::Right => Action::MoveCursorRight,
90        KeyCode::Up => Action::ScrollUp,
91        KeyCode::Down => Action::ScrollDown,
92        KeyCode::Home => Action::MoveCursorHome,
93        KeyCode::End => Action::MoveCursorEnd,
94        _ => Action::None,
95    }
96}