use std::any::Any;
use crate::common_util::Counter;
use crate::dialog::{FileDialogOptions, FileInfo};
use crate::error::Error;
use crate::keyboard::{KeyEvent, KeyModifiers};
use crate::kurbo::{Point, Size, Vec2};
use crate::menu::Menu;
use crate::mouse::{Cursor, MouseEvent};
use crate::platform::window as platform;
pub type Text<'a> = <piet_common::Piet<'a> as piet_common::RenderContext>::Text;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Hash)]
pub struct TimerToken(u64);
impl TimerToken {
pub const INVALID: TimerToken = TimerToken(0);
pub fn next() -> TimerToken {
static TIMER_COUNTER: Counter = Counter::new();
TimerToken(TIMER_COUNTER.next())
}
pub const fn from_raw(id: u64) -> TimerToken {
TimerToken(id)
}
pub const fn into_raw(self) -> u64 {
self.0
}
}
#[derive(Clone)]
pub struct IdleHandle(platform::IdleHandle);
impl IdleHandle {
pub fn add_idle<F>(&self, callback: F)
where
F: FnOnce(&dyn Any) + Send + 'static,
{
self.0.add_idle_callback(callback)
}
pub fn schedule_idle(&mut self, token: IdleToken) {
self.0.add_idle_token(token)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Hash)]
pub struct IdleToken(usize);
impl IdleToken {
pub const fn new(raw: usize) -> IdleToken {
IdleToken(raw)
}
}
#[derive(Clone, Default)]
pub struct WindowHandle(platform::WindowHandle);
impl WindowHandle {
pub fn show(&self) {
self.0.show()
}
pub fn close(&self) {
self.0.close()
}
pub fn resizable(&self, resizable: bool) {
self.0.resizable(resizable)
}
pub fn show_titlebar(&self, show_titlebar: bool) {
self.0.show_titlebar(show_titlebar)
}
pub fn bring_to_front_and_focus(&self) {
self.0.bring_to_front_and_focus()
}
pub fn invalidate(&self) {
self.0.invalidate()
}
pub fn set_title(&self, title: &str) {
self.0.set_title(title)
}
pub fn set_menu(&self, menu: Menu) {
self.0.set_menu(menu.into_inner())
}
pub fn text(&self) -> Text {
self.0.text()
}
pub fn request_timer(&self, deadline: std::time::Instant) -> TimerToken {
self.0.request_timer(deadline)
}
pub fn set_cursor(&mut self, cursor: &Cursor) {
self.0.set_cursor(cursor)
}
pub fn open_file_sync(&mut self, options: FileDialogOptions) -> Option<FileInfo> {
self.0.open_file_sync(options)
}
pub fn save_as_sync(&mut self, options: FileDialogOptions) -> Option<FileInfo> {
self.0.save_as_sync(options)
}
pub fn show_context_menu(&self, menu: Menu, pos: Point) {
self.0.show_context_menu(menu.into_inner(), pos)
}
pub fn get_idle_handle(&self) -> Option<IdleHandle> {
self.0.get_idle_handle().map(IdleHandle)
}
pub fn get_dpi(&self) -> f32 {
self.0.get_dpi()
}
}
pub struct WindowBuilder(platform::WindowBuilder);
impl WindowBuilder {
pub fn new() -> WindowBuilder {
WindowBuilder(platform::WindowBuilder::new())
}
pub fn set_handler(&mut self, handler: Box<dyn WinHandler>) {
self.0.set_handler(handler)
}
pub fn set_size(&mut self, size: Size) {
self.0.set_size(size)
}
pub fn set_min_size(&mut self, size: Size) {
self.0.set_min_size(size)
}
pub fn resizable(&mut self, resizable: bool) {
self.0.resizable(resizable)
}
pub fn show_titlebar(&mut self, show_titlebar: bool) {
self.0.show_titlebar(show_titlebar)
}
pub fn set_title(&mut self, title: impl Into<String>) {
self.0.set_title(title)
}
pub fn set_menu(&mut self, menu: Menu) {
self.0.set_menu(menu.into_inner())
}
pub fn build(self) -> Result<WindowHandle, Error> {
self.0.build().map(WindowHandle).map_err(Into::into)
}
}
pub trait WinHandler {
fn connect(&mut self, handle: &WindowHandle);
#[allow(unused_variables)]
fn size(&mut self, width: u32, height: u32) {}
fn paint(&mut self, piet: &mut piet_common::Piet) -> bool;
#[allow(unused_variables)]
fn rebuild_resources(&mut self) {}
#[allow(unused_variables)]
fn command(&mut self, id: u32) {}
#[allow(unused_variables)]
fn key_down(&mut self, event: KeyEvent) -> bool {
false
}
#[allow(unused_variables)]
fn key_up(&mut self, event: KeyEvent) {}
#[allow(unused_variables)]
fn wheel(&mut self, delta: Vec2, mods: KeyModifiers) {}
#[allow(unused_variables)]
fn zoom(&mut self, delta: f64) {}
#[allow(unused_variables)]
fn mouse_move(&mut self, event: &MouseEvent) {}
#[allow(unused_variables)]
fn mouse_down(&mut self, event: &MouseEvent) {}
#[allow(unused_variables)]
fn mouse_up(&mut self, event: &MouseEvent) {}
#[allow(unused_variables)]
fn timer(&mut self, token: TimerToken) {}
#[allow(unused_variables)]
fn got_focus(&mut self) {}
#[allow(unused_variables)]
fn destroy(&mut self) {}
#[allow(unused_variables)]
fn idle(&mut self, token: IdleToken) {}
fn as_any(&mut self) -> &mut dyn Any;
}
impl From<platform::WindowHandle> for WindowHandle {
fn from(src: platform::WindowHandle) -> WindowHandle {
WindowHandle(src)
}
}