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_ 147