use crate::EngineLayoutStyle;
use gpui_types::{AvailableSpace, Bounds, Pixels, Size};
use std::any::Any;
#[repr(transparent)]
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct LayoutId(pub u64);
pub struct MeasureHandles<'a> {
pub window: (&'a mut dyn Any, &'a mut dyn Any),
pub app: &'a mut dyn Any,
}
pub trait MeasureContext {
fn handles(&mut self) -> MeasureHandles<'_>;
}
pub type BoxedMeasureFn = Box<
dyn FnMut(Size<Option<Pixels>>, Size<AvailableSpace>, &mut dyn MeasureContext) -> Size<Pixels>,
>;
pub trait LayoutEngine {
fn clear(&mut self);
fn request_layout(
&mut self,
style: &EngineLayoutStyle,
rem_size: Pixels,
scale_factor: f32,
children: &[LayoutId],
) -> LayoutId;
fn request_measured_layout(
&mut self,
style: &EngineLayoutStyle,
rem_size: Pixels,
scale_factor: f32,
measure: BoxedMeasureFn,
) -> LayoutId;
fn stretch_auto_size_to_fill(&mut self, id: LayoutId, size: Size<Pixels>, scale_factor: f32);
fn compute_layout(
&mut self,
id: LayoutId,
available_space: Size<AvailableSpace>,
scale_factor: f32,
context: &mut dyn MeasureContext,
);
fn layout_bounds(&mut self, id: LayoutId, scale_factor: f32) -> Bounds<Pixels>;
}