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_POINT_H_ | |
6 #define UI_EVENTS_GESTURES_GESTURE_POINT_H_ | |
7 | |
8 #include "base/basictypes.h" | |
9 #include "ui/events/gestures/velocity_calculator.h" | |
10 #include "ui/gfx/point.h" | |
11 #include "ui/gfx/rect.h" | |
12 | |
13 namespace ui { | |
14 class TouchEvent; | |
15 | |
16 // A GesturePoint represents a single touch-point/finger during a gesture | |
17 // recognition process. | |
18 class GesturePoint { | |
19 public: | |
20 GesturePoint(); | |
21 ~GesturePoint(); | |
22 | |
23 // Resets various states. | |
24 void Reset(); | |
25 | |
26 void ResetVelocity(); | |
27 | |
28 // Updates some states when a Tap gesture has been recognized for this point. | |
29 void UpdateForTap(); | |
30 | |
31 // Updates some states when a Scroll gesture has been recognized for this | |
32 // point. | |
33 void UpdateForScroll(); | |
34 | |
35 // Updates states depending on the event and the gesture-state. | |
36 void UpdateValues(const TouchEvent& event); | |
37 | |
38 // Responds according to the state of the gesture point (i.e. the point can | |
39 // represent a click or scroll etc.) | |
40 bool IsInClickWindow(const TouchEvent& event) const; | |
41 bool IsInDoubleClickWindow(const TouchEvent& event) const; | |
42 bool IsInTripleClickWindow(const TouchEvent& event) const; | |
43 bool IsInFlickWindow(const TouchEvent& event); | |
44 bool IsInHorizontalRailWindow() const; | |
45 bool IsInVerticalRailWindow() const; | |
46 bool IsInsideTouchSlopRegion(const TouchEvent& event) const; | |
47 bool IsInScrollWindow(const TouchEvent& event) const; | |
48 bool BreaksHorizontalRail(); | |
49 bool BreaksVerticalRail(); | |
50 bool DidScroll(const TouchEvent& event, int distance) const; | |
51 | |
52 const gfx::PointF& first_touch_position() const { | |
53 return first_touch_position_; | |
54 } | |
55 | |
56 double last_touch_time() const { return last_touch_time_; } | |
57 const gfx::PointF& last_touch_position() const { | |
58 return last_touch_position_; | |
59 } | |
60 float x() const { return last_touch_position_.x(); } | |
61 float y() const { return last_touch_position_.y(); } | |
62 | |
63 // point_id_ is used to drive GestureSequence::ProcessTouchEventForGesture. | |
64 // point_ids are maintained such that the set of point_ids is always | |
65 // contiguous, from 0 to the number of current touches. | |
66 // A lower point_id indicates that a touch occurred first. | |
67 // A negative point_id indicates that the GesturePoint is not currently | |
68 // associated with a touch. | |
69 void set_point_id(int point_id) { point_id_ = point_id; } | |
70 int point_id() const { return point_id_; } | |
71 | |
72 void set_touch_id(int touch_id) { touch_id_ = touch_id; } | |
73 int touch_id() const { return touch_id_; } | |
74 | |
75 bool in_use() const { return point_id_ >= 0; } | |
76 | |
77 gfx::Vector2dF ScrollDelta() const; | |
78 | |
79 float XVelocity() { return velocity_calculator_.XVelocity(); } | |
80 float YVelocity() { return velocity_calculator_.YVelocity(); } | |
81 | |
82 const gfx::RectF& enclosing_rectangle() const { return enclosing_rect_; } | |
83 | |
84 void set_source_device_id(int source_device_id) { | |
85 source_device_id_ = source_device_id; | |
86 } | |
87 int source_device_id() const { return source_device_id_; } | |
88 | |
89 private: | |
90 // Various statistical functions to manipulate gestures. | |
91 | |
92 bool IsInClickTimeWindow() const; | |
93 bool IsInClickAggregateTimeWindow(double before, double after) const; | |
94 bool IsPointInsideDoubleTapTouchSlopRegion( | |
95 gfx::PointF p1, gfx::PointF p2) const; | |
96 bool IsOverMinFlickSpeed(); | |
97 | |
98 // Returns -1, 0, 1 for |v| below the negative velocity threshold, | |
99 // in [-threshold, threshold] or above respectively. | |
100 int ScrollVelocityDirection(float v); | |
101 | |
102 // The enclosing rectangle represents a rectangular touch region generated | |
103 // by a sequence of ET_TOUCH_PRESSED, ET_TOUCH_MOVED, and ET_TOUCH_RELEASED | |
104 // events forming a GESTURE_TAP event. The enclosing rectangle is updated | |
105 // to be the union of the touch data from each of these events. It is | |
106 // cleared on a ET_TOUCH_PRESSED event (i.e., at the beginning of a possible | |
107 // GESTURE_TAP event) or when Reset is called. | |
108 void UpdateEnclosingRectangle(const TouchEvent& event); | |
109 void clear_enclosing_rectangle() { enclosing_rect_ = gfx::RectF(); } | |
110 | |
111 // The position of the first touchdown event. | |
112 gfx::PointF first_touch_position_; | |
113 double first_touch_time_; | |
114 | |
115 gfx::PointF second_last_touch_position_; | |
116 double second_last_touch_time_; | |
117 | |
118 gfx::PointF last_touch_position_; | |
119 double last_touch_time_; | |
120 | |
121 double second_last_tap_time_; | |
122 gfx::PointF second_last_tap_position_; | |
123 | |
124 double last_tap_time_; | |
125 gfx::PointF last_tap_position_; | |
126 | |
127 VelocityCalculator velocity_calculator_; | |
128 | |
129 int point_id_; | |
130 int touch_id_; | |
131 | |
132 // Represents the rectangle that encloses the circles/ellipses | |
133 // generated by a sequence of touch events | |
134 gfx::RectF enclosing_rect_; | |
135 | |
136 int source_device_id_; | |
137 | |
138 float max_touch_move_in_pixels_for_click_squared_; | |
139 float max_distance_between_taps_for_double_tap_squared_; | |
140 | |
141 DISALLOW_COPY_AND_ASSIGN(GesturePoint); | |
142 }; | |
143 | |
144 } // namespace ui | |
145 | |
146 #endif // UI_EVENTS_GESTURES_GESTURE_POINT_H_ | |
OLD | NEW |