use crate::display::window::Window; use crate::vulkan::VkRenderContext; use winit::application::ApplicationHandler; use winit::event::WindowEvent; use winit::event_loop::ActiveEventLoop; use winit::window::WindowId; pub struct App { window: Window, render_context: Option, } impl App { pub fn new(window: Window) -> Self { Self { window, render_context: None, } } } impl ApplicationHandler for App { fn resumed(&mut self, event_loop: &ActiveEventLoop) { self.window.create_window(event_loop) .map_err(|err| format!("Failed to create window: {}", err)) .unwrap(); self.render_context = VkRenderContext::init(&self.window).ok(); } fn window_event(&mut self, event_loop: &ActiveEventLoop, id: WindowId, event: WindowEvent) { match event { WindowEvent::CloseRequested => { log::debug!("The close button was pressed; stopping"); event_loop.exit(); } WindowEvent::Resized(size) => { match self.render_context.as_mut() { Some(render_context) => { if let Err(error) = render_context.update_resolution(size.width, size.height) { log::error!("Failed to update resolution of render context : {}", error); } } None => log::warn!("Window resized but no render context found") }; } WindowEvent::RedrawRequested => { match self.render_context.as_mut() { Some(render_context) => { if let Err(error) = render_context.render() { log::error!("Failed to render with render context : {}", error); } } None => log::warn!("Window resized but no render context found") }; self.window.request_redraw(); } _ => {} } } }