60 lines
1.9 KiB
Rust
60 lines
1.9 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),
|
|
}
|
|
}
|
|
}
|
|
}
|