From a592318a6f6034995bb70bcdd37d508bc98bfaff Mon Sep 17 00:00:00 2001 From: shadow cat Date: Tue, 20 Jan 2026 18:11:21 -0500 Subject: [PATCH 1/3] impl idlike for widgetview --- core/src/event/manager.rs | 19 ++++++++++--------- core/src/widget/view.rs | 10 +++++++++- 2 files changed, 19 insertions(+), 10 deletions(-) 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 + } +} From 17c436d9448d07ac7d1cc4ee29f8cf033327858b Mon Sep 17 00:00:00 2001 From: shadow cat Date: Thu, 22 Jan 2026 23:33:46 -0500 Subject: [PATCH 2/3] stuff --- src/event.rs | 7 +++++++ 1 file changed, 7 insertions(+) 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: From 7b54aaf3c48b0c6e7e558a9a6dbaa522eb5ea167 Mon Sep 17 00:00:00 2001 From: shadow cat Date: Thu, 29 Jan 2026 16:39:19 -0500 Subject: [PATCH 3/3] readme --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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