use std::collections::{BTreeMap, BTreeSet};
use zenith_core::{ResolvedToken, TableRow};
use super::super::util::resolve_geometry_px;
pub(in crate::compile) struct PlacedCell<'a> {
pub(super) row: usize,
pub(super) col: usize,
pub(super) cs: usize,
pub(super) rs: usize,
pub(super) cell: &'a zenith_core::TableCell,
}
pub(in crate::compile) fn place_cells(
rows: &[TableRow],
col_count: usize,
row_count: usize,
) -> Vec<PlacedCell<'_>> {
let mut placed: Vec<PlacedCell> = Vec::new();
let mut occupied: BTreeSet<(usize, usize)> = BTreeSet::new();
for (r, row) in rows.iter().enumerate() {
let mut col_cursor = 0usize;
for cell in &row.cells {
while col_cursor < col_count && occupied.contains(&(r, col_cursor)) {
col_cursor += 1;
}
if col_cursor >= col_count {
break;
}
let cs = (cell.colspan.max(1) as usize).min(col_count - col_cursor);
let rs = (cell.rowspan.max(1) as usize).min(row_count - r);
for dr in 0..rs {
for dc in 0..cs {
occupied.insert((r + dr, col_cursor + dc));
}
}
placed.push(PlacedCell {
row: r,
col: col_cursor,
cs,
rs,
cell,
});
col_cursor += cs;
}
}
placed
}
pub(super) struct CellRect {
pub(super) x: f64,
pub(super) y: f64,
pub(super) w: f64,
pub(super) h: f64,
}
pub(super) fn child_declared_box(
node: &zenith_core::Node,
resolved: &BTreeMap<String, ResolvedToken>,
) -> (Option<f64>, Option<f64>) {
use zenith_core::Node;
let px = |d: &Option<zenith_core::PropertyValue>| resolve_geometry_px(d.as_ref(), resolved);
match node {
Node::Rect(n) => (px(&n.w), px(&n.h)),
Node::Ellipse(n) => (px(&n.w), px(&n.h)),
Node::Text(n) => (px(&n.w), px(&n.h)),
Node::Code(n) => (px(&n.w), px(&n.h)),
Node::Image(n) => (px(&n.w), px(&n.h)),
Node::Frame(n) => (px(&n.w), px(&n.h)),
Node::Group(n) => (px(&n.w), px(&n.h)),
Node::Field(n) => (px(&n.w), px(&n.h)),
Node::Toc(n) => (px(&n.w), px(&n.h)),
Node::Table(n) => (px(&n.w), px(&n.h)),
Node::Shape(n) => (px(&n.w), px(&n.h)),
Node::Line(_)
| Node::Polygon(_)
| Node::Polyline(_)
| Node::Instance(_)
| Node::Footnote(_)
| Node::Connector(_)
| Node::Pattern(_)
| Node::Chart(_)
| Node::Unknown(_) => (None, None),
}
}
pub(super) fn child_declared_y(
node: &zenith_core::Node,
resolved: &BTreeMap<String, ResolvedToken>,
) -> Option<f64> {
use zenith_core::Node;
let px = |d: &Option<zenith_core::PropertyValue>| resolve_geometry_px(d.as_ref(), resolved);
match node {
Node::Rect(n) => px(&n.y),
Node::Ellipse(n) => px(&n.y),
Node::Text(n) => px(&n.y),
Node::Code(n) => px(&n.y),
Node::Image(n) => px(&n.y),
Node::Frame(n) => px(&n.y),
Node::Group(n) => px(&n.y),
Node::Field(n) => px(&n.y),
Node::Toc(n) => px(&n.y),
Node::Table(n) => px(&n.y),
Node::Shape(n) => px(&n.y),
Node::Line(_)
| Node::Polygon(_)
| Node::Polyline(_)
| Node::Instance(_)
| Node::Footnote(_)
| Node::Connector(_)
| Node::Pattern(_)
| Node::Chart(_)
| Node::Unknown(_) => None,
}
}