use std::{any::Any, fmt, rc::Rc};
use smallvec::SmallVec;
use super::lazy_list_state::LazyListItemInfo;
pub type SmallNodeVec = SmallVec<[u64; 4]>;
pub type SmallOffsetVec = SmallVec<[f32; 4]>;
#[derive(Debug)]
pub struct LazyListMeasuredItem {
pub index: usize,
pub key: u64,
pub content_type: Option<u64>,
pub main_axis_size: f32,
pub cross_axis_size: f32,
pub offset: f32,
pub roots: Rc<LazyItemRoots>,
pub child_cross_offsets: SmallOffsetVec,
pub child_main_sizes: SmallOffsetVec,
}
#[derive(Clone, Default)]
pub struct LazyItemRoots {
pub node_ids: SmallNodeVec,
pub child_offsets: SmallOffsetVec,
pub child_cross_axis_sizes: SmallOffsetVec,
pub measurements: Option<Rc<dyn Any>>,
}
impl fmt::Debug for LazyItemRoots {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("LazyItemRoots")
.field("node_ids", &self.node_ids)
.field("child_offsets", &self.child_offsets)
.field("child_cross_axis_sizes", &self.child_cross_axis_sizes)
.field("measurements", &self.measurements.is_some())
.finish()
}
}
impl Clone for LazyListMeasuredItem {
fn clone(&self) -> Self {
Self {
index: self.index,
key: self.key,
content_type: self.content_type,
main_axis_size: self.main_axis_size,
cross_axis_size: self.cross_axis_size,
offset: self.offset,
roots: Rc::clone(&self.roots),
child_cross_offsets: copy_offsets(&self.child_cross_offsets),
child_main_sizes: copy_offsets(&self.child_main_sizes),
}
}
}
fn copy_offsets(offsets: &SmallOffsetVec) -> SmallOffsetVec {
if offsets.is_empty() {
SmallOffsetVec::new()
} else {
SmallVec::from_slice(offsets)
}
}
impl LazyListMeasuredItem {
pub fn new(
index: usize,
key: u64,
content_type: Option<u64>,
main_axis_size: f32,
cross_axis_size: f32,
roots: Rc<LazyItemRoots>,
) -> Self {
Self {
index,
key,
content_type,
main_axis_size,
cross_axis_size,
offset: 0.0,
roots,
child_cross_offsets: SmallVec::new(),
child_main_sizes: SmallVec::new(),
}
}
pub fn to_item_info(&self) -> LazyListItemInfo {
LazyListItemInfo {
index: self.index,
key: self.key,
offset: self.offset,
size: self.main_axis_size,
}
}
}
#[derive(Clone, Debug)]
pub struct LazyListMeasureResult {
pub visible_items: Vec<LazyListMeasuredItem>,
pub first_visible_item_index: usize,
pub first_visible_item_scroll_offset: f32,
pub viewport_size: f32,
pub total_content_size: f32,
pub can_scroll_forward: bool,
pub can_scroll_backward: bool,
}
impl Default for LazyListMeasureResult {
fn default() -> Self {
Self {
visible_items: Vec::new(),
first_visible_item_index: 0,
first_visible_item_scroll_offset: 0.0,
viewport_size: 0.0,
total_content_size: 0.0,
can_scroll_forward: false,
can_scroll_backward: false,
}
}
}