OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef UI_EVENTS_GESTURES_GESTURE_SEQUENCE_H_ | |
6 #define UI_EVENTS_GESTURES_GESTURE_SEQUENCE_H_ | |
7 | |
8 #include "base/timer/timer.h" | |
9 #include "ui/events/event_constants.h" | |
10 #include "ui/events/gesture_event_details.h" | |
11 #include "ui/events/gestures/gesture_point.h" | |
12 #include "ui/events/gestures/gesture_recognizer.h" | |
13 #include "ui/gfx/rect.h" | |
14 | |
15 namespace ui { | |
16 class TouchEvent; | |
17 class GestureEvent; | |
18 | |
19 // Gesture state. | |
20 enum GestureState { | |
21 GS_NO_GESTURE, | |
22 GS_PENDING_SYNTHETIC_CLICK, | |
23 // One finger is down: tap could occur, but scroll cannot until the number of | |
24 // active touch points changes. | |
25 GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, | |
26 // One finger is down: no gestures can occur until the number of active touch | |
27 // points changes. | |
28 GS_SYNTHETIC_CLICK_ABORTED, | |
29 GS_SCROLL, | |
30 GS_PINCH, | |
31 GS_PENDING_TWO_FINGER_TAP, | |
32 GS_PENDING_TWO_FINGER_TAP_NO_PINCH, | |
33 GS_PENDING_PINCH, | |
34 GS_PENDING_PINCH_NO_PINCH, | |
35 }; | |
36 | |
37 enum ScrollType { | |
38 ST_FREE, | |
39 ST_HORIZONTAL, | |
40 ST_VERTICAL, | |
41 }; | |
42 | |
43 enum IsFirstScroll { | |
44 FS_FIRST_SCROLL, | |
45 FS_NOT_FIRST_SCROLL, | |
46 }; | |
47 | |
48 // Delegates dispatch of gesture events for which the GestureSequence does not | |
49 // have enough context to dispatch itself. | |
50 class EVENTS_EXPORT GestureSequenceDelegate { | |
51 public: | |
52 virtual void DispatchPostponedGestureEvent(GestureEvent* event) = 0; | |
53 | |
54 protected: | |
55 virtual ~GestureSequenceDelegate() {} | |
56 }; | |
57 | |
58 // A GestureSequence recognizes gestures from touch sequences. | |
59 class EVENTS_EXPORT GestureSequence { | |
60 public: | |
61 // Maximum number of points in a single gesture. | |
62 static const int kMaxGesturePoints = 12; | |
63 | |
64 explicit GestureSequence(GestureSequenceDelegate* delegate); | |
65 virtual ~GestureSequence(); | |
66 | |
67 typedef GestureRecognizer::Gestures Gestures; | |
68 | |
69 // Invoked for each touch event that could contribute to the current gesture. | |
70 // Returns list of zero or more GestureEvents identified after processing | |
71 // TouchEvent. | |
72 // Caller would be responsible for freeing up Gestures. | |
73 virtual Gestures* ProcessTouchEventForGesture(const TouchEvent& event, | |
74 EventResult status); | |
75 const GesturePoint* points() const { return points_; } | |
76 int point_count() const { return point_count_; } | |
77 | |
78 const gfx::PointF& last_touch_location() const { | |
79 return last_touch_location_; | |
80 } | |
81 | |
82 protected: | |
83 virtual base::OneShotTimer<GestureSequence>* CreateTimer(); | |
84 base::OneShotTimer<GestureSequence>* GetLongPressTimer(); | |
85 base::OneShotTimer<GestureSequence>* GetShowPressTimer(); | |
86 | |
87 private: | |
88 // Recreates the axis-aligned bounding box that contains all the touch-points | |
89 // at their most recent position. | |
90 void RecreateBoundingBox(); | |
91 | |
92 void ResetVelocities(); | |
93 | |
94 GesturePoint& GesturePointForEvent(const TouchEvent& event); | |
95 | |
96 // Do a linear scan through points_ to find the GesturePoint | |
97 // with id |point_id|. | |
98 GesturePoint* GetPointByPointId(int point_id); | |
99 | |
100 bool IsSecondTouchDownCloseEnoughForTwoFingerTap(); | |
101 | |
102 // Creates a gesture event with the specified parameters. The function | |
103 // includes some common information (e.g. number of touch-points in the | |
104 // gesture etc.) in the gesture event as well. | |
105 GestureEvent* CreateGestureEvent(const GestureEventDetails& details, | |
106 const gfx::PointF& location, | |
107 int flags, | |
108 base::Time timestamp, | |
109 int oldest_touch_id); | |
110 | |
111 // Functions to be called to add GestureEvents, after successful recognition. | |
112 | |
113 // Tap gestures. | |
114 void AppendTapDownGestureEvent(const GesturePoint& point, Gestures* gestures); | |
115 void PrependTapCancelGestureEvent(const GesturePoint& point, | |
116 Gestures* gestures); | |
117 void AppendBeginGestureEvent(const GesturePoint& point, Gestures* gestures); | |
118 void AppendEndGestureEvent(const GesturePoint& point, Gestures* gestures); | |
119 void AppendClickGestureEvent(const GesturePoint& point, | |
120 int tap_count, | |
121 Gestures* gestures); | |
122 void AppendDoubleClickGestureEvent(const GesturePoint& point, | |
123 Gestures* gestures); | |
124 void AppendLongPressGestureEvent(); | |
125 void AppendShowPressGestureEvent(); | |
126 void AppendLongTapGestureEvent(const GesturePoint& point, | |
127 Gestures* gestures); | |
128 | |
129 // Scroll gestures. | |
130 void AppendScrollGestureBegin(const GesturePoint& point, | |
131 const gfx::PointF& location, | |
132 Gestures* gestures); | |
133 void AppendScrollGestureEnd(const GesturePoint& point, | |
134 const gfx::PointF& location, | |
135 Gestures* gestures, | |
136 float x_velocity, | |
137 float y_velocity); | |
138 void AppendScrollGestureUpdate(GesturePoint& point, | |
139 Gestures* gestures, | |
140 IsFirstScroll is_first_scroll); | |
141 | |
142 // Pinch gestures. | |
143 void AppendPinchGestureBegin(const GesturePoint& p1, | |
144 const GesturePoint& p2, | |
145 Gestures* gestures); | |
146 void AppendPinchGestureEnd(const GesturePoint& p1, | |
147 const GesturePoint& p2, | |
148 float scale, | |
149 Gestures* gestures); | |
150 void AppendPinchGestureUpdate(const GesturePoint& point, | |
151 float scale, | |
152 Gestures* gestures); | |
153 void AppendSwipeGesture(const GesturePoint& point, | |
154 int swipe_x, | |
155 int swipe_y, | |
156 Gestures* gestures); | |
157 void AppendTwoFingerTapGestureEvent(Gestures* gestures); | |
158 | |
159 void set_state(const GestureState state) { state_ = state; } | |
160 | |
161 // Various GestureTransitionFunctions for a signature. | |
162 // There is, 1:many mapping from GestureTransitionFunction to Signature | |
163 // But a Signature have only one GestureTransitionFunction. | |
164 bool Click(const TouchEvent& event, | |
165 const GesturePoint& point, | |
166 Gestures* gestures); | |
167 bool ScrollStart(const TouchEvent& event, | |
168 GesturePoint& point, | |
169 Gestures* gestures); | |
170 void BreakRailScroll(const TouchEvent& event, | |
171 GesturePoint& point, | |
172 Gestures* gestures); | |
173 bool ScrollUpdate(const TouchEvent& event, | |
174 GesturePoint& point, | |
175 Gestures* gestures, | |
176 IsFirstScroll is_first_scroll); | |
177 bool TouchDown(const TouchEvent& event, | |
178 const GesturePoint& point, | |
179 Gestures* gestures); | |
180 bool TwoFingerTouchDown(const TouchEvent& event, | |
181 const GesturePoint& point, | |
182 Gestures* gestures); | |
183 bool TwoFingerTouchMove(const TouchEvent& event, | |
184 const GesturePoint& point, | |
185 Gestures* gestures); | |
186 bool TwoFingerTouchReleased(const TouchEvent& event, | |
187 const GesturePoint& point, | |
188 Gestures* gestures); | |
189 bool ScrollEnd(const TouchEvent& event, | |
190 GesturePoint& point, | |
191 Gestures* gestures); | |
192 bool PinchStart(const TouchEvent& event, | |
193 const GesturePoint& point, | |
194 Gestures* gestures); | |
195 bool PinchUpdate(const TouchEvent& event, | |
196 GesturePoint& point, | |
197 Gestures* gestures); | |
198 bool PinchEnd(const TouchEvent& event, | |
199 const GesturePoint& point, | |
200 Gestures* gestures); | |
201 bool MaybeSwipe(const TouchEvent& event, | |
202 const GesturePoint& point, | |
203 Gestures* gestures); | |
204 | |
205 void TwoFingerTapOrPinch(const TouchEvent& event, | |
206 const GesturePoint& point, | |
207 Gestures* gestures); | |
208 | |
209 void StopTimersIfRequired(const TouchEvent& event); | |
210 | |
211 void StartRailFreeScroll(const GesturePoint& point, Gestures* gestures); | |
212 | |
213 // Current state of gesture recognizer. | |
214 GestureState state_; | |
215 | |
216 // ui::EventFlags. | |
217 int flags_; | |
218 | |
219 // We maintain the smallest axis-aligned rectangle that contains all the | |
220 // current touch-points. This box is updated after every touch-event. | |
221 gfx::RectF bounding_box_; | |
222 | |
223 // The center of the bounding box used in the latest multi-finger scroll | |
224 // update gesture. | |
225 gfx::PointF latest_multi_scroll_update_location_; | |
226 | |
227 // The last scroll update prediction offset. This is removed from the scroll | |
228 // distance on the next update since the page has already been scrolled this | |
229 // distance. | |
230 gfx::Vector2dF last_scroll_prediction_offset_; | |
231 | |
232 // For pinch, the 'distance' represents the diagonal distance of | |
233 // |bounding_box_|. | |
234 | |
235 // The distance between the two points at PINCH_START. | |
236 float pinch_distance_start_; | |
237 | |
238 // This distance is updated after each PINCH_UPDATE. | |
239 float pinch_distance_current_; | |
240 | |
241 // This is the time when second touch down was received. Used for determining | |
242 // if a two finger double tap has happened. | |
243 base::TimeDelta second_touch_time_; | |
244 | |
245 ScrollType scroll_type_; | |
246 scoped_ptr<base::OneShotTimer<GestureSequence> > long_press_timer_; | |
247 scoped_ptr<base::OneShotTimer<GestureSequence> > show_press_timer_; | |
248 | |
249 GesturePoint points_[kMaxGesturePoints]; | |
250 int point_count_; | |
251 | |
252 // Location of the last touch event. | |
253 gfx::PointF last_touch_location_; | |
254 | |
255 GestureSequenceDelegate* delegate_; | |
256 | |
257 DISALLOW_COPY_AND_ASSIGN(GestureSequence); | |
258 }; | |
259 | |
260 } // namespace ui | |
261 | |
262 #endif // UI_EVENTS_GESTURES_GESTURE_SEQUENCE_H_ | |
OLD | NEW |