rtlibs-tui 0.1.4

rtools library: ratatui widgets
Documentation
use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;

use crate::widgets::KeyEventHandler;
use crate::Result;

use super::ListItem;
use super::ListState;

pub enum ListEvent<'a, T>
{
    Handled,
    Select(&'a mut T),
    Action(&'a mut T),
    Exit,
}

impl<'a, T> KeyEventHandler<'a, ListEvent<'a, T>> for ListState<T>
where
    T: ListItem,
{
    fn handle_key_event(
        &'a mut self,
        code: KeyCode,
        _modifiers: KeyModifiers,
    ) -> Result<ListEvent<'a, T>>
    {
        let exit = ListEvent::Exit;
        let skip = ListEvent::Handled;

        let response = match code
        {
            KeyCode::Char('q') | KeyCode::Esc => exit,
            KeyCode::Char('j') | KeyCode::Down =>
            {
                self.select_next();
                self.return_selected()
            }
            KeyCode::Char('k') | KeyCode::Up =>
            {
                self.select_previous();
                self.return_selected()
            }
            KeyCode::PageDown =>
            {
                self.select_next_tab();
                self.return_selected()
            }
            KeyCode::PageUp =>
            {
                self.select_previous_tab();
                self.return_selected()
            }
            KeyCode::Char('g') | KeyCode::Home =>
            {
                self.select_first();
                self.return_selected()
            }
            KeyCode::Char('e') | KeyCode::End =>
            {
                self.select_last();
                self.return_selected()
            }
            _ =>
            {
                if let Some(selected) = self.get_selected()
                {
                    ListEvent::Action(selected)
                }
                else
                {
                    skip
                }
            }
        };

        Ok(response)
    }
}