rtlibs-tui 0.1.4

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