use ratatui::{
layout::{Constraint, Direction, Layout, Rect},
Frame,
};
use tuiserial_core::{AppState, MenuState};
mod areas;
mod config;
mod help;
mod log;
mod menu;
mod mouse;
mod notification;
mod shortcuts;
mod status;
mod tx;
mod utils;
pub use areas::{
get_clicked_field, get_clicked_menu, get_clicked_tab, get_ui_areas, is_inside,
is_shortcuts_hint_clicked, update_cursor_state, UiAreas,
};
pub use crossterm;
pub use mouse::{
calculate_dropdown_area, get_cursor_type, get_hover_style, handle_mouse_click,
handle_mouse_hover, handle_mouse_scroll, is_clickable_area, CursorType, MouseAction,
ScrollAction, ScrollDirection,
};
pub use ratatui;
pub use shortcuts::{draw_context_shortcuts, draw_shortcuts_help, draw_shortcuts_hint};
pub use menu::find_clicked_menu;
pub fn draw(f: &mut Frame, app: &AppState) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(1), Constraint::Min(15), Constraint::Length(3), Constraint::Length(1), ])
.split(f.area());
draw_main_content(f, app, chunks[1]);
notification::draw_notification_bar(f, app, chunks[2]);
shortcuts::draw_shortcuts_hint(f, chunks[3], app.language);
menu::draw_menu_bar(f, app, chunks[0]);
if let MenuState::Dropdown(menu_idx, item_idx) = app.menu_state {
menu::draw_menu_dropdown(f, app, chunks[0], menu_idx, item_idx);
}
if app.show_shortcuts_help {
shortcuts::draw_shortcuts_help(f, app.language);
}
areas::update_area(areas::UiAreaField::MenuBar, chunks[0]);
areas::update_area(areas::UiAreaField::NotificationArea, chunks[2]);
areas::update_area(areas::UiAreaField::ShortcutsHint, chunks[3]);
}
fn draw_main_content(f: &mut Frame, app: &AppState, area: Rect) {
let chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Length(42), Constraint::Min(50)])
.split(area);
draw_config_panel(f, app, chunks[0]);
draw_main_area(f, app, chunks[1]);
}
fn draw_config_panel(f: &mut Frame, app: &AppState, area: Rect) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(5), Constraint::Length(5), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Min(10), ])
.split(area);
config::draw_port_dropdown(f, app, chunks[0]);
config::draw_baud_rate_dropdown(f, app, chunks[1]);
config::draw_data_bits_dropdown(f, app, chunks[2]);
config::draw_parity_dropdown(f, app, chunks[3]);
config::draw_stop_bits_dropdown(f, app, chunks[4]);
config::draw_flow_control_dropdown(f, app, chunks[5]);
status::draw_status_panel(f, app, chunks[6]);
}
fn draw_main_area(f: &mut Frame, app: &AppState, area: Rect) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Min(10), Constraint::Length(7), Constraint::Length(3), ])
.split(area);
log::draw_log_area(f, app, chunks[0]);
tx::draw_tx_area(f, app, chunks[1]);
status::draw_control_area(f, app, chunks[2]);
}