67 lines
2.0 KiB
Rust
67 lines
2.0 KiB
Rust
use crate::prelude::*;
|
|
use iris_macro::widget_trait;
|
|
|
|
pub mod eventable {
|
|
use super::*;
|
|
|
|
widget_trait! {
|
|
pub trait Eventable;
|
|
fn on<E: EventAlias, Ctx: 'static>(
|
|
self,
|
|
event: E,
|
|
f: impl for<'a> EventIdFn<Ctx, <E::Event as Event>::Data<'a>, WL::Widget>,
|
|
) -> impl WidgetIdFn<WL::Widget> {
|
|
move |ui| {
|
|
let id = self.add(ui);
|
|
Events::<E::Event, Ctx>::register(id.weak(), event.into_event(), f);
|
|
id
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// TODO: naming in here is a bit weird like eventable
|
|
#[macro_export]
|
|
macro_rules! event_ctx {
|
|
($ty: ty) => {
|
|
mod local_event_trait {
|
|
use super::*;
|
|
#[allow(unused_imports)]
|
|
use $crate::prelude::*;
|
|
|
|
widget_trait! {
|
|
#[allow(unused)]
|
|
pub trait EventableCtx;
|
|
fn on<E: EventAlias>(
|
|
self,
|
|
event: E,
|
|
f: impl for<'a> EventIdFn<$ty, <E::Event as Event>::Data<'a>, WL::Widget>,
|
|
) -> impl WidgetIdFn<WL::Widget> {
|
|
eventable::Eventable::on(self, event, f)
|
|
}
|
|
}
|
|
use std::marker::Sized;
|
|
#[allow(unused)]
|
|
pub trait EventableCtxRef<W: Widget + ?Sized> {
|
|
fn on<E: EventAlias>(
|
|
self,
|
|
event: E,
|
|
f: impl for<'a> EventIdFn<$ty, <E::Event as Event>::Data<'a>, W>,
|
|
);
|
|
}
|
|
|
|
impl<W: Widget + ?Sized> EventableCtxRef<W> for WidgetRef<W> {
|
|
fn on<E: EventAlias>(
|
|
self,
|
|
event: E,
|
|
f: impl for<'a> EventIdFn<$ty, <E::Event as Event>::Data<'a>, W>,
|
|
) {
|
|
Events::<E::Event, $ty>::register(self, event.into_event(), f);
|
|
}
|
|
}
|
|
}
|
|
use local_event_trait::*;
|
|
};
|
|
}
|
|
pub use event_ctx;
|