dioxus_use_cursor/hooks/use_cursor/
mod.rs1mod display;
2
3use super::*;
4use dioxus::events::PointerData;
5use web_sys::PointerEvent;
6
7pub 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 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 pub fn screen_x(&self) -> usize {
99 self.data.borrow().pointer.screen_x as _
100 }
101 pub fn screen_y(&self) -> usize {
103 self.data.borrow().pointer.screen_y as _
104 }
105 pub fn is_over(&self) {}
115 pub fn is_down(&self) {}
117
118 }