dioxus_gestures/state/gestures/
pointer.rs1use std::rc::Rc;
2
3use dioxus::prelude::Modifiers;
4use dioxus::html::point_interaction::{InteractionLocation, ModifiersInteraction, PointerInteraction};
5use dioxus::{
6 html::{
7 geometry::{euclid::Vector2D, ClientSpace},
8 input_data::MouseButtonSet,
9 PointerData,
10 },
11};
12
13#[derive(Clone, Copy, PartialEq, Eq)]
14pub struct PointerId(pub i32);
15
16impl PointerId {
17 pub fn is_equal_i32(&self, probe: i32) -> bool {
18 self.0 == probe
19 }
20}
21
22impl From<i32> for PointerId {
23 fn from(value: i32) -> Self {
24 PointerId(value)
25 }
26}
27
28pub struct IncrementalOffsetPointer {
29 pub initial_data: Rc<PointerData>,
30 pub preceding_data: Rc<PointerData>,
31 pub current_data: Rc<PointerData>,
32}
33
34impl IncrementalOffsetPointer {
35 pub fn delta_movement(&self) -> Vector2D<f64, ClientSpace> {
36 PointerDataDifference::coordinates(&self.current_data, &self.preceding_data)
37 }
38
39 pub fn delta_width(&self) -> f64 {
40 PointerDataDifference::width(&self.current_data, &self.preceding_data)
41 }
42
43 pub fn delta_height(&self) -> f64 {
44 PointerDataDifference::height(&self.current_data, &self.preceding_data)
45 }
46
47 pub fn delta_pressure(&self) -> f32 {
48 PointerDataDifference::pressure(&self.current_data, &self.preceding_data)
49 }
50
51 pub fn delta_tangential_pressure(&self) -> f32 {
52 PointerDataDifference::tangential_pressure(&self.current_data, &self.preceding_data)
53 }
54
55 pub fn delta_tilt_x(&self) -> i32 {
56 PointerDataDifference::tilt_x(&self.current_data, &self.preceding_data)
57 }
58
59 pub fn delta_tilt_y(&self) -> i32 {
60 PointerDataDifference::tilt_y(&self.current_data, &self.preceding_data)
61 }
62
63 pub fn delta_twist(&self) -> i32 {
64 PointerDataDifference::twist(&self.current_data, &self.preceding_data)
65 }
66
67 pub fn delta_is_primary(&self) -> bool {
68 PointerDataDifference::is_primary(&self.current_data, &self.preceding_data)
69 }
70
71 pub fn delta_modifiers(&self) -> Modifiers {
72 PointerDataDifference::modifiers(&self.current_data, &self.preceding_data)
73 }
74
75 pub fn delta_held_buttons(&self) -> MouseButtonSet {
76 PointerDataDifference::held_buttons(&self.current_data, &self.preceding_data)
77 }
78}
79
80impl IncrementalOffsetPointer {
81 pub fn offset_movement(&self) -> Vector2D<f64, ClientSpace> {
82 PointerDataDifference::coordinates(&self.current_data, &self.initial_data)
83 }
84
85 pub fn offset_width(&self) -> f64 {
86 PointerDataDifference::width(&self.current_data, &self.initial_data)
87 }
88
89 pub fn offset_height(&self) -> f64 {
90 PointerDataDifference::height(&self.current_data, &self.initial_data)
91 }
92
93 pub fn offset_pressure(&self) -> f32 {
94 PointerDataDifference::pressure(&self.current_data, &self.initial_data)
95 }
96
97 pub fn offset_tangential_pressure(&self) -> f32 {
98 PointerDataDifference::tangential_pressure(&self.current_data, &self.initial_data)
99 }
100
101 pub fn offset_tilt_x(&self) -> i32 {
102 PointerDataDifference::tilt_x(&self.current_data, &self.initial_data)
103 }
104
105 pub fn offset_tilt_y(&self) -> i32 {
106 PointerDataDifference::tilt_y(&self.current_data, &self.initial_data)
107 }
108
109 pub fn offset_twist(&self) -> i32 {
110 PointerDataDifference::twist(&self.current_data, &self.initial_data)
111 }
112
113 pub fn offset_is_primary(&self) -> bool {
114 PointerDataDifference::is_primary(&self.current_data, &self.initial_data)
115 }
116
117 pub fn offset_modifiers(&self) -> Modifiers {
118 PointerDataDifference::modifiers(&self.current_data, &self.initial_data)
119 }
120
121 pub fn offset_held_buttons(&self) -> MouseButtonSet {
122 PointerDataDifference::held_buttons(&self.current_data, &self.initial_data)
123 }
124}
125
126pub struct OffsetPointer {
127 pub initial_data: Rc<PointerData>,
128 pub final_data: Rc<PointerData>,
129}
130
131impl OffsetPointer {
132 pub fn offset_movement(&self) -> Vector2D<f64, ClientSpace> {
133 PointerDataDifference::coordinates(&self.final_data, &self.initial_data)
134 }
135
136 pub fn offset_width(&self) -> f64 {
137 PointerDataDifference::width(&self.final_data, &self.initial_data)
138 }
139
140 pub fn offset_height(&self) -> f64 {
141 PointerDataDifference::height(&self.final_data, &self.initial_data)
142 }
143
144 pub fn offset_pressure(&self) -> f32 {
145 PointerDataDifference::pressure(&self.final_data, &self.initial_data)
146 }
147
148 pub fn offset_tangential_pressure(&self) -> f32 {
149 PointerDataDifference::tangential_pressure(&self.final_data, &self.initial_data)
150 }
151
152 pub fn offset_tilt_x(&self) -> i32 {
153 PointerDataDifference::tilt_x(&self.final_data, &self.initial_data)
154 }
155
156 pub fn offset_tilt_y(&self) -> i32 {
157 PointerDataDifference::tilt_y(&self.final_data, &self.initial_data)
158 }
159
160 pub fn offset_twist(&self) -> i32 {
161 PointerDataDifference::twist(&self.final_data, &self.initial_data)
162 }
163
164 pub fn offset_is_primary(&self) -> bool {
165 PointerDataDifference::is_primary(&self.final_data, &self.initial_data)
166 }
167
168 pub fn offset_modifiers(&self) -> Modifiers {
169 PointerDataDifference::modifiers(&self.final_data, &self.initial_data)
170 }
171
172 pub fn offset_held_buttons(&self) -> MouseButtonSet {
173 PointerDataDifference::held_buttons(&self.final_data, &self.initial_data)
174 }
175}
176
177pub struct InitialPointer {
178 pub data: Rc<PointerData>,
179}
180
181struct PointerDataDifference;
182
183impl PointerDataDifference {
184 fn coordinates(a: &PointerData, b: &PointerData) -> Vector2D<f64, ClientSpace> {
185 a.client_coordinates() - b.client_coordinates()
186 }
187
188 fn width(a: &PointerData, b: &PointerData) -> f64 {
189 a.width() - b.width()
190 }
191
192 fn height(a: &PointerData, b: &PointerData) -> f64 {
193 a.height() - b.height()
194 }
195
196 fn pressure(a: &PointerData, b: &PointerData) -> f32 {
197 a.pressure() - b.pressure()
198 }
199
200 fn tangential_pressure(a: &PointerData, b: &PointerData) -> f32 {
201 a.tangential_pressure() - b.tangential_pressure()
202 }
203
204 fn tilt_x(a: &PointerData, b: &PointerData) -> i32 {
205 a.tilt_x() - b.tilt_x()
206 }
207
208 fn tilt_y(a: &PointerData, b: &PointerData) -> i32 {
209 a.tilt_y() - b.tilt_y()
210 }
211
212 fn twist(a: &PointerData, b: &PointerData) -> i32 {
213 a.twist() - b.twist()
214 }
215
216 fn is_primary(a: &PointerData, b: &PointerData) -> bool {
217 a.is_primary() ^ b.is_primary()
218 }
219
220 fn modifiers(a: &PointerData, b: &PointerData) -> Modifiers {
221 a.modifiers().symmetric_difference(b.modifiers())
222 }
223
224 fn held_buttons(a: &PointerData, b: &PointerData) -> MouseButtonSet {
225 a.held_buttons().symmetrical_difference(b.held_buttons())
226 }
227}