use crate::tui::render::responsive;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
pub const CARD_COUNT: usize = 6;
pub const MIN_WIDTH: u16 = 40;
const SUMMARY_ROWS: u16 = 2;
const FOOTER_ROWS: u16 = 1;
const MIN_CARD_ROWS: u16 = 3;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct UsageLayout {
pub summary: Rect,
pub cards: [Rect; CARD_COUNT],
pub footer: Rect,
pub too_small: bool,
}
pub fn required_height(cols: usize) -> u16 {
let rows = CARD_COUNT.div_ceil(cols.max(1)) as u16;
SUMMARY_ROWS + rows * MIN_CARD_ROWS + FOOTER_ROWS
}
pub fn min_height(width: u16) -> u16 {
required_height(responsive::grid_cols(width))
}
pub fn fits(width: u16, height: u16) -> bool {
width >= MIN_WIDTH && height >= min_height(width)
}
pub fn compute(area: Rect) -> UsageLayout {
let empty = Rect::new(area.x, area.y, 0, 0);
if !fits(area.width, area.height) {
return UsageLayout {
summary: empty,
cards: [empty; CARD_COUNT],
footer: empty,
too_small: true,
};
}
let bands = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(SUMMARY_ROWS),
Constraint::Min(MIN_CARD_ROWS),
Constraint::Length(FOOTER_ROWS),
])
.split(area);
let grid = bands[1];
let cols = responsive::grid_cols(grid.width);
let rows = CARD_COUNT.div_ceil(cols);
let row_areas = Layout::default()
.direction(Direction::Vertical)
.constraints(vec![Constraint::Ratio(1, rows as u32); rows])
.split(grid);
let mut cards = [empty; CARD_COUNT];
for (i, slot) in cards.iter_mut().enumerate() {
let col_areas = Layout::default()
.direction(Direction::Horizontal)
.constraints(vec![Constraint::Ratio(1, cols as u32); cols])
.split(row_areas[i / cols]);
*slot = col_areas[i % cols];
}
UsageLayout {
summary: bands[0],
cards,
footer: bands[2],
too_small: false,
}
}