use ratatui::{
Frame,
layout::{Alignment, Constraint, Layout, Rect},
style::{Modifier, Style},
text::{Line, Span},
widgets::{Block, Borders, Paragraph, Tabs},
};
use crate::app::App;
use super::{tab_cpu, tab_gpu, tab_memory, tab_overview, tab_soc};
pub(crate) fn draw(f: &mut Frame, app: &App, area: Rect) {
let chunks = Layout::default()
.constraints(
[
Constraint::Length(1),
Constraint::Length(3),
Constraint::Min(0),
]
.as_ref(),
)
.split(area);
let title_area = chunks[0];
let tabs_area = chunks[1];
let main_area = chunks[2];
let program_name = format!("Pumas v{}", env!("CARGO_PKG_VERSION"));
let app_paragraph = Paragraph::new(Span::from(program_name));
f.render_widget(app_paragraph, title_area);
let machine_desc = format!(
" {} (cores: {}E+{}P+{}GPU) ",
app.soc_info.cpu_brand_name,
app.soc_info.num_efficiency_cores,
app.soc_info.num_performance_cores,
app.soc_info.num_gpu_cores
);
let machine_desc_par = Paragraph::new(Span::styled(
machine_desc,
Style::default().fg(app.colors.accent()),
))
.alignment(Alignment::Right);
f.render_widget(machine_desc_par, title_area);
let tab_titles: Vec<_> = app
.tabs
.titles
.iter()
.map(|t| Line::from(Span::styled(*t, Style::default())))
.collect();
let tabs = Tabs::new(tab_titles)
.block(Block::default().borders(Borders::ALL))
.highlight_style(
Style::default()
.fg(app.colors.accent())
.add_modifier(Modifier::BOLD),
)
.select(app.tabs.index);
f.render_widget(tabs, tabs_area);
match app.tabs.index {
0 => tab_overview::draw_overview_tab(f, app, main_area),
1 => tab_cpu::draw_cpu_tab(f, app, main_area),
2 => tab_gpu::draw_gpu_tab(f, app, main_area),
3 => tab_memory::draw_memory_tab(f, app, main_area),
4 => tab_soc::draw_soc_tab(f, app, main_area),
_ => {}
};
}