dioxus_gestures/state/gestures/
pointer.rs

1use 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}