use crate::lang::prog::ffi::js::{JsInstant, JsNumFmt, js_number};
use crate::{
EventButton, EventButtonState, EventButtons, EventKind, EventKindTimed, EventMouse,
EventTimestamp, KeyMods, Timed, WebEventKind,
};
use crate::{impl_trait, is};
#[doc = crate::_tags!(event web)]
#[doc = crate::_doc_meta!{
location("sys/os/browser/web"),
test_size_of(WebEventMouse = 32|256; niche Option),
}]
#[repr(C)]
#[derive(Copy, Clone, PartialEq)]
pub struct WebEventMouse {
pub x: js_number, pub y: js_number,
pub button: u8, pub buttons: u8, pub mods: KeyMods, pub etype: WebEventKind,
pub timestamp: JsInstant, }
impl WebEventMouse {
pub const fn new(
x: js_number,
y: js_number,
button: u8,
buttons: u8,
mods: KeyMods,
etype: WebEventKind,
timestamp: JsInstant,
) -> Self {
Self { x, y, button, buttons, mods, etype, timestamp }
}
}
impl_trait! { fmt::Debug for WebEventMouse |self, f| {
f.debug_struct("WebEventMouse")
.field("x", &JsNumFmt::<2>(self.x))
.field("y", &JsNumFmt::<2>(self.y))
.field("button", &self.button())
.field("buttons", &EventButtons::from_bits(self.buttons))
.field("mods", &self.mods)
.field("etype", &self.etype)
.field("timestamp", &self.timestamp)
.finish()
}}
impl WebEventMouse {
pub const fn button(self) -> Option<EventButton> {
EventButton::from_web(self.button)
}
pub const fn web_button(self) -> u8 {
self.button
}
pub const fn buttons(self) -> EventButtons {
EventButtons::from_bits(self.buttons)
}
pub const fn web_buttons(self) -> u8 {
self.buttons
}
pub const fn to_kind_timed(self) -> EventKindTimed {
let kind = EventKind::Mouse(EventMouse {
x: self.x as i32,
y: self.y as i32,
button: EventButton::from_web(self.button),
state: EventButtonState::from_web(self.etype),
buttons: EventButtons::from_bits(self.buttons),
mods: self.mods,
});
let timestamp = Some(EventTimestamp::from_js(self.timestamp));
EventKindTimed::new(kind, timestamp)
}
pub const fn from_event_mouse_timed(
from: Timed<EventMouse, Option<EventTimestamp>>,
) -> WebEventMouse {
let timestamp = is![let Some(t) = from.time, t.to_js(), JsInstant { ms: 0.0 }];
WebEventMouse {
x: from.value.x as js_number,
y: from.value.y as js_number,
button: is![let Some(b) = from.value.button, b.to_web(), 255],
buttons: from.value.buttons.bits(), mods: from.value.mods,
etype: from.value.state.to_web_as_mouse(),
timestamp,
}
}
}
impl From<WebEventMouse> for EventKindTimed {
fn from(from: WebEventMouse) -> Self {
from.to_kind_timed()
}
}
impl From<Timed<EventMouse, Option<EventTimestamp>>> for WebEventMouse {
fn from(from: Timed<EventMouse, Option<EventTimestamp>>) -> Self {
Self::from_event_mouse_timed(from)
}
}