fix event stuff
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
use std::hash::Hash;
|
use std::{cell::RefCell, hash::Hash, rc::Rc};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
layout::{Ui, UiModule, WidgetId, WidgetRef},
|
layout::{Ui, UiModule, WidgetId, WidgetRef},
|
||||||
@@ -77,10 +77,14 @@ impl<E: DefaultEvent> Event for E {
|
|||||||
|
|
||||||
pub trait EventModule<E: Event, Ctx>: UiModule + Default {
|
pub trait EventModule<E: Event, Ctx>: UiModule + Default {
|
||||||
fn register(&mut self, id: WidgetId, event: E, f: impl EventFn<Ctx, E::Data>);
|
fn register(&mut self, id: WidgetId, event: E, f: impl EventFn<Ctx, E::Data>);
|
||||||
fn run(&mut self, id: WidgetId, event: E) -> Option<impl FnOnce(EventCtx<Ctx, E::Data>)>;
|
fn run<'a>(
|
||||||
|
&mut self,
|
||||||
|
id: WidgetId,
|
||||||
|
event: E,
|
||||||
|
) -> Option<impl FnOnce(EventCtx<Ctx, E::Data>) + use<'a, Self, Ctx, E>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
type EventFnMap<Ctx, Data> = HashMap<WidgetId, Vec<Box<dyn EventFn<Ctx, Data>>>>;
|
type EventFnMap<Ctx, Data> = HashMap<WidgetId, Vec<Rc<RefCell<dyn EventFn<Ctx, Data>>>>>;
|
||||||
pub struct DefaultEventModule<E: Event, Ctx> {
|
pub struct DefaultEventModule<E: Event, Ctx> {
|
||||||
map: HashMap<E, EventFnMap<Ctx, <E as Event>::Data>>,
|
map: HashMap<E, EventFnMap<Ctx, <E as Event>::Data>>,
|
||||||
}
|
}
|
||||||
@@ -103,16 +107,21 @@ impl<E: HashableEvent, Ctx: 'static> EventModule<E, Ctx> for DefaultEventModule<
|
|||||||
.or_default()
|
.or_default()
|
||||||
.entry(id)
|
.entry(id)
|
||||||
.or_default()
|
.or_default()
|
||||||
.push(Box::new(f));
|
.push(Rc::new(RefCell::new(f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(&mut self, id: WidgetId, event: E) -> Option<impl FnOnce(EventCtx<Ctx, E::Data>)> {
|
fn run<'a>(
|
||||||
if let Some(map) = self.map.get_mut(&event)
|
&mut self,
|
||||||
&& let Some(fs) = map.get_mut(&id)
|
id: WidgetId,
|
||||||
|
event: E,
|
||||||
|
) -> Option<impl FnOnce(EventCtx<Ctx, E::Data>) + 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<Ctx, <E as Event>::Data>| {
|
Some(move |ctx: EventCtx<Ctx, <E as Event>::Data>| {
|
||||||
for f in fs {
|
for f in fs {
|
||||||
f(EventCtx {
|
f.borrow_mut()(EventCtx {
|
||||||
ui: ctx.ui,
|
ui: ctx.ui,
|
||||||
state: ctx.state,
|
state: ctx.state,
|
||||||
data: ctx.data.clone(),
|
data: ctx.data.clone(),
|
||||||
@@ -130,10 +139,11 @@ impl<E: HashableEvent, Ctx: 'static> DefaultEventModule<E, Ctx> {
|
|||||||
where
|
where
|
||||||
E::Data: Clone,
|
E::Data: Clone,
|
||||||
{
|
{
|
||||||
if let Some(map) = self.map.get_mut(&event) {
|
if let Some(map) = self.map.get(&event) {
|
||||||
for fs in map.values_mut() {
|
for fs in map.values() {
|
||||||
|
let fs = fs.clone();
|
||||||
for f in fs {
|
for f in fs {
|
||||||
f(EventCtx {
|
f.borrow_mut()(EventCtx {
|
||||||
ui: ctx.ui,
|
ui: ctx.ui,
|
||||||
state: ctx.state,
|
state: ctx.state,
|
||||||
data: ctx.data.clone(),
|
data: ctx.data.clone(),
|
||||||
@@ -168,7 +178,7 @@ impl Ui {
|
|||||||
{
|
{
|
||||||
eprintln!("FIXME");
|
eprintln!("FIXME");
|
||||||
f(EventCtx {
|
f(EventCtx {
|
||||||
ui: &mut Ui::new(),
|
ui: self,
|
||||||
state: ctx,
|
state: ctx,
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use crate::{
|
|||||||
layout::{UiModule, UiRegion, Vec2},
|
layout::{UiModule, UiRegion, Vec2},
|
||||||
util::HashMap,
|
util::HashMap,
|
||||||
};
|
};
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::{
|
use std::{
|
||||||
ops::{BitOr, Deref, DerefMut},
|
ops::{BitOr, Deref, DerefMut},
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
@@ -97,7 +98,7 @@ pub enum ActivationState {
|
|||||||
/// but I'm not sure how or if worth it
|
/// but I'm not sure how or if worth it
|
||||||
pub struct Sensor<Ctx, Data> {
|
pub struct Sensor<Ctx, Data> {
|
||||||
pub senses: CursorSenses,
|
pub senses: CursorSenses,
|
||||||
pub f: Box<dyn EventFn<Ctx, Data>>,
|
pub f: Rc<RefCell<dyn EventFn<Ctx, Data>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type SensorMap<Ctx, Data> = HashMap<WidgetId, SensorGroup<Ctx, Data>>;
|
pub type SensorMap<Ctx, Data> = HashMap<WidgetId, SensorGroup<Ctx, Data>>;
|
||||||
@@ -207,7 +208,7 @@ impl<Ctx: 'static> CursorModule<Ctx> {
|
|||||||
scroll_delta: cursor.scroll_delta,
|
scroll_delta: cursor.scroll_delta,
|
||||||
sense,
|
sense,
|
||||||
};
|
};
|
||||||
(sensor.f)(EventCtx {
|
(sensor.f.borrow_mut())(EventCtx {
|
||||||
ui,
|
ui,
|
||||||
state: ctx,
|
state: ctx,
|
||||||
data,
|
data,
|
||||||
@@ -308,15 +309,15 @@ impl<E: Event<Data = <CursorSenses as Event>::Data> + Into<CursorSenses>, Ctx: '
|
|||||||
// TODO: does not add to active if currently active
|
// TODO: does not add to active if currently active
|
||||||
self.map.entry(id).or_default().sensors.push(Sensor {
|
self.map.entry(id).or_default().sensors.push(Sensor {
|
||||||
senses: senses.into(),
|
senses: senses.into(),
|
||||||
f: Box::new(f),
|
f: Rc::new(RefCell::new(f)),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(
|
fn run<'a>(
|
||||||
&mut self,
|
&mut self,
|
||||||
id: WidgetId,
|
id: WidgetId,
|
||||||
event: E,
|
event: E,
|
||||||
) -> Option<impl FnOnce(EventCtx<Ctx, <E as Event>::Data>)> {
|
) -> Option<impl FnOnce(EventCtx<Ctx, <E as Event>::Data>) + use<'a, Ctx, E>> {
|
||||||
let senses = event.into();
|
let senses = event.into();
|
||||||
if let Some(group) = self.map.get_mut(&id) {
|
if let Some(group) = self.map.get_mut(&id) {
|
||||||
let fs: Vec<_> = group
|
let fs: Vec<_> = group
|
||||||
@@ -324,7 +325,7 @@ impl<E: Event<Data = <CursorSenses as Event>::Data> + Into<CursorSenses>, Ctx: '
|
|||||||
.iter_mut()
|
.iter_mut()
|
||||||
.filter_map(|sensor| {
|
.filter_map(|sensor| {
|
||||||
if sensor.senses.iter().any(|s| senses.contains(s)) {
|
if sensor.senses.iter().any(|s| senses.contains(s)) {
|
||||||
Some(&mut sensor.f)
|
Some(sensor.f.clone())
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@@ -332,7 +333,7 @@ impl<E: Event<Data = <CursorSenses as Event>::Data> + Into<CursorSenses>, Ctx: '
|
|||||||
.collect();
|
.collect();
|
||||||
Some(move |ctx: EventCtx<Ctx, CursorData>| {
|
Some(move |ctx: EventCtx<Ctx, CursorData>| {
|
||||||
for f in fs {
|
for f in fs {
|
||||||
f(EventCtx {
|
f.borrow_mut()(EventCtx {
|
||||||
state: ctx.state,
|
state: ctx.state,
|
||||||
ui: ctx.ui,
|
ui: ctx.ui,
|
||||||
data: ctx.data.clone(),
|
data: ctx.data.clone(),
|
||||||
|
|||||||
Reference in New Issue
Block a user