1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DETAILS_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DETAILS_H_
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/event_constants.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/events_base_export.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/rect.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/rect_conversions.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace ui {
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct EVENTS_BASE_EXPORT GestureEventDetails {
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GestureEventDetails();
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GestureEventDetails(EventType type, float delta_x, float delta_y);
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EventType type() const { return type_; }
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int touch_points() const { return touch_points_; }
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void set_touch_points(int touch_points) {
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK_GT(touch_points, 0);
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    touch_points_ = touch_points;
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TODO(tdresser): Return RectF. See crbug.com/337824.
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const gfx::Rect bounding_box() const {
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return ToEnclosingRect(bounding_box_);
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const gfx::RectF& bounding_box_f() const {
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return bounding_box_;
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_bounding_box(const gfx::RectF& box) { bounding_box_ = box; }
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float scroll_x_hint() const {
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SCROLL_BEGIN, type_);
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.scroll_begin.x_hint;
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float scroll_y_hint() const {
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SCROLL_BEGIN, type_);
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.scroll_begin.y_hint;
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float scroll_x() const {
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SCROLL_UPDATE, type_);
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.scroll_update.x;
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float scroll_y() const {
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SCROLL_UPDATE, type_);
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.scroll_update.y;
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float velocity_x() const {
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_SCROLL_FLING_START, type_);
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return data.fling_velocity.x;
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float velocity_y() const {
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_SCROLL_FLING_START, type_);
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return data.fling_velocity.y;
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float first_finger_width() const {
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_TWO_FINGER_TAP, type_);
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.first_finger_enclosing_rectangle.width;
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float first_finger_height() const {
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_TWO_FINGER_TAP, type_);
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.first_finger_enclosing_rectangle.height;
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float scale() const {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_PINCH_UPDATE, type_);
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.scale;
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool swipe_left() const {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SWIPE, type_);
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.swipe.left;
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool swipe_right() const {
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SWIPE, type_);
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.swipe.right;
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool swipe_up() const {
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SWIPE, type_);
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.swipe.up;
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool swipe_down() const {
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ET_GESTURE_SWIPE, type_);
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.swipe.down;
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int tap_count() const {
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(type_ == ET_GESTURE_TAP ||
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           type_ == ET_GESTURE_TAP_UNCONFIRMED ||
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch           type_ == ET_GESTURE_DOUBLE_TAP);
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return data.tap_count;
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void set_tap_count(int tap_count) {
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK_GE(tap_count, 0);
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(type_ == ET_GESTURE_TAP ||
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           type_ == ET_GESTURE_TAP_UNCONFIRMED ||
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           type_ == ET_GESTURE_DOUBLE_TAP);
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    data.tap_count = tap_count;
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EventType type_;
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  union Details {
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    Details();
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    struct {  // SCROLL start details.
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      // Distance that caused the scroll to start.  Generally redundant with
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      // the x/y values from the first scroll_update.
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float x_hint;
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float y_hint;
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } scroll_begin;
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    struct {  // SCROLL delta.
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float x;
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float y;
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } scroll_update;
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    float scale;  // PINCH scale.
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    struct {  // FLING velocity.
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float x;
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float y;
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } fling_velocity;
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Dimensions of the first finger's enclosing rectangle for
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // TWO_FINGER_TAP.
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    struct {
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float width;
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      float height;
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } first_finger_enclosing_rectangle;
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    struct {  // SWIPE direction.
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      bool left;
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      bool right;
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      bool up;
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      bool down;
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } swipe;
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Tap information must be set for ET_GESTURE_TAP,
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // ET_GESTURE_TAP_UNCONFIRMED, and ET_GESTURE_DOUBLE_TAP events.
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int tap_count;  // TAP repeat count.
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } data;
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int touch_points_;  // Number of active touch points in the gesture.
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Bounding box is an axis-aligned rectangle that contains all the
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // enclosing rectangles of the touch-points in the gesture.
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::RectF bounding_box_;
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace ui
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DETAILS_H_
172