mod gpu;
mod panes;
use std::sync::Arc;
use winit::application::ApplicationHandler;
use winit::event::WindowEvent;
use winit::event_loop::{ActiveEventLoop, EventLoop};
use winit::window::{Window, WindowId};
use gpu::Gpu;
#[derive(Default)]
struct App {
window: Option<Arc<Window>>,
gpu: Option<Gpu>,
}
impl ApplicationHandler for App {
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
if self.window.is_some() {
return;
}
let attributes = Window::default_attributes()
.with_title("decade")
.with_inner_size(winit::dpi::LogicalSize::new(1280, 800));
let window = Arc::new(event_loop.create_window(attributes).unwrap());
self.gpu = Some(Gpu::new(window.clone()));
self.window = Some(window);
}
fn window_event(&mut self, event_loop: &ActiveEventLoop, _: WindowId, event: WindowEvent) {
let (Some(window), Some(gpu)) = (&self.window, &mut self.gpu) else {
return;
};
match event {
WindowEvent::CloseRequested => event_loop.exit(),
WindowEvent::Resized(size) => {
gpu.resize(size.width, size.height);
window.request_redraw();
}
WindowEvent::RedrawRequested => {
let (width, height) = gpu.size();
gpu.render(&panes::layout(width, height));
}
_ => {}
}
}
}
fn main() {
let event_loop = EventLoop::new().unwrap();
event_loop.run_app(&mut App::default()).unwrap();
}