leptos_motion_gestures/
lib.rs

1//! Advanced gesture recognition for Leptos Motion
2
3#![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/// Advanced gesture configuration
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct GestureConfig {
18    /// Basic gestures enabled
19    pub basic_gestures: bool,
20    /// Multi-touch gestures enabled
21    pub multi_touch: bool,
22    /// Pinch-to-zoom enabled
23    pub pinch_to_zoom: bool,
24    /// Rotation gestures enabled
25    pub rotation: bool,
26    /// Gesture sensitivity (0.0 to 1.0)
27    pub sensitivity: f64,
28    /// Minimum distance for gesture recognition
29    pub min_distance: f64,
30    /// Maximum number of simultaneous touches
31    pub max_touches: usize,
32    /// Gesture timeout in milliseconds
33    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    /// Enable basic gestures only
53    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    /// Enable multi-touch gestures
61    pub fn enable_multi_touch(mut self) -> Self {
62        self.multi_touch = true;
63        self
64    }
65
66    /// Enable pinch-to-zoom
67    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    /// Enable rotation gestures
74    pub fn enable_rotation(mut self) -> Self {
75        self.rotation = true;
76        self.multi_touch = true;
77        self
78    }
79
80    /// Set gesture sensitivity
81    pub fn sensitivity(mut self, sensitivity: f64) -> Self {
82        self.sensitivity = sensitivity.clamp(0.0, 1.0);
83        self
84    }
85
86    /// Set minimum distance threshold
87    pub fn min_distance(mut self, distance: f64) -> Self {
88        self.min_distance = distance.max(0.0);
89        self
90    }
91
92    /// Set maximum number of touches
93    pub fn max_touches(mut self, max: usize) -> Self {
94        self.max_touches = max.max(1);
95        self
96    }
97
98    /// Set gesture timeout
99    pub fn timeout(mut self, timeout_ms: u64) -> Self {
100        self.timeout_ms = timeout_ms;
101        self
102    }
103}
104
105/// Touch point information
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct TouchPoint {
108    /// Unique identifier for the touch
109    pub id: u64,
110    /// X coordinate
111    pub x: f64,
112    /// Y coordinate
113    pub y: f64,
114    /// Pressure (0.0 to 1.0)
115    pub pressure: f64,
116    /// Timestamp
117    pub timestamp: u64,
118}
119
120/// Multi-touch gesture state
121#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct MultiTouchState {
123    /// Active touch points
124    pub touches: HashMap<u64, TouchPoint>,
125    /// Center point of all touches
126    pub center: (f64, f64),
127    /// Average distance from center
128    pub average_distance: f64,
129    /// Scale factor (1.0 = no change)
130    pub scale: f64,
131    /// Rotation angle in radians
132    pub rotation: f64,
133    /// Gesture is active
134    pub active: bool,
135    /// Gesture type
136    pub gesture_type: MultiTouchGestureType,
137}
138
139/// Types of multi-touch gestures
140#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
141pub enum MultiTouchGestureType {
142    /// No gesture detected
143    None,
144    /// Pinch-to-zoom gesture
145    Pinch,
146    /// Rotation gesture
147    Rotation,
148    /// Combined pinch and rotation
149    PinchAndRotate,
150    /// Multi-finger tap
151    MultiTap,
152    /// Multi-finger swipe
153    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/// Gesture event types
171#[derive(Debug, Clone, Serialize, Deserialize)]
172pub enum GestureEvent {
173    /// Touch start event
174    TouchStart {
175        /// The touch points that started
176        touches: Vec<TouchPoint>,
177    },
178    /// Touch move event
179    TouchMove {
180        /// The touch points that moved
181        touches: Vec<TouchPoint>,
182    },
183    /// Touch end event
184    TouchEnd {
185        /// The touch points that ended
186        touches: Vec<TouchPoint>,
187    },
188    /// Gesture recognized event
189    GestureRecognized {
190        /// The recognized gesture state
191        gesture: MultiTouchState,
192    },
193    /// Gesture updated event
194    GestureUpdated {
195        /// The updated gesture state
196        gesture: MultiTouchState,
197    },
198    /// Gesture completed event
199    GestureCompleted {
200        /// The completed gesture state
201        gesture: MultiTouchState,
202    },
203}
204
205/// Gesture recognition result
206#[derive(Debug, Clone)]
207pub struct GestureResult {
208    /// Whether a gesture was recognized
209    pub recognized: bool,
210    /// The recognized gesture type
211    pub gesture_type: MultiTouchGestureType,
212    /// Gesture data
213    pub data: Option<MultiTouchState>,
214    /// Confidence level (0.0 to 1.0)
215    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
229/// Gesture handler trait for custom gesture implementations
230pub trait GestureHandler {
231    /// Handle gesture events
232    fn handle_gesture(&mut self, event: GestureEvent) -> GestureResult;
233
234    /// Check if gesture is active
235    fn is_active(&self) -> bool;
236
237    /// Reset gesture state
238    fn reset(&mut self);
239}
240
241pub use gesture_detector::GestureDetector;
242/// Re-export commonly used types
243pub use multi_touch::MultiTouchGestureDetector;
244
245// Re-export simplified gesture API (new public API)
246pub use simplified_gesture_api::{
247    SimplifiedGestureBounds, SimplifiedGestureConfig, SimplifiedGestureData,
248    SimplifiedGestureDetector, SimplifiedGestureResult, SimplifiedGestureType, SimplifiedVector2D,
249};
250
251// Include simplified gesture tests
252#[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// Include the gesture animation TDD tests
263// #[cfg(test)]
264// mod gesture_animation_tdd_tests; // Disabled due to Leptos/web_sys API conflicts