1#![warn(missing_docs)]
4
5pub mod drag;
6pub mod gesture_detector;
7pub mod hover;
8pub mod multi_touch;
9pub mod simplified_gesture_api;
10pub mod tap;
11
12use serde::{Deserialize, Serialize};
13use std::collections::HashMap;
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct GestureConfig {
18 pub basic_gestures: bool,
20 pub multi_touch: bool,
22 pub pinch_to_zoom: bool,
24 pub rotation: bool,
26 pub sensitivity: f64,
28 pub min_distance: f64,
30 pub max_touches: usize,
32 pub timeout_ms: u64,
34}
35
36impl Default for GestureConfig {
37 fn default() -> Self {
38 Self {
39 basic_gestures: true,
40 multi_touch: true,
41 pinch_to_zoom: true,
42 rotation: true,
43 sensitivity: 0.5,
44 min_distance: 10.0,
45 max_touches: 5,
46 timeout_ms: 300,
47 }
48 }
49}
50
51impl GestureConfig {
52 pub fn basic_only(mut self) -> Self {
54 self.multi_touch = false;
55 self.pinch_to_zoom = false;
56 self.rotation = false;
57 self
58 }
59
60 pub fn enable_multi_touch(mut self) -> Self {
62 self.multi_touch = true;
63 self
64 }
65
66 pub fn enable_pinch_to_zoom(mut self) -> Self {
68 self.pinch_to_zoom = true;
69 self.multi_touch = true;
70 self
71 }
72
73 pub fn enable_rotation(mut self) -> Self {
75 self.rotation = true;
76 self.multi_touch = true;
77 self
78 }
79
80 pub fn sensitivity(mut self, sensitivity: f64) -> Self {
82 self.sensitivity = sensitivity.clamp(0.0, 1.0);
83 self
84 }
85
86 pub fn min_distance(mut self, distance: f64) -> Self {
88 self.min_distance = distance.max(0.0);
89 self
90 }
91
92 pub fn max_touches(mut self, max: usize) -> Self {
94 self.max_touches = max.max(1);
95 self
96 }
97
98 pub fn timeout(mut self, timeout_ms: u64) -> Self {
100 self.timeout_ms = timeout_ms;
101 self
102 }
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct TouchPoint {
108 pub id: u64,
110 pub x: f64,
112 pub y: f64,
114 pub pressure: f64,
116 pub timestamp: u64,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct MultiTouchState {
123 pub touches: HashMap<u64, TouchPoint>,
125 pub center: (f64, f64),
127 pub average_distance: f64,
129 pub scale: f64,
131 pub rotation: f64,
133 pub active: bool,
135 pub gesture_type: MultiTouchGestureType,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
141pub enum MultiTouchGestureType {
142 None,
144 Pinch,
146 Rotation,
148 PinchAndRotate,
150 MultiTap,
152 MultiSwipe,
154}
155
156impl Default for MultiTouchState {
157 fn default() -> Self {
158 Self {
159 touches: HashMap::new(),
160 center: (0.0, 0.0),
161 average_distance: 0.0,
162 scale: 1.0,
163 rotation: 0.0,
164 active: false,
165 gesture_type: MultiTouchGestureType::None,
166 }
167 }
168}
169
170#[derive(Debug, Clone, Serialize, Deserialize)]
172pub enum GestureEvent {
173 TouchStart {
175 touches: Vec<TouchPoint>,
177 },
178 TouchMove {
180 touches: Vec<TouchPoint>,
182 },
183 TouchEnd {
185 touches: Vec<TouchPoint>,
187 },
188 GestureRecognized {
190 gesture: MultiTouchState,
192 },
193 GestureUpdated {
195 gesture: MultiTouchState,
197 },
198 GestureCompleted {
200 gesture: MultiTouchState,
202 },
203}
204
205#[derive(Debug, Clone)]
207pub struct GestureResult {
208 pub recognized: bool,
210 pub gesture_type: MultiTouchGestureType,
212 pub data: Option<MultiTouchState>,
214 pub confidence: f64,
216}
217
218impl Default for GestureResult {
219 fn default() -> Self {
220 Self {
221 recognized: false,
222 gesture_type: MultiTouchGestureType::None,
223 data: None,
224 confidence: 0.0,
225 }
226 }
227}
228
229pub trait GestureHandler {
231 fn handle_gesture(&mut self, event: GestureEvent) -> GestureResult;
233
234 fn is_active(&self) -> bool;
236
237 fn reset(&mut self);
239}
240
241pub use gesture_detector::GestureDetector;
242pub use multi_touch::MultiTouchGestureDetector;
244
245pub use simplified_gesture_api::{
247 SimplifiedGestureBounds, SimplifiedGestureConfig, SimplifiedGestureData,
248 SimplifiedGestureDetector, SimplifiedGestureResult, SimplifiedGestureType, SimplifiedVector2D,
249};
250
251#[cfg(test)]
253mod simplified_gesture_tests {
254 include!("simplified_gesture_tests.rs");
255}
256
257#[cfg(test)]
258mod gesture_system_tdd_tests;
259#[cfg(test)]
260mod gesture_tests;
261
262