From 76f75192d5d04d960f7f83cf887145aa242b79b6 Mon Sep 17 00:00:00 2001 From: shadow cat Date: Wed, 10 Dec 2025 13:29:36 -0500 Subject: [PATCH] fix event stuff --- core/src/layout/event.rs | 34 ++++++++++++++++++++++------------ src/widget/sense.rs | 15 ++++++++------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/core/src/layout/event.rs b/core/src/layout/event.rs index a060e5f..4a9939b 100644 --- a/core/src/layout/event.rs +++ b/core/src/layout/event.rs @@ -1,4 +1,4 @@ -use std::hash::Hash; +use std::{cell::RefCell, hash::Hash, rc::Rc}; use crate::{ layout::{Ui, UiModule, WidgetId, WidgetRef}, @@ -77,10 +77,14 @@ impl Event for E { pub trait EventModule: UiModule + Default { fn register(&mut self, id: WidgetId, event: E, f: impl EventFn); - fn run(&mut self, id: WidgetId, event: E) -> Option)>; + fn run<'a>( + &mut self, + id: WidgetId, + event: E, + ) -> Option) + use<'a, Self, Ctx, E>>; } -type EventFnMap = HashMap>>>; +type EventFnMap = HashMap>>>>; pub struct DefaultEventModule { map: HashMap::Data>>, } @@ -103,16 +107,21 @@ impl EventModule for DefaultEventModule< .or_default() .entry(id) .or_default() - .push(Box::new(f)); + .push(Rc::new(RefCell::new(f))); } - fn run(&mut self, id: WidgetId, event: E) -> Option)> { - if let Some(map) = self.map.get_mut(&event) - && let Some(fs) = map.get_mut(&id) + fn run<'a>( + &mut self, + id: WidgetId, + event: E, + ) -> Option) + use<'a, Ctx, E>> { + if let Some(map) = self.map.get(&event) + && let Some(fs) = map.get(&id) { + let fs = fs.clone(); Some(move |ctx: EventCtx::Data>| { for f in fs { - f(EventCtx { + f.borrow_mut()(EventCtx { ui: ctx.ui, state: ctx.state, data: ctx.data.clone(), @@ -130,10 +139,11 @@ impl DefaultEventModule { where E::Data: Clone, { - if let Some(map) = self.map.get_mut(&event) { - for fs in map.values_mut() { + if let Some(map) = self.map.get(&event) { + for fs in map.values() { + let fs = fs.clone(); for f in fs { - f(EventCtx { + f.borrow_mut()(EventCtx { ui: ctx.ui, state: ctx.state, data: ctx.data.clone(), @@ -168,7 +178,7 @@ impl Ui { { eprintln!("FIXME"); f(EventCtx { - ui: &mut Ui::new(), + ui: self, state: ctx, data, }); diff --git a/src/widget/sense.rs b/src/widget/sense.rs index 59ec132..27b3953 100644 --- a/src/widget/sense.rs +++ b/src/widget/sense.rs @@ -3,6 +3,7 @@ use crate::{ layout::{UiModule, UiRegion, Vec2}, util::HashMap, }; +use std::cell::RefCell; use std::{ ops::{BitOr, Deref, DerefMut}, rc::Rc, @@ -97,7 +98,7 @@ pub enum ActivationState { /// but I'm not sure how or if worth it pub struct Sensor { pub senses: CursorSenses, - pub f: Box>, + pub f: Rc>>, } pub type SensorMap = HashMap>; @@ -207,7 +208,7 @@ impl CursorModule { scroll_delta: cursor.scroll_delta, sense, }; - (sensor.f)(EventCtx { + (sensor.f.borrow_mut())(EventCtx { ui, state: ctx, data, @@ -308,15 +309,15 @@ impl::Data> + Into, Ctx: ' // TODO: does not add to active if currently active self.map.entry(id).or_default().sensors.push(Sensor { senses: senses.into(), - f: Box::new(f), + f: Rc::new(RefCell::new(f)), }); } - fn run( + fn run<'a>( &mut self, id: WidgetId, event: E, - ) -> Option::Data>)> { + ) -> Option::Data>) + use<'a, Ctx, E>> { let senses = event.into(); if let Some(group) = self.map.get_mut(&id) { let fs: Vec<_> = group @@ -324,7 +325,7 @@ impl::Data> + Into, Ctx: ' .iter_mut() .filter_map(|sensor| { if sensor.senses.iter().any(|s| senses.contains(s)) { - Some(&mut sensor.f) + Some(sensor.f.clone()) } else { None } @@ -332,7 +333,7 @@ impl::Data> + Into, Ctx: ' .collect(); Some(move |ctx: EventCtx| { for f in fs { - f(EventCtx { + f.borrow_mut()(EventCtx { state: ctx.state, ui: ctx.ui, data: ctx.data.clone(),