From b73513eb1f499dec8f9b18cb6827aa25fd1b5a91 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 9 Oct 2023 10:32:03 +0200 Subject: [PATCH 1/2] using styleHints for the minimal pan distance --- src/controls/QskPanGestureRecognizer.cpp | 5 +++-- src/controls/QskSkinManager.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controls/QskPanGestureRecognizer.cpp b/src/controls/QskPanGestureRecognizer.cpp index f7db9f5a..c103730d 100644 --- a/src/controls/QskPanGestureRecognizer.cpp +++ b/src/controls/QskPanGestureRecognizer.cpp @@ -7,10 +7,11 @@ #include "QskEvent.h" #include "QskGesture.h" -#include #include #include #include +#include +#include static inline bool qskIsInOrientation( const QPointF& from, const QPointF& to, Qt::Orientations orientations ) @@ -146,7 +147,7 @@ class QskPanGestureRecognizer::PrivateData public: Qt::Orientations orientations = Qt::Horizontal | Qt::Vertical; - int minDistance = 15; + int minDistance = QGuiApplication::styleHints()->startDragDistance() + 5; quint64 timestampVelocity = 0.0; // timestamp of the last mouse event qreal angle = 0.0; diff --git a/src/controls/QskSkinManager.cpp b/src/controls/QskSkinManager.cpp index 218d2747..33864821 100644 --- a/src/controls/QskSkinManager.cpp +++ b/src/controls/QskSkinManager.cpp @@ -121,7 +121,7 @@ namespace scheme = Qt::ColorScheme::Unknown; } - const auto systemScheme = qGuiApp->styleHints()->colorScheme(); + const auto systemScheme = QGuiApplication::styleHints()->colorScheme(); if( scheme == systemScheme ) { From 2e980f087d3101b89526f336de581c2a3ae4fc7a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 9 Oct 2023 10:37:07 +0200 Subject: [PATCH 2/2] QskGestureRecognizer::targetItem introduced --- src/controls/QskGestureRecognizer.cpp | 13 ++++++++++++- src/controls/QskGestureRecognizer.h | 7 ++++++- src/controls/QskPanGestureRecognizer.cpp | 15 ++++++++++----- src/controls/QskPanGestureRecognizer.h | 3 ++- 4 files changed, 30 insertions(+), 8 deletions(-) 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; };