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