use super::Component;
use crate::action::{mode::Mode, scene::Scene, Action};
use crate::tui::Frame;
use color_eyre::eyre::Result;
use ratatui::{
prelude::*,
widgets::{Block, Borders, Paragraph, Tabs},
};
#[derive(Debug)]
pub struct Base {
scene: Scene,
mode: Mode,
}
impl Base {
pub fn new() -> Base {
Base {
scene: Scene::default(),
mode: Mode::default(),
}
}
}
impl Component for Base {
fn update(&mut self, action: Action) -> Result<Option<Action>> {
if let Action::ChangeMode(mode) = action {
self.mode = mode;
}
if self.mode == Mode::Navigation {
if let Action::ChangeScene(scene) = action {
self.scene = scene;
}
}
Ok(None)
}
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
let layer_zero = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Max(2), Constraint::Min(1), Constraint::Max(3)])
.split(area.inner(&Margin {
horizontal: 1,
vertical: 1,
}));
let layer_top_bar = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Max(3)])
.split(layer_zero[0]);
let layer_top_bar_left_right = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Max(40), Constraint::Min(14)])
.split(layer_top_bar[0]);
f.render_widget(
Block::default().borders(Borders::BOTTOM),
layer_top_bar[0],
);
let top_tabs = Tabs::new(
["Home", "Session", "Internals", "? Usage"]
.iter()
.map(|t| {
let (first, rest) = t.split_at(1);
Line::from(vec![first.white(), rest.gray()])
})
.collect::<Vec<_>>(),
)
.block(Block::default().borders(Borders::NONE))
.select(match self.scene {
Scene::Home => 0,
Scene::Session => 1,
Scene::Internals => 2,
})
.style(Style::default())
.highlight_style(Style::default().bold());
f.render_widget(top_tabs, layer_top_bar_left_right[0]);
f.render_widget(
Paragraph::new("Napali v0.1.1")
.block(Block::default().borders(Borders::NONE))
.alignment(Alignment::Right),
layer_top_bar_left_right[1],
);
f.render_widget(
Block::default()
.title("Integrated Reasoning, Inc.")
.title_alignment(Alignment::Right)
.borders(Borders::ALL)
.border_style(Style::default()),
area,
);
Ok(())
}
}