use crate::{ UiRegion, WidgetId, Widgets, primitive::{PrimitiveData, PrimitiveInstance, Primitives}, }; pub struct Painter<'a, Ctx> { nodes: &'a Widgets, ctx: &'a mut Ctx, primitives: Primitives, pub region: UiRegion, } impl<'a, Ctx> Painter<'a, Ctx> { pub fn new(nodes: &'a Widgets, ctx: &'a mut Ctx) -> Self { Self { nodes, ctx, primitives: Primitives::default(), region: UiRegion::full(), } } pub fn write(&mut self, data: Data) { let ptr = self.primitives.data.len() as u32; let region = self.region; self.primitives .instances .push(PrimitiveInstance { region, ptr }); self.primitives.data.push(Data::DISCRIM); self.primitives .data .extend_from_slice(bytemuck::cast_slice::<_, u32>(&[data])); } pub fn draw(&mut self, id: &WidgetId) where Ctx: 'static { self.nodes.get_dyn(id).draw(self); } pub fn draw_within(&mut self, node: &WidgetId, region: UiRegion) where Ctx: 'static { let old = self.region; self.region.select(®ion); self.draw(node); self.region = old; } pub fn finish(self) -> Primitives { self.primitives } pub fn ctx_mut(&mut self) -> &mut Ctx { self.ctx } }