narui_core 0.1.2

unwrapped core crate of the narui gui framework
Documentation
use crate::{
    context::context::MaybeEvaluatedFragment::Evaluated,
    eval::layout::LayoutTree,
    geom::{Rect, Vec2},
    CallbackContext,
    Fragment,
};

#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum MeasureError {
    NoPreviousLayout,
}

pub trait ContextMeasure {
    fn measure_size(&self, idx: Fragment) -> Result<Vec2, MeasureError>;
    fn measure_offset(&self, idx1: Fragment, idx2: Fragment) -> Result<Vec2, MeasureError>;
    fn measure(&self, idx: Fragment) -> Result<Rect, MeasureError>;
}
impl ContextMeasure for CallbackContext<'_> {
    fn measure_size(&self, idx: Fragment) -> Result<Vec2, MeasureError> {
        let rect = get_layout(self, idx)?;
        Ok(rect.size)
    }

    fn measure_offset(&self, idx1: Fragment, idx2: Fragment) -> Result<Vec2, MeasureError> {
        let ro1 = get_layout(self, idx1)?;
        let ro2 = get_layout(self, idx2)?;
        Ok(ro2.pos - ro1.pos)
    }

    fn measure(&self, idx: Fragment) -> Result<Rect, MeasureError> { get_layout(self, idx) }
}

fn get_layout(context: &CallbackContext, idx: Fragment) -> Result<Rect, MeasureError> {
    let layout = context.layout;
    let frag = context.fragment_store.get(idx);
    match frag {
        Evaluated(frag) => Ok(layout.get_positioned(frag.layout_idx).0),
        _ => Err(MeasureError::NoPreviousLayout),
    }
}