use crate::{
algo::grid::{GridFlow, GridMatrix},
DefLength, LayoutTrackListItem, LayoutTrackSize, LayoutTreeNode, OptionNum,
};
use core::fmt::Debug;
use float_pigment_css::{length_num::LengthNum, num_traits::Zero};
#[derive(Clone, PartialEq)]
pub(crate) enum TrackSize<T: LayoutTreeNode> {
Original(DefLength<T::Length, T::LengthCustom>),
Fr(f32),
Fixed(OptionNum<T::Length>),
}
impl<T: LayoutTreeNode> Debug for TrackSize<T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::Original(length) => write!(f, "Original({:?})", length),
Self::Fr(fr) => write!(f, "Fr({:?})", fr),
Self::Fixed(length) => write!(f, "Fixed({:?})", length),
}
}
}
pub(crate) fn apply_track_size<'a, T: LayoutTreeNode>(
track_list: &[&LayoutTrackListItem<T::Length, T::LengthCustom>],
flow: GridFlow,
grid_matrix: &mut GridMatrix<'a, T>,
parent_node: &'a T,
current_flow_parent_size: OptionNum<T::Length>,
available_grid_space: &mut OptionNum<T::Length>,
) {
let mut total_specified_track_size = T::Length::zero();
for track_item in track_list.iter() {
if let LayoutTrackListItem::TrackSize(LayoutTrackSize::Length(length)) = track_item {
let current_size = length
.resolve(current_flow_parent_size, parent_node)
.or_zero();
total_specified_track_size += current_size;
}
}
for item in grid_matrix.items_mut() {
let track_idx = match flow {
GridFlow::Row => item.row(),
GridFlow::Column => item.column(),
};
if track_idx < track_list.len() {
match track_list[track_idx] {
LayoutTrackListItem::TrackSize(LayoutTrackSize::Length(length)) => match flow {
GridFlow::Row => {
item.update_track_block_size(TrackSize::Original(length.clone()))
}
GridFlow::Column => {
item.update_track_inline_size(TrackSize::Original(length.clone()))
}
},
LayoutTrackListItem::TrackSize(LayoutTrackSize::Fr(fr_value)) => match flow {
GridFlow::Row => item.update_track_block_size(TrackSize::Fr(*fr_value)),
GridFlow::Column => item.update_track_inline_size(TrackSize::Fr(*fr_value)),
},
_ => {}
}
}
}
for item in grid_matrix.items_mut() {
let track_size_ref = match flow {
GridFlow::Row => &item.track_block_size,
GridFlow::Column => &item.track_inline_size,
};
let fixed_track_size = match track_size_ref {
TrackSize::Original(def_length) => {
match def_length {
DefLength::Auto => {
TrackSize::Fixed(OptionNum::none())
}
DefLength::Points(points) => TrackSize::Fixed(OptionNum::some(points.clone())),
DefLength::Percent(percent) => {
if let Some(available_width) = available_grid_space.val() {
TrackSize::Fixed(OptionNum::some(available_width.mul_f32(*percent)))
} else {
TrackSize::Fixed(OptionNum::none())
}
}
_ => TrackSize::Fixed(OptionNum::none()),
}
}
TrackSize::Fr(_) => {
TrackSize::Fixed(OptionNum::none())
}
TrackSize::Fixed(_) => {
continue;
}
};
match flow {
GridFlow::Row => item.update_track_block_size(fixed_track_size),
GridFlow::Column => item.update_track_inline_size(fixed_track_size),
}
}
}