use crate::{ Event, EventCtx, EventLike, EventManager, IdLike, UiRsc, WeakWidget, Widget, WidgetEventFn, }; pub trait HasState: 'static { type State; } pub trait HasEvents: Sized + UiRsc + HasState { fn events(&self) -> &EventManager; fn events_mut(&mut self) -> &mut EventManager; fn register_event( &mut self, id: WeakWidget, event: E, f: impl for<'a> WidgetEventFn::Data<'a>, W>, ) { self.events_mut().register(id, event, f); } } pub trait RunEvents: HasEvents { fn run_event( &mut self, id: impl IdLike, data: ::Data<'_>, state: &mut Self::State, ) { let f = self.events_mut().get_type::().run_fn(id); f(EventCtx { state, data }, self) } } impl RunEvents for T {}