pub mod bottom_bar;
pub mod common;
pub mod header_bar;
pub mod help_overlay;
pub mod mode_select;
pub mod sections;
use ratatui::Frame;
use crate::app::App;
pub fn render(frame: &mut Frame, app: &App) {
if app.too_small {
render_too_small(frame);
return;
}
if app.mode.is_none() {
mode_select::render(frame);
return;
}
let area = frame.area();
let chunks = ratatui::layout::Layout::default()
.direction(ratatui::layout::Direction::Vertical)
.constraints([
ratatui::layout::Constraint::Length(2), ratatui::layout::Constraint::Min(1), ratatui::layout::Constraint::Length(1), ])
.split(area);
header_bar::render(frame, app, chunks[0]);
sections::render(frame, app, chunks[1]);
bottom_bar::render(frame, app, chunks[2]);
if app.show_help {
help_overlay::render(frame, area);
}
}
fn render_too_small(frame: &mut Frame) {
use crate::ui::common::{COLOR_MUTED, COLOR_WARN};
use ratatui::layout::{Alignment, Constraint, Flex, Layout};
use ratatui::style::Style;
use ratatui::text::{Line, Span};
use ratatui::widgets::Paragraph;
let area = frame.area();
let [center_y] = Layout::vertical([Constraint::Length(3)])
.flex(Flex::Center)
.areas(area);
let [center] = Layout::horizontal([Constraint::Length(40)])
.flex(Flex::Center)
.areas(center_y);
let text = vec![
Line::from(Span::styled(
"Terminal too small",
Style::default().fg(COLOR_WARN),
)),
Line::from(""),
Line::from(Span::styled(
"Please resize to at least 80x24",
Style::default().fg(COLOR_MUTED),
)),
];
let paragraph = Paragraph::new(text).alignment(Alignment::Center);
frame.render_widget(paragraph, center);
}