use std::rc::Rc;
use crate::{JsJson, dev::JsJsonListDecoder, struct_mut::ValueMut};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum WheelDeltaMode {
#[default]
Pixel,
Line,
Page,
}
#[derive(Clone, Debug, Default)]
pub struct WheelEvent {
pub delta_x: f64,
pub delta_y: f64,
pub delta_z: f64,
pub delta_mode: WheelDeltaMode,
pub pointer_x: f64,
pub pointer_y: f64,
pub element_width: f64,
pub element_height: f64,
pub alt_key: bool,
pub ctrl_key: bool,
pub shift_key: bool,
pub meta_key: bool,
flags: Rc<ValueMut<WheelEventFlags>>,
}
#[derive(Clone, Copy, Debug, Default)]
struct WheelEventFlags {
stop_propagation: bool,
prevent_default: bool,
}
impl WheelEvent {
pub fn stop_propagation(&self) {
self.flags.change(|flags| flags.stop_propagation = true);
}
pub fn prevent_default(&self) {
self.flags.change(|flags| flags.prevent_default = true);
}
pub(crate) fn from_driver(data: JsJson) -> Result<Self, String> {
data.map_list(|mut params: JsJsonListDecoder| {
let delta_x = params.get_f64("deltaX")?;
let delta_y = params.get_f64("deltaY")?;
let delta_z = params.get_f64("deltaZ")?;
let delta_mode = match params.get_u32("deltaMode")? {
1 => WheelDeltaMode::Line,
2 => WheelDeltaMode::Page,
_ => WheelDeltaMode::Pixel,
};
let pointer_x = params.get_f64("pointerX")?;
let pointer_y = params.get_f64("pointerY")?;
let element_width = params.get_f64("elementWidth")?;
let element_height = params.get_f64("elementHeight")?;
let alt_key = params.get_bool("altKey")?;
let ctrl_key = params.get_bool("ctrlKey")?;
let shift_key = params.get_bool("shiftKey")?;
let meta_key = params.get_bool("metaKey")?;
params.expect_no_more()?;
Ok(Self {
delta_x,
delta_y,
delta_z,
delta_mode,
pointer_x,
pointer_y,
element_width,
element_height,
alt_key,
ctrl_key,
shift_key,
meta_key,
flags: Rc::default(),
})
})
}
}
impl From<WheelEvent> for JsJson {
fn from(val: WheelEvent) -> JsJson {
let flags = val.flags.get();
JsJson::Object(
[
(
"stop_propagation".to_string(),
JsJson::from(flags.stop_propagation),
),
(
"prevent_default".to_string(),
JsJson::from(flags.prevent_default),
),
]
.into_iter()
.collect(),
)
}
}