ratatui_eventInput/
crossterm.rs1use 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}