Fix handling of modifiers in event handler
This commit is contained in:
parent
263799662c
commit
1223dc190a
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user