use std::io; use ratatui::crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers}; use crate::app::App; pub fn handle_event(app: &mut App) -> io::Result { if let Event::Key(key) = event::read()? { match app.view { crate::app::ViewState::Dashboard => { if handle_dashboard_keybinds(key, app) { return Ok(true); } } crate::app::ViewState::InstalledPackages => { if app.showing_search_window { handle_search_keybinds(key, app); } else if handle_installed_packages_keybinds(key, app) { return Ok(true); } } } } Ok(false) } fn handle_search_keybinds(key: KeyEvent, app: &mut App) { match key.code { KeyCode::Esc => app.toggle_search_window(), KeyCode::Enter => { app.search(); app.toggle_search_window(); } _ => { app.textarea.input_without_shortcuts(key); app.search_found = Some(app.search()); } } } fn handle_installed_packages_keybinds(key: KeyEvent, app: &mut App) -> bool { match key.modifiers { KeyModifiers::CONTROL => match key.code { KeyCode::Char('d') => app .list_state .select(Some(app.list_state.selected().unwrap_or(0) + 30)), KeyCode::Char('u') => { if let Some(selected) = app.list_state.selected() { if selected < 30 { app.list_state.select(Some(0)); } else { app.list_state.select(Some(selected - 30)); } } } _ => {} }, _ => match key.code { KeyCode::Char('q') => return true, KeyCode::Char('j') => app.list_state.select_next(), KeyCode::Char('k') => app.list_state.select_previous(), KeyCode::Char('/') => app.toggle_search_window(), KeyCode::Char('n') => app.next_search(), KeyCode::Char('N') => app.prev_search(), KeyCode::Tab => app.cycle_current_tab(), _ => {} }, } false } fn handle_dashboard_keybinds(key: KeyEvent, app: &mut App) -> bool { match key.code { KeyCode::Char('q') => return true, KeyCode::Tab => app.cycle_current_tab(), _ => {} } false }