pub mod nav_panel;
mod preview_panel;
mod status_bar;
mod terminal_panel;
mod theme;
use ratatui::backend::Backend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::Terminal;
use std::io;
use crate::app::state::AppState;
use crate::preview::provider::PreviewContent;
pub fn render<B: Backend>(terminal: &mut Terminal<B>, state: &mut AppState) -> io::Result<()> {
let drawing_image = matches!(state.preview.content, PreviewContent::Image(_));
if state.preview.drew_image && !drawing_image {
terminal.clear()?;
}
state.preview.drew_image = drawing_image;
terminal.draw(|frame| {
let outer = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Min(1), Constraint::Length(1), ])
.split(frame.area());
let (main, panel) = if state.terminal.is_visible() {
let rows = crate::terminal::panel_rows(
outer[0].height,
state.config.terminal.height,
state.terminal.is_maximized(),
);
let split = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Min(0), Constraint::Length(rows)])
.split(outer[0]);
(split[0], Some(split[1]))
} else {
(outer[0], None)
};
status_bar::draw(frame, outer[1], state);
if let Some(panel) = panel {
terminal_panel::draw(frame, panel, state);
}
if main.height == 0 {
return;
}
let inner = Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage(40), Constraint::Percentage(60), ])
.split(main);
let listed = state.filtered_count();
let nav_offset = crate::app::scroll::NavScroll::update(
&mut state.nav_scroll,
&state.cwd,
state.selected,
listed,
usize::from(inner[0].height.saturating_sub(2)),
state.config.navigation.scroll_margin,
);
nav_panel::draw(frame, inner[0], state, nav_offset);
preview_panel::draw(frame, inner[1], state);
})?;
Ok(())
}