use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;
use crate::widgets::KeyEventHandler;
use crate::Result;
use super::InputNumberState;
pub enum InputNumberEvent
{
NotHandled,
Handled,
Change(
String,
Option<u32>,
),
Confirm(
String,
Option<u32>,
),
Cancel(),
}
impl KeyEventHandler<'_, InputNumberEvent> for InputNumberState
{
fn handle_key_event(
&mut self,
code: KeyCode,
_modifiers: KeyModifiers,
) -> Result<InputNumberEvent>
{
let value = self
.input()
.filter(
|v| {
self.max_value
.map(|max| *v <= max)
.unwrap_or(true)
},
)
.filter(
|v| {
self.min_value
.map(|min| *v >= min)
.unwrap_or(true)
},
);
let response = match code
{
KeyCode::Esc =>
{
if self.clear_on_cancel
{
self.clear();
}
InputNumberEvent::Cancel()
}
KeyCode::Char(to_insert) =>
{
if to_insert.is_ascii_digit()
{
self.enter_char(to_insert);
InputNumberEvent::Change(
self.input
.clone(),
value,
)
}
else
{
InputNumberEvent::NotHandled
}
}
KeyCode::Delete =>
{
self.supp_char();
InputNumberEvent::Change(
self.input
.clone(),
value,
)
}
KeyCode::Backspace =>
{
self.delete_char();
InputNumberEvent::Change(
self.input
.clone(),
value,
)
}
KeyCode::Left =>
{
self.move_cursor_left();
InputNumberEvent::Handled
}
KeyCode::Right =>
{
self.move_cursor_right();
InputNumberEvent::Handled
}
KeyCode::Home =>
{
self.move_cursor_start();
InputNumberEvent::Handled
}
KeyCode::End =>
{
self.move_cursor_end();
InputNumberEvent::Handled
}
KeyCode::Enter =>
{
let result = InputNumberEvent::Confirm(
self.input
.clone(),
value,
);
if self.clear_on_confirm
{
self.clear();
}
result
}
_ => InputNumberEvent::NotHandled,
};
Ok(response)
}
}