qskinny/src/controls/QskGestureRecognizer.h

106 lines
2.8 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_GESTURE_RECOGNIZER_H
#define QSK_GESTURE_RECOGNIZER_H
#include "QskGlobal.h"
#include <qobject.h>
#include <qnamespace.h>
#include <memory>
class QQuickItem;
class QEvent;
class QMouseEvent;
class QSK_EXPORT QskGestureRecognizer : public QObject
{
Q_OBJECT
Q_PROPERTY( State state READ state NOTIFY stateChanged )
Q_PROPERTY( QQuickItem* watchedItem READ watchedItem WRITE setWatchedItem )
Q_PROPERTY( QQuickItem* targetItem READ targetItem WRITE setTargetItem )
Q_PROPERTY( Qt::MouseButtons acceptedMouseButtons
READ acceptedMouseButtons WRITE setAcceptedMouseButtons )
Q_PROPERTY( int timeout READ timeout WRITE setTimeout )
using Inherited = QObject;
public:
enum State : quint8
{
Idle,
Pending,
Accepted
};
Q_ENUM( State )
QskGestureRecognizer( QObject* parent = nullptr );
~QskGestureRecognizer() override;
bool eventFilter( QObject*, QEvent* ) override;
// the item where the gesture happens
void setWatchedItem( QQuickItem* );
QQuickItem* watchedItem() const;
// the item processing the gesture events
void setTargetItem( QQuickItem* );
QQuickItem* targetItem() const;
// Qt::NoButton means: all buttons accepted
void setAcceptedMouseButtons( Qt::MouseButtons );
Qt::MouseButtons acceptedMouseButtons() const;
void setRejectOnTimeout( bool );
bool rejectOnTimeout() const;
void setTimeout( int );
int timeout() const;
// timestamp, when the Idle state had been left
quint64 timestampStarted() const;
void reject();
void accept();
void abort();
State state() const;
virtual bool isAcceptedPos( const QPointF& ) const;
Q_SIGNALS:
void stateChanged( State from, State to );
protected:
void timerEvent( QTimerEvent* ) override;
/*
This API works for single-touch gestures and multi-touch gestures,
that can be translated to single positions ( f.e 2 finger swipes ).
Once we support more complex inputs ( f.e pinch gesture ) we need to
make substantial adjustments here.
*/
virtual void processPress( const QPointF&, quint64 timestamp, bool isFinal );
virtual void processMove( const QPointF&, quint64 timestamp );
virtual void processRelease( const QPointF&, quint64 timestamp );
private:
bool maybeGesture( const QQuickItem*, const QEvent* );
bool processMouseEvent( const QQuickItem*, const QMouseEvent* );
void setState( State );
void reset();
class PrivateData;
std::unique_ptr< PrivateData > m_data;
};
#endif