Skip to main content

netwatch_rs/
input.rs

1use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum InputEvent {
5    // Navigation
6    NextPanel,  // Tab - Next panel
7    PrevPanel,  // Shift+Tab - Previous panel
8    NextItem,   // Down arrow, j
9    PrevItem,   // Up arrow, k
10    NextDevice, // Right arrow, l
11    PrevDevice, // Left arrow, h
12
13    // Settings
14    ShowOptions,    // F2 - Show options window
15    SaveSettings,   // F5 - Save current settings
16    ReloadSettings, // F6 - Reload settings from config
17
18    // Control
19    Quit,  // 'q' or Ctrl+C
20    Reset, // 'r' - Reset statistics
21    Pause, // Space - Pause/resume
22
23    // Display modes
24    ToggleTrafficUnits, // 'u' - Cycle through traffic unit types (speeds)
25    ToggleDataUnits,    // 'U' - Cycle through data unit types (totals)
26    ToggleGraphs,       // 'g' - Toggle graph display
27    ToggleMultiple,     // Enter - Toggle between single/multiple device view
28    ZoomIn,             // '+' - Zoom graph scale
29    ZoomOut,            // '-' - Zoom graph scale
30
31    // Config adjustments (for F2 options)
32    IncreaseRefresh, // '>' - Increase refresh rate (decrease interval)
33    DecreaseRefresh, // '<' - Decrease refresh rate (increase interval)
34    IncreaseAverage, // ']' - Increase average window
35    DecreaseAverage, // '[' - Decrease average window
36
37    // Unknown/unhandled
38    Unknown,
39}
40
41impl InputEvent {
42    pub fn from_key_event(key_event: KeyEvent) -> Self {
43        match (key_event.code, key_event.modifiers) {
44            (KeyCode::Tab, KeyModifiers::NONE) => Self::NextPanel,
45            (KeyCode::Tab, KeyModifiers::SHIFT) => Self::PrevPanel,
46            (KeyCode::BackTab, _) => Self::PrevPanel,
47
48            (KeyCode::Down | KeyCode::Char('j'), _) => Self::NextItem,
49            (KeyCode::Up | KeyCode::Char('k'), _) => Self::PrevItem,
50            (KeyCode::Right | KeyCode::Char('l'), _) => Self::NextDevice,
51            (KeyCode::Left | KeyCode::Char('h'), _) => Self::PrevDevice,
52
53            (KeyCode::Enter, _) => Self::ToggleMultiple,
54
55            (KeyCode::F(2), _) => Self::ShowOptions,
56            (KeyCode::F(5), _) => Self::SaveSettings,
57            (KeyCode::F(6), _) => Self::ReloadSettings,
58
59            (KeyCode::Char('q'), _) => Self::Quit,
60            (KeyCode::Char('r'), _) => Self::Reset,
61            (KeyCode::Char(' '), _) => Self::Pause,
62            (KeyCode::Char('u'), _) => Self::ToggleTrafficUnits,
63            (KeyCode::Char('U'), _) => Self::ToggleDataUnits,
64            (KeyCode::Char('g'), _) => Self::ToggleGraphs,
65            (KeyCode::Char('+'), _) => Self::ZoomIn,
66            (KeyCode::Char('-'), _) => Self::ZoomOut,
67            (KeyCode::Char('>'), _) => Self::IncreaseRefresh,
68            (KeyCode::Char('<'), _) => Self::DecreaseRefresh,
69            (KeyCode::Char(']'), _) => Self::IncreaseAverage,
70            (KeyCode::Char('['), _) => Self::DecreaseAverage,
71
72            (KeyCode::Esc, _) => Self::Quit,
73
74            _ => Self::Unknown,
75        }
76    }
77}