use std::any::Any;
use std::ops::{Deref, DerefMut};
use kas::draw::{Colour, DrawHandle, DrawShared, SizeHandle};
use kas::geom::Rect;
use kas::ThemeApi;
pub trait Theme<D: DrawShared>: ThemeApi {
type Window: Window<D::Draw> + 'static;
#[cfg(not(feature = "gat"))]
type DrawHandle: DrawHandle;
#[cfg(feature = "gat")]
type DrawHandle<'a>: DrawHandle;
fn init(&mut self, draw: &mut D);
fn new_window(&self, draw: &mut D::Draw, dpi_factor: f32) -> Self::Window;
fn update_window(&self, window: &mut Self::Window, dpi_factor: f32);
#[cfg(not(feature = "gat"))]
unsafe fn draw_handle(
&self,
draw: &mut D::Draw,
window: &mut Self::Window,
rect: Rect,
) -> Self::DrawHandle;
#[cfg(feature = "gat")]
fn draw_handle<'a>(
&'a self,
draw: &'a mut D::Draw,
window: &'a mut Self::Window,
rect: Rect,
) -> Self::DrawHandle<'a>;
fn clear_colour(&self) -> Colour;
}
pub trait Window<Draw> {
#[cfg(not(feature = "gat"))]
type SizeHandle: SizeHandle;
#[cfg(feature = "gat")]
type SizeHandle<'a>: SizeHandle;
#[cfg(not(feature = "gat"))]
unsafe fn size_handle(&mut self, draw: &mut Draw) -> Self::SizeHandle;
#[cfg(feature = "gat")]
fn size_handle<'a>(&'a mut self, draw: &'a mut Draw) -> Self::SizeHandle<'a>;
fn as_any_mut(&mut self) -> &mut dyn Any;
}
impl<T: Theme<D>, D: DrawShared> Theme<D> for Box<T> {
type Window = <T as Theme<D>>::Window;
#[cfg(not(feature = "gat"))]
type DrawHandle = <T as Theme<D>>::DrawHandle;
#[cfg(feature = "gat")]
type DrawHandle<'a> = <T as Theme<D>>::DrawHandle<'a>;
fn init(&mut self, draw: &mut D) {
self.deref_mut().init(draw);
}
fn new_window(&self, draw: &mut D::Draw, dpi_factor: f32) -> Self::Window {
self.deref().new_window(draw, dpi_factor)
}
fn update_window(&self, window: &mut Self::Window, dpi_factor: f32) {
self.deref().update_window(window, dpi_factor);
}
#[cfg(not(feature = "gat"))]
unsafe fn draw_handle(
&self,
draw: &mut D::Draw,
window: &mut Self::Window,
rect: Rect,
) -> Self::DrawHandle {
self.deref().draw_handle(draw, window, rect)
}
#[cfg(feature = "gat")]
fn draw_handle<'a>(
&'a self,
draw: &'a mut D::Draw,
window: &'a mut Self::Window,
rect: Rect,
) -> Self::DrawHandle<'a> {
self.deref().draw_handle(draw, window, rect)
}
fn clear_colour(&self) -> Colour {
self.deref().clear_colour()
}
}
impl<W: Window<Draw>, Draw> Window<Draw> for Box<W> {
#[cfg(not(feature = "gat"))]
type SizeHandle = <W as Window<Draw>>::SizeHandle;
#[cfg(feature = "gat")]
type SizeHandle<'a> = <W as Window<Draw>>::SizeHandle<'a>;
#[cfg(not(feature = "gat"))]
unsafe fn size_handle(&mut self, draw: &mut Draw) -> Self::SizeHandle {
self.deref_mut().size_handle(draw)
}
#[cfg(feature = "gat")]
fn size_handle<'a>(&'a mut self, draw: &'a mut Draw) -> Self::SizeHandle<'a> {
self.deref_mut().size_handle(draw)
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self.deref_mut().as_any_mut()
}
}