use uzor::types::Rect;
use uzor_text::{FontSpec, ParagraphLayout};
use super::Region;
use crate::scene::{Block, BlockId, BlockNode};
#[derive(Clone)]
pub struct PlacedBlock<'a> {
pub id: BlockId,
pub rect: Rect,
pub kind: &'a Block<'a>,
pub paragraph_layout: Option<ParagraphLayout>,
pub table_placement: Option<TablePlacement<'a>>,
pub list_placement: Option<ListPlacement<'a>>,
}
impl<'a> PlacedBlock<'a> {
pub(crate) fn translate(&mut self, dx: f64, dy: f64) {
self.rect.x += dx;
self.rect.y += dy;
if let Some(table) = &mut self.table_placement {
for row in &mut table.rows {
row.rect.x += dx;
row.rect.y += dy;
for cell in &mut row.cells {
cell.rect.x += dx;
cell.rect.y += dy;
for inner in &mut cell.content {
inner.translate(dx, dy);
}
}
}
}
if let Some(list) = &mut self.list_placement {
for item in &mut list.items {
item.marker_rect.x += dx;
item.marker_rect.y += dy;
for inner in &mut item.content {
inner.translate(dx, dy);
}
}
}
}
}
#[derive(Clone)]
pub struct Frame<'a> {
pub region: Region,
pub blocks: Vec<PlacedBlock<'a>>,
pub overflow: Option<&'a BlockNode<'a>>,
}
#[derive(Clone)]
pub struct PlacedTableCell<'a> {
pub column_index: usize,
pub col_span: usize,
pub row_span: usize,
pub rect: Rect,
pub content: Vec<PlacedBlock<'a>>,
}
#[derive(Clone)]
pub struct PlacedTableRow<'a> {
pub rect: Rect,
pub cells: Vec<PlacedTableCell<'a>>,
pub spans_row: bool,
}
#[derive(Clone)]
pub struct TablePlacement<'a> {
pub column_widths: Vec<f64>,
pub rows: Vec<PlacedTableRow<'a>>,
}
#[derive(Clone)]
pub struct PlacedListItem<'a> {
pub marker_rect: Rect,
pub marker_text: String,
pub marker_font: FontSpec,
pub content: Vec<PlacedBlock<'a>>,
}
#[derive(Clone)]
pub struct ListPlacement<'a> {
pub items: Vec<PlacedListItem<'a>>,
}