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 + } +} diff --git a/readme.md b/readme.md index 5e2cbe9..9bd2147 100644 --- a/readme.md +++ b/readme.md @@ -4,12 +4,12 @@ My experimental attempt at a rust ui library (also my first ui library). It's currently designed around using retained data structures (widgets), rather than diffing generated trees from data like xilem or iced. This is an experiment and I'm not sure if it's a good idea or not. -There's a `main.rs` that runs a testing window, so you can just `cargo run` to see it working. +Examples are in `examples`, eg. `cargo run --example tabs`. Goals, in general order: 1. does what I want it to (text, images, video, animations) 2. very easy to use ignoring ergonomic ref counting -3. reasonably fast / efficient (a lot faster than electron, save battery life) +3. reasonably fast / efficient (a lot faster than electron, save battery life, try to beat iced and xilem) ## dev details diff --git a/src/event.rs b/src/event.rs index 03cd18a..f740f75 100644 --- a/src/event.rs +++ b/src/event.rs @@ -57,6 +57,13 @@ widget_trait! { pub trait HasTasks: Sized + HasState + HasEvents { fn tasks_mut(&mut self) -> &mut Tasks; + + fn spawn_task) + 'static + std::marker::Send>(&mut self, task: F) + where + F::CallOnceFuture: Send, + { + self.tasks_mut().spawn(task); + } } pub trait AsyncWidgetEventFn: