From 379a6f6ccce51d32032cc4e5bd466daab81a27f5 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 10 Jan 2022 14:59:22 +0100 Subject: [PATCH] wheelEvent handling improved --- src/controls/QskBoundedInput.cpp | 2 +- src/controls/QskEvent.cpp | 57 ++++++++++---------------------- src/controls/QskEvent.h | 6 ++-- src/controls/QskScrollBox.cpp | 14 ++++++-- src/controls/QskScrollView.cpp | 31 ++++++++--------- 5 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/controls/QskBoundedInput.cpp b/src/controls/QskBoundedInput.cpp index f62f0a64..26aac2e6 100644 --- a/src/controls/QskBoundedInput.cpp +++ b/src/controls/QskBoundedInput.cpp @@ -207,7 +207,7 @@ void QskBoundedInput::wheelEvent( QWheelEvent* event ) return; } - auto offset = qskWheelSteps( event ) * m_stepSize; + auto offset = qskWheelIncrement( event ) * m_stepSize; if ( event->modifiers() & ( Qt::ControlModifier | Qt::ShiftModifier ) ) offset *= m_pageSize; diff --git a/src/controls/QskEvent.cpp b/src/controls/QskEvent.cpp index 347c3967..6a77d9b8 100644 --- a/src/controls/QskEvent.cpp +++ b/src/controls/QskEvent.cpp @@ -87,52 +87,31 @@ QPointF qskWheelPosition( const QWheelEvent* event ) #ifndef QT_NO_WHEELEVENT -qreal qskWheelSteps( const QWheelEvent* event, int orientation ) +qreal qskWheelSteps( const QWheelEvent* event ) { - qreal delta = 0.0; - - // what about event->pixelDelta() - auto aDelta = event->angleDelta(); - -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) - if ( event->inverted() ) - aDelta.setY( -aDelta.y() ); -#endif - - switch( orientation ) - { - case Qt::Horizontal: - delta = aDelta.x(); - break; - - case Qt::Vertical: - delta = aDelta.y(); - break; - - default: - delta = aDelta.y() ? aDelta.y() : aDelta.x(); - } + const auto angleDelta = event->angleDelta(); + const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); return delta / QWheelEvent::DefaultDeltasPerStep; } +qreal qskWheelIncrement( const QWheelEvent* event ) +{ + /* + Some controls ( f.e a spin box ) are interpreting the wheel to + in/decrease a value. For those the physical direction is not relevant + and we might have to invert the y delta. + */ + + auto angleDelta = event->angleDelta(); + +#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) + if ( event->inverted() ) + angleDelta.setY( -angleDelta.y() ); #endif -#ifndef QT_NO_WHEELEVENT - -QPointF qskScrollIncrement( const QWheelEvent* event ) -{ - QPointF increment = event->pixelDelta(); - - if ( increment.isNull() ) - { - increment = event->angleDelta() / QWheelEvent::DefaultDeltasPerStep; - - constexpr qreal stepSize = 20.0; // how to find this value ??? - increment *= stepSize; - } - - return increment; + const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); + return delta / QWheelEvent::DefaultDeltasPerStep; } #endif diff --git a/src/controls/QskEvent.h b/src/controls/QskEvent.h index 2ebe81be..51efd964 100644 --- a/src/controls/QskEvent.h +++ b/src/controls/QskEvent.h @@ -143,10 +143,8 @@ QSK_EXPORT QPointF qskHoverPosition( const QHoverEvent* ); #ifndef QT_NO_WHEELEVENT QSK_EXPORT QPointF qskWheelPosition( const QWheelEvent* ); -QSK_EXPORT qreal qskWheelSteps( - const QWheelEvent*, int orientation = 0 ); - -QSK_EXPORT QPointF qskScrollIncrement( const QWheelEvent* ); +QSK_EXPORT qreal qskWheelSteps( const QWheelEvent* ); +QSK_EXPORT qreal qskWheelIncrement( const QWheelEvent* ); #endif diff --git a/src/controls/QskScrollBox.cpp b/src/controls/QskScrollBox.cpp index a9dcba70..86b09cdd 100644 --- a/src/controls/QskScrollBox.cpp +++ b/src/controls/QskScrollBox.cpp @@ -402,11 +402,21 @@ void QskScrollBox::gestureEvent( QskGestureEvent* event ) QPointF QskScrollBox::scrollOffset( const QWheelEvent* event ) const { + QPointF offset; + const auto pos = qskWheelPosition( event ); if ( viewContentsRect().contains( pos ) ) - return qskScrollIncrement( event ); + { + offset = event->pixelDelta(); - return QPointF(); + if ( offset.isNull() ) + { + offset = event->angleDelta() / QWheelEvent::DefaultDeltasPerStep; + offset *= 20.0; // how to find such a value ??? + } + } + + return offset; } void QskScrollBox::wheelEvent( QWheelEvent* event ) diff --git a/src/controls/QskScrollView.cpp b/src/controls/QskScrollView.cpp index 6644790b..fd244bbf 100644 --- a/src/controls/QskScrollView.cpp +++ b/src/controls/QskScrollView.cpp @@ -8,6 +8,9 @@ #include "QskBoxBorderMetrics.h" #include "QskEvent.h" +#include +#include + QSK_SUBCONTROL( QskScrollView, Panel ) QSK_SUBCONTROL( QskScrollView, Viewport ) QSK_SUBCONTROL( QskScrollView, HorizontalScrollBar ) @@ -18,6 +21,15 @@ QSK_SUBCONTROL( QskScrollView, VerticalScrollHandle ) QSK_SYSTEM_STATE( QskScrollView, VerticalHandlePressed, QskAspect::FirstSystemState << 1 ) QSK_SYSTEM_STATE( QskScrollView, HorizontalHandlePressed, QskAspect::FirstSystemState << 2 ) +static int qskScrollLines() +{ +#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) + return QGuiApplication::styleHints()->wheelScrollLines(); +#else + return 3; +#endif +} + class QskScrollView::PrivateData { public: @@ -217,24 +229,13 @@ QPointF QskScrollView::scrollOffset( const QWheelEvent* event ) const if ( subControlRect( VerticalScrollBar ).contains( pos ) ) { - const auto increment = qskScrollIncrement( event ); - offset.setY( increment.y() ); + const auto steps = qskWheelSteps( event ); + offset.setY( steps * qskScrollLines() ); } else if ( subControlRect( HorizontalScrollBar ).contains( pos ) ) { - const auto increment = qskScrollIncrement( event ); - - qreal dx = increment.x(); - if ( dx == 0 ) - { - dx = increment.y(); - -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) - if ( event->inverted() ) - dx = -dx; -#endif - } - offset.setX( dx ); + const auto steps = qskWheelSteps( event ); + offset.setX( steps * qskScrollLines() ); } else {