use bitflags::bitflags;
use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
use std::any::Any;
use std::ffi::c_void;
use std::sync::Arc;
use crate::context::gui::GuiContext;
pub trait Editor: Send {
fn spawn(
&self,
parent: ParentWindowHandle,
context: Arc<dyn GuiContext>,
) -> Box<dyn Any + Send>;
fn size(&self) -> (u32, u32);
fn set_scale_factor(&self, factor: f32) -> bool;
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, _width: u32, _height: u32) -> bool {
false
}
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 {
X11Window(u32),
AppKitNsView(*mut c_void),
Win32Hwnd(*mut c_void),
}
unsafe impl HasRawWindowHandle for ParentWindowHandle {
fn raw_window_handle(&self) -> RawWindowHandle {
match *self {
ParentWindowHandle::X11Window(window) => {
let mut handle = raw_window_handle::XcbWindowHandle::empty();
handle.window = window;
RawWindowHandle::Xcb(handle)
}
ParentWindowHandle::AppKitNsView(ns_view) => {
let mut handle = raw_window_handle::AppKitWindowHandle::empty();
handle.ns_view = ns_view;
RawWindowHandle::AppKit(handle)
}
ParentWindowHandle::Win32Hwnd(hwnd) => {
let mut handle = raw_window_handle::Win32WindowHandle::empty();
handle.hwnd = hwnd;
RawWindowHandle::Win32(handle)
}
}
}
}
#[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;
}
}