use crate::input::handler::{DeferredAction, InputContext, InputResult};
use crate::view::popup::Popup;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
pub enum SharedHandleResult {
Handled(InputResult),
NotHandled,
}
pub fn try_handle_shared(
event: &KeyEvent,
popup: Option<&mut Popup>,
ctx: &mut InputContext,
) -> SharedHandleResult {
match event.code {
KeyCode::Esc => {
ctx.defer(DeferredAction::ClosePopup);
SharedHandleResult::Handled(InputResult::Consumed)
}
KeyCode::PageUp => {
if let Some(p) = popup {
p.page_up();
}
SharedHandleResult::Handled(InputResult::Consumed)
}
KeyCode::PageDown => {
if let Some(p) = popup {
p.page_down();
}
SharedHandleResult::Handled(InputResult::Consumed)
}
KeyCode::Home => {
if let Some(p) = popup {
p.select_first();
}
SharedHandleResult::Handled(InputResult::Consumed)
}
KeyCode::End => {
if let Some(p) = popup {
p.select_last();
}
SharedHandleResult::Handled(InputResult::Consumed)
}
KeyCode::Char('c') if event.modifiers == KeyModifiers::CONTROL => {
if let Some(p) = popup {
if p.has_selection() {
if let Some(text) = p.get_selected_text() {
ctx.defer(DeferredAction::CopyToClipboard(text));
}
}
}
SharedHandleResult::Handled(InputResult::Consumed)
}
_ => SharedHandleResult::NotHandled,
}
}
pub fn handle_list_navigation(event: &KeyEvent, popup: Option<&mut Popup>) -> Option<InputResult> {
match event.code {
KeyCode::Up if event.modifiers.is_empty() => {
if let Some(p) = popup {
p.select_prev();
}
Some(InputResult::Consumed)
}
KeyCode::Down if event.modifiers.is_empty() => {
if let Some(p) = popup {
p.select_next();
}
Some(InputResult::Consumed)
}
_ => None,
}
}