wheelEvent handling improved

This commit is contained in:
Uwe Rathmann 2022-01-10 14:59:22 +01:00
parent d4f140f20e
commit 379a6f6ccc
5 changed files with 49 additions and 61 deletions

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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 )

View File

@ -8,6 +8,9 @@
#include "QskBoxBorderMetrics.h"
#include "QskEvent.h"
#include <qguiapplication.h>
#include <qstylehints.h>
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
{