use std::marker::PhantomData; use crate::{Painter, Widget, WidgetFn, WidgetId, WidgetLike}; pub struct Sensor, Ctx> { inner: WidgetId, f: F, _pd: PhantomData, } impl, Ctx: 'static> Widget for Sensor { fn draw(&self, painter: &mut Painter) { (self.f)(painter.ctx_mut()); painter.draw(&self.inner); } } pub trait SenseFn = Fn(&mut Ctx) + 'static; pub trait Sensable { fn sense>(self, f: F) -> impl WidgetFn, Ctx>; } impl, Ctx: 'static, Tag> Sensable for W { fn sense>(self, f: F) -> impl WidgetFn, Ctx> { |ui| { let inner = self.add(ui).erase_type(); Sensor { inner, f, _pd: PhantomData, } } } }