use crate::{ UIRegion, WidgetId, Widgets, primitive::{PrimitiveData, PrimitiveInstance, Primitives}, }; pub struct Painter<'a> { nodes: &'a Widgets, primitives: Primitives, pub region: UIRegion, } impl<'a> Painter<'a> { pub fn new(nodes: &'a Widgets) -> Self { Self { nodes, 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, node: &WidgetId) { self.nodes.get(node).draw(self); } pub fn draw_within(&mut self, node: &WidgetId, region: UIRegion) { let old = self.region; self.region.select(®ion); self.draw(node); self.region = old; } pub fn finish(self) -> Primitives { self.primitives } }