use winit::{ application::ApplicationHandler, event::WindowEvent, event_loop::{ActiveEventLoop, EventLoop, EventLoopProxy}, window::WindowId, }; pub trait UiState { type Event: 'static; fn new(event_loop: &ActiveEventLoop, proxy: EventLoopProxy) -> Self; fn window_event(&mut self, event: WindowEvent, event_loop: &ActiveEventLoop); fn event(&mut self, event: Self::Event, event_loop: &ActiveEventLoop); fn exit(&mut self); } pub struct UiApp { state: Option, proxy: EventLoopProxy, } impl UiApp { pub fn run() { let event_loop = EventLoop::with_user_event().build().unwrap(); let proxy = event_loop.create_proxy(); event_loop .run_app(&mut UiApp:: { state: None, proxy }) .unwrap(); } } impl ApplicationHandler for UiApp { fn resumed(&mut self, event_loop: &ActiveEventLoop) { if self.state.is_none() { let state = State::new(event_loop, self.proxy.clone()); self.state = Some(state); } } fn window_event(&mut self, event_loop: &ActiveEventLoop, _id: WindowId, event: WindowEvent) { let state = self.state.as_mut().unwrap(); state.window_event(event, event_loop); } fn user_event(&mut self, event_loop: &ActiveEventLoop, event: State::Event) { let state = self.state.as_mut().unwrap(); state.event(event, event_loop); } fn exiting(&mut self, _: &ActiveEventLoop) { let state = self.state.as_mut().unwrap(); state.exit(); } }