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);
218 virtual void touchEvent(QTouchEvent *event);
222 void onEnabledChanged();
225 void touchEvent_absent(QTouchEvent *event);
226 void touchEvent_undecided(QTouchEvent *event);
227 void touchEvent_recognized(QTouchEvent *event);
228 bool pointInsideAllowedArea()
const;
229 bool movingInRightDirection()
const;
230 bool movedFarEnough(
const QPointF &point)
const;
231 const QTouchEvent::TouchPoint *fetchTargetTouchPoint(QTouchEvent *event);
232 void setStatus(Status newStatus);
233 void setPreviousPos(
const QPointF &point);
234 void setPreviousScenePos(
const QPointF &point);
235 void updateVelocityCalculator(
const QPointF &point);
236 bool isWithinTouchCompositionWindow();
237 void updateSceneDirectionVector();
240 qreal projectOntoDirectionVector(
const QPointF &sceneVector)
const;
245 QPointF m_startScenePos;
246 QPointF m_previousPos;
247 QPointF m_previousScenePos;
248 qreal m_sceneDistance;
253 DampedPointF m_dampedScenePos;
254 QPointF m_previousDampedScenePos;
257 QPointF m_sceneDirectionVector;
259 Direction::Type m_direction;
260 qreal m_wideningAngle;
261 qreal m_wideningFactor;
262 qreal m_distanceThreshold;
263 qreal m_distanceThresholdSquared;
265 int m_maxSilenceTime;
267 int m_compositionTime;
268 int m_numSamplesOnLastSpeedCheck;
269 UbuntuGestures::AbstractTimer *m_recognitionTimer;
270 AxisVelocityCalculator *m_velocityCalculator;
272 UbuntuGestures::SharedTimeSource m_timeSource;
275 struct ActiveTouchInfo {
276 ActiveTouchInfo() : id(-1), startTime(-1) {}
277 bool isValid()
const {
return id != -1; }
278 void reset() {
id = -1; }
282 class ActiveTouchesInfo {
284 ActiveTouchesInfo(
const UbuntuGestures::SharedTimeSource &timeSource);
285 void update(QTouchEvent *event);
286 ActiveTouchInfo &touchInfo(
int id);
287 qint64 mostRecentStartTime();
288 UbuntuGestures::SharedTimeSource m_timeSource;
289 bool isEmpty()
const {
return m_lastUsedIndex == -1; }
291 void addTouchPoint(
const QTouchEvent::TouchPoint &touchPoint);
292 ActiveTouchInfo &getEmptySlot();
293 void freeSlot(
int index);
294 void removeTouchPoint(
const QTouchEvent::TouchPoint &touchPoint);
295 QVector<struct ActiveTouchInfo> m_vector;
300 #endif // DIRECTIONAL_DRAG_AREA_H