| Index: views/touchui/gesture_recognizer.h
|
| diff --git a/views/touchui/gesture_recognizer.h b/views/touchui/gesture_recognizer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2879b002894923e02b1064dfaa2544bf593c715a
|
| --- /dev/null
|
| +++ b/views/touchui/gesture_recognizer.h
|
| @@ -0,0 +1,134 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef VIEWS_TOUCHUI_GESTURE_RECOGNIZER_H_
|
| +#define VIEWS_TOUCHUI_GESTURE_RECOGNIZER_H_
|
| +#pragma once
|
| +
|
| +#include <map>
|
| +#include <vector>
|
| +
|
| +#include "ui/gfx/point.h"
|
| +#include "views/view.h"
|
| +
|
| +namespace ui {
|
| +enum EventType;
|
| +}
|
| +
|
| +namespace views {
|
| +class TouchEvent;
|
| +class GestureEvent;
|
| +
|
| +// A GestureRecognizer recognizes gestures frome touch sequences.
|
| +//
|
| +class VIEWS_EXPORT GestureRecognizer {
|
| + public:
|
| + // Gesture state.
|
| + enum GestureState {
|
| + GS_NO_GESTURE,
|
| + GS_PENDING_SYNTHETIC_CLICK,
|
| + GS_SCROLL,
|
| + };
|
| +
|
| + // Touch state.
|
| + enum TouchState {
|
| + TS_RELEASED,
|
| + TS_PRESSED,
|
| + TS_MOVED,
|
| + TS_STATIONARY,
|
| + TS_CANCELLED,
|
| + TS_UNKNOWN,
|
| + };
|
| +
|
| + // List of GestureEvent*
|
| + typedef std::vector<GestureEvent* > Gestures;
|
| + typedef bool (GestureRecognizer::*GestureTransitionFunction)(
|
| + const TouchEvent&, Gestures*);
|
| +
|
| + GestureRecognizer();
|
| + virtual ~GestureRecognizer();
|
| +
|
| + // Invoked for each touch event that could contribute to the current gesture.
|
| + // Returns list of zero or more GestureEvents identified after processing
|
| + // TouchEvent.
|
| + // Caller would be responsible for freeing up Gestures.
|
| + virtual Gestures* ProcessTouchEventForGesture(const TouchEvent& event,
|
| + bool touch_handled);
|
| +
|
| + // Clears the GestureRecognizer to it's initial state.
|
| + virtual void Reset();
|
| +
|
| + // Accessor function.
|
| + GestureState GetState() { return state_; }
|
| +
|
| + private:
|
| + // Get equivalent TouchState from EventType |type|
|
| + // This is required in order to fit TouchState in 3 bits of Signature.
|
| + static TouchState TouchEventTypeToTouchState(ui::EventType type);
|
| +
|
| + // Create a 32 bit signature to identify GestureTransitionFunction.
|
| + static unsigned int Signature(GestureState state,
|
| + unsigned int touch_id, ui::EventType type,
|
| + bool touch_handled);
|
| +
|
| + // Creates a map of Singnatures and corresponding GestureTransitionFunction.
|
| + void AddEdgeFunction(GestureState state,
|
| + unsigned int touch_id,
|
| + ui::EventType type,
|
| + bool touch_handled,
|
| + GestureTransitionFunction function);
|
| +
|
| + // Various statistical functions to manipulate gestures.
|
| + bool IsInClickTimeWindow();
|
| + bool IsInSecondClickTimeWindow();
|
| + bool IsInsideManhattanSquare(const TouchEvent& event);
|
| + bool IsSecondClickInsideManhattanSquare(const TouchEvent& event);
|
| + bool IsOverMinFlickSpeed();
|
| +
|
| + // Functions to be called to add GestureEvents, after succesful recognition.
|
| + void AppendTapDownGestureEvent(const TouchEvent& event, Gestures* gestures);
|
| + void AppendClickGestureEvent(const TouchEvent& event, Gestures* gestures);
|
| + void AppendDoubleClickGestureEvent(const TouchEvent& event,
|
| + Gestures* gestures);
|
| + void AppendScrollGestureBegin(const TouchEvent& event, Gestures* gestures);
|
| + void AppendScrollGestureEnd(const TouchEvent& event,
|
| + Gestures* gestures,
|
| + float x_velocity, float y_velocity);
|
| + void AppendScrollGestureUpdate(const TouchEvent& event, Gestures* gestures);
|
| +
|
| + void UpdateValues(const TouchEvent& event);
|
| + void SetState(const GestureState state ) { state_ = state; }
|
| +
|
| + // Various GestureTransitionFunctions for a signature.
|
| + // There is, 1:many mapping from GestureTransitionFunction to Signature
|
| + // But a Signature have only one GestureTransitionFunction.
|
| + bool Click(const TouchEvent& event, Gestures* gestures);
|
| + bool IsClickOrScroll(const TouchEvent& event, Gestures* gestures);
|
| + bool InScroll(const TouchEvent& event, Gestures* gestures);
|
| + bool NoGesture(const TouchEvent& event, Gestures* gestures);
|
| + bool TouchDown(const TouchEvent& event, Gestures* gestures);
|
| + bool ScrollEnd(const TouchEvent& event, Gestures* gestures);
|
| +
|
| + typedef std::map<int, GestureTransitionFunction> GestureTransitionFunctionMap;
|
| + GestureTransitionFunctionMap edge_functions_;
|
| +
|
| + gfx::Point first_touch_position_;
|
| +
|
| + double first_touch_time_;
|
| + GestureState state_;
|
| +
|
| + double last_touch_time_;
|
| + double last_click_time_;
|
| + gfx::Point last_click_position_;
|
| + gfx::Point last_touch_position_;
|
| + float x_velocity_;
|
| + float y_velocity_;
|
| + int flags_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GestureRecognizer);
|
| +};
|
| +
|
| +} // namespace views
|
| +
|
| +#endif // VIEWS_TOUCHUI_GESTURE_RECOGNIZER_H_
|
|
|