use ratatui::layout::Position;
use crate::widgets::CommanderState;
use super::AppCommanderCommand;
#[derive(Debug)]
pub struct AppCommanderState<T>
where
T: AppCommanderCommand,
{
pub(crate) commander: CommanderState,
pub(crate) commands: Vec<T>,
pub(crate) selected: Option<String>,
}
impl<T> AppCommanderState<T>
where
T: AppCommanderCommand,
{
pub fn new(commands: Vec<T>) -> Self
{
let exported = commands
.iter()
.map(|c| c.command())
.collect::<Vec<_>>();
let commander = CommanderState::new(exported);
Self {
commander,
commands,
selected: None,
}
}
pub fn selected(&mut self) -> Option<&mut T>
{
self.selected
.clone()
.and_then(
|s| {
self.commands
.iter_mut()
.find(
|c| {
c.command()
.get_name()
.eq(&s)
},
)
},
)
}
pub fn clear_selected(&mut self)
{
self.selected = None;
}
pub fn height(
&self,
width: u16,
) -> u16
{
self.commander
.height(width)
}
pub fn cursor(&self) -> Option<Position>
{
self.commander
.cursor()
}
pub fn set_message<S>(
&mut self,
message: S,
) where
S: AsRef<str>,
{
self.commander
.set_message(message)
}
pub fn clear_message(&mut self)
{
self.commander
.clear_message()
}
}