rtlibs-tui 0.1.5

rtools library: ratatui widgets
Documentation
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)
    }
}