use crate::{HasEvents, HasState, HasUi, Ui, Widget, WidgetRef}; use std::ops::{Deref, DerefMut}; pub struct EventCtx<'a, State, Data> { pub state: &'a mut State, pub data: &'a mut Data, } pub struct EventIdCtx<'a, State, Data, W: ?Sized> { pub widget: WidgetRef, pub state: &'a mut State, pub data: &'a mut Data, } impl Deref for EventIdCtx<'_, State, Data, W> { type Target = State; fn deref(&self) -> &Self::Target { self.state } } impl DerefMut for EventIdCtx<'_, State, Data, W> { fn deref_mut(&mut self) -> &mut Self::Target { self.state } } impl<'a, State: HasUi, Data, W: Widget> EventIdCtx<'a, State, Data, W> { pub fn widget(&mut self) -> &mut W { &mut self.state.get_mut()[self.widget] } } impl HasUi for EventIdCtx<'_, State, Data, W> { fn get(&self) -> &Ui { self.state.ui() } fn get_mut(&mut self) -> &mut Ui { self.state.ui_mut() } } impl HasState for EventIdCtx<'_, State, Data, W> { type State = State; } impl, Data, W: Widget> HasEvents for EventIdCtx<'_, State, Data, W> { fn get(&self) -> &super::EventManager { self.state.events() } fn get_mut(&mut self) -> &mut super::EventManager { self.state.events_mut() } }