use promkit_widgets::text_editor;
use crate::{
crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers},
preset, PromptSignal,
};
pub type Keymap = fn(
event: &Event,
renderer: &mut preset::query_selector::render::Renderer,
) -> anyhow::Result<PromptSignal>;
pub fn default(
event: &Event,
renderer: &mut preset::query_selector::render::Renderer,
) -> anyhow::Result<PromptSignal> {
let text_editor_after_mut = renderer.text_editor_snapshot.after_mut();
let listbox_after_mut = renderer.listbox_snapshot.after_mut();
match event {
Event::Key(KeyEvent {
code: KeyCode::Enter,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => return Ok(PromptSignal::Quit),
Event::Key(KeyEvent {
code: KeyCode::Char('c'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => return Err(anyhow::anyhow!("ctrl+c")),
Event::Key(KeyEvent {
code: KeyCode::Left,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => {
text_editor_after_mut.texteditor.backward();
}
Event::Key(KeyEvent {
code: KeyCode::Right,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => {
text_editor_after_mut.texteditor.forward();
}
Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => text_editor_after_mut.texteditor.move_to_head(),
Event::Key(KeyEvent {
code: KeyCode::Char('e'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => text_editor_after_mut.texteditor.move_to_tail(),
Event::Key(KeyEvent {
code: KeyCode::Backspace,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => text_editor_after_mut.texteditor.erase(),
Event::Key(KeyEvent {
code: KeyCode::Char('u'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => text_editor_after_mut.texteditor.erase_all(),
Event::Key(KeyEvent {
code: KeyCode::Up,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => {
listbox_after_mut.listbox.backward();
}
Event::Key(KeyEvent {
code: KeyCode::Down,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => {
listbox_after_mut.listbox.forward();
}
Event::Key(KeyEvent {
code: KeyCode::Char(ch),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
})
| Event::Key(KeyEvent {
code: KeyCode::Char(ch),
modifiers: KeyModifiers::SHIFT,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
}) => match text_editor_after_mut.edit_mode {
text_editor::Mode::Insert => text_editor_after_mut.texteditor.insert(*ch),
text_editor::Mode::Overwrite => text_editor_after_mut.texteditor.overwrite(*ch),
},
_ => (),
}
Ok(PromptSignal::Continue)
}