#![allow(missing_docs)]
#[derive(Debug, Clone)]
pub struct WindowConfig {
pub title: String,
pub width: u32,
pub height: u32,
pub resizable: bool,
pub maximized: bool,
}
impl Default for WindowConfig {
fn default() -> Self {
Self {
title: "Iris App".to_string(),
width: 1280,
height: 720,
resizable: true,
maximized: false,
}
}
}
impl WindowConfig {
pub fn new(title: impl Into<String>, width: u32, height: u32) -> Self {
Self {
title: title.into(),
width,
height,
..Default::default()
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub fn create_window(
event_loop: &winit::event_loop::ActiveEventLoop,
config: WindowConfig,
) -> Result<winit::window::Window, Box<dyn std::error::Error>> {
use winit::dpi::LogicalSize;
let attributes = winit::window::Window::default_attributes()
.with_title(config.title)
.with_inner_size(LogicalSize::new(config.width, config.height))
.with_resizable(config.resizable)
.with_maximized(config.maximized);
let window = event_loop.create_window(attributes)?;
Ok(window)
}
#[cfg(target_arch = "wasm32")]
pub fn create_window(
_event_loop: &(),
config: WindowConfig,
) -> Result<String, Box<dyn std::error::Error>> {
use wasm_bindgen::JsCast;
let window = web_sys::window().ok_or("No browser window found")?;
let document = window.document().ok_or("No document found")?;
let canvas = document.create_element("canvas")
.map_err(|_| "Failed to create canvas element")?;
let canvas = canvas.dyn_into::<web_sys::HtmlCanvasElement>()
.map_err(|_| "Failed to cast to HtmlCanvasElement")?;
canvas.set_width(config.width);
canvas.set_height(config.height);
canvas.set_attribute("style", "display:block;width:100%;height:100%")
.ok();
let body = document.body().ok_or("No body element")?;
body.append_child(&canvas)
.map_err(|_| "Failed to append canvas")?;
document.set_title(&config.title);
let canvas_id = canvas.id();
Ok(canvas_id)
}