mod bar_gauge;
mod gauge;
mod graph;
mod heatmap;
mod stat;
mod table;
use crate::app::{AppState, PanelState, PanelType};
use ratatui::{
prelude::*,
widgets::{Block, Borders, Paragraph, Wrap},
};
use bar_gauge::render_bar_gauge;
use gauge::render_gauge;
pub(crate) use graph::calculate_y_bounds;
use graph::render_graph_panel;
use heatmap::render_heatmap;
use stat::render_stat;
use table::render_table;
pub(crate) fn render_panel(
frame: &mut Frame,
area: Rect,
p: &PanelState,
app: &AppState,
is_selected: bool,
cursor_x: Option<f64>,
) {
let theme = &app.theme;
let border_style = if is_selected {
Style::default().fg(theme.border_selected)
} else {
Style::default().fg(theme.border)
};
if let Some(err) = &p.last_error {
let block = Block::default()
.borders(Borders::ALL)
.border_style(border_style)
.title(Span::styled(
format!("{} — ERROR", p.title),
Style::default().fg(theme.title),
));
let para = Paragraph::new(err.clone())
.block(block)
.wrap(Wrap { trim: true })
.style(Style::default().fg(theme.text));
frame.render_widget(para, area);
return;
}
let block = Block::default()
.borders(Borders::ALL)
.border_style(border_style)
.title(Span::styled(
p.title.clone(),
Style::default().fg(theme.title),
));
frame.render_widget(block.clone(), area);
let inner_area = block.inner(area);
match p.panel_type {
PanelType::Graph | PanelType::Unknown => {
render_graph_panel(frame, inner_area, p, app, cursor_x);
}
PanelType::Gauge => {
render_gauge(frame, inner_area, p, app);
}
PanelType::BarGauge => {
render_bar_gauge(frame, inner_area, p, app);
}
PanelType::Table => {
render_table(frame, inner_area, p, app);
}
PanelType::Stat => {
render_stat(frame, inner_area, p, app);
}
PanelType::Heatmap => {
render_heatmap(frame, inner_area, p, app);
}
}
}