dioxus_gestures/state/
state.rs1use dioxus::{document, html::PointerData, prelude::Event};
2use nanoid::nanoid;
3
4use crate::state::{
5 events::PointerEventReceiver,
6 external_handlers::ExternalHandlers,
7 gestures::{
8 down_pointer::DownPointerGestureState,
9 drag::Drag,
10 hover::{Hover, HoverGestureState},
11 pinch::Pinch,
12 },
13};
14
15#[derive(Clone)]
16pub struct UseGesturesState {
17 pub target_unique_id: String,
18 external: ExternalHandlers,
19 hover: HoverGestureState,
20 down_pointer: DownPointerGestureState,
21}
22
23impl UseGesturesState {
24 pub fn new(external: ExternalHandlers, hover: Hover, drag: Drag, pinch: Pinch) -> Self {
25 let target_unique_id = nanoid!();
26 Self {
27 target_unique_id: target_unique_id.clone(),
28 external,
29 hover: HoverGestureState::new(hover),
30 down_pointer: DownPointerGestureState::new(drag, pinch),
31 }
32 }
33}
34
35impl UseGesturesState {
36 fn set_pointer_capture(&self, pointer_id: i32) {
37 let target_unique_id = &self.target_unique_id;
38 document::eval(&format!(
39 r#"document.querySelector("*[data-gestures-id='{target_unique_id}']").setPointerCapture({:?})"#,
40 pointer_id
41 ));
42 }
43}
44
45impl UseGesturesState {
46 fn release_pointer_capture(&self, pointer_id: i32) {
47 let target_unique_id = &self.target_unique_id;
48 document::eval(&format!(
49 r#"document.querySelector("*[data-gestures-id='{target_unique_id}']").releasePointerCapture("{:?}")"#,
50 pointer_id
51 ));
52 }
53}
54
55impl PointerEventReceiver<Event<PointerData>> for UseGesturesState {
56 fn pointer_over(&mut self, event: Event<PointerData>) {
57 self.hover.pointer_over(&event);
58 self.down_pointer.pointer_over(&event);
59 self.external.pointer_over(event);
60 }
61
62 fn pointer_enter(&mut self, event: Event<PointerData>) {
63 self.hover.pointer_enter(&event);
64 self.down_pointer.pointer_enter(&event);
65 self.external.pointer_enter(event);
66 }
67
68 fn pointer_down(&mut self, event: Event<PointerData>) {
69 self.set_pointer_capture(event.pointer_id());
70
71 self.hover.pointer_down(&event);
72 self.down_pointer.pointer_down(&event);
73 self.external.pointer_down(event);
74 }
75
76 fn pointer_move(&mut self, event: Event<PointerData>) {
77 self.hover.pointer_move(&event);
78 self.down_pointer.pointer_move(&event);
79 self.external.pointer_move(event);
80 }
81
82 fn pointer_up(&mut self, event: Event<PointerData>) {
83 self.release_pointer_capture(event.pointer_id());
84
85 self.hover.pointer_up(&event);
86 self.down_pointer.pointer_up(&event);
87 self.external.pointer_up(event);
88 }
89
90 fn pointer_cancel(&mut self, event: Event<PointerData>) {
91 self.release_pointer_capture(event.pointer_id());
92
93 self.hover.pointer_cancel(&event);
94 self.down_pointer.pointer_cancel(&event);
95 self.external.pointer_cancel(event);
96 }
97
98 fn pointer_out(&mut self, event: Event<PointerData>) {
99 self.hover.pointer_out(&event);
100 self.down_pointer.pointer_out(&event);
101 self.external.pointer_out(event);
102 }
103
104 fn pointer_leave(&mut self, event: Event<PointerData>) {
105 self.hover.pointer_leave(&event);
106 self.down_pointer.pointer_leave(&event);
107 self.external.pointer_leave(event);
108 }
109}