use float_pigment_css::typing::GridAutoFlow;
use crate::{
algo::grid::{grid_item::GridItem, GridMatrix},
LayoutTreeNode,
};
pub(crate) fn place_grid_items<'a, T: LayoutTreeNode>(
grid_matrix: &mut GridMatrix<'a, T>,
children_iter: impl Iterator<Item = &'a T>,
) {
let explicit_row_count = grid_matrix.explicit_row_count();
let explicit_column_count = grid_matrix.explicit_column_count();
let flow = grid_matrix.flow();
let mut cur_row = 0;
let mut cur_column = 0;
let mut dense_hint = 0;
children_iter.for_each(|child| match flow {
GridAutoFlow::Row => {
if cur_column >= explicit_column_count.max(1) {
cur_column = 0;
cur_row += 1;
}
let grid_item = GridItem::new(child, cur_row, cur_column);
grid_matrix.place_item(cur_row, cur_column, grid_item);
cur_column += 1;
}
GridAutoFlow::RowDense => {
let (row, col) = grid_matrix.find_first_unoccupied(&mut dense_hint);
let grid_item = GridItem::new(child, row, col);
grid_matrix.place_item(row, col, grid_item);
}
GridAutoFlow::Column => {
if cur_row >= explicit_row_count.max(1) {
cur_row = 0;
cur_column += 1;
}
let grid_item = GridItem::new(child, cur_row, cur_column);
grid_matrix.place_item(cur_row, cur_column, grid_item);
cur_row += 1;
}
GridAutoFlow::ColumnDense => {
let (row, col) = grid_matrix.find_first_unoccupied(&mut dense_hint);
let grid_item = GridItem::new(child, row, col);
grid_matrix.place_item(row, col, grid_item);
}
});
}