use std::{
any::Any,
rc::Rc,
};
use crate::{
geometry::Size2D,
node::Node,
prelude::{
Area,
Length,
},
torin::Torin,
tree_adapter::{
LayoutNode,
NodeKey,
},
};
pub struct PostMeasure<Key: NodeKey> {
pub content_size: Option<Size2D>,
pub offsets: Vec<(Key, Length, Length)>,
pub hidden_children: Vec<Key>,
}
impl<Key: NodeKey> Default for PostMeasure<Key> {
fn default() -> Self {
Self {
content_size: None,
offsets: Vec::new(),
hidden_children: Vec::new(),
}
}
}
pub trait LayoutMeasurer<Key: NodeKey> {
fn measure(
&mut self,
node_id: Key,
node: &Node,
size: &Size2D,
) -> Option<(Size2D, Rc<dyn Any>)>;
fn should_hook_measurement(&mut self, node_id: Key) -> bool;
fn should_measure_inner_children(&mut self, node_id: Key) -> bool;
fn should_post_measure(&mut self, _node_id: Key) -> bool {
false
}
fn post_measure(
&mut self,
_node_id: Key,
_node_layout: &LayoutNode,
_children: &[Key],
_layout: &Torin<Key>,
) -> PostMeasure<Key> {
PostMeasure::default()
}
fn notify_layout_references(
&mut self,
_node_id: Key,
_area: Area,
_visible_area: Area,
_inner_sizes: Size2D,
) {
}
}
pub struct NoopMeasurer;
impl LayoutMeasurer<usize> for NoopMeasurer {
fn measure(
&mut self,
_node_id: usize,
_node: &Node,
_size: &Size2D,
) -> Option<(Size2D, Rc<dyn Any>)> {
None
}
fn should_hook_measurement(&mut self, _node_id: usize) -> bool {
false
}
fn should_measure_inner_children(&mut self, _node_id: usize) -> bool {
false
}
}