]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/private/ktwofingerswipe.cpp
Fix icon resize animation
[dolphin.git] / src / kitemviews / private / ktwofingerswipe.cpp
1 /*
2 * SPDX-FileCopyrightText: 2020 Steffen Hartleib <steffenhartleib@t-online.de>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 // Self
8 #include "ktwofingerswipe.h"
9
10 // Qt
11 #include <QTouchEvent>
12 #include <QLineF>
13
14 KTwoFingerSwipeRecognizer::KTwoFingerSwipeRecognizer() :
15 QGestureRecognizer(),
16 m_touchBeginnTimestamp(0),
17 m_gestureAlreadyTriggered(false)
18 {
19 }
20
21 KTwoFingerSwipeRecognizer::~KTwoFingerSwipeRecognizer()
22 {
23 }
24
25 QGesture* KTwoFingerSwipeRecognizer::create(QObject*)
26 {
27 return static_cast<QGesture*>(new KTwoFingerSwipe());
28 }
29
30 QGestureRecognizer::Result KTwoFingerSwipeRecognizer::recognize(QGesture* gesture, QObject* watched, QEvent* event)
31 {
32 Q_UNUSED(watched)
33
34 KTwoFingerSwipe* const kTwoFingerSwipe = static_cast<KTwoFingerSwipe*>(gesture);
35 const QTouchEvent* touchEvent = static_cast<const QTouchEvent*>(event);
36
37 const int maxTimeFrameForSwipe = 90;
38 const int minDistanceForSwipe = 30;
39
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());
48 return MayBeGesture;
49 }
50
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());
61
62 if (touchEvent->touchPoints().size() > 2) {
63 return CancelGesture;
64 }
65
66 if (touchEvent->touchPoints().size() == 2) {
67 if ((elapsedTime) > maxTimeFrameForSwipe) {
68 return CancelGesture;
69 }
70
71 if (distance.manhattanLength() >= minDistanceForSwipe &&
72 (elapsedTime) <= maxTimeFrameForSwipe && !m_gestureAlreadyTriggered) {
73 m_gestureAlreadyTriggered = true;
74 return FinishGesture;
75 } else if ((elapsedTime) <= maxTimeFrameForSwipe && !m_gestureAlreadyTriggered) {
76 return TriggerGesture;
77 }
78 }
79 break;
80 }
81
82 default:
83 return Ignore;
84 }
85 return Ignore;
86 }
87
88 KTwoFingerSwipe::KTwoFingerSwipe(QObject* parent) :
89 QGesture(parent),
90 m_pos(QPointF(-1, -1)),
91 m_screenPos(QPointF(-1, -1)),
92 m_scenePos(QPointF(-1, -1)),
93 m_swipeAngle(0.0)
94 {
95 }
96
97 KTwoFingerSwipe::~KTwoFingerSwipe()
98 {
99 }
100
101 QPointF KTwoFingerSwipe::pos() const
102 {
103 return m_pos;
104 }
105
106 void KTwoFingerSwipe::setPos(QPointF _pos)
107 {
108 m_pos = _pos;
109 }
110
111 QPointF KTwoFingerSwipe::screenPos() const
112 {
113 return m_screenPos;
114 }
115
116 void KTwoFingerSwipe::setScreenPos(QPointF _screenPos)
117 {
118 m_screenPos = _screenPos;
119 }
120
121 QPointF KTwoFingerSwipe::scenePos() const
122 {
123 return m_scenePos;
124 }
125
126 void KTwoFingerSwipe::setScenePos(QPointF _scenePos)
127 {
128 m_scenePos = _scenePos;
129 }
130
131 qreal KTwoFingerSwipe::swipeAngle() const
132 {
133 return m_swipeAngle;
134 }
135 void KTwoFingerSwipe::setSwipeAngle(qreal _swipeAngle)
136 {
137 m_swipeAngle = _swipeAngle;
138 }
139