Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmacgesturerecognizer.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6#include "qgesture.h"
7#include "qgesture_p.h"
8#include "qevent.h"
9#include "qwidget.h"
10#include "qdebug.h"
11#include <QtCore/qcoreapplication.h>
12
13#ifndef QT_NO_GESTURES
14
16
17QMacSwipeGestureRecognizer::QMacSwipeGestureRecognizer()
18{
19}
20
21QGesture *QMacSwipeGestureRecognizer::create(QObject * /*target*/)
22{
23 return new QSwipeGesture;
24}
25
26QGestureRecognizer::Result
27QMacSwipeGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *event)
28{
29 if (event->type() == QEvent::NativeGesture && obj->isWidgetType()) {
30 QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
31 switch (ev->gestureType()) {
32 case Qt::SwipeNativeGesture: {
33 QSwipeGesture *g = static_cast<QSwipeGesture *>(gesture);
34 g->setSwipeAngle(ev->value());
35 g->setHotSpot(ev->globalPosition());
36 return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint;
37 break; }
38 default:
39 break;
40 }
41 }
42
43 return QGestureRecognizer::Ignore;
44}
45
46void QMacSwipeGestureRecognizer::reset(QGesture *gesture)
47{
48 QSwipeGesture *g = static_cast<QSwipeGesture *>(gesture);
49 g->setSwipeAngle(0);
50 QGestureRecognizer::reset(gesture);
51}
52
53////////////////////////////////////////////////////////////////////////
54
58
59QGesture *QMacPinchGestureRecognizer::create(QObject * /*target*/)
60{
61 return new QPinchGesture;
62}
63
64QGestureRecognizer::Result
65QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *event)
66{
67 if (event->type() == QEvent::NativeGesture && obj->isWidgetType()) {
68 QPinchGesture *g = static_cast<QPinchGesture *>(gesture);
69 QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
70 switch (ev->gestureType()) {
71 case Qt::BeginNativeGesture:
72 reset(gesture);
73 g->setStartCenterPoint(static_cast<QWidget*>(obj)->mapFromGlobal(ev->globalPosition().toPoint()));
74 g->setCenterPoint(g->startCenterPoint());
75 g->setChangeFlags(QPinchGesture::CenterPointChanged);
76 g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
77 g->setHotSpot(ev->globalPosition());
78 return QGestureRecognizer::MayBeGesture | QGestureRecognizer::ConsumeEventHint;
79 case Qt::RotateNativeGesture:
80 g->setLastScaleFactor(g->scaleFactor());
81 g->setLastRotationAngle(g->rotationAngle());
82 g->setRotationAngle(g->rotationAngle() + ev->value());
83 g->setChangeFlags(QPinchGesture::RotationAngleChanged);
84 g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
85 g->setHotSpot(ev->globalPosition());
86 return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
87 case Qt::ZoomNativeGesture:
88 g->setLastScaleFactor(g->scaleFactor());
89 g->setLastRotationAngle(g->rotationAngle());
90 g->setScaleFactor(1 + ev->value());
91 g->setTotalScaleFactor(g->totalScaleFactor() * g->scaleFactor());
92 g->setChangeFlags(QPinchGesture::ScaleFactorChanged);
93 g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
94 g->setHotSpot(ev->globalPosition());
95 return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
96 case Qt::SmartZoomNativeGesture:
97 g->setLastScaleFactor(g->scaleFactor());
98 g->setLastRotationAngle(g->rotationAngle());
99 g->setScaleFactor(ev->value() ? 1.7f : 1.0f);
100 g->setChangeFlags(QPinchGesture::ScaleFactorChanged);
101 g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags());
102 g->setHotSpot(ev->globalPosition());
103 return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
104 case Qt::EndNativeGesture:
105 return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint;
106 default:
107 break;
108 }
109 }
110
111 return QGestureRecognizer::Ignore;
112}
113
114void QMacPinchGestureRecognizer::reset(QGesture *gesture)
115{
116 QPinchGesture *g = static_cast<QPinchGesture *>(gesture);
117 g->setChangeFlags({});
118 g->setTotalChangeFlags({});
119 g->setScaleFactor(1.0f);
120 g->setTotalScaleFactor(1.0f);
121 g->setLastScaleFactor(1.0f);
122 g->setRotationAngle(0.0f);
123 g->setTotalRotationAngle(0.0f);
124 g->setLastRotationAngle(0.0f);
125 g->setCenterPoint(QPointF());
126 g->setStartCenterPoint(QPointF());
127 g->setLastCenterPoint(QPointF());
128 QGestureRecognizer::reset(gesture);
129}
130
131////////////////////////////////////////////////////////////////////////
132
133QMacPanGestureRecognizer::QMacPanGestureRecognizer() : _panCanceled(true)
134{
135}
136
137QGesture *QMacPanGestureRecognizer::create(QObject *target)
138{
139 if (!target)
140 return new QPanGesture;
141
142 if (QWidget *w = qobject_cast<QWidget *>(target)) {
143 w->setAttribute(Qt::WA_AcceptTouchEvents);
144 w->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
145 return new QPanGesture;
146 }
147 return nullptr;
148}
149
151{
152 if (ev->timerId() == _panTimer.timerId()) {
153 if (_panTimer.isActive())
154 _panTimer.stop();
155 if (_target)
156 QCoreApplication::sendEvent(_target, ev);
157 }
158}
159
160QGestureRecognizer::Result
161QMacPanGestureRecognizer::recognize(QGesture *gesture, QObject *target, QEvent *event)
162{
163 const int panBeginDelay = 300;
164 const int panBeginRadius = 3;
165
166 QPanGesture *g = static_cast<QPanGesture *>(gesture);
167
168 switch (event->type()) {
169 case QEvent::TouchBegin: {
170 const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
171 if (ev->points().size() == 1) {
172 reset(gesture);
173 _startPos = QCursor::pos();
174 _target = target;
175 _panTimer.start(panBeginDelay, this);
176 _panCanceled = false;
177 return QGestureRecognizer::MayBeGesture;
178 }
179 break;}
180 case QEvent::TouchEnd: {
181 if (_panCanceled)
182 break;
183
184 const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
185 if (ev->points().size() == 1)
186 return QGestureRecognizer::FinishGesture;
187 break;}
188 case QEvent::TouchUpdate: {
189 if (_panCanceled)
190 break;
191
192 const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
193 if (ev->points().size() == 1) {
194 if (_panTimer.isActive()) {
195 // INVARIANT: Still in maybeGesture. Check if the user
196 // moved his finger so much that it makes sense to cancel the pan:
197 const QPointF p = QCursor::pos();
198 if ((p - _startPos).manhattanLength() > panBeginRadius) {
199 _panCanceled = true;
200 _panTimer.stop();
201 return QGestureRecognizer::CancelGesture;
202 }
203 } else {
204 const QPointF p = QCursor::pos();
205 const QPointF posOffset = p - _startPos;
206 g->setLastOffset(g->offset());
207 g->setOffset(QPointF(posOffset.x(), posOffset.y()));
208 g->setHotSpot(_startPos);
209 return QGestureRecognizer::TriggerGesture;
210 }
211 } else if (_panTimer.isActive()) {
212 // I only want to cancel the pan if the user is pressing
213 // more than one finger, and the pan hasn't started yet:
214 _panCanceled = true;
215 _panTimer.stop();
216 return QGestureRecognizer::CancelGesture;
217 }
218 break;}
219 case QEvent::Timer: {
220 QTimerEvent *ev = static_cast<QTimerEvent *>(event);
221 if (ev->timerId() == _panTimer.timerId()) {
222 if (_panCanceled)
223 break;
224 // Begin new pan session!
225 _startPos = QCursor::pos();
226 g->setHotSpot(_startPos);
227 return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint;
228 }
229 break; }
230 default:
231 break;
232 }
233
234 return QGestureRecognizer::Ignore;
235}
236
237void QMacPanGestureRecognizer::reset(QGesture *gesture)
238{
239 QPanGesture *g = static_cast<QPanGesture *>(gesture);
240 _startPos = QPointF();
241 _panCanceled = true;
242 _panTimer.stop();
243 g->setOffset(QPointF(0, 0));
244 g->setLastOffset(QPointF(0, 0));
245 g->setAcceleration(qreal(1));
246 QGestureRecognizer::reset(gesture);
247}
248
249QT_END_NAMESPACE
250
251#endif // QT_NO_GESTURES
void reset(QGesture *gesture) override
This function is called by Qt to reset a given gesture.
QGesture * create(QObject *target) override
This function is called by Qt to create a new QGesture object for the given target (QWidget or QGraph...
void timerEvent(QTimerEvent *ev) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
void reset(QGesture *gesture) override
This function is called by Qt to reset a given gesture.
QGesture * create(QObject *target) override
This function is called by Qt to create a new QGesture object for the given target (QWidget or QGraph...
\inmodule QtCore\reentrant
Definition qpoint.h:231