2 * SPDX-FileCopyrightText: 2020 Steffen Hartleib <steffenhartleib@t-online.de>
4 * SPDX-License-Identifier: GPL-2.0-or-later
8 #include "ktwofingerswipe.h"
11 #include <QTouchEvent>
14 KTwoFingerSwipeRecognizer::KTwoFingerSwipeRecognizer() :
16 m_touchBeginnTimestamp(0),
17 m_gestureAlreadyTriggered(false)
21 KTwoFingerSwipeRecognizer::~KTwoFingerSwipeRecognizer()
25 QGesture
* KTwoFingerSwipeRecognizer::create(QObject
*)
27 return static_cast<QGesture
*>(new KTwoFingerSwipe());
30 QGestureRecognizer::Result
KTwoFingerSwipeRecognizer::recognize(QGesture
* gesture
, QObject
* watched
, QEvent
* event
)
34 KTwoFingerSwipe
* const kTwoFingerSwipe
= static_cast<KTwoFingerSwipe
*>(gesture
);
35 const QTouchEvent
* touchEvent
= static_cast<const QTouchEvent
*>(event
);
37 const int maxTimeFrameForSwipe
= 90;
38 const int minDistanceForSwipe
= 30;
40 switch (event
->type()) {
41 case QEvent::TouchBegin
: {
42 m_touchBeginnTimestamp
= touchEvent
->timestamp();
43 m_gestureAlreadyTriggered
= false;
44 kTwoFingerSwipe
->setHotSpot(touchEvent
->touchPoints().first().startScreenPos());
45 kTwoFingerSwipe
->setPos(touchEvent
->touchPoints().first().startPos());
46 kTwoFingerSwipe
->setScreenPos(touchEvent
->touchPoints().first().startScreenPos());
47 kTwoFingerSwipe
->setScenePos(touchEvent
->touchPoints().first().startScenePos());
51 case QEvent::TouchUpdate
: {
52 const qint64 now
= touchEvent
->timestamp();
53 const qint64 elapsedTime
= now
- m_touchBeginnTimestamp
;
54 const QPointF distance
= touchEvent
->touchPoints().first().startPos() - touchEvent
->touchPoints().first().pos();
55 kTwoFingerSwipe
->setHotSpot(touchEvent
->touchPoints().first().startScreenPos());
56 kTwoFingerSwipe
->setPos(touchEvent
->touchPoints().first().startPos());
57 kTwoFingerSwipe
->setScreenPos(touchEvent
->touchPoints().first().startScreenPos());
58 kTwoFingerSwipe
->setScenePos(touchEvent
->touchPoints().first().startScenePos());
59 const QLineF ql
= QLineF(touchEvent
->touchPoints().first().startPos(), touchEvent
->touchPoints().first().pos());
60 kTwoFingerSwipe
->setSwipeAngle(ql
.angle());
62 if (touchEvent
->touchPoints().size() > 2) {
66 if (touchEvent
->touchPoints().size() == 2) {
67 if ((elapsedTime
) > maxTimeFrameForSwipe
) {
71 if (distance
.manhattanLength() >= minDistanceForSwipe
&&
72 (elapsedTime
) <= maxTimeFrameForSwipe
&& !m_gestureAlreadyTriggered
) {
73 m_gestureAlreadyTriggered
= true;
75 } else if ((elapsedTime
) <= maxTimeFrameForSwipe
&& !m_gestureAlreadyTriggered
) {
76 return TriggerGesture
;
88 KTwoFingerSwipe::KTwoFingerSwipe(QObject
* parent
) :
90 m_pos(QPointF(-1, -1)),
91 m_screenPos(QPointF(-1, -1)),
92 m_scenePos(QPointF(-1, -1)),
97 KTwoFingerSwipe::~KTwoFingerSwipe()
101 QPointF
KTwoFingerSwipe::pos() const
106 void KTwoFingerSwipe::setPos(QPointF _pos
)
111 QPointF
KTwoFingerSwipe::screenPos() const
116 void KTwoFingerSwipe::setScreenPos(QPointF _screenPos
)
118 m_screenPos
= _screenPos
;
121 QPointF
KTwoFingerSwipe::scenePos() const
126 void KTwoFingerSwipe::setScenePos(QPointF _scenePos
)
128 m_scenePos
= _scenePos
;
131 qreal
KTwoFingerSwipe::swipeAngle() const
135 void KTwoFingerSwipe::setSwipeAngle(qreal _swipeAngle
)
137 m_swipeAngle
= _swipeAngle
;