use ratatui::{
layout::{Constraint, Direction, Layout},
Frame,
};
use crate::app::{AppState, Screen, SnippetPopup, ViewState};
pub mod card;
pub mod dashboard;
pub mod detail_view;
pub mod file_manager;
pub mod host_list;
pub mod popup;
pub mod snippets;
pub mod status_bar;
pub mod terminal;
pub mod theme;
pub fn render(frame: &mut Frame, state: &AppState, view: &ViewState) {
let area = frame.area();
if area.width < 80 || area.height < 24 {
let msg = ratatui::widgets::Paragraph::new(
"Terminal too small — please resize to at least 80×24.",
)
.style(ratatui::style::Style::default().fg(ratatui::style::Color::Red));
frame.render_widget(msg, area);
return;
}
let layout = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Min(1), Constraint::Length(1)])
.split(area);
let content_area = layout[0];
let status_area = layout[1];
match state.screen {
Screen::Dashboard => dashboard::render(frame, content_area, state, view),
Screen::DetailView => detail_view::render(frame, content_area, state, view),
Screen::FileManager => file_manager::render(frame, content_area, state, view),
Screen::Snippets => snippets::render(frame, content_area, state, view),
Screen::Terminal => terminal::render(frame, content_area, state, view),
}
status_bar::render(frame, status_area, state, view);
if let Some(snip_popup) = &view.snippets_view.popup {
match snip_popup {
SnippetPopup::Results { entries, scroll } => {
popup::render_snippet_results(
frame,
entries,
*scroll,
view.tick_count,
&view.theme,
);
}
SnippetPopup::QuickExecuteInput {
host_name,
command_field,
} => {
popup::render_quick_execute_input(frame, host_name, command_field, &view.theme);
}
_ => {}
}
}
if view.show_help {
popup::render_help(frame, &view.theme);
}
}