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