diff --git a/src/controls/QskGestureRecognizer.cpp b/src/controls/QskGestureRecognizer.cpp index 07a44f2d..b383730c 100644 --- a/src/controls/QskGestureRecognizer.cpp +++ b/src/controls/QskGestureRecognizer.cpp @@ -68,7 +68,8 @@ class QskGestureRecognizer::PrivateData return watchedItem->acceptedMouseButtons(); } - QQuickItem* watchedItem = nullptr; + QPointer< QQuickItem > watchedItem = nullptr; + QPointer< QQuickItem > targetItem = nullptr; QVector< QMouseEvent* > pendingEvents; @@ -121,6 +122,16 @@ QQuickItem* QskGestureRecognizer::watchedItem() const return m_data->watchedItem; } +void QskGestureRecognizer::setTargetItem( QQuickItem* item ) +{ + m_data->targetItem = item; +} + +QQuickItem* QskGestureRecognizer::targetItem() const +{ + return m_data->targetItem; +} + void QskGestureRecognizer::setAcceptedMouseButtons( Qt::MouseButtons buttons ) { m_data->buttons = buttons; diff --git a/src/controls/QskGestureRecognizer.h b/src/controls/QskGestureRecognizer.h index 012aa839..b34cd012 100644 --- a/src/controls/QskGestureRecognizer.h +++ b/src/controls/QskGestureRecognizer.h @@ -43,11 +43,16 @@ class QSK_EXPORT QskGestureRecognizer : public QObject QskGestureRecognizer( QObject* parent = nullptr ); ~QskGestureRecognizer() override; - bool eventFilter( QObject* object, QEvent* event) 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; diff --git a/src/controls/QskPanGestureRecognizer.cpp b/src/controls/QskPanGestureRecognizer.cpp index c103730d..859b8d91 100644 --- a/src/controls/QskPanGestureRecognizer.cpp +++ b/src/controls/QskPanGestureRecognizer.cpp @@ -61,9 +61,14 @@ static inline qreal qskAngle( } static void qskSendPanGestureEvent( - QQuickItem* item, QskGesture::State state, qreal velocity, qreal angle, - const QPointF& origin, const QPointF& lastPosition, const QPointF& position ) + QskGestureRecognizer* recognizer, QskGesture::State state, + qreal velocity, qreal angle, const QPointF& origin, + const QPointF& lastPosition, const QPointF& position ) { + auto item = recognizer->targetItem(); + if ( item == nullptr ) + item = recognizer->watchedItem(); + auto gesture = std::make_shared< QskPanGesture >(); gesture->setState( state ); @@ -244,12 +249,12 @@ void QskPanGestureRecognizer::processMove( const QPointF& pos, quint64 timestamp if ( started ) { - qskSendPanGestureEvent( watchedItem(), QskGesture::Started, + qskSendPanGestureEvent( this, QskGesture::Started, velocity, m_data->angle, m_data->origin, m_data->origin, m_data->pos ); } else { - qskSendPanGestureEvent( watchedItem(), QskGesture::Updated, + qskSendPanGestureEvent( this, QskGesture::Updated, velocity, m_data->angle, m_data->origin, oldPos, m_data->pos ); } } @@ -262,7 +267,7 @@ void QskPanGestureRecognizer::processRelease( const QPointF&, quint64 timestamp const ulong elapsedTotal = timestamp - timestampStarted(); const qreal velocity = m_data->velocityTracker.velocity( elapsedTotal ); - qskSendPanGestureEvent( watchedItem(), QskGesture::Finished, + qskSendPanGestureEvent( this, QskGesture::Finished, velocity, m_data->angle, m_data->origin, m_data->pos, m_data->pos ); } } diff --git a/src/controls/QskPanGestureRecognizer.h b/src/controls/QskPanGestureRecognizer.h index 26a72576..ba3bb121 100644 --- a/src/controls/QskPanGestureRecognizer.h +++ b/src/controls/QskPanGestureRecognizer.h @@ -23,11 +23,12 @@ class QSK_EXPORT QskPanGestureRecognizer : public QskGestureRecognizer void setOrientations( Qt::Orientations ); Qt::Orientations orientations() const; - private: + protected: void processPress( const QPointF&, quint64 timestamp, bool isFinal ) override; void processMove( const QPointF&, quint64 timestamp ) override; void processRelease( const QPointF&, quint64 timestamp ) override; + private: class PrivateData; std::unique_ptr< PrivateData > m_data; };