diff --git a/examples/tabs/main.rs b/examples/tabs/main.rs index d9789f1..d888e1a 100644 --- a/examples/tabs/main.rs +++ b/examples/tabs/main.rs @@ -148,7 +148,7 @@ impl DefaultAppState for Client { .span(Dir::DOWN) .add(rsc); - let main = WidgetPtr::new().add(rsc); + let main = WidgetPtr::empty().add(rsc); let vals = Rc::new(RefCell::new((0, Vec::new()))); let mut switch_button = |color, to: WeakWidget, label| { diff --git a/src/default/event.rs b/src/default/event.rs index b33f09e..2ba4add 100644 --- a/src/default/event.rs +++ b/src/default/event.rs @@ -7,3 +7,7 @@ impl Event for Submit {} #[derive(Eq, PartialEq, Hash, Clone)] pub struct Edited; impl Event for Edited {} + +#[derive(Eq, PartialEq, Hash, Clone)] +pub struct Draw; +impl Event for Draw {} diff --git a/src/default/mod.rs b/src/default/mod.rs index ea00eb7..8d70485 100644 --- a/src/default/mod.rs +++ b/src/default/mod.rs @@ -101,9 +101,21 @@ pub struct DefaultRsc { pub events: EventManager, pub tasks: Tasks, pub state: WidgetState, + pub widget_events: Vec, _state: PhantomData, } +pub struct WidgetEvent { + id: WidgetId, + ty: WidgetEventType, +} + +pub enum WidgetEventType { + Draw, + Undraw, + Remove, +} + impl DefaultRsc { fn init(window: Arc) -> (Self, TaskMsgReceiver) { let (tasks, recv) = Tasks::init(window); @@ -112,6 +124,7 @@ impl DefaultRsc { ui: Default::default(), events: Default::default(), tasks, + widget_events: Default::default(), state: Default::default(), _state: Default::default(), }, @@ -135,15 +148,27 @@ impl UiRsc for DefaultRsc { fn on_draw(&mut self, active: &ActiveData) { self.events.draw(active); + self.widget_events.push(WidgetEvent { + id: active.id, + ty: WidgetEventType::Draw, + }); } fn on_undraw(&mut self, active: &ActiveData) { self.events.undraw(active); + self.widget_events.push(WidgetEvent { + id: active.id, + ty: WidgetEventType::Undraw, + }); } fn on_remove(&mut self, id: WidgetId) { self.events.remove(id); self.state.remove(id); + self.widget_events.push(WidgetEvent { + id, + ty: WidgetEventType::Remove, + }); } } @@ -297,6 +322,18 @@ impl AppState for DefaultApp { _ => (), } state.window_event(event, rsc, render); + + let mut events = std::mem::take(&mut rsc.widget_events); + for event in events.drain(..) { + match event.ty { + WidgetEventType::Draw => { + rsc.run_event::(event.id, (), state); + } + _ => (), + } + } + rsc.widget_events = events; + let ui_state = self.state.default_state_mut(); if render.needs_redraw(&ui_state.root, rsc.widgets()) { ui_state.renderer.window().request_redraw(); diff --git a/src/widget/ptr.rs b/src/widget/ptr.rs index 1e6241b..1667afc 100644 --- a/src/widget/ptr.rs +++ b/src/widget/ptr.rs @@ -30,8 +30,10 @@ impl Widget for WidgetPtr { } impl WidgetPtr { - pub fn new() -> Self { - Self::default() + pub fn new(widget: StrongWidget) -> Self { + Self { + inner: Some(widget), + } } pub fn empty() -> Self { Self {