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)
}
}