use crate::terminal::TerminalState;
use ratatui::layout::{Constraint, Direction, Layout};
const CONSTRAINT_LENGTH: u8 = 0;
const CONSTRAINT_MIN: u8 = 1;
const CONSTRAINT_MAX: u8 = 2;
const CONSTRAINT_PERCENTAGE: u8 = 3;
#[allow(dead_code)]
const CONSTRAINT_FILL: u8 = 4;
pub fn do_split(
state: &mut TerminalState,
area_id: u32,
direction: u8,
constraint_types: &[u8],
constraint_values: &[u16],
out_ids: &mut [u32],
) -> u32 {
let parent_rect = match state.area_map.get(&area_id).copied() {
Some(r) => r,
None => return 0,
};
let dir = if direction == 0 {
Direction::Horizontal
} else {
Direction::Vertical
};
let count = constraint_types.len().min(constraint_values.len());
let constraints: Vec<Constraint> = constraint_types[..count]
.iter()
.zip(&constraint_values[..count])
.map(|(&t, &v)| constraint_from_bytes(t, v))
.collect();
let chunks = Layout::default()
.direction(dir)
.constraints(constraints)
.split(parent_rect);
let produced = chunks.len().min(out_ids.len());
for (i, &rect) in chunks.iter().enumerate().take(produced) {
let id = state.register_area(rect);
out_ids[i] = id;
}
produced as u32
}
pub(crate) fn constraint_from_bytes(t: u8, v: u16) -> Constraint {
match t {
CONSTRAINT_LENGTH => Constraint::Length(v),
CONSTRAINT_MIN => Constraint::Min(v),
CONSTRAINT_MAX => Constraint::Max(v),
CONSTRAINT_PERCENTAGE => Constraint::Percentage(v),
_ => Constraint::Fill(v),
}
}