From bb1655409781b3f832c9721a8ae4ff969bc216ab Mon Sep 17 00:00:00 2001 From: Chance Date: Wed, 16 Apr 2025 16:52:19 +0000 Subject: [PATCH] feat: add the ability to open and close new windows --- src/main.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 98f7ddc..1caac30 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,8 +10,10 @@ use wgpu::{ PipelineCompilationOptions, Surface, }; use winit::application::ApplicationHandler; -use winit::event_loop::EventLoop; +use winit::event::{ElementState, MouseButton}; +use winit::event_loop::{ActiveEventLoop, EventLoop}; use winit::window::{Window, WindowAttributes, WindowId}; +use zlog::LogLevel; use zlog::{config::LoggerConfig, query::LogQuery}; struct WindowContext<'window> { window: Arc, @@ -47,6 +49,21 @@ impl App<'_> { windows: BTreeMap::new(), } } + pub fn spawn_window(&mut self, event_loop: &ActiveEventLoop) { + let attr = WindowAttributes::default() + .with_title("Zenyx - SubWindow") + .with_min_inner_size(winit::dpi::LogicalSize::new(1, 1)); + + let window = event_loop.create_window(attr).unwrap(); + let window = Arc::new(window); + let renderer = self.state.create_renderer(window.clone()); + let window_ctx = WindowContext { + renderer: smol::block_on(renderer), + window: window.clone(), + }; + let window_id = window.id(); + self.windows.insert(window_id, window_ctx); + } } struct WgpuState { @@ -282,7 +299,19 @@ impl<'window> ApplicationHandler for App<'window> { surface_texture.present() } winit::event::WindowEvent::CloseRequested => { - event_loop.exit(); + let _ = self.windows.remove(&window_id); + if self.windows.is_empty() { + event_loop.exit(); + } + } + winit::event::WindowEvent::MouseInput { + device_id, + state, + button, + } => { + if button == MouseButton::Left && state == ElementState::Pressed { + self.spawn_window(event_loop); + } } winit::event::WindowEvent::Resized(size) => { if let Some(window_ctx) = self.windows.get(&window_id) { @@ -327,6 +356,7 @@ fn main() -> Result<(), terminator::Terminator> { .log_to_stdout(true) .file_include_time(true) .log_to_file(true) + .level(LogLevel::Info) .log_path("zenyx.log"); let _logger = zlog::Logger::new(config); let event_loop = EventLoop::new()?;