ratatui_eventInput/
crossterm.rs

1use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers, MediaKeyCode, ModifierKeyCode};
2
3use crate::Input;
4
5use super::{Key, Modifier, Side};
6
7impl From<&Event> for Input {
8    fn from(value: &Event) -> Self {
9        if let Event::Key(key) = value {
10            if matches!(
11                key.kind,
12                KeyEventKind::Press | crossterm::event::KeyEventKind::Repeat
13            ) {
14                let result_key: Key = key.code.into();
15                let modifier = key.modifiers.into();
16                return Input::new(result_key, modifier);
17            }
18        }
19
20        Input::default()
21    }
22}
23
24impl From<KeyCode> for Key {
25    fn from(value: KeyCode) -> Self {
26        match value {
27            KeyCode::Char(c) => Key::Char(c),
28            KeyCode::Up => Key::Up,
29            KeyCode::Down => Key::Down,
30            KeyCode::Left => Key::Left,
31            KeyCode::Right => Key::Right,
32            KeyCode::Backspace => Key::Backspace,
33            KeyCode::Enter => Key::Enter,
34            KeyCode::Home => Key::Home,
35            KeyCode::End => Key::End,
36            KeyCode::PageUp => Key::PageUp,
37            KeyCode::PageDown => Key::PageDown,
38            KeyCode::Tab => Key::Tab,
39            KeyCode::BackTab => Key::BackTab,
40            KeyCode::Delete => Key::Delete,
41            KeyCode::Insert => Key::Insert,
42            KeyCode::F(n) => Key::Func(n),
43            KeyCode::Esc => Key::Esc,
44            KeyCode::CapsLock => Key::CapsLock,
45            KeyCode::ScrollLock => Key::ScrollLock,
46            KeyCode::NumLock => Key::NumLock,
47            KeyCode::PrintScreen => Key::PrintScreen,
48            KeyCode::Pause => Key::Pause,
49            KeyCode::Menu => Key::Menu,
50            KeyCode::Media(media) => match media {
51                MediaKeyCode::Play => Key::MediaPlay,
52                MediaKeyCode::Pause => Key::MediaPause,
53                MediaKeyCode::PlayPause => Key::MediaPlayPause,
54                MediaKeyCode::Stop => Key::MediaStop,
55                MediaKeyCode::TrackNext => Key::MediaNext,
56                MediaKeyCode::TrackPrevious => Key::MediaPrevious,
57                MediaKeyCode::LowerVolume => Key::LowerVolume,
58                MediaKeyCode::RaiseVolume => Key::RaisVolume,
59                MediaKeyCode::MuteVolume => Key::MuteVolume,
60                _ => Key::None,
61            },
62            KeyCode::Modifier(modifier) => Key::Modifier(modifier.into()),
63            _ => Key::None,
64        }
65    }
66}
67
68impl From<ModifierKeyCode> for Modifier {
69    fn from(value: ModifierKeyCode) -> Self {
70        match value {
71            ModifierKeyCode::LeftShift => Modifier::Shift(Side::Left),
72            ModifierKeyCode::LeftControl => Modifier::Control(Side::Left),
73            ModifierKeyCode::LeftAlt => Modifier::Alt(Side::Left),
74            ModifierKeyCode::LeftSuper => Modifier::Super(Side::Left),
75            ModifierKeyCode::LeftHyper => Modifier::Hyper(Side::Left),
76            ModifierKeyCode::LeftMeta => Modifier::Meta(Side::Left),
77            ModifierKeyCode::RightShift => Modifier::Shift(Side::Right),
78            ModifierKeyCode::RightControl => Modifier::Control(Side::Right),
79            ModifierKeyCode::RightAlt => Modifier::Alt(Side::Right),
80            ModifierKeyCode::RightSuper => Modifier::Super(Side::Right),
81            ModifierKeyCode::RightHyper => Modifier::Hyper(Side::Right),
82            ModifierKeyCode::RightMeta => Modifier::Meta(Side::Right),
83            _ => Modifier::None,
84        }
85    }
86}
87
88impl From<KeyModifiers> for Modifier {
89    fn from(value: KeyModifiers) -> Self {
90        match value {
91            KeyModifiers::SHIFT => Modifier::Shift(Side::Left),
92            KeyModifiers::CONTROL => Modifier::Control(Side::Left),
93            KeyModifiers::ALT => Modifier::Alt(Side::Left),
94            KeyModifiers::META => Modifier::Meta(Side::Left),
95            KeyModifiers::SUPER => Modifier::Super(Side::Left),
96            KeyModifiers::HYPER => Modifier::Hyper(Side::Left),
97            KeyModifiers::NONE => Modifier::None,
98            _ => Modifier::None,
99        }
100    }
101}