euv_ui/hook/use_scroll/
impl.rs1use super::*;
2
3impl UseScroll {
5 pub(crate) fn new() -> Self {
11 Self {
12 x: Signal::create(0.0),
13 y: Signal::create(0.0),
14 teardown: Rc::new(RefCell::new(None)),
15 }
16 }
17
18 pub fn current_y(&self) -> f64 {
24 self.get_y().get()
25 }
26
27 pub fn current_x(&self) -> f64 {
33 self.get_x().get()
34 }
35
36 pub fn scroll_to_top(&self) {
43 #[cfg(target_arch = "wasm32")]
44 {
45 let Some(window) = browser_window() else {
46 return;
47 };
48 window.scroll_to_with_x_and_y(0.0, 0.0);
49 }
50 }
51
52 pub(crate) fn attach(&self) {
58 #[cfg(target_arch = "wasm32")]
59 {
60 let Some(window) = browser_window() else {
61 return;
62 };
63 let x: Signal<f64> = self.get_x();
64 let y: Signal<f64> = self.get_y();
65 let scrolled: Window = window.clone();
66 let on_scroll: Closure<dyn FnMut(Event)> =
67 Closure::wrap(Box::new(move |_event: Event| {
68 x.set(scrolled.scroll_x().unwrap_or(0.0));
69 y.set(scrolled.scroll_y().unwrap_or(0.0));
70 }));
71 if window
72 .add_event_listener_with_callback(EVENT_SCROLL, on_scroll.as_ref().unchecked_ref())
73 .is_err()
74 {
75 return;
76 }
77 x.set(window.scroll_x().unwrap_or(0.0));
78 y.set(window.scroll_y().unwrap_or(0.0));
79 *self.get_teardown().borrow_mut() = Some(Box::new(move || {
80 let _: Result<(), JsValue> = window.remove_event_listener_with_callback(
81 EVENT_SCROLL,
82 on_scroll.as_ref().unchecked_ref(),
83 );
84 }));
85 }
86 }
87
88 pub(crate) fn detach(&self) {
90 let taken: Option<Box<dyn Fn()>> = self.get_teardown().borrow_mut().take();
91 if let Some(teardown) = taken {
92 teardown();
93 }
94 }
95}