use bitflags::bitflags;
use dpi::{PhysicalSize, Size};
use raw_window_handle::{HasWindowHandle, RawWindowHandle};
use std::any::Any;
use std::ffi::{c_ulong, c_void};
use std::num::{NonZeroIsize, NonZeroU32};
use std::ptr::NonNull;
use std::sync::Arc;
use crate::context::gui::GuiContext;
pub use dpi;
pub trait Editor: Send {
fn spawn(&self, parent: ParentWindowHandle, context: Arc<dyn GuiContext>) -> Box<dyn Any>;
fn size(&self) -> Size;
fn param_value_changed(&self, id: &str, normalized_value: f32);
fn param_modulation_changed(&self, id: &str, modulation_offset: f32);
fn param_values_changed(&self);
fn on_virtual_key_from_host(
&self,
_key_code: VirtualKeyCode,
_is_down: bool,
_modifiers: Modifiers,
) -> bool {
false
}
fn set_size(&self, physical_size: PhysicalSize<u32>) -> bool {
let _ = physical_size;
false
}
fn set_scale_factor(&self, factor: f64) -> bool;
fn resize_hint(&self) -> ResizeHint {
ResizeHint::default()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ResizeHint {
pub can_resize: bool,
pub can_resize_horizontally: bool,
pub can_resize_vertically: bool,
pub preserve_aspect_ratio: bool,
pub aspect_ratio_width: u32,
pub aspect_ratio_height: u32,
}
impl Default for ResizeHint {
fn default() -> Self {
Self {
can_resize: false,
can_resize_horizontally: true,
can_resize_vertically: true,
preserve_aspect_ratio: false,
aspect_ratio_width: 1,
aspect_ratio_height: 1,
}
}
}
impl ResizeHint {
pub fn resizable() -> Self {
Self {
can_resize: true,
..Self::default()
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum ParentWindowHandle {
XlibWindow(c_ulong),
XcbWindow(NonZeroU32),
AppKitNsView(NonNull<c_void>),
Win32Hwnd(NonZeroIsize),
}
impl HasWindowHandle for ParentWindowHandle {
fn window_handle(
&self,
) -> Result<raw_window_handle::WindowHandle<'_>, raw_window_handle::HandleError> {
let raw = match *self {
ParentWindowHandle::XlibWindow(window) => {
RawWindowHandle::Xlib(raw_window_handle::XlibWindowHandle::new(window))
}
ParentWindowHandle::XcbWindow(window) => {
RawWindowHandle::Xcb(raw_window_handle::XcbWindowHandle::new(window))
}
ParentWindowHandle::AppKitNsView(ns_view) => {
RawWindowHandle::AppKit(raw_window_handle::AppKitWindowHandle::new(ns_view))
}
ParentWindowHandle::Win32Hwnd(hwnd) => {
RawWindowHandle::Win32(raw_window_handle::Win32WindowHandle::new(hwnd))
}
};
Ok(unsafe { raw_window_handle::WindowHandle::borrow_raw(raw) })
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum VirtualKeyCode {
Backspace,
Tab,
Clear,
Return,
Pause,
Escape,
Space,
Next,
End,
Home,
ArrowLeft,
ArrowUp,
ArrowRight,
ArrowDown,
PageUp,
PageDown,
Select,
Print,
NumpadEnter,
Snapshot,
Insert,
Delete,
Help,
Numpad0,
Numpad1,
Numpad2,
Numpad3,
Numpad4,
Numpad5,
Numpad6,
Numpad7,
Numpad8,
Numpad9,
NumpadMultiply,
NumpadAdd,
NumpadSeparator,
NumpadSubtract,
NumpadDecimal,
NumpadDivide,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
NumLock,
ScrollLock,
Shift,
Control,
Alt,
Equals,
ContextMenu,
MediaPlay,
MediaStop,
MediaPrevTrack,
MediaNextTrack,
VolumeUp,
VolumeDown,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21,
F22,
F23,
F24,
Super,
}
bitflags! {
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct Modifiers: u8 {
const SHIFT = 1 << 0;
const ALT = 1 << 1;
const COMMAND = 1 << 2;
const CONTROL = 1 << 3;
}
}