1use crate::render::Rect;
2
3use super::Panel;
4
5pub fn compute_wrap_panels(
7 levels: &[String],
8 ncol: Option<usize>,
9 total_area: &Rect,
10 strip_height: f64,
11) -> Vec<Panel> {
12 let n = levels.len();
13 if n == 0 {
14 return vec![];
15 }
16
17 let ncol = ncol.unwrap_or_else(|| {
18 let sqrt = (n as f64).sqrt().ceil() as usize;
19 sqrt.max(1)
20 });
21 let nrow = n.div_ceil(ncol);
22
23 let panel_width = total_area.width / ncol as f64;
24 let panel_height = total_area.height / nrow as f64;
25
26 levels
27 .iter()
28 .enumerate()
29 .map(|(i, label)| {
30 let row = i / ncol;
31 let col = i % ncol;
32
33 Panel {
34 row,
35 col,
36 label: label.clone(),
37 row_label: None,
38 col_label: Some(label.clone()),
39 rect: Rect {
40 x: total_area.x + col as f64 * panel_width,
41 y: total_area.y + row as f64 * panel_height + strip_height,
42 width: panel_width,
43 height: panel_height - strip_height,
44 },
45 }
46 })
47 .collect()
48}