use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;
use crate::widgets::InputEvent;
use crate::widgets::KeyEventHandler;
use crate::widgets::ListEvent;
use crate::Result;
use super::InputSelectState;
pub enum InputSelectEvent
{
NotHandled,
Handled,
Change(Option<String>),
Confirm(String),
Cancel(),
}
impl KeyEventHandler<'_, InputSelectEvent> for InputSelectState
{
fn handle_key_event(
&mut self,
code: KeyCode,
modifiers: KeyModifiers,
) -> Result<InputSelectEvent>
{
let handled = InputSelectEvent::Handled;
let response = match self
.input
.handle_key_event(
code, modifiers,
)?
{
InputEvent::NotHandled =>
{
let new_filter = match self
.input_options
.handle_key_event(
code, modifiers,
)?
{
ListEvent::Handled => None,
ListEvent::Select(value) => Some(
value
.text
.clone(),
),
ListEvent::Action(_) => None,
ListEvent::Exit => None,
};
if let Some(filter) = new_filter
{
self.input
.set(filter);
}
handled
}
InputEvent::Handled => handled,
InputEvent::Change(value) =>
{
self.set_filter(value);
handled
}
InputEvent::Confirm(value) =>
{
if !self
.options
.contains(&value)
&& !self.allow_new_option
{
handled
}
else
{
InputSelectEvent::Confirm(value)
}
}
InputEvent::Cancel() => InputSelectEvent::Cancel(),
};
Ok(response)
}
}