use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;
use crate::widgets::InputNumberEvent;
use crate::widgets::KeyEventHandler;
use crate::Result;
use super::InputCurrencyFocus;
use super::InputCurrencyState;
pub enum InputCurrencyEvent
{
NotHandled,
Handled,
Change(Option<i32>),
Confirm(i32),
Cancel(),
}
impl InputCurrencyState
{
pub(crate) fn handle_key_event_integral(
&mut self,
code: KeyCode,
modifiers: KeyModifiers,
) -> Result<InputCurrencyEvent>
{
let handled = InputCurrencyEvent::Handled;
let response = match self
.input_integral
.handle_key_event(
code, modifiers,
)?
{
InputNumberEvent::NotHandled => match code
{
KeyCode::Tab | KeyCode::Char('.') | KeyCode::Char(',') =>
{
self.input_mode = InputCurrencyFocus::Decimal;
handled
}
KeyCode::BackTab =>
{
self.input_mode = InputCurrencyFocus::Decimal;
handled
}
KeyCode::Char('-') | KeyCode::Char('+') =>
{
self.is_negative = !self.is_negative;
handled
}
_ => InputCurrencyEvent::NotHandled,
},
InputNumberEvent::Handled => handled,
InputNumberEvent::Change(_, _) => InputCurrencyEvent::Change(self.input()),
InputNumberEvent::Confirm(_, _) =>
{
if let Some(value) = self.input()
{
InputCurrencyEvent::Confirm(value)
}
else
{
InputCurrencyEvent::Handled
}
}
InputNumberEvent::Cancel() => InputCurrencyEvent::Cancel(),
};
Ok(response)
}
fn handle_key_event_decimal(
&mut self,
code: KeyCode,
modifiers: KeyModifiers,
) -> Result<InputCurrencyEvent>
{
let handled = InputCurrencyEvent::Handled;
let response = match self
.input_decimal
.handle_key_event(
code, modifiers,
)?
{
InputNumberEvent::NotHandled => match code
{
KeyCode::Tab =>
{
self.input_mode = InputCurrencyFocus::Integral;
handled
}
KeyCode::BackTab =>
{
self.input_mode = InputCurrencyFocus::Integral;
handled
}
KeyCode::Char('-') | KeyCode::Char('+') =>
{
self.is_negative = !self.is_negative;
handled
}
_ => InputCurrencyEvent::NotHandled,
},
InputNumberEvent::Handled => handled,
InputNumberEvent::Change(_, _) => InputCurrencyEvent::Change(self.input()),
InputNumberEvent::Confirm(_, _) =>
{
if let Some(value) = self.input()
{
InputCurrencyEvent::Confirm(value)
}
else
{
InputCurrencyEvent::Handled
}
}
InputNumberEvent::Cancel() => InputCurrencyEvent::Cancel(),
};
Ok(response)
}
}
impl KeyEventHandler<'_, InputCurrencyEvent> for InputCurrencyState
{
fn handle_key_event(
&mut self,
code: KeyCode,
modifiers: KeyModifiers,
) -> Result<InputCurrencyEvent>
{
let response = match self.input_mode
{
InputCurrencyFocus::Integral => self.handle_key_event_integral(
code, modifiers,
)?,
InputCurrencyFocus::Decimal => self.handle_key_event_decimal(
code, modifiers,
)?,
};
Ok(response)
}
}