use crossterm::event::{Event as CrosstermEvent, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use log::debug;
use tui_input::backend::crossterm::EventHandler;
use crate::{command::client::engine::Engine, AppResult};
use super::app::App;
pub fn handle_key_events<T: Engine>(key_event: KeyEvent, app: &mut App<T>) -> AppResult<()> {
if key_event.kind != KeyEventKind::Press {
return Ok(());
}
match key_event.code {
KeyCode::Esc => {
app.cancel();
}
KeyCode::Char('c') | KeyCode::Char('C') => {
if key_event.modifiers == KeyModifiers::CONTROL {
app.cancel();
} else {
app.search_box.handle_event(&CrosstermEvent::Key(key_event));
app.update_commands();
}
}
KeyCode::Enter => {
app.confirm();
}
KeyCode::Up => {
app.selected = app
.selected
.checked_sub(1)
.unwrap_or_else(|| app.current_commands.len().saturating_sub(1));
debug!("selected idx : {}", app.selected);
}
KeyCode::Down => {
app.selected = if app.selected < app.current_commands.len().saturating_sub(1) {
app.selected.saturating_add(1)
} else {
0
};
debug!("selected idx : {}", app.selected);
}
_ => {
app.search_box.handle_event(&CrosstermEvent::Key(key_event));
app.update_commands();
}
}
Ok(())
}