use crate::handler::WindowHandlerBuilder;
use crate::host::Host;
use crate::platform;
use crate::*;
use dpi::{LogicalSize, PhysicalSize, Pixel, Size};
use std::marker::PhantomData;
pub struct Window {
inner: platform::WindowHandle,
phantom: PhantomData<*mut ()>,
}
impl Window {
#[inline]
pub fn create<H: WindowHandler>(
options: WindowSettings,
handler: impl FnOnce(WindowContext) -> Result<H, HandlerError> + Send + 'static,
) -> Result<Window, Error> {
Self::create_with_host(options, handler, None)
}
pub fn create_with_host<H: WindowHandler>(
settings: WindowSettings,
handler: impl FnOnce(WindowContext) -> Result<H, HandlerError> + Send + 'static,
host: impl Into<Option<Host>>,
) -> Result<Window, Error> {
let initializer = WindowInitializer {
settings,
builder: WindowHandlerBuilder::new(handler),
host: host.into().unwrap_or_else(Host::default),
};
Ok(Self {
inner: platform::WindowHandle::create_window(initializer)?,
phantom: PhantomData,
})
}
#[inline]
pub fn run_until_closed(self) -> Result<(), Error> {
self.inner.run_until_closed()?;
Ok(())
}
#[inline]
pub fn size(&self) -> WindowSize {
self.inner.size()
}
#[inline]
pub fn resize(&self, size: impl Into<Size>) -> Result<(), Error> {
self.inner.resize(size.into())?;
Ok(())
}
#[inline]
pub fn suggest_fallback_scale_factor(&self, scale_factor: f64) -> Result<(), Error> {
self.inner.suggest_scale_factor(scale_factor)?;
Ok(())
}
#[inline]
pub fn close(self) {
drop(self)
}
#[inline]
pub fn is_open(&self) -> bool {
self.inner.is_open()
}
#[inline]
pub fn host_main_thread_callback(&mut self) {
self.inner.handle_main_thread_callback()
}
#[inline]
pub fn set_parent(&self, parent: impl Into<ParentWindowHandle>) -> Result<(), Error> {
self.inner.set_parent(parent.into().inner)?;
Ok(())
}
#[inline]
pub fn show(&self) -> Result<(), Error> {
self.inner.show()?;
Ok(())
}
#[inline]
pub fn hide(&self) -> Result<(), Error> {
self.inner.hide()?;
Ok(())
}
}
pub(crate) struct WindowInitializer {
pub settings: WindowSettings,
pub builder: WindowHandlerBuilder,
pub host: Host,
}
#[derive(Debug, Copy, Clone)]
pub struct WindowSize {
pub physical: PhysicalSize<u32>,
pub logical: LogicalSize<f64>,
pub scale_factor: f64,
}
impl WindowSize {
#[inline]
pub fn from_physical(physical: PhysicalSize<u32>, scale_factor: f64) -> Self {
Self { physical, logical: physical.to_logical(scale_factor), scale_factor }
}
#[inline]
pub fn from_logical(logical: LogicalSize<f64>, scale_factor: f64) -> Self {
Self { physical: logical.to_physical(scale_factor), logical, scale_factor }
}
}
impl<P: Pixel> From<WindowSize> for PhysicalSize<P> {
#[inline]
fn from(size: WindowSize) -> Self {
size.physical.cast()
}
}
impl<P: Pixel> From<WindowSize> for LogicalSize<P> {
#[inline]
fn from(size: WindowSize) -> Self {
size.logical.cast()
}
}