use cranpose_ui_graphics::Point;
use crate::{
draw::RenderItem,
scene::{DrawShape, ImageDraw, ItemCounts, RasterScene, ShadowDraw, TextDraw},
};
#[derive(Clone, Copy)]
pub(crate) enum ItemRef<'a> {
Shape(&'a DrawShape),
Image(&'a ImageDraw),
Text(&'a TextDraw),
Shadow(&'a ShadowDraw),
}
pub(crate) trait SceneItem: Sized {
fn item(index: usize) -> RenderItem;
fn index_of(item: RenderItem) -> Option<usize>;
fn count(counts: &mut ItemCounts) -> &mut usize;
fn lists(scene: &mut RasterScene) -> (&mut Vec<Self>, &mut Vec<RenderItem>);
fn snap_to(&mut self, anchor: Point);
fn as_ref(&self) -> ItemRef<'_>;
}
macro_rules! scene_item {
($item:ident, $variant:ident, $list:ident) => {
impl SceneItem for $item {
fn item(index: usize) -> RenderItem {
RenderItem::$variant(index)
}
fn index_of(item: RenderItem) -> Option<usize> {
match item {
RenderItem::$variant(index) => Some(index),
_ => None,
}
}
fn count(counts: &mut ItemCounts) -> &mut usize {
&mut counts.$list
}
fn lists(scene: &mut RasterScene) -> (&mut Vec<Self>, &mut Vec<RenderItem>) {
(&mut scene.$list, &mut scene.order)
}
fn snap_to(&mut self, anchor: Point) {
self.snap_anchor = Some(anchor);
}
fn as_ref(&self) -> ItemRef<'_> {
ItemRef::$variant(self)
}
}
};
}
scene_item!(DrawShape, Shape, shapes);
scene_item!(ImageDraw, Image, images);
scene_item!(TextDraw, Text, texts);
scene_item!(ShadowDraw, Shadow, shadows);