use std::ops::{Deref, DerefMut};
use crate::key::Key;
use crate::physical_key::PhysicalKey;
use crate::{bson_class, bson_enum, ferro_remote_message_guid};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum InputModifiers {
#[default]
Alt = 0,
Control = 1,
Shift = 2,
Windows = 3,
LeftMouseButton = 4,
RightMouseButton = 5,
MiddleMouseButton = 6,
}
impl InputModifiers {
pub fn from_value(value: i32) -> Option<InputModifiers> {
match value {
0 => Some(InputModifiers::Alt),
1 => Some(InputModifiers::Control),
2 => Some(InputModifiers::Shift),
3 => Some(InputModifiers::Windows),
4 => Some(InputModifiers::LeftMouseButton),
5 => Some(InputModifiers::RightMouseButton),
6 => Some(InputModifiers::MiddleMouseButton),
_ => None,
}
}
}
bson_enum!(InputModifiers);
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum MouseButton {
#[default]
None = 0,
Left = 1,
Right = 2,
Middle = 3,
}
impl MouseButton {
pub fn from_value(value: i32) -> Option<MouseButton> {
match value {
0 => Some(MouseButton::None),
1 => Some(MouseButton::Left),
2 => Some(MouseButton::Right),
3 => Some(MouseButton::Middle),
_ => None,
}
}
}
bson_enum!(MouseButton);
bson_enum!(Key);
bson_enum!(PhysicalKey);
#[derive(Clone, Debug, Default, PartialEq)]
pub struct InputEventMessageBase {
pub modifiers: Option<Vec<InputModifiers>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct PointerEventMessageBase {
pub base: InputEventMessageBase,
pub x: f64,
pub y: f64,
}
impl Deref for PointerEventMessageBase {
type Target = InputEventMessageBase;
fn deref(&self) -> &InputEventMessageBase {
&self.base
}
}
impl DerefMut for PointerEventMessageBase {
fn deref_mut(&mut self) -> &mut InputEventMessageBase {
&mut self.base
}
}
macro_rules! derives {
($class:ident : $base:ident) => {
impl Deref for $class {
type Target = $base;
fn deref(&self) -> &$base {
&self.base
}
}
impl DerefMut for $class {
fn deref_mut(&mut self) -> &mut $base {
&mut self.base
}
}
};
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct PointerMovedEventMessage {
pub base: PointerEventMessageBase,
}
derives!(PointerMovedEventMessage: PointerEventMessageBase);
ferro_remote_message_guid!(PointerMovedEventMessage, "6228F0B9-99F2-4F62-A621-414DA2881648");
bson_class!(PointerMovedEventMessage as "PointerMovedEventMessage" {
"X" => base.x: f64,
"Y" => base.y: f64,
"Modifiers" => base.base.modifiers: Option<Vec<InputModifiers>>,
});
#[derive(Clone, Debug, Default, PartialEq)]
pub struct PointerPressedEventMessage {
pub base: PointerEventMessageBase,
pub button: MouseButton,
}
derives!(PointerPressedEventMessage: PointerEventMessageBase);
ferro_remote_message_guid!(PointerPressedEventMessage, "7E9E2818-F93F-411A-800E-6B1AEB11DA46");
bson_class!(PointerPressedEventMessage as "PointerPressedEventMessage" {
"Button" => button: MouseButton,
"X" => base.x: f64,
"Y" => base.y: f64,
"Modifiers" => base.base.modifiers: Option<Vec<InputModifiers>>,
});
#[derive(Clone, Debug, Default, PartialEq)]
pub struct PointerReleasedEventMessage {
pub base: PointerEventMessageBase,
pub button: MouseButton,
}
derives!(PointerReleasedEventMessage: PointerEventMessageBase);
ferro_remote_message_guid!(PointerReleasedEventMessage, "4ADC84EE-E7C8-4BCF-986C-DE3A2F78EDE4");
bson_class!(PointerReleasedEventMessage as "PointerReleasedEventMessage" {
"Button" => button: MouseButton,
"X" => base.x: f64,
"Y" => base.y: f64,
"Modifiers" => base.base.modifiers: Option<Vec<InputModifiers>>,
});
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ScrollEventMessage {
pub base: PointerEventMessageBase,
pub delta_x: f64,
pub delta_y: f64,
}
derives!(ScrollEventMessage: PointerEventMessageBase);
ferro_remote_message_guid!(ScrollEventMessage, "79301A05-F02D-4B90-BB39-472563B504AE");
bson_class!(ScrollEventMessage as "ScrollEventMessage" {
"DeltaX" => delta_x: f64,
"DeltaY" => delta_y: f64,
"X" => base.x: f64,
"Y" => base.y: f64,
"Modifiers" => base.base.modifiers: Option<Vec<InputModifiers>>,
});
#[derive(Clone, Debug, Default, PartialEq)]
pub struct KeyEventMessage {
pub base: InputEventMessageBase,
pub is_down: bool,
pub key: Key,
pub physical_key: PhysicalKey,
pub key_symbol: Option<String>,
}
derives!(KeyEventMessage: InputEventMessageBase);
ferro_remote_message_guid!(KeyEventMessage, "1C3B691E-3D54-4237-BFB0-9FEA83BC1DB8");
bson_class!(KeyEventMessage as "KeyEventMessage" {
"IsDown" => is_down: bool,
"Key" => key: Key,
"PhysicalKey" => physical_key: PhysicalKey,
"KeySymbol" => key_symbol: Option<String>,
"Modifiers" => base.modifiers: Option<Vec<InputModifiers>>,
});
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TextInputEventMessage {
pub base: InputEventMessageBase,
pub text: String,
}
derives!(TextInputEventMessage: InputEventMessageBase);
ferro_remote_message_guid!(TextInputEventMessage, "C174102E-7405-4594-916F-B10B8248A17D");
bson_class!(TextInputEventMessage as "TextInputEventMessage" {
"Text" => text: String,
"Modifiers" => base.modifiers: Option<Vec<InputModifiers>>,
});