1use ratatui::{
19 layout::{Constraint, Direction, Layout, Rect},
20 Frame,
21};
22use tuiserial_core::{AppState, MenuState};
23
24mod areas;
26mod config;
27mod help;
28mod log;
29mod menu;
30mod mouse;
31mod notification;
32mod shortcuts;
33mod status;
34mod tx;
35mod utils;
36
37pub use areas::{
39 get_clicked_field, get_clicked_menu, get_clicked_tab, get_ui_areas, is_inside,
40 is_shortcuts_hint_clicked, update_cursor_state, UiAreas,
41};
42pub use crossterm;
43pub use mouse::{
44 calculate_dropdown_area, get_cursor_type, get_hover_style, handle_mouse_click,
45 handle_mouse_hover, handle_mouse_scroll, is_clickable_area, CursorType, MouseAction,
46 ScrollAction, ScrollDirection,
47};
48pub use ratatui;
49pub use shortcuts::{draw_context_shortcuts, draw_shortcuts_help, draw_shortcuts_hint};
50
51pub use menu::find_clicked_menu;
53
54pub fn draw(f: &mut Frame, app: &AppState) {
59 let chunks = Layout::default()
61 .direction(Direction::Vertical)
62 .constraints([
63 Constraint::Length(1), Constraint::Min(15), Constraint::Length(3), Constraint::Length(1), ])
68 .split(f.area());
69
70 draw_main_content(f, app, chunks[1]);
72
73 notification::draw_notification_bar(f, app, chunks[2]);
75
76 shortcuts::draw_shortcuts_hint(f, chunks[3], app.language);
78
79 menu::draw_menu_bar(f, app, chunks[0]);
81
82 if let MenuState::Dropdown(menu_idx, item_idx) = app.menu_state {
84 menu::draw_menu_dropdown(f, app, chunks[0], menu_idx, item_idx);
85 }
86
87 if app.show_shortcuts_help {
89 shortcuts::draw_shortcuts_help(f, app.language);
90 }
91
92 areas::update_area(areas::UiAreaField::MenuBar, chunks[0]);
94 areas::update_area(areas::UiAreaField::NotificationArea, chunks[2]);
95 areas::update_area(areas::UiAreaField::ShortcutsHint, chunks[3]);
96}
97
98fn draw_main_content(f: &mut Frame, app: &AppState, area: Rect) {
100 let chunks = Layout::default()
101 .direction(Direction::Horizontal)
102 .constraints([Constraint::Length(42), Constraint::Min(50)])
103 .split(area);
104
105 draw_config_panel(f, app, chunks[0]);
106 draw_main_area(f, app, chunks[1]);
107}
108
109fn draw_config_panel(f: &mut Frame, app: &AppState, area: Rect) {
111 let chunks = Layout::default()
112 .direction(Direction::Vertical)
113 .constraints([
114 Constraint::Length(5), Constraint::Length(5), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Min(10), ])
122 .split(area);
123
124 config::draw_port_dropdown(f, app, chunks[0]);
125 config::draw_baud_rate_dropdown(f, app, chunks[1]);
126 config::draw_data_bits_dropdown(f, app, chunks[2]);
127 config::draw_parity_dropdown(f, app, chunks[3]);
128 config::draw_stop_bits_dropdown(f, app, chunks[4]);
129 config::draw_flow_control_dropdown(f, app, chunks[5]);
130 status::draw_status_panel(f, app, chunks[6]);
131}
132
133fn draw_main_area(f: &mut Frame, app: &AppState, area: Rect) {
135 let chunks = Layout::default()
136 .direction(Direction::Vertical)
137 .constraints([
138 Constraint::Min(10), Constraint::Length(7), Constraint::Length(3), ])
142 .split(area);
143
144 log::draw_log_area(f, app, chunks[0]);
145 tx::draw_tx_area(f, app, chunks[1]);
146 status::draw_control_area(f, app, chunks[2]);
147}