dioxus_web/events/
scroll.rs

1use dioxus_html::HasScrollData;
2use wasm_bindgen::JsCast;
3use web_sys::{Document, Element, Event};
4
5use super::{Synthetic, WebEventExt};
6
7impl HasScrollData for Synthetic<Event> {
8    fn as_any(&self) -> &dyn std::any::Any {
9        &self.event
10    }
11
12    fn scroll_top(&self) -> f64 {
13        if let Some(target) = self.event.target().as_ref() {
14            if let Some(element) = target.dyn_ref::<Element>() {
15                return element.scroll_top() as f64;
16            } else if let Some(element) = target
17                .dyn_ref::<Document>()
18                .and_then(|document| document.document_element())
19            {
20                return element.scroll_top() as f64;
21            }
22        }
23        0f64
24    }
25
26    fn scroll_left(&self) -> f64 {
27        if let Some(target) = self.event.target().as_ref() {
28            if let Some(element) = target.dyn_ref::<Element>() {
29                return element.scroll_left() as f64;
30            } else if let Some(element) = target
31                .dyn_ref::<Document>()
32                .and_then(|document| document.document_element())
33            {
34                return element.scroll_left() as f64;
35            }
36        }
37        0f64
38    }
39
40    fn scroll_width(&self) -> i32 {
41        if let Some(target) = self.event.target().as_ref() {
42            if let Some(element) = target.dyn_ref::<Element>() {
43                return element.scroll_width();
44            } else if let Some(element) = target
45                .dyn_ref::<Document>()
46                .and_then(|document| document.document_element())
47            {
48                return element.scroll_width();
49            }
50        }
51        0
52    }
53
54    fn scroll_height(&self) -> i32 {
55        if let Some(target) = self.event.target().as_ref() {
56            if let Some(element) = target.dyn_ref::<Element>() {
57                return element.scroll_height();
58            } else if let Some(element) = target
59                .dyn_ref::<Document>()
60                .and_then(|document| document.document_element())
61            {
62                return element.scroll_height();
63            }
64        }
65        0
66    }
67
68    fn client_width(&self) -> i32 {
69        if let Some(target) = self.event.target().as_ref() {
70            if let Some(element) = target.dyn_ref::<Element>() {
71                return element.client_width();
72            } else if let Some(element) = target
73                .dyn_ref::<Document>()
74                .and_then(|document| document.document_element())
75            {
76                return element.client_width();
77            }
78        }
79        0
80    }
81
82    fn client_height(&self) -> i32 {
83        if let Some(target) = self.event.target().as_ref() {
84            if let Some(element) = target.dyn_ref::<Element>() {
85                return element.client_height();
86            } else if let Some(element) = target
87                .dyn_ref::<Document>()
88                .and_then(|document| document.document_element())
89            {
90                return element.client_height();
91            }
92        }
93        0
94    }
95}
96
97impl WebEventExt for dioxus_html::ScrollData {
98    type WebEvent = web_sys::Event;
99
100    #[inline(always)]
101    fn try_as_web_event(&self) -> Option<Self::WebEvent> {
102        self.downcast::<web_sys::Event>().cloned()
103    }
104}