Fix handling of modifiers in event handler

This commit is contained in:
Patrick Auernig 2023-08-18 15:15:22 +02:00
parent 263799662c
commit 1223dc190a

View File

@ -44,75 +44,72 @@ fn handle_keyboard_input(
msg_tx: &mut mpsc::Sender<Message>, msg_tx: &mut mpsc::Sender<Message>,
state: &mut State, state: &mut State,
) -> Result<()> { ) -> Result<()> {
if key.modifiers.is_empty() { match (key.code, &state.mode) {
match (key.code, &state.mode) { (KeyCode::Esc, Mode::Insert) => msg_tx.send(Message::CancelEditEntry)?,
(KeyCode::Esc, Mode::Insert) => msg_tx.send(Message::CancelEditEntry)?, (KeyCode::Esc, Mode::SelectFile) => {
(KeyCode::Esc, _) => msg_tx.send(Message::SetMode(Mode::Normal))?, if state.prompt_save {
(KeyCode::Enter, Mode::Edit) => msg_tx.send(Message::StartEditEntry)?, msg_tx.send(Message::SetMode(Mode::Edit))?;
(KeyCode::Enter, Mode::Insert) => msg_tx.send(Message::CommitEditEntry)?, } else {
(KeyCode::Enter, Mode::SelectFile) => { msg_tx.send(Message::SetMode(Mode::Normal))?;
if state.prompt_save {
msg_tx.send(Message::SaveFile)?;
} else {
msg_tx.send(Message::LoadFile)?;
}
} }
(KeyCode::Char('q'), Mode::Normal) => msg_tx.send(Message::Exit)?, }
(KeyCode::Char('e'), Mode::Normal) => msg_tx.send(Message::SetMode(Mode::Edit))?, (KeyCode::Esc, _) => msg_tx.send(Message::SetMode(Mode::Normal))?,
(KeyCode::Enter, Mode::Edit) => msg_tx.send(Message::StartEditEntry)?,
// file loading (KeyCode::Enter, Mode::Insert) => msg_tx.send(Message::CommitEditEntry)?,
(KeyCode::Char('o'), Mode::Normal) => { (KeyCode::Enter, Mode::SelectFile) => {
if state.prompt_save {
msg_tx.send(Message::SaveFile)?;
} else {
msg_tx.send(Message::LoadFile)?;
}
}
(KeyCode::Char('q'), _) if key.modifiers == KeyModifiers::CONTROL => {
msg_tx.send(Message::Exit)?
}
(KeyCode::Char(ch), Mode::Normal) => match ch {
'q' => msg_tx.send(Message::Exit)?,
'e' => msg_tx.send(Message::SetMode(Mode::Edit))?,
'o' => {
state.prompt_save = false; state.prompt_save = false;
state.file_select = Input::default(); state.file_select = Input::default();
msg_tx.send(Message::SetMode(Mode::SelectFile))? msg_tx.send(Message::SetMode(Mode::SelectFile))?
} }
(KeyCode::Char('r'), Mode::Normal) => msg_tx.send(Message::ReloadFile)?, 'r' => msg_tx.send(Message::ReloadFile)?,
#[cfg(feature = "watch")] #[cfg(feature = "watch")]
(KeyCode::Char('w'), Mode::Normal) => msg_tx.send(Message::ToggleFileWatch)?, 'w' => msg_tx.send(Message::ToggleFileWatch)?,
_ => (),
},
(KeyCode::Char(ch), Mode::Edit) => match ch {
// movement inside editor section // movement inside editor section
(KeyCode::Char('h'), Mode::Edit) => msg_tx.send(Message::MoveCur(Direction::Left))?, 'h' => msg_tx.send(Message::MoveCur(Direction::Left))?,
(KeyCode::Char('j'), Mode::Edit) => msg_tx.send(Message::MoveCur(Direction::Down))?, 'j' => msg_tx.send(Message::MoveCur(Direction::Down))?,
(KeyCode::Char('k'), Mode::Edit) => msg_tx.send(Message::MoveCur(Direction::Up))?, 'k' => msg_tx.send(Message::MoveCur(Direction::Up))?,
(KeyCode::Char('l'), Mode::Edit) => msg_tx.send(Message::MoveCur(Direction::Right))?, 'l' => msg_tx.send(Message::MoveCur(Direction::Right))?,
// movement between editor sections // movement between editor sections
(KeyCode::Char('H'), Mode::Edit) => { 'H' => msg_tx.send(Message::MoveSection(Direction::Left))?,
msg_tx.send(Message::MoveSection(Direction::Left))? 'J' => msg_tx.send(Message::MoveSection(Direction::Down))?,
} 'K' => msg_tx.send(Message::MoveSection(Direction::Up))?,
(KeyCode::Char('J'), Mode::Edit) => { 'L' => msg_tx.send(Message::MoveSection(Direction::Right))?,
msg_tx.send(Message::MoveSection(Direction::Down))?
}
(KeyCode::Char('K'), Mode::Edit) => msg_tx.send(Message::MoveSection(Direction::Up))?,
(KeyCode::Char('L'), Mode::Edit) => {
msg_tx.send(Message::MoveSection(Direction::Right))?
}
// next/previous value selection // next/previous value selection
(KeyCode::Char('n'), Mode::Edit) => msg_tx.send(Message::NextEntryValue)?, 'n' => msg_tx.send(Message::NextEntryValue)?,
(KeyCode::Char('p'), Mode::Edit) => msg_tx.send(Message::PreviousEntryValue)?, 'p' => msg_tx.send(Message::PreviousEntryValue)?,
// open save prompt // open save prompt
(KeyCode::Char('s'), Mode::Edit) => { 's' => {
state.prompt_save = true; state.prompt_save = true;
state.file_select = Input::default(); state.file_select = Input::default();
msg_tx.send(Message::SetMode(Mode::SelectFile))?; msg_tx.send(Message::SetMode(Mode::SelectFile))?;
} }
(_, Mode::Insert) => {
if let Some(input) = &mut state.edit_input {
input.handle_event(&Event::Key(key));
}
}
(_, Mode::SelectFile) => {
state.file_select.handle_event(&Event::Key(key));
}
_ => (),
};
} else if key.modifiers.contains(KeyModifiers::CONTROL) {
match (key.code, &state.mode) {
(KeyCode::Char('q'), _) => msg_tx.send(Message::Exit)?,
_ => (), _ => (),
},
(_, Mode::Insert) => {
if let Some(input) = &mut state.edit_input {
input.handle_event(&Event::Key(key));
}
} }
(_, Mode::SelectFile) => {
state.file_select.handle_event(&Event::Key(key));
}
_ => (),
} }
state.clear_error_message(); state.clear_error_message();