use crate::ui::{ component::{Component, Event, EventCtx, Never}, display, geometry::Rect, }; pub struct Painter { area: Rect, func: F, } impl Painter { pub fn new(func: F) -> Self { Self { func, area: Rect::zero(), } } } impl Component for Painter where F: FnMut(Rect), { type Msg = Never; fn place(&mut self, bounds: Rect) -> Rect { self.area = bounds; self.area } fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option { None } fn paint(&mut self) { (self.func)(self.area); } fn bounds(&self, sink: &mut dyn FnMut(Rect)) { sink(self.area) } } #[cfg(feature = "ui_debug")] impl crate::trace::Trace for Painter { fn trace(&self, t: &mut dyn crate::trace::Tracer) { t.string("Painter") } } pub fn qrcode_painter(data: T, max_size: u32, case_sensitive: bool) -> Painter where T: AsRef, { // Ignore errors as we currently can't propagate them out of paint(). let f = move |area: Rect| { display::qrcode(area.center(), data.as_ref(), max_size, case_sensitive).unwrap_or(()) }; Painter::new(f) } pub fn image_painter(image: &'static [u8]) -> Painter { let f = move |area: Rect| display::image(area.center(), image); Painter::new(f) }