dioxus_web/events/
wheel.rs1use dioxus_html::{
2 geometry::{ClientPoint, ElementPoint, PagePoint, ScreenPoint},
3 input_data::{decode_mouse_button_set, MouseButton},
4 HasMouseData, HasWheelData, InteractionElementOffset, InteractionLocation, Modifiers,
5 ModifiersInteraction, PointerInteraction,
6};
7use web_sys::WheelEvent;
8
9use super::{Synthetic, WebEventExt};
10
11impl HasWheelData for Synthetic<WheelEvent> {
12 fn delta(&self) -> dioxus_html::geometry::WheelDelta {
13 dioxus_html::geometry::WheelDelta::from_web_attributes(
14 self.event.delta_mode(),
15 self.event.delta_x(),
16 self.event.delta_y(),
17 self.event.delta_z(),
18 )
19 }
20
21 fn as_any(&self) -> &dyn std::any::Any {
22 &self.event
23 }
24}
25
26impl HasMouseData for Synthetic<WheelEvent> {
27 fn as_any(&self) -> &dyn std::any::Any {
28 &self.event
29 }
30}
31
32impl InteractionLocation for Synthetic<WheelEvent> {
33 fn client_coordinates(&self) -> ClientPoint {
34 ClientPoint::new(self.event.client_x().into(), self.event.client_y().into())
35 }
36
37 fn screen_coordinates(&self) -> ScreenPoint {
38 ScreenPoint::new(self.event.screen_x().into(), self.event.screen_y().into())
39 }
40
41 fn page_coordinates(&self) -> PagePoint {
42 PagePoint::new(self.event.page_x().into(), self.event.page_y().into())
43 }
44}
45
46impl InteractionElementOffset for Synthetic<WheelEvent> {
47 fn element_coordinates(&self) -> ElementPoint {
48 ElementPoint::new(self.event.offset_x().into(), self.event.offset_y().into())
49 }
50}
51
52impl ModifiersInteraction for Synthetic<WheelEvent> {
53 fn modifiers(&self) -> Modifiers {
54 let mut modifiers = Modifiers::empty();
55
56 if self.event.alt_key() {
57 modifiers.insert(Modifiers::ALT);
58 }
59 if self.event.ctrl_key() {
60 modifiers.insert(Modifiers::CONTROL);
61 }
62 if self.event.meta_key() {
63 modifiers.insert(Modifiers::META);
64 }
65 if self.event.shift_key() {
66 modifiers.insert(Modifiers::SHIFT);
67 }
68
69 modifiers
70 }
71}
72
73impl PointerInteraction for Synthetic<WheelEvent> {
74 fn held_buttons(&self) -> dioxus_html::input_data::MouseButtonSet {
75 decode_mouse_button_set(self.event.buttons())
76 }
77
78 fn trigger_button(&self) -> Option<MouseButton> {
79 Some(MouseButton::from_web_code(self.event.button()))
80 }
81}
82
83impl WebEventExt for dioxus_html::WheelData {
84 type WebEvent = web_sys::WheelEvent;
85
86 #[inline(always)]
87 fn try_as_web_event(&self) -> Option<Self::WebEvent> {
88 self.downcast::<web_sys::WheelEvent>().cloned()
89 }
90}