pub mod apps;
pub mod chrome;
pub mod context;
pub mod copy;
pub mod files;
pub mod key;
pub mod login;
pub mod model;
pub mod research_live;
pub mod session;
pub mod settings;
pub mod skills;
pub mod space;
pub mod swarm;
pub mod usage;
pub mod watches;
#[cfg(test)]
mod tests;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum BrowseAction {
Close,
Filter(char),
Backspace,
MoveUp,
MoveDown,
PageUp,
PageDown,
Top,
Bottom,
Create,
Rename,
ConfirmDelete,
}
pub(super) fn apply_page(mut move_by: impl FnMut(i32), action: BrowseAction, page: i32) {
match action {
BrowseAction::PageUp => move_by(-page),
BrowseAction::PageDown => move_by(page),
BrowseAction::Top => move_by(i32::MIN / 2),
BrowseAction::Bottom => move_by(i32::MAX / 2),
_ => {}
}
}
pub(super) const fn classify_browse_key(
key: KeyEvent,
supports_create: bool,
supports_rename: bool,
) -> Option<BrowseAction> {
let ctrl = key.modifiers.contains(KeyModifiers::CONTROL);
match key.code {
KeyCode::Esc => Some(BrowseAction::Close),
KeyCode::Up => Some(BrowseAction::MoveUp),
KeyCode::Down => Some(BrowseAction::MoveDown),
KeyCode::PageUp => Some(BrowseAction::PageUp),
KeyCode::PageDown => Some(BrowseAction::PageDown),
KeyCode::Home => Some(BrowseAction::Top),
KeyCode::End => Some(BrowseAction::Bottom),
KeyCode::Char('n') if ctrl && supports_create => Some(BrowseAction::Create),
KeyCode::Char('r') if ctrl && supports_rename => Some(BrowseAction::Rename),
KeyCode::Char('d') if ctrl => Some(BrowseAction::ConfirmDelete),
KeyCode::Backspace => Some(BrowseAction::Backspace),
KeyCode::Char(c) if !ctrl => Some(BrowseAction::Filter(c)),
_ => None,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum EditAction {
Cancel,
Save,
Backspace,
Push(char),
}
pub(super) const fn classify_edit_key(key: KeyEvent) -> Option<EditAction> {
match key.code {
KeyCode::Esc => Some(EditAction::Cancel),
KeyCode::Enter => Some(EditAction::Save),
KeyCode::Backspace => Some(EditAction::Backspace),
KeyCode::Char(c) => Some(EditAction::Push(c)),
_ => None,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum ConfirmDeleteAction {
Yes,
No,
}
pub(super) const fn classify_confirm_delete_key(key: KeyEvent) -> Option<ConfirmDeleteAction> {
let ctrl = key.modifiers.contains(KeyModifiers::CONTROL);
match key.code {
KeyCode::Char('d') if ctrl => Some(ConfirmDeleteAction::Yes),
KeyCode::Esc => Some(ConfirmDeleteAction::No),
_ => None,
}
}