35 lines
925 B
Rust
35 lines
925 B
Rust
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<Self>;
|
|
fn events_mut(&mut self) -> &mut EventManager<Self>;
|
|
|
|
fn register_event<W: Widget + ?Sized, E: EventLike>(
|
|
&mut self,
|
|
id: WeakWidget<W>,
|
|
event: E,
|
|
f: impl for<'a> WidgetEventFn<Self, <E::Event as Event>::Data<'a>, W>,
|
|
) {
|
|
self.events_mut().register(id, event, f);
|
|
}
|
|
}
|
|
|
|
pub trait RunEvents: HasEvents {
|
|
fn run_event<E: EventLike>(
|
|
&mut self,
|
|
id: impl IdLike,
|
|
data: <E::Event as Event>::Data<'_>,
|
|
state: &mut Self::State,
|
|
) {
|
|
let f = self.events_mut().get_type::<E>().run_fn(id);
|
|
f(EventCtx { state, data }, self)
|
|
}
|
|
}
|
|
impl<T: HasEvents> RunEvents for T {}
|