blob: 1a3737091f57c272964c8afa714ec1bd3b7f6a36 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtQuick module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QQUICKEVENTS_P_P_H
#define QQUICKEVENTS_P_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <private/qtquickglobal_p.h>
#include <qqml.h>
#include <QtCore/qobject.h>
#include <QtCore/qpointer.h>
#include <QtGui/qvector2d.h>
#include <QtGui/qevent.h>
#include <QtGui/qkeysequence.h>
#include <QtQuick/qquickitem.h>
QT_BEGIN_NAMESPACE
class QQuickPointerDevice;
class QQuickPointerEvent;
class QQuickPointerMouseEvent;
#if QT_CONFIG(gestures)
class QQuickPointerNativeGestureEvent;
#endif
class QQuickPointerScrollEvent;
class QQuickPointerTabletEvent;
class QQuickPointerTouchEvent;
class QQuickPointerHandler;
class QQuickKeyEvent : public QObject
{
Q_OBJECT
Q_PROPERTY(int key READ key CONSTANT)
Q_PROPERTY(QString text READ text CONSTANT)
Q_PROPERTY(int modifiers READ modifiers CONSTANT)
Q_PROPERTY(bool isAutoRepeat READ isAutoRepeat CONSTANT)
Q_PROPERTY(int count READ count CONSTANT)
Q_PROPERTY(quint32 nativeScanCode READ nativeScanCode CONSTANT)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
public:
QQuickKeyEvent()
: event(QEvent::None, 0, nullptr)
{}
void reset(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers,
const QString &text = QString(), bool autorep = false, ushort count = 1)
{
event = QKeyEvent(type, key, modifiers, text, autorep, count);
event.setAccepted(false);
}
void reset(const QKeyEvent &ke)
{
event = ke;
event.setAccepted(false);
}
int key() const { return event.key(); }
QString text() const { return event.text(); }
int modifiers() const { return event.modifiers(); }
bool isAutoRepeat() const { return event.isAutoRepeat(); }
int count() const { return event.count(); }
quint32 nativeScanCode() const { return event.nativeScanCode(); }
bool isAccepted() { return event.isAccepted(); }
void setAccepted(bool accepted) { event.setAccepted(accepted); }
#if QT_CONFIG(shortcut)
Q_REVISION(2) Q_INVOKABLE bool matches(QKeySequence::StandardKey key) const { return event.matches(key); }
#endif
private:
QKeyEvent event;
};
// used in Qt Location
class Q_QUICK_PRIVATE_EXPORT QQuickMouseEvent : public QObject
{
Q_OBJECT
Q_PROPERTY(qreal x READ x CONSTANT)
Q_PROPERTY(qreal y READ y CONSTANT)
Q_PROPERTY(int button READ button CONSTANT)
Q_PROPERTY(int buttons READ buttons CONSTANT)
Q_PROPERTY(int modifiers READ modifiers CONSTANT)
Q_PROPERTY(int source READ source CONSTANT REVISION 7)
Q_PROPERTY(bool wasHeld READ wasHeld CONSTANT)
Q_PROPERTY(bool isClick READ isClick CONSTANT)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
Q_PROPERTY(int flags READ flags CONSTANT REVISION 11)
public:
QQuickMouseEvent()
: _buttons(Qt::NoButton), _modifiers(Qt::NoModifier)
, _wasHeld(false), _isClick(false), _accepted(false)
, _flags(Qt::MouseEventFlags(nullptr))
{}
void reset(qreal x, qreal y, Qt::MouseButton button, Qt::MouseButtons buttons,
Qt::KeyboardModifiers modifiers, bool isClick = false, bool wasHeld = false,
Qt::MouseEventFlags flags = nullptr)
{
_x = x;
_y = y;
_button = button;
_buttons = buttons;
_modifiers = modifiers;
_source = Qt::MouseEventNotSynthesized;
_wasHeld = wasHeld;
_isClick = isClick;
_accepted = true;
_flags = flags;
}
qreal x() const { return _x; }
qreal y() const { return _y; }
int button() const { return _button; }
int buttons() const { return _buttons; }
int modifiers() const { return _modifiers; }
int source() const { return _source; }
bool wasHeld() const { return _wasHeld; }
bool isClick() const { return _isClick; }
// only for internal usage
void setX(qreal x) { _x = x; }
void setY(qreal y) { _y = y; }
void setPosition(const QPointF &point) { _x = point.x(); _y = point.y(); }
void setSource(Qt::MouseEventSource s) { _source = s; }
bool isAccepted() { return _accepted; }
void setAccepted(bool accepted) { _accepted = accepted; }
int flags() const { return _flags; }
private:
qreal _x = 0;
qreal _y = 0;
Qt::MouseButton _button = Qt::NoButton;
Qt::MouseButtons _buttons;
Qt::KeyboardModifiers _modifiers;
Qt::MouseEventSource _source = Qt::MouseEventNotSynthesized;
bool _wasHeld : 1;
bool _isClick : 1;
bool _accepted : 1;
Qt::MouseEventFlags _flags;
};
class QQuickWheelEvent : public QObject
{
Q_OBJECT
Q_PROPERTY(qreal x READ x CONSTANT)
Q_PROPERTY(qreal y READ y CONSTANT)
Q_PROPERTY(QPoint angleDelta READ angleDelta CONSTANT)
Q_PROPERTY(QPoint pixelDelta READ pixelDelta CONSTANT)
Q_PROPERTY(int buttons READ buttons CONSTANT)
Q_PROPERTY(int modifiers READ modifiers CONSTANT)
Q_PROPERTY(bool inverted READ inverted CONSTANT)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
public:
QQuickWheelEvent()
: _buttons(Qt::NoButton), _modifiers(Qt::NoModifier)
{}
void reset(qreal x, qreal y, const QPoint &angleDelta, const QPoint &pixelDelta,
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, bool inverted)
{
_x = x;
_y = y;
_angleDelta = angleDelta;
_pixelDelta = pixelDelta;
_buttons = buttons;
_modifiers = modifiers;
_accepted = true;
_inverted = inverted;
}
qreal x() const { return _x; }
qreal y() const { return _y; }
QPoint angleDelta() const { return _angleDelta; }
QPoint pixelDelta() const { return _pixelDelta; }
int buttons() const { return _buttons; }
int modifiers() const { return _modifiers; }
bool inverted() const { return _inverted; }
bool isAccepted() { return _accepted; }
void setAccepted(bool accepted) { _accepted = accepted; }
private:
qreal _x = 0;
qreal _y = 0;
QPoint _angleDelta;
QPoint _pixelDelta;
Qt::MouseButtons _buttons;
Qt::KeyboardModifiers _modifiers;
bool _inverted = false;
bool _accepted = false;
};
class Q_QUICK_PRIVATE_EXPORT QQuickCloseEvent : public QObject
{
Q_OBJECT
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
public:
QQuickCloseEvent() {}
bool isAccepted() { return _accepted; }
void setAccepted(bool accepted) { _accepted = accepted; }
private:
bool _accepted = true;
};
class Q_QUICK_PRIVATE_EXPORT QQuickEventPoint : public QObject
{
Q_OBJECT
Q_PROPERTY(QQuickPointerEvent *event READ pointerEvent CONSTANT)
Q_PROPERTY(QPointF position READ position CONSTANT)
Q_PROPERTY(QPointF scenePosition READ scenePosition CONSTANT)
Q_PROPERTY(QPointF scenePressPosition READ scenePressPosition CONSTANT)
Q_PROPERTY(QPointF sceneGrabPosition READ sceneGrabPosition CONSTANT)
Q_PROPERTY(State state READ state CONSTANT)
Q_PROPERTY(int pointId READ pointId CONSTANT)
Q_PROPERTY(qreal timeHeld READ timeHeld CONSTANT)
Q_PROPERTY(QVector2D velocity READ velocity CONSTANT)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
Q_PROPERTY(QObject *exclusiveGrabber READ exclusiveGrabber WRITE setExclusiveGrabber)
public:
enum State {
Pressed = Qt::TouchPointPressed,
Updated = Qt::TouchPointMoved,
Stationary = Qt::TouchPointStationary,
Released = Qt::TouchPointReleased
};
Q_DECLARE_FLAGS(States, State)
Q_FLAG(States)
enum GrabTransition {
GrabPassive = 0x01,
UngrabPassive = 0x02,
CancelGrabPassive = 0x03,
OverrideGrabPassive = 0x04,
GrabExclusive = 0x10,
UngrabExclusive = 0x20,
CancelGrabExclusive = 0x30,
};
Q_ENUM(GrabTransition)
QQuickEventPoint(QQuickPointerEvent *parent);
void reset(Qt::TouchPointState state, const QPointF &scenePosition, int pointId, ulong timestamp, const QVector2D &velocity = QVector2D());
void localizePosition(QQuickItem *target);
QQuickPointerEvent *pointerEvent() const;
QPointF position() const { return m_pos; }
QPointF scenePosition() const { return m_scenePos; }
QPointF scenePressPosition() const { return m_scenePressPos; }
QPointF sceneGrabPosition() const { return m_sceneGrabPos; }
QVector2D velocity() const { return m_velocity; }
State state() const { return m_state; }
int pointId() const { return m_pointId; }
qreal timeHeld() const { return (m_timestamp - m_pressTimestamp) / 1000.0; }
bool isAccepted() const { return m_accept; }
void setAccepted(bool accepted = true);
QObject *exclusiveGrabber() const;
void setExclusiveGrabber(QObject *exclusiveGrabber);
QQuickItem *grabberItem() const;
void setGrabberItem(QQuickItem *exclusiveGrabber);
QQuickPointerHandler *grabberPointerHandler() const;
void setGrabberPointerHandler(QQuickPointerHandler *exclusiveGrabber, bool exclusive = false);
void cancelExclusiveGrab();
void cancelPassiveGrab(QQuickPointerHandler *handler);
bool removePassiveGrabber(QQuickPointerHandler *handler);
void cancelAllGrabs(QQuickPointerHandler *handler);
QVector<QPointer <QQuickPointerHandler> > passiveGrabbers() const { return m_passiveGrabbers; }
void setPassiveGrabbers(const QVector<QPointer <QQuickPointerHandler> > &grabbers) { m_passiveGrabbers = grabbers; }
void clearPassiveGrabbers() { m_passiveGrabbers.clear(); }
protected:
void cancelExclusiveGrabImpl(QTouchEvent *cancelEvent = nullptr);
private:
QVector2D estimatedVelocity() const;
protected:
QPointF m_pos;
QPointF m_scenePos;
QPointF m_scenePressPos;
QPointF m_sceneGrabPos;
QVector2D m_velocity;
int m_pointId;
QPointer<QObject> m_exclusiveGrabber;
QVector<QPointer <QQuickPointerHandler> > m_passiveGrabbers;
ulong m_timestamp;
ulong m_pressTimestamp;
State m_state;
bool m_accept : 1;
bool m_grabberIsHandler : 1;
int m_reserved : 29;
friend class QQuickPointerTouchEvent;
friend class QQuickWindowPrivate;
Q_DISABLE_COPY(QQuickEventPoint)
};
class Q_QUICK_PRIVATE_EXPORT QQuickEventTouchPoint : public QQuickEventPoint
{
Q_OBJECT
Q_PROPERTY(qreal rotation READ rotation)
Q_PROPERTY(qreal pressure READ pressure)
Q_PROPERTY(QSizeF ellipseDiameters READ ellipseDiameters)
Q_PROPERTY(QPointingDeviceUniqueId uniqueId READ uniqueId)
public:
QQuickEventTouchPoint(QQuickPointerTouchEvent *parent);
void reset(const QTouchEvent::TouchPoint &tp, ulong timestamp);
qreal rotation() const { return m_rotation; }
qreal pressure() const { return m_pressure; }
QSizeF ellipseDiameters() const { return m_ellipseDiameters; }
QPointingDeviceUniqueId uniqueId() const { return m_uniqueId; }
private:
qreal m_rotation;
qreal m_pressure;
QSizeF m_ellipseDiameters;
QPointingDeviceUniqueId m_uniqueId;
friend class QQuickPointerTouchEvent;
Q_DISABLE_COPY(QQuickEventTouchPoint)
};
class Q_QUICK_PRIVATE_EXPORT QQuickPointerEvent : public QObject
{
Q_OBJECT
Q_PROPERTY(QQuickPointerDevice *device READ device CONSTANT)
Q_PROPERTY(Qt::KeyboardModifiers modifiers READ modifiers CONSTANT)
Q_PROPERTY(Qt::MouseButtons button READ button CONSTANT)
Q_PROPERTY(Qt::MouseButtons buttons READ buttons CONSTANT)
public:
QQuickPointerEvent(QObject *parent = nullptr, QQuickPointerDevice *device = nullptr)
: QObject(parent)
, m_device(device)
, m_pressedButtons(Qt::NoButton)
{}
~QQuickPointerEvent() override;
public: // property accessors
QQuickPointerDevice *device() const { return m_device; }
Qt::KeyboardModifiers modifiers() const { return m_event ? m_event->modifiers() : Qt::NoModifier; }
Qt::MouseButton button() const { return m_button; }
Qt::MouseButtons buttons() const { return m_pressedButtons; }
public: // helpers for C++ only (during event delivery)
virtual QQuickPointerEvent *reset(QEvent *ev) = 0;
virtual void localize(QQuickItem *target) = 0;
virtual bool isPressEvent() const = 0;
virtual bool isDoubleClickEvent() const { return false; }
virtual bool isUpdateEvent() const = 0;
virtual bool isReleaseEvent() const = 0;
virtual QQuickPointerMouseEvent *asPointerMouseEvent() { return nullptr; }
virtual QQuickPointerTouchEvent *asPointerTouchEvent() { return nullptr; }
virtual QQuickPointerTabletEvent *asPointerTabletEvent() { return nullptr; }
#if QT_CONFIG(gestures)
virtual QQuickPointerNativeGestureEvent *asPointerNativeGestureEvent() { return nullptr; }
#endif
virtual QQuickPointerScrollEvent *asPointerScrollEvent() { return nullptr; }
virtual const QQuickPointerMouseEvent *asPointerMouseEvent() const { return nullptr; }
virtual const QQuickPointerTouchEvent *asPointerTouchEvent() const { return nullptr; }
virtual const QQuickPointerTabletEvent *asPointerTabletEvent() const { return nullptr; }
#if QT_CONFIG(gestures)
virtual const QQuickPointerNativeGestureEvent *asPointerNativeGestureEvent() const { return nullptr; }
#endif
virtual const QQuickPointerScrollEvent *asPointerScrollEvent() const { return nullptr; }
virtual bool allPointsAccepted() const = 0;
virtual bool allUpdatedPointsAccepted() const = 0;
virtual bool allPointsGrabbed() const = 0;
bool isAccepted() { return m_event ? m_event->isAccepted() : false; }
void setAccepted(bool accepted) { if (m_event) m_event->setAccepted(accepted); }
QVector<QPointF> unacceptedPressedPointScenePositions() const;
virtual int pointCount() const = 0;
virtual QQuickEventPoint *point(int i) const = 0;
virtual QQuickEventPoint *pointById(int pointId) const = 0;
virtual QVector<QObject *> exclusiveGrabbers() const = 0;
virtual void clearGrabbers() const = 0;
virtual bool hasExclusiveGrabber(const QQuickPointerHandler *handler) const = 0;
ulong timestamp() const { return m_event ? m_event->timestamp() : 0; }
protected:
QQuickPointerDevice *m_device;
QInputEvent *m_event = nullptr; // original event as received by QQuickWindow
Qt::MouseButton m_button = Qt::NoButton;
Qt::MouseButtons m_pressedButtons;
friend class QQuickWindowPrivate;
Q_DISABLE_COPY(QQuickPointerEvent)
};
class Q_QUICK_PRIVATE_EXPORT QQuickSinglePointEvent : public QQuickPointerEvent
{
Q_OBJECT
public:
QQuickSinglePointEvent(QObject *parent = nullptr, QQuickPointerDevice *device = nullptr)
: QQuickPointerEvent(parent, device), m_point(new QQuickEventPoint(this)) { }
void localize(QQuickItem *target) override;
int pointCount() const override { return 1; }
QQuickEventPoint *point(int i) const override;
QQuickEventPoint *pointById(int pointId) const override;
bool allPointsAccepted() const override;
bool allUpdatedPointsAccepted() const override;
bool allPointsGrabbed() const override;
QVector<QObject *> exclusiveGrabbers() const override;
void clearGrabbers() const override;
bool hasExclusiveGrabber(const QQuickPointerHandler *handler) const override;
protected:
QQuickEventPoint *m_point;
Q_DISABLE_COPY(QQuickSinglePointEvent)
};
class Q_QUICK_PRIVATE_EXPORT QQuickPointerMouseEvent : public QQuickSinglePointEvent
{
Q_OBJECT
public:
QQuickPointerMouseEvent(QObject *parent = nullptr, QQuickPointerDevice *device = nullptr)
: QQuickSinglePointEvent(parent, device) { }
QQuickPointerEvent *reset(QEvent *) override;
bool isPressEvent() const override;
bool isDoubleClickEvent() const override;
bool isUpdateEvent() const override;
bool isReleaseEvent() const override;
QQuickPointerMouseEvent *asPointerMouseEvent() override { return this; }
const QQuickPointerMouseEvent *asPointerMouseEvent() const override { return this; }
QMouseEvent *asMouseEvent(const QPointF& localPos) const;
Q_DISABLE_COPY(QQuickPointerMouseEvent)
};
class Q_QUICK_PRIVATE_EXPORT QQuickPointerTouchEvent : public QQuickPointerEvent
{
Q_OBJECT
public:
QQuickPointerTouchEvent(QObject *parent = nullptr, QQuickPointerDevice *device = nullptr)
: QQuickPointerEvent(parent, device)
, m_synthMouseEvent(QEvent::MouseMove, QPointF(), Qt::NoButton, Qt::NoButton, Qt::NoModifier)
{}
QQuickPointerEvent *reset(QEvent *) override;
void localize(QQuickItem *target) override;
bool isPressEvent() const override;
bool isUpdateEvent() const override;
bool isReleaseEvent() const override;
QQuickPointerTouchEvent *asPointerTouchEvent() override { return this; }
const QQuickPointerTouchEvent *asPointerTouchEvent() const override { return this; }
int pointCount() const override { return m_pointCount; }
QQuickEventPoint *point(int i) const override;
QQuickEventPoint *pointById(int pointId) const override;
const QTouchEvent::TouchPoint *touchPointById(int pointId) const;
bool allPointsAccepted() const override;
bool allUpdatedPointsAccepted() const override;
bool allPointsGrabbed() const override;
QVector<QObject *> exclusiveGrabbers() const override;
void clearGrabbers() const override;
bool hasExclusiveGrabber(const QQuickPointerHandler *handler) const override;
QMouseEvent *syntheticMouseEvent(int pointID, QQuickItem *relativeTo) const;
QTouchEvent *touchEventForItem(QQuickItem *item, bool isFiltering = false) const;
QTouchEvent *asTouchEvent() const;
private:
Qt::TouchPointStates touchPointStates() const;
int m_pointCount = 0;
QVector<QQuickEventTouchPoint *> m_touchPoints;
mutable QMouseEvent m_synthMouseEvent;
Q_DISABLE_COPY(QQuickPointerTouchEvent)
};
#if QT_CONFIG(gestures)
class Q_QUICK_PRIVATE_EXPORT QQuickPointerNativeGestureEvent : public QQuickSinglePointEvent
{
Q_OBJECT
Q_PROPERTY(Qt::NativeGestureType type READ type CONSTANT)
Q_PROPERTY(qreal value READ value CONSTANT)
public:
QQuickPointerNativeGestureEvent(QObject *parent = nullptr, QQuickPointerDevice *device = nullptr)
: QQuickSinglePointEvent(parent, device) { }
QQuickPointerEvent *reset(QEvent *) override;
bool isPressEvent() const override;
bool isUpdateEvent() const override;
bool isReleaseEvent() const override;
QQuickPointerNativeGestureEvent *asPointerNativeGestureEvent() override { return this; }
const QQuickPointerNativeGestureEvent *asPointerNativeGestureEvent() const override { return this; }
Qt::NativeGestureType type() const;
qreal value() const;
Q_DISABLE_COPY(QQuickPointerNativeGestureEvent)
};
#endif // QT_CONFIG(gestures)
class Q_QUICK_PRIVATE_EXPORT QQuickPointerScrollEvent : public QQuickSinglePointEvent
{
Q_OBJECT
Q_PROPERTY(QVector2D angleDelta READ angleDelta CONSTANT)
Q_PROPERTY(QVector2D pixelDelta READ pixelDelta CONSTANT)
Q_PROPERTY(bool hasAngleDelta READ hasAngleDelta CONSTANT)
Q_PROPERTY(bool hasPixelDelta READ hasPixelDelta CONSTANT)
Q_PROPERTY(bool inverted READ isInverted CONSTANT)
public:
QQuickPointerScrollEvent(QObject *parent = nullptr, QQuickPointerDevice *device = nullptr)
: QQuickSinglePointEvent(parent, device) { }
QQuickPointerEvent *reset(QEvent *) override;
void localize(QQuickItem *target) override;
bool isPressEvent() const override;
bool isUpdateEvent() const override;
bool isReleaseEvent() const override;
QQuickPointerScrollEvent *asPointerScrollEvent() override { return this; }
const QQuickPointerScrollEvent *asPointerScrollEvent() const override { return this; }
QVector2D angleDelta() const { return m_angleDelta; }
QVector2D pixelDelta() const { return m_pixelDelta; }
bool hasAngleDelta() const { return !angleDelta().isNull(); }
bool hasPixelDelta() const { return !pixelDelta().isNull(); }
bool isInverted() const { return m_inverted; }
Qt::ScrollPhase phase() const { return m_phase; }
private:
// TODO add QQuickPointerDevice source() whenever QInputEvent is extended to have a source device
// then maybe Qt::MouseEventSource synthSource() will be obsolete... that's why it's not public now
Qt::MouseEventSource synthSource() const { return m_synthSource; }
private:
QVector2D m_angleDelta;
QVector2D m_pixelDelta;
Qt::ScrollPhase m_phase = Qt::NoScrollPhase;
Qt::MouseEventSource m_synthSource = Qt::MouseEventNotSynthesized;
bool m_inverted = false;
friend class QQuickWindowPrivate;
friend class QQuickWheelHandler;
Q_DISABLE_COPY(QQuickPointerScrollEvent)
};
// ### Qt 6: move this to qtbase, replace QTouchDevice and the enums in QTabletEvent
class Q_QUICK_PRIVATE_EXPORT QQuickPointerDevice : public QObject
{
Q_OBJECT
Q_PROPERTY(DeviceType type READ type CONSTANT)
Q_PROPERTY(PointerType pointerType READ pointerType CONSTANT)
Q_PROPERTY(Capabilities capabilities READ capabilities CONSTANT)
Q_PROPERTY(int maximumTouchPoints READ maximumTouchPoints CONSTANT)
Q_PROPERTY(int buttonCount READ buttonCount CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QPointingDeviceUniqueId uniqueId READ uniqueId CONSTANT)
public:
enum DeviceType : qint16 {
UnknownDevice = 0x0000,
Mouse = 0x0001,
TouchScreen = 0x0002,
TouchPad = 0x0004,
Puck = 0x0008,
Stylus = 0x0010,
Airbrush = 0x0020,
AllDevices = 0x7FFF
};
Q_DECLARE_FLAGS(DeviceTypes, DeviceType)
Q_FLAG(DeviceTypes)
enum PointerType : qint16 {
GenericPointer = 0x0001,
Finger = 0x0002,
Pen = 0x0004,
Eraser = 0x0008,
Cursor = 0x0010,
AllPointerTypes = 0x7FFF
};
Q_DECLARE_FLAGS(PointerTypes, PointerType)
Q_FLAG(PointerTypes)
enum CapabilityFlag : qint16 {
Position = QTouchDevice::Position,
Area = QTouchDevice::Area,
Pressure = QTouchDevice::Pressure,
Velocity = QTouchDevice::Velocity,
MouseEmulation = QTouchDevice::MouseEmulation,
// some bits reserved in case we need more of QTouchDevice::Capabilities
Scroll = 0x0100, // mouse has a wheel, or there is OS-level scroll gesture recognition (dubious?)
Hover = 0x0200,
Rotation = 0x0400,
XTilt = 0x0800,
YTilt = 0x1000
};
Q_DECLARE_FLAGS(Capabilities, CapabilityFlag)
Q_FLAG(Capabilities)
DeviceType type() const { return m_deviceType; }
PointerType pointerType() const { return m_pointerType; }
Capabilities capabilities() const { return static_cast<Capabilities>(m_capabilities); }
bool hasCapability(CapabilityFlag cap) { return m_capabilities & cap; }
int maximumTouchPoints() const { return m_maximumTouchPoints; }
int buttonCount() const { return m_buttonCount; }
QString name() const { return m_name; }
QPointingDeviceUniqueId uniqueId() const { return m_uniqueId; }
const QTouchDevice *qTouchDevice() const;
static QQuickPointerDevice *touchDevice(const QTouchDevice *d);
static QList<QQuickPointerDevice *> touchDevices();
static QQuickPointerDevice *genericMouseDevice();
static QQuickPointerDevice *tabletDevice(qint64);
QVector<QQuickPointerHandler *> &eventDeliveryTargets() { return m_eventDeliveryTargets; }
private:
QQuickPointerDevice(DeviceType devType, PointerType pType, Capabilities caps, int maxPoints, int buttonCount, const QString &name, qint64 uniqueId = 0)
: m_deviceType(devType), m_pointerType(pType), m_capabilities(static_cast<qint16>(caps))
, m_maximumTouchPoints(static_cast<qint8>(maxPoints)), m_buttonCount(static_cast<qint8>(buttonCount)), m_name(name)
, m_uniqueId(QPointingDeviceUniqueId::fromNumericId(uniqueId))
{
}
~QQuickPointerDevice() override { }
private:
// begin 64-bit field
DeviceType m_deviceType;
PointerType m_pointerType;
qint16 m_capabilities;
qint8 m_maximumTouchPoints;
qint8 m_buttonCount;
// end 64-bit field
QString m_name;
QPointingDeviceUniqueId m_uniqueId;
QVector<QQuickPointerHandler *> m_eventDeliveryTargets; // during delivery, handlers which have already seen the event
Q_DISABLE_COPY(QQuickPointerDevice)
friend struct ConstructableQQuickPointerDevice;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickPointerDevice::DeviceTypes)
Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickPointerDevice::PointerTypes)
Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickPointerDevice::Capabilities)
Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug, const QQuickPointerDevice *);
Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug, const QQuickPointerEvent *);
Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug, const QQuickEventPoint *);
//Q_QUICK_PRIVATE_EXPORT QDebug operator<<(QDebug, const QQuickEventTouchPoint *); TODO maybe
QT_END_NAMESPACE
QML_DECLARE_TYPE(QQuickKeyEvent)
QML_DECLARE_TYPE(QQuickMouseEvent)
QML_DECLARE_TYPE(QQuickWheelEvent)
QML_DECLARE_TYPE(QQuickCloseEvent)
QML_DECLARE_TYPE(QQuickPointerDevice)
QML_DECLARE_TYPE(QPointingDeviceUniqueId)
QML_DECLARE_TYPE(QQuickPointerEvent)
Q_DECLARE_METATYPE(QQuickEventPoint::GrabTransition)
#endif // QQUICKEVENTS_P_P_H