17 #ifndef DIRECTIONAL_DRAG_AREA_H
18 #define DIRECTIONAL_DRAG_AREA_H
20 #include <QtQuick/QQuickItem>
21 #include "AxisVelocityCalculator.h"
22 #include "UbuntuGesturesGlobal.h"
24 #include "Direction.h"
26 namespace UbuntuGestures {
28 class UBUNTUGESTURES_EXPORT AbstractTimer :
public QObject {
31 AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
32 virtual int interval()
const = 0;
33 virtual void setInterval(
int msecs) = 0;
34 virtual void start() { m_isRunning =
true; };
35 virtual void stop() { m_isRunning =
false; }
36 bool isRunning()
const {
return m_isRunning; }
53 class UBUNTUGESTURES_EXPORT DirectionalDragArea :
public QQuickItem {
57 Q_PROPERTY(Direction::Type direction READ direction WRITE setDirection NOTIFY directionChanged)
61 Q_PROPERTY(qreal distance READ distance NOTIFY distanceChanged)
65 Q_PROPERTY(qreal sceneDistance READ sceneDistance NOTIFY sceneDistanceChanged)
68 Q_PROPERTY(qreal touchX READ touchX NOTIFY touchXChanged)
69 Q_PROPERTY(qreal touchY READ touchY NOTIFY touchYChanged)
72 Q_PROPERTY(qreal touchSceneX READ touchSceneX NOTIFY touchSceneXChanged)
73 Q_PROPERTY(qreal touchSceneY READ touchSceneY NOTIFY touchSceneYChanged)
76 Q_PROPERTY(Status status READ status NOTIFY statusChanged)
81 Q_PROPERTY(
bool dragging READ dragging NOTIFY draggingChanged)
91 Q_PROPERTY(qreal maxDeviation READ maxDeviation WRITE setMaxDeviation NOTIFY maxDeviationChanged)
97 Q_PROPERTY(qreal wideningAngle READ wideningAngle WRITE setWideningAngle
98 NOTIFY wideningAngleChanged)
102 Q_PROPERTY(qreal distanceThreshold READ distanceThreshold WRITE setDistanceThreshold
103 NOTIFY distanceThresholdChanged)
108 Q_PROPERTY(qreal minSpeed READ minSpeed WRITE setMinSpeed NOTIFY minSpeedChanged)
117 Q_PROPERTY(
int maxSilenceTime READ maxSilenceTime
118 WRITE setMaxSilenceTime
119 NOTIFY maxSilenceTimeChanged)
127 Q_PROPERTY(
int compositionTime READ compositionTime
128 WRITE setCompositionTime
129 NOTIFY compositionTimeChanged)
134 DirectionalDragArea(QQuickItem *parent = 0);
136 Direction::Type direction() const;
137 void setDirection(Direction::Type);
159 Status status()
const {
return m_status; }
161 qreal distance()
const;
162 qreal sceneDistance()
const;
163 void updateSceneDistance();
165 qreal touchX()
const;
166 qreal touchY()
const;
168 qreal touchSceneX()
const;
169 qreal touchSceneY()
const;
171 bool dragging()
const {
return (m_status == Undecided) || (m_status == Recognized); }
173 qreal maxDeviation()
const {
return m_dampedScenePos.maxDelta(); }
174 void setMaxDeviation(qreal value);
176 qreal wideningAngle()
const;
177 void setWideningAngle(qreal value);
179 qreal distanceThreshold()
const {
return m_distanceThreshold; }
180 void setDistanceThreshold(qreal value);
182 qreal minSpeed()
const {
return m_minSpeed; }
183 void setMinSpeed(qreal value);
185 int maxSilenceTime()
const {
return m_maxSilenceTime; }
186 void setMaxSilenceTime(
int value);
188 int compositionTime()
const {
return m_compositionTime; }
189 void setCompositionTime(
int value);
194 void setRecognitionTimer(UbuntuGestures::AbstractTimer *timer);
197 void setTimeSource(
const UbuntuGestures::SharedTimeSource &timeSource);
200 void directionChanged(Direction::Type direction);
201 void statusChanged(Status value);
202 void draggingChanged(
bool value);
203 void distanceChanged(qreal value);
204 void sceneDistanceChanged(qreal value);
205 void maxDeviationChanged(qreal value);
206 void wideningAngleChanged(qreal value);
207 void distanceThresholdChanged(qreal value);
208 void minSpeedChanged(qreal value);
209 void maxSilenceTimeChanged(
int value);
210 void compositionTimeChanged(
int value);
211 void touchXChanged(qreal value);
212 void touchYChanged(qreal value);
213 void touchSceneXChanged(qreal value);
214 void touchSceneYChanged(qreal value);
217 virtual void touchEvent(QTouchEvent *event);
221 void onEnabledChanged();
224 void touchEvent_absent(QTouchEvent *event);
225 void touchEvent_undecided(QTouchEvent *event);
226 void touchEvent_recognized(QTouchEvent *event);
227 bool pointInsideAllowedArea()
const;
228 bool movingInRightDirection()
const;
229 bool movedFarEnough(
const QPointF &point)
const;
230 const QTouchEvent::TouchPoint *fetchTargetTouchPoint(QTouchEvent *event);
231 void setStatus(Status newStatus);
232 void setPreviousPos(
const QPointF &point);
233 void setPreviousScenePos(
const QPointF &point);
234 void updateVelocityCalculator(
const QPointF &point);
235 bool isWithinTouchCompositionWindow();
236 void updateSceneDirectionVector();
239 qreal projectOntoDirectionVector(
const QPointF &sceneVector)
const;
244 QPointF m_startScenePos;
245 QPointF m_previousPos;
246 QPointF m_previousScenePos;
247 qreal m_sceneDistance;
252 DampedPointF m_dampedScenePos;
253 QPointF m_previousDampedScenePos;
256 QPointF m_sceneDirectionVector;
258 Direction::Type m_direction;
259 qreal m_wideningAngle;
260 qreal m_wideningFactor;
261 qreal m_distanceThreshold;
262 qreal m_distanceThresholdSquared;
264 int m_maxSilenceTime;
266 int m_compositionTime;
267 int m_numSamplesOnLastSpeedCheck;
268 UbuntuGestures::AbstractTimer *m_recognitionTimer;
269 AxisVelocityCalculator *m_velocityCalculator;
271 UbuntuGestures::SharedTimeSource m_timeSource;
274 struct ActiveTouchInfo {
275 ActiveTouchInfo() : id(-1), startTime(-1) {}
276 bool isValid()
const {
return id != -1; }
277 void reset() {
id = -1; }
281 class ActiveTouchesInfo {
283 ActiveTouchesInfo(
const UbuntuGestures::SharedTimeSource &timeSource);
284 void update(QTouchEvent *event);
285 ActiveTouchInfo &touchInfo(
int id);
286 qint64 mostRecentStartTime();
287 UbuntuGestures::SharedTimeSource m_timeSource;
288 bool isEmpty()
const {
return m_lastUsedIndex == -1; }
290 void addTouchPoint(
const QTouchEvent::TouchPoint &touchPoint);
291 ActiveTouchInfo &getEmptySlot();
292 void freeSlot(
int index);
293 void removeTouchPoint(
const QTouchEvent::TouchPoint &touchPoint);
294 QVector<struct ActiveTouchInfo> m_vector;
299 #endif // DIRECTIONAL_DRAG_AREA_H