use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KeyAction {
MoveUp,
MoveDown,
MoveLeft,
MoveRight,
JumpToTop,
JumpToBottom,
PageUp,
PageDown,
#[allow(dead_code)]
Expand,
#[allow(dead_code)]
Collapse,
ToggleExpand,
DrillDown,
NavigateBack,
Delete,
ToggleDetails,
ToggleHelp,
ToggleTheme,
Refresh,
Search,
Sort,
CommandMode,
Confirm,
Cancel,
ClearMarks,
NextTab,
PrevTab,
Quit,
ForceQuit,
None,
}
impl KeyAction {
pub fn from_key_event(event: KeyEvent) -> Self {
match (event.code, event.modifiers) {
(KeyCode::Char('q'), KeyModifiers::NONE) => KeyAction::Quit,
(KeyCode::Esc, _) => KeyAction::Quit,
(KeyCode::Char('c'), KeyModifiers::CONTROL) => KeyAction::ForceQuit,
(KeyCode::Char('j'), KeyModifiers::NONE) => KeyAction::MoveDown,
(KeyCode::Char('k'), KeyModifiers::NONE) => KeyAction::MoveUp,
(KeyCode::Char('h'), KeyModifiers::NONE) => KeyAction::MoveLeft,
(KeyCode::Char('l'), KeyModifiers::NONE) => KeyAction::MoveRight,
(KeyCode::Down, _) => KeyAction::MoveDown,
(KeyCode::Up, _) => KeyAction::MoveUp,
(KeyCode::Left, _) => KeyAction::MoveLeft,
(KeyCode::Right, _) => KeyAction::MoveRight,
(KeyCode::Char('g'), KeyModifiers::NONE) => KeyAction::JumpToTop, (KeyCode::Char('G'), KeyModifiers::SHIFT) => KeyAction::JumpToBottom,
(KeyCode::Home, _) => KeyAction::JumpToTop,
(KeyCode::End, _) => KeyAction::JumpToBottom,
(KeyCode::PageUp, _) => KeyAction::PageUp,
(KeyCode::PageDown, _) => KeyAction::PageDown,
(KeyCode::Char('u'), KeyModifiers::CONTROL) => KeyAction::PageUp,
(KeyCode::Char('d'), KeyModifiers::CONTROL) => KeyAction::PageDown,
(KeyCode::Char(' '), KeyModifiers::NONE) => KeyAction::ToggleExpand,
(KeyCode::Char('o'), KeyModifiers::NONE) => KeyAction::ToggleExpand,
(KeyCode::Char('d'), KeyModifiers::NONE) => KeyAction::Delete,
(KeyCode::Delete, _) => KeyAction::Delete,
(KeyCode::Char('i'), KeyModifiers::NONE) => KeyAction::ToggleDetails,
(KeyCode::Char('?'), KeyModifiers::NONE) => KeyAction::ToggleHelp,
(KeyCode::Char('t'), KeyModifiers::NONE) => KeyAction::ToggleTheme,
(KeyCode::Char('r'), KeyModifiers::NONE) => KeyAction::Refresh,
(KeyCode::Char('/'), KeyModifiers::NONE) => KeyAction::Search,
(KeyCode::Char('s'), KeyModifiers::NONE) => KeyAction::Sort,
(KeyCode::Enter, _) => KeyAction::DrillDown,
(KeyCode::Backspace, _) => KeyAction::NavigateBack,
(KeyCode::Char('-'), KeyModifiers::NONE) => KeyAction::NavigateBack,
(KeyCode::Char(':'), KeyModifiers::NONE) => KeyAction::CommandMode,
(KeyCode::Char(':'), KeyModifiers::SHIFT) => KeyAction::CommandMode,
(KeyCode::Char('y'), KeyModifiers::NONE) => KeyAction::Confirm,
(KeyCode::Char('n'), KeyModifiers::NONE) => KeyAction::Cancel,
(KeyCode::Char('x'), KeyModifiers::NONE) => KeyAction::ClearMarks,
(KeyCode::Tab, KeyModifiers::NONE) => KeyAction::NextTab,
(KeyCode::BackTab, _) => KeyAction::PrevTab,
(KeyCode::Char('1'), KeyModifiers::NONE) => KeyAction::NextTab, (KeyCode::Char('2'), KeyModifiers::NONE) => KeyAction::NextTab,
(KeyCode::Char('3'), KeyModifiers::NONE) => KeyAction::NextTab,
_ => KeyAction::None,
}
}
}
pub struct KeyBinding {
pub keys: &'static str,
pub description: &'static str,
}
pub fn get_key_bindings() -> Vec<KeyBinding> {
vec![
KeyBinding {
keys: "Tab/S-Tab",
description: "Switch view",
},
KeyBinding {
keys: "j/k, ↑/↓",
description: "Navigate up/down",
},
KeyBinding {
keys: "h/l, ←/→",
description: "Collapse/expand",
},
KeyBinding {
keys: "Enter",
description: "Drill into directory",
},
KeyBinding {
keys: "Backspace",
description: "Navigate back up",
},
KeyBinding {
keys: "Space/o",
description: "Toggle expand",
},
KeyBinding {
keys: "g/G",
description: "Jump to top/bottom",
},
KeyBinding {
keys: "PgUp/PgDn",
description: "Page up/down",
},
KeyBinding {
keys: "d/Del",
description: "Mark for deletion",
},
KeyBinding {
keys: "x",
description: "Clear all marks",
},
KeyBinding {
keys: "y",
description: "Confirm deletion",
},
KeyBinding {
keys: ":",
description: "Command palette",
},
KeyBinding {
keys: "i",
description: "Toggle details",
},
KeyBinding {
keys: "?",
description: "Toggle help",
},
KeyBinding {
keys: "r",
description: "Refresh",
},
KeyBinding {
keys: "q/Esc",
description: "Quit",
},
]
}