mod decode_panel;
mod helpers;
mod popups;
mod stats_panel;
mod status_bar;
use ratatui::{
Frame,
layout::{Constraint, Direction, Layout},
style::{Color, Style},
widgets::{Block, Borders},
};
use crate::app::{App, InputMode};
use crate::decode::{LuaDecoderManager, WasmDecoderManager};
use crate::hex_view::HexView;
pub fn draw(
frame: &mut Frame,
app: &mut App,
lua_mgr: &mut LuaDecoderManager,
wasm_mgr: &mut WasmDecoderManager,
) {
let size = frame.area();
let outer = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Min(5), Constraint::Length(1)])
.split(size);
let body = outer[0];
let status_bar_area = outer[1];
let body_layout = Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage(100 - app.decode_panel_pct),
Constraint::Percentage(app.decode_panel_pct),
])
.split(body);
let hex_area = body_layout[0];
let right_area = body_layout[1];
let (decode_area, stats_area) = if app.show_stats_panel {
let split = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Percentage(60), Constraint::Percentage(40)])
.split(right_area);
(split[0], Some(split[1]))
} else {
(right_area, None)
};
app.hex_area = Some(hex_area);
app.decode_area = Some(decode_area);
app.stats_area = stats_area;
app.visible_rows = hex_area.height.saturating_sub(2) as usize;
decode_panel::draw_decode_panel(frame, app, lua_mgr, wasm_mgr, decode_area);
if let Some(stats_area) = stats_area {
stats_panel::draw_stats_panel(frame, app, stats_area);
}
let hex_block = Block::default()
.title(format!(" {} ", app.filename))
.borders(Borders::ALL)
.border_style(Style::default().fg(Color::DarkGray));
let hex_view = HexView::new(app).block(hex_block);
frame.render_widget(hex_view, hex_area);
status_bar::draw_status_bar(frame, app, status_bar_area);
match app.input_mode {
InputMode::Help => popups::draw_help_popup(frame, size),
InputMode::DecoderSettings | InputMode::ParamEdit => {
popups::draw_decoder_settings(frame, app, size)
}
_ => {}
}
}