use engine_renderer_api::{DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, RenderExtent, RenderWindow, WindowHandle};
use thiserror::Error;
use winit::{
dpi::PhysicalSize,
event_loop::ActiveEventLoop,
window::{Window as WinitWindow, WindowId},
};
#[derive(Debug, Error)]
pub enum WindowError {
#[error("event loop failed: {0}")]
EventLoop(#[from] winit::error::EventLoopError),
#[error("operating system call failed: {0}")]
Os(#[from] winit::error::OsError),
}
#[derive(Debug)]
pub(super) struct Window {
inner: WinitWindow,
}
impl Window {
pub(super) fn create(event_loop: &ActiveEventLoop, title: &str) -> Result<Self, WindowError> {
let attributes = WinitWindow::default_attributes().with_title(title);
let inner = event_loop.create_window(attributes)?;
Ok(Self { inner })
}
pub(super) fn id(&self) -> WindowId {
self.inner.id()
}
fn physical_size(&self) -> PhysicalSize<u32> {
self.inner.inner_size()
}
pub(super) fn request_redraw(&self) {
self.inner.request_redraw();
}
}
impl HasWindowHandle for Window {
fn window_handle(&self) -> Result<WindowHandle<'_>, HandleError> {
self.inner.window_handle()
}
}
impl HasDisplayHandle for Window {
fn display_handle(&self) -> Result<DisplayHandle<'_>, HandleError> {
self.inner.display_handle()
}
}
impl RenderWindow for Window {
fn size(&self) -> RenderExtent {
let size = self.physical_size();
RenderExtent::new(size.width, size.height)
}
}