dioxus_gestures/state/gestures/
pointer.rs

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