use super::base::{try_handle_shared, SharedHandleResult};
use crate::input::handler::{DeferredAction, InputContext, InputResult};
use crate::view::popup::Popup;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
pub fn handle_completion_input(
event: &KeyEvent,
popup: Option<&mut Popup>,
ctx: &mut InputContext,
) -> InputResult {
match try_handle_shared(event, popup, ctx) {
SharedHandleResult::Handled(result) => return result,
SharedHandleResult::NotHandled => {}
}
match event.code {
KeyCode::Enter => {
ctx.defer(DeferredAction::CompletionEnterKey);
InputResult::Consumed
}
KeyCode::Tab if event.modifiers.is_empty() => {
ctx.defer(DeferredAction::ConfirmPopup);
InputResult::Consumed
}
KeyCode::Up | KeyCode::Down if event.modifiers.is_empty() => {
InputResult::Consumed
}
KeyCode::Char(c)
if event.modifiers.is_empty() || event.modifiers == KeyModifiers::SHIFT =>
{
ctx.defer(DeferredAction::PopupTypeChar(c));
InputResult::Consumed
}
KeyCode::Backspace if event.modifiers.is_empty() => {
ctx.defer(DeferredAction::PopupBackspace);
InputResult::Consumed
}
_ => InputResult::Consumed,
}
}
pub fn handle_completion_input_with_popup(
event: &KeyEvent,
popup: &mut Popup,
ctx: &mut InputContext,
) -> InputResult {
match try_handle_shared(event, Some(popup), ctx) {
SharedHandleResult::Handled(result) => return result,
SharedHandleResult::NotHandled => {}
}
match event.code {
KeyCode::Enter => {
ctx.defer(DeferredAction::CompletionEnterKey);
InputResult::Consumed
}
KeyCode::Tab if event.modifiers.is_empty() => {
ctx.defer(DeferredAction::ConfirmPopup);
InputResult::Consumed
}
KeyCode::Up if event.modifiers.is_empty() => {
popup.select_prev();
InputResult::Consumed
}
KeyCode::Down if event.modifiers.is_empty() => {
popup.select_next();
InputResult::Consumed
}
KeyCode::Char(c)
if event.modifiers.is_empty() || event.modifiers == KeyModifiers::SHIFT =>
{
ctx.defer(DeferredAction::PopupTypeChar(c));
InputResult::Consumed
}
KeyCode::Backspace if event.modifiers.is_empty() => {
ctx.defer(DeferredAction::PopupBackspace);
InputResult::Consumed
}
_ => InputResult::Consumed,
}
}