use duat_core::{
hook::{self, FocusedOn, UnfocusedFrom},
ui::{Area, AreaId, BuilderDummy, GetAreaId, Ui, Widget, WidgetAlias},
};
pub use self::{
line_numbers::{LineNumbers, LineNumbersCfg},
log_book::{LogBook, LogBookCfg},
notifications::{Notifications, NotificationsCfg},
prompt_line::{PromptLine, PromptLineCfg},
status_line::{State, StatusLine, StatusLineCfg, status},
};
mod line_numbers;
mod log_book;
mod notifications;
mod prompt_line;
mod status_line;
#[derive(Default)]
pub struct FooterWidgets<U: Ui> {
status_cfg: StatusLineCfg<U>,
prompt_cfg: PromptLineCfg<U>,
notifs_cfg: NotificationsCfg<U>,
is_one_line: bool,
is_above: bool,
}
impl<U: Ui> FooterWidgets<U> {
pub fn new(status_cfg: StatusLineCfg<U>) -> Self {
Self {
status_cfg,
prompt_cfg: PromptLine::cfg(),
notifs_cfg: Notifications::cfg(),
is_one_line: false,
is_above: false,
}
}
pub fn one_line(self) -> Self {
Self { is_one_line: true, ..self }
}
pub fn above(self) -> Self {
Self { is_above: true, ..self }
}
pub fn prompt(self, prompt_cfg: PromptLineCfg<U>) -> Self {
Self { prompt_cfg, ..self }
}
pub fn notifs(self, notifs_cfg: NotificationsCfg<U>) -> Self {
Self { notifs_cfg, ..self }
}
}
impl<U: Ui> WidgetAlias<U, FooterWidgetsDummy> for FooterWidgets<U> {
fn push_alias(self, builder: &mut duat_core::ui::RawUiBuilder<U>) -> AreaId {
let status_id = if self.is_above {
builder.push(self.status_cfg.above())
} else {
builder.push(self.status_cfg.below())
};
let prompt_id = if self.is_one_line {
builder.push_to(status_id, self.prompt_cfg.left_ratioed(3, 7).hidden())
} else {
builder.push_to(status_id, self.prompt_cfg.below().hidden())
};
let notifs_id = builder.push_to(prompt_id, self.notifs_cfg);
hook::add::<FocusedOn<PromptLine<U>, U>, U>({
move |pa, (_, prompt)| {
if prompt.area_id() == prompt_id
&& let Some(notifs_area) = notifs_id.area::<U>(pa)
{
notifs_area.hide().unwrap();
prompt.area(pa).reveal().unwrap();
}
}
});
hook::add::<UnfocusedFrom<PromptLine<U>, U>, U>(move |pa, (prompt, _)| {
if prompt.area_id() == prompt_id
&& let Some(notifs_area) = notifs_id.area::<U>(pa)
{
notifs_area.reveal().unwrap();
prompt.area(pa).hide().unwrap();
}
});
notifs_id
}
}
#[doc(hidden)]
pub struct FooterWidgetsDummy;
impl BuilderDummy for FooterWidgetsDummy {}