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