diff --git a/src/tui.rs b/src/tui.rs index 963011e..a2f1d26 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -3,7 +3,7 @@ use std::sync::mpsc; use std::time::Duration; use anyhow::Result; -use crossterm::event::{self, Event, KeyCode, KeyEvent}; +use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers}; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::style::{Color, Style}; use ratatui::widgets::{Block, Borders, Cell, Paragraph, Row, Table, TableState}; @@ -84,7 +84,7 @@ pub fn run(projects: Projects) -> Result<()> { } if let Event::Key(key_event) = event::read()? { - handle_event(&mut state, &mut msg_tx, key_event); + handle_key_event(&mut state, &mut msg_tx, key_event); } } @@ -98,24 +98,26 @@ pub fn run(projects: Projects) -> Result<()> { } -fn handle_event(state: &mut State, tx: &mut mpsc::Sender, event: KeyEvent) { - let msg = match (event.code, &state.mode) { - (KeyCode::Char('q') | KeyCode::Esc, Mode::Normal) => Message::Exit, - (KeyCode::Char('j') | KeyCode::Down, Mode::Normal) => Message::MoveDown, - (KeyCode::Char('k') | KeyCode::Up, Mode::Normal) => Message::MoveUp, - (KeyCode::Char('/'), Mode::Normal) => Message::Search, +fn handle_key_event(state: &mut State, tx: &mut mpsc::Sender, event: KeyEvent) { + let msg = match (&state.mode, event.modifiers, event.code) { + (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('q') | KeyCode::Esc) => Message::Exit, + (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('j') | KeyCode::Down) => Message::MoveDown, + (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('k') | KeyCode::Up) => Message::MoveUp, + (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('/')) => Message::Search, - (KeyCode::Esc, Mode::Search) => Message::ExitSearch, - (KeyCode::Char(c), Mode::Search) => { + (Mode::Search, KeyModifiers::NONE, KeyCode::Esc) => Message::ExitSearch, + (Mode::Search, KeyModifiers::CONTROL, KeyCode::Char('j')) => Message::MoveDown, + (Mode::Search, KeyModifiers::CONTROL, KeyCode::Char('k')) => Message::MoveUp, + (Mode::Search, KeyModifiers::NONE, KeyCode::Char(c)) => { state.search.handle(InputRequest::InsertChar(c)); Message::SearchUpdate } - (KeyCode::Backspace, Mode::Search) => { + (Mode::Search, KeyModifiers::NONE, KeyCode::Backspace) => { state.search.handle(InputRequest::DeletePrevChar); Message::SearchUpdate } - (KeyCode::Enter, _) => Message::Confirm, + (_, _, KeyCode::Enter) => Message::Confirm, _ => Message::Noop, };