23 lines
1.4 KiB
Rust
23 lines
1.4 KiB
Rust
use crate::theme::{ChromeMode, ResolvedTheme};
|
|
use ratatui::{Frame, layout::Rect, widgets::{Block, Borders, Paragraph}};
|
|
|
|
/// Draw a conventional outlined panel or a filled surface from the same call
|
|
/// site. Screens can migrate without embedding theme branches in layouts.
|
|
pub fn render_panel(frame: &mut Frame, area: Rect, title: &str, focused: bool, theme: &ResolvedTheme) -> Rect {
|
|
match theme.chrome {
|
|
ChromeMode::Bordered => {
|
|
let block = Block::default().title(title).borders(Borders::ALL).border_style(if focused { theme.borders.focused } else { theme.borders.normal });
|
|
let inner = block.inner(area);
|
|
frame.render_widget(block, area);
|
|
inner
|
|
}
|
|
ChromeMode::Surfaces => {
|
|
frame.render_widget(Block::default().style(if focused { theme.surfaces.panel_focused } else { theme.surfaces.panel }), area);
|
|
let header = Rect { x: area.x, y: area.y, width: area.width, height: area.height.min(1) };
|
|
frame.render_widget(Paragraph::new(format!(" {title}")).style(theme.surfaces.panel_alternate), header);
|
|
// Surface panels use a single header row. A one-cell inset keeps
|
|
// compact controls such as the console usable at height three.
|
|
Rect { x: area.x.saturating_add(1), y: area.y.saturating_add(1), width: area.width.saturating_sub(2), height: area.height.saturating_sub(1) }
|
|
}
|
|
}
|
|
}
|