use crate::action::Action;
use crate::app_error::AppError;
use crate::event::Event;
use crossterm::event;
use ratatui::layout;
use std::io;
use tokio::sync::mpsc;
pub trait Component: HandleFocus {
#[allow(unused_variables)]
fn register_action_handler(&mut self, tx: mpsc::UnboundedSender<Action>) -> io::Result<()> {
Ok(())
}
#[allow(unused_variables)]
fn init(&mut self, area: layout::Rect) -> io::Result<()> {
Ok(())
}
fn handle_events(&mut self, event: Option<Event>) -> Result<Option<Action>, AppError<Action>> {
let r = match event {
Some(Event::Key(key, modifiers)) => {
self.handle_key_events(Event::Key(key, modifiers))?
}
Some(Event::Mouse(mouse_event)) => self.handle_mouse_events(mouse_event)?,
_ => None,
};
Ok(r)
}
#[allow(unused_variables)]
fn handle_key_events(&mut self, key: Event) -> io::Result<Option<Action>> {
Ok(None)
}
#[allow(unused_variables)]
fn handle_mouse_events(&mut self, mouse: event::MouseEvent) -> io::Result<Option<Action>> {
Ok(None)
}
#[allow(unused_variables)]
fn update(&mut self, action: Action) {}
fn draw(&mut self, f: &mut ratatui::Frame<'_>, area: layout::Rect) -> io::Result<()>;
fn new_boxed(self) -> Box<Self>
where
Self: Sized,
{
Box::new(self)
}
}
pub trait HandleFocus {
fn focus(&mut self);
fn unfocus(&mut self);
}