dioxus_use_cursor/hooks/use_cursor/
mod.rs

1mod display;
2
3use super::*;
4use dioxus::events::PointerData;
5use web_sys::PointerEvent;
6
7/// effect handler
8pub struct UseCursor {
9    data: Rc<RefCell<UseCursorData>>,
10    listen_mouse_move: Option<EventListener>,
11}
12
13struct UseCursorData {
14    pointer: PointerData,
15}
16
17impl UseCursorBuilder {
18    /// hooks for window's size with config
19    ///
20    /// # Arguments
21    ///
22    /// * `cx`: [`Scope`] or [`ScopeState`]
23    ///
24    /// returns: [`WindowSize`]
25    ///
26    /// # Examples
27    ///
28    /// ```
29    /// use dioxus::prelude::*;
30    /// use dioxus_use_cursor::use_cursor;
31    ///
32    /// fn App(cx: Scope) -> Element {
33    ///     let size = use_cursor(&cx);
34    ///
35    ///     cx.render(rsx!(
36    ///         h1 { "Window size: {size}" }
37    ///     ))
38    /// }
39    /// ```
40    pub fn use_cursor<'a>(&self, cx: &'a ScopeState) -> &'a mut UseCursor {
41        let hook = UseCursor::new(cx);
42        cx.use_hook(|| hook)
43    }
44}
45
46impl UseCursor {
47    fn new(cx: &ScopeState) -> Self {
48        match window() {
49            None => Default::default(),
50            Some(w) => {
51                let data = Rc::new(RefCell::new(UseCursorData::default()));
52                let mouse_move = Self::on_pointer_move(cx, &w, &data);
53                Self { data, listen_mouse_move: Some(mouse_move) }
54            }
55        }
56    }
57    fn on_pointer_move(cx: &ScopeState, window: &Window, data: &Rc<RefCell<UseCursorData>>) -> EventListener {
58        #[cfg(debug_assertions)]
59        {
60            info!("Pointer Move Listener Initialized at {}!", cx.scope_id().0);
61        }
62        let setter = data.clone();
63        let regenerate = cx.schedule_update();
64        EventListener::new(&window, "pointermove", move |e| {
65            let mut setter = setter.borrow_mut();
66            let e: &PointerEvent = e.unchecked_ref();
67            setter.pointer = PointerData {
68                alt_key: e.alt_key(),
69                button: e.button(),
70                buttons: e.buttons(),
71                client_x: e.client_x(),
72                client_y: e.client_y(),
73                ctrl_key: e.ctrl_key(),
74                meta_key: e.meta_key(),
75                page_x: e.page_x(),
76                page_y: e.page_y(),
77                screen_x: e.screen_x(),
78                screen_y: e.screen_y(),
79                shift_key: e.shift_key(),
80                pointer_id: e.pointer_id(),
81                width: e.width(),
82                height: e.height(),
83                pressure: e.pressure(),
84                tangential_pressure: e.tangential_pressure(),
85                tilt_x: e.tilt_x(),
86                tilt_y: e.tilt_y(),
87                twist: e.twist(),
88                pointer_type: e.pointer_type(),
89                is_primary: e.is_primary(),
90            };
91            regenerate();
92        })
93    }
94}
95
96impl UseCursor {
97    /// Getter for the screenX field of this object.
98    pub fn screen_x(&self) -> usize {
99        self.data.borrow().pointer.screen_x as _
100    }
101    ///
102    pub fn screen_y(&self) -> usize {
103        self.data.borrow().pointer.screen_y as _
104    }
105    ///
106    // pub fn element_width(&self) -> usize {
107    //     self.view_mouse().map(|e| e.page_x()).unwrap_or_default() as _
108    // }
109    // ///
110    // pub fn element_height(&self) -> usize {
111    //     self.view_mouse().map(|e| e.element_height()).unwrap_or_default() as _
112    // }
113    ///
114    pub fn is_over(&self) {}
115    ///
116    pub fn is_down(&self) {}
117
118    // #[inline]
119    // fn view_mouse(&self) -> Option<&MouseEvent> {
120    //     self.data.borrow().mouse.as_ref()
121    // }
122}