pub mod channels;
pub mod config;
pub mod footer;
pub mod header;
pub mod modal;
pub mod plotter;
pub mod serial;
pub mod sidebar;
pub mod theme;
pub mod utils;
pub mod widgets;
pub use utils::center_rect;
use crate::app::{ActiveTab, App};
use ratatui::{
Frame,
layout::{Constraint, Direction, Layout, Rect},
style::{Modifier, Style},
widgets::{Block, Borders, Tabs},
};
pub fn draw(f: &mut Frame, app: &mut App) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(3), Constraint::Min(10), Constraint::Length(1), ])
.split(f.size());
app.layout_zones.header = chunks[0];
header::draw(f, app, chunks[0]);
draw_main_area(f, app, chunks[1]);
footer::draw(f, app, chunks[2]);
if app.show_exit_menu {
let area = center_rect(48, 11, f.size());
app.layout_zones.exit_menu_modal = area;
modal::draw_exit_menu(f, app, area);
}
if app.is_entering_password {
let area = center_rect(45, 11, f.size());
app.layout_zones.password_modal = area;
modal::draw(f, app, area);
}
}
fn draw_main_area(f: &mut Frame, app: &mut App, area: Rect) {
if app.active_tab == ActiveTab::Flasher && app.show_sidebar {
let chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Percentage(70), Constraint::Percentage(30)])
.split(area);
draw_workspace(f, app, chunks[0]);
sidebar::draw(f, app, chunks[1]);
} else {
draw_workspace(f, app, area);
}
}
fn draw_workspace(f: &mut Frame, app: &mut App, area: Rect) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Length(3), Constraint::Min(5)])
.split(area);
let tab_titles = vec![
" [1] Serial ",
" [2] Plot ",
" [3] Dash ",
" [4] Flash ",
" [5] Settings ",
];
let active_index = match app.active_tab {
ActiveTab::Serial => 0,
ActiveTab::Plotter => 1,
ActiveTab::Widgets => 2,
ActiveTab::Flasher => 3,
ActiveTab::Configuration => 4,
};
let tabs = Tabs::new(tab_titles)
.block(
Block::default()
.borders(Borders::BOTTOM)
.border_style(Style::default().fg(theme::CATPPUCCIN_MOCHA.border)),
)
.select(active_index)
.style(Style::default().fg(theme::CATPPUCCIN_MOCHA.text_muted))
.highlight_style(
Style::default()
.fg(theme::CATPPUCCIN_MOCHA.accent)
.add_modifier(Modifier::BOLD),
);
f.render_widget(tabs, chunks[0]);
app.layout_zones.tabs = chunks[0];
match app.active_tab {
ActiveTab::Serial => serial::draw(f, app, chunks[1]),
ActiveTab::Plotter => plotter::draw(f, app, chunks[1]),
ActiveTab::Flasher => channels::draw(f, app, chunks[1]),
ActiveTab::Configuration => {
app.layout_zones.config_table = chunks[1];
config::draw(f, app, chunks[1]);
}
ActiveTab::Widgets => {
app.layout_zones.monitor_panel = chunks[1];
widgets::draw(f, app, chunks[1]);
}
}
}