feat(tui): Handle key modifiers for input events

This commit is contained in:
Patrick Auernig 2024-11-27 20:18:54 +01:00
parent 5da0795103
commit efe950da64

View File

@ -3,7 +3,7 @@ use std::sync::mpsc;
use std::time::Duration; use std::time::Duration;
use anyhow::Result; 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::layout::{Constraint, Layout, Rect};
use ratatui::style::{Color, Style}; use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders, Cell, Paragraph, Row, Table, TableState}; 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()? { 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<Message>, event: KeyEvent) { fn handle_key_event(state: &mut State, tx: &mut mpsc::Sender<Message>, event: KeyEvent) {
let msg = match (event.code, &state.mode) { let msg = match (&state.mode, event.modifiers, event.code) {
(KeyCode::Char('q') | KeyCode::Esc, Mode::Normal) => Message::Exit, (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('q') | KeyCode::Esc) => Message::Exit,
(KeyCode::Char('j') | KeyCode::Down, Mode::Normal) => Message::MoveDown, (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('j') | KeyCode::Down) => Message::MoveDown,
(KeyCode::Char('k') | KeyCode::Up, Mode::Normal) => Message::MoveUp, (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('k') | KeyCode::Up) => Message::MoveUp,
(KeyCode::Char('/'), Mode::Normal) => Message::Search, (Mode::Normal, KeyModifiers::NONE, KeyCode::Char('/')) => Message::Search,
(KeyCode::Esc, Mode::Search) => Message::ExitSearch, (Mode::Search, KeyModifiers::NONE, KeyCode::Esc) => Message::ExitSearch,
(KeyCode::Char(c), Mode::Search) => { (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)); state.search.handle(InputRequest::InsertChar(c));
Message::SearchUpdate Message::SearchUpdate
} }
(KeyCode::Backspace, Mode::Search) => { (Mode::Search, KeyModifiers::NONE, KeyCode::Backspace) => {
state.search.handle(InputRequest::DeletePrevChar); state.search.handle(InputRequest::DeletePrevChar);
Message::SearchUpdate Message::SearchUpdate
} }
(KeyCode::Enter, _) => Message::Confirm, (_, _, KeyCode::Enter) => Message::Confirm,
_ => Message::Noop, _ => Message::Noop,
}; };