dioxus_web/events/
wheel.rs

1use 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}