use std::any::Any;
use std::ops::Deref;
use std::path::PathBuf;
use crate::clipboard::ClipboardItem;
use crate::dialog::FileDialogOptions;
pub use crate::keyboard::{KeyEvent, KeyModifiers};
use crate::kurbo::{Point, Vec2};
use crate::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(usize);
impl TimerToken {
pub const INVALID: TimerToken = TimerToken(0);
pub(crate) const fn new(id: usize) -> TimerToken {
TimerToken(id)
}
#[cfg(target_os = "windows")]
pub(crate) const fn get_raw(self) -> usize {
self.0
}
}
#[derive(Clone, Default)]
pub struct WindowHandle {
pub inner: platform::WindowHandle,
}
impl Deref for WindowHandle {
type Target = platform::WindowHandle;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
pub trait WinCtx<'a> {
fn invalidate(&mut self);
fn text_factory(&mut self) -> &mut Text<'a>;
fn set_cursor(&mut self, cursor: &Cursor);
fn request_timer(&mut self, deadline: std::time::Instant) -> TimerToken;
fn open_file_sync(&mut self, options: FileDialogOptions) -> Option<FileInfo>;
fn set_clipboard_contents(&mut self, contents: ClipboardItem);
}
pub trait WinHandler {
fn connect(&mut self, handle: &WindowHandle);
#[allow(unused_variables)]
fn size(&mut self, width: u32, height: u32, ctx: &mut dyn WinCtx) {}
fn paint(&mut self, piet: &mut piet_common::Piet, ctx: &mut dyn WinCtx) -> bool;
#[allow(unused_variables)]
fn rebuild_resources(&mut self, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn command(&mut self, id: u32, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn key_down(&mut self, event: KeyEvent, ctx: &mut dyn WinCtx) -> bool {
false
}
#[allow(unused_variables)]
fn key_up(&mut self, event: KeyEvent, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn wheel(&mut self, delta: Vec2, mods: KeyModifiers, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn mouse_move(&mut self, event: &MouseEvent, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn mouse_down(&mut self, event: &MouseEvent, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn mouse_up(&mut self, event: &MouseEvent, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn timer(&mut self, token: TimerToken, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn got_focus(&mut self, ctx: &mut dyn WinCtx) {}
#[allow(unused_variables)]
fn destroy(&mut self, ctx: &mut dyn WinCtx) {}
fn as_any(&mut self) -> &mut dyn Any;
}
#[derive(Debug, Clone, PartialEq)]
pub struct MouseEvent {
pub pos: Point,
pub mods: KeyModifiers,
pub count: u32,
pub button: MouseButton,
}
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub enum MouseButton {
Left,
Middle,
Right,
X1,
X2,
}
impl MouseButton {
#[inline(always)]
pub fn is_left(self) -> bool {
self == MouseButton::Left
}
#[inline(always)]
pub fn is_right(self) -> bool {
self == MouseButton::Right
}
}
#[derive(Clone)]
pub enum Cursor {
Arrow,
IBeam,
Crosshair,
OpenHand,
NotAllowed,
ResizeLeftRight,
ResizeUpDown,
}
#[derive(Debug, Clone)]
pub struct FileInfo {
pub path: PathBuf,
}