use std::{any::Any, time::Duration};
use raw_window_handle::{DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, WindowHandle as RWHWindowHandle};
use crate::kurbo::{Point, Size};
use crate::prelude::*;
#[derive(Clone)]
pub struct WindowHandle(pub(crate) crate::platform::handle::WindowHandle);
impl HasWindowHandle for WindowHandle {
fn window_handle(&self) -> Result<RWHWindowHandle<'_>, HandleError> {
self.0.window_handle()
}
}
impl HasDisplayHandle for WindowHandle {
fn display_handle(&self) -> Result<DisplayHandle<'_>, HandleError> {
self.0.display_handle()
}
}
impl WindowHandle {
pub fn set_input_handler(&self, id: impl Into<Option<NodeId>>, handler: impl InputHandler + Send + Sync + 'static) {
self.0.set_input_handler(id.into(), Some(Box::new(handler)))
}
pub fn release_input_handler(&self) {
self.0.set_input_handler(None, None)
}
pub fn get_physical_size(&self) -> Size {
self.0.get_physical_size()
}
pub fn get_logical_size(&self) -> Size {
self.0.get_logical_size()
}
pub fn get_position(&self) -> Point {
self.0.get_position()
}
pub fn get_window_state(&self) -> WindowState {
self.0.get_window_state()
}
pub fn is_active(&self) -> bool {
self.0.is_active()
}
pub fn activate(&self) {
self.0.activate()
}
pub fn deactivate(&self) {
self.0.deactivate()
}
pub fn set_menu(&self, menu: impl Into<Option<MenuDesc>>) {
self.0.set_menu(menu)
}
pub fn show_context_menu(&self, id: Option<NodeId>, menu: MenuDesc, pos: Point) {
self.0.show_context_menu(id, menu, pos)
}
pub fn create_window<S: Any + Sync + 'static>(&self, desc: &WindowDesc<S>) {
self.0.create_window(desc)
}
pub fn request_close(&self) {
self.0.request_close()
}
pub fn request_exit(&self) {
self.0.request_exit()
}
pub fn set_max_size(&self, size: Option<impl Into<Size>>) {
self.0.set_max_size(size)
}
pub fn set_min_size(&self, size: Option<impl Into<Size>>) {
self.0.set_min_size(size)
}
pub fn set_position(&self, position: impl Into<Point>) {
self.0.set_position(position)
}
pub fn set_resizable(&self, resizable: bool) {
self.0.set_resizable(resizable)
}
pub fn set_size(&self, size: impl Into<Size>) {
self.0.set_size(size)
}
pub fn set_title(&self, title: impl Into<String>) {
self.0.set_title(title)
}
pub fn minimize(&self) {
self.0.minimize()
}
pub fn maximize(&self) {
self.0.maximize()
}
pub fn restore(&self) {
self.0.restore()
}
pub fn set_cursor(&self, cursor: CursorType) {
self.0.set_cursor(cursor)
}
pub fn hide_cursor(&self) {
self.0.hide_cursor()
}
pub fn unhide_cursor(&self) {
self.0.unhide_cursor()
}
pub fn set_clipboard_text(&self, text: &str) {
self.0.set_clipboard_text(text)
}
pub fn get_clipboard_text(&self) -> Option<String> {
self.0.get_clipboard_text()
}
pub fn open_url(&self, url: &str) {
self.0.open_url(url)
}
pub fn open_file_dialog(&self, id: Option<NodeId>, options: FileDialogOptions) {
self.0.open_file_dialog(id, options)
}
pub fn save_file_dialog(&self, id: Option<NodeId>, options: FileDialogOptions) {
self.0.save_file_dialog(id, options)
}
pub fn timer(&self, id: Option<NodeId>, delay: Duration) {
self.0.timer(id, delay)
}
pub fn alert(&self, title: &str, details: &str) {
self.0.alert::<CommandId>(None, None, title, details, &[])
}
pub fn alert_custom<C>(&self, node: Option<NodeId>, png_bytes: Option<&'static [u8]>, title: &str, details: &str, options: &[(&'static str, C)])
where
C: Into<CommandId> + Copy,
{
self.0.alert(node, png_bytes, title, details, options)
}
}
#[derive(Copy, Clone, Debug, Default)]
pub enum CursorType {
#[default]
Default,
ContextMenu,
Help,
Pointer,
Cell,
Crosshair,
Text,
VerticalText,
Alias,
Copy,
Move,
NotAllowed,
Grab,
Grabbing,
ColResize,
RowResize,
NResize,
EResize,
SResize,
WResize,
NEResize,
NWResize,
SEResize,
SWResize,
EWResize,
NSResize,
NESWResize,
NWSEResize,
ZoomIn,
ZoomOut,
}