diff --git a/core/src/event/manager.rs b/core/src/event/manager.rs index 1a315a6..840fcb8 100644 --- a/core/src/event/manager.rs +++ b/core/src/event/manager.rs @@ -1,6 +1,6 @@ use crate::{ ActiveData, Event, EventCtx, EventFn, EventIdCtx, EventLike, HasEvents, IdLike, LayerId, - WeakWidget, Widget, WidgetEventFn, WidgetId, + WeakWidget, WidgetEventFn, WidgetId, util::{HashMap, HashSet, TypeMap}, }; use std::{any::TypeId, rc::Rc}; @@ -24,15 +24,16 @@ impl EventManager { self.types.type_or_default() } - pub fn register( + pub fn register( &mut self, - id: WeakWidget, + id: I, event: E, - f: impl for<'a> WidgetEventFn::Data<'a>, W>, + f: impl for<'a> WidgetEventFn::Data<'a>, I::Widget>, ) { + let i = id.id(); self.get_type::().register(id, event, f); self.widget_to_types - .entry(id.id()) + .entry(i) .or_default() .insert(Self::type_key::()); } @@ -112,11 +113,11 @@ impl Default for TypeEventManager { } impl TypeEventManager { - fn register( + fn register( &mut self, - widget: WeakWidget, + widget: I, event: impl EventLike, - f: impl for<'a> WidgetEventFn, W>, + f: impl for<'a> WidgetEventFn, I::Widget>, ) { let event = event.into_event(); self.map.entry(widget.id()).or_default().push(( @@ -124,7 +125,7 @@ impl TypeEventManager { Rc::new(move |ctx, rsc| { f( EventIdCtx { - widget, + widget: WeakWidget::new(widget.id()), state: ctx.state, data: ctx.data, }, diff --git a/core/src/widget/view.rs b/core/src/widget/view.rs index 042f9b8..19c7eea 100644 --- a/core/src/widget/view.rs +++ b/core/src/widget/view.rs @@ -1,6 +1,6 @@ use std::marker::Unsize; -use crate::{Widget, WeakWidget}; +use crate::{IdLike, WeakWidget, Widget}; pub trait WidgetView { type Widget: Widget + ?Sized + Unsize; @@ -14,3 +14,11 @@ pub trait HasWidget { impl + ?Sized> HasWidget for WeakWidget { type Widget = W; } + +impl IdLike for WV { + type Widget = WV::Widget; + + fn id(&self) -> super::WidgetId { + self.root().id + } +}