From 879f56327e5d41564ae010a2ab98a02c76396d0e Mon Sep 17 00:00:00 2001 From: J-P Nurmi <jpnurmi@digia.com> Date: Wed, 20 Feb 2013 15:47:58 +0100 Subject: [PATCH] WheelArea: adjust wheel scrolling speed Use (slightly adjusted) pixel values on systems that provide platforms that support high-resolution pixel-based delta values, such as Mac OS X, and set a reasonable default scrolling speed (20px) for typical angle based mouse wheels. Change-Id: I3ff7b3dfcb31fbc83c25188078f82cf5416ea355 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com> --- src/private/qwheelarea.cpp | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/private/qwheelarea.cpp b/src/private/qwheelarea.cpp index eb06f31f6..db3b51714 100644 --- a/src/private/qwheelarea.cpp +++ b/src/private/qwheelarea.cpp @@ -43,6 +43,19 @@ QT_BEGIN_NAMESPACE +// On Mac OS X, the scrolling speed in Safari is roughly 2.5 times faster +// than in TextEdit (the native app). The former is using high-resolution +// pixel-based delta values as they are, which is fine for a typical web +// content, whereas the latter evidently makes scrolling slower to make it +// feel natural and more precise for typical document type of content. +// => we'll compromise between the two for now, and pick an arbitrary value +// to make the pixel-based scrolling speed something between the two +static const qreal pixelDeltaAdjustment = 0.5; + +// The default scroll speed for typical angle-based mouse wheels. The value +// comes originally from QTextEdit, which sets 20px steps by default. +static const qreal defaultScrollSpeed = 20.0; + QWheelArea::QWheelArea(QQuickItem *parent) : QQuickItem(parent), m_horizontalMinimumValue(0), @@ -53,7 +66,7 @@ QWheelArea::QWheelArea(QQuickItem *parent) m_verticalValue(0), m_verticalDelta(0), m_horizontalDelta(0), - m_scrollSpeed(1.0) + m_scrollSpeed(defaultScrollSpeed) { } @@ -65,11 +78,17 @@ QWheelArea::~QWheelArea() void QWheelArea::wheelEvent(QWheelEvent *we) { - if (we->orientation() == Qt::Vertical) { - setVerticalDelta(we->delta()); - } else { - setHorizontalDelta(we->delta()); + QPoint numPixels = we->pixelDelta(); + QPoint numDegrees = we->angleDelta() / 8; + + if (!numPixels.isNull()) { + setHorizontalDelta(numPixels.x() * pixelDeltaAdjustment); + setVerticalDelta(numPixels.y() * pixelDeltaAdjustment); + } else if (!numDegrees.isNull()) { + setHorizontalDelta(numDegrees.x() / 15.0 * m_scrollSpeed); + setVerticalDelta(numDegrees.y() / 15.0 * m_scrollSpeed); } + we->accept(); } @@ -145,7 +164,7 @@ qreal QWheelArea::verticalValue() const void QWheelArea::setVerticalDelta(qreal value) { - m_verticalDelta = m_scrollSpeed * value / 15; + m_verticalDelta = value; setVerticalValue(m_verticalValue - m_verticalDelta); emit verticalWheelMoved(); @@ -158,7 +177,7 @@ qreal QWheelArea::verticalDelta() const void QWheelArea::setHorizontalDelta(qreal value) { - m_horizontalDelta = value / 15; + m_horizontalDelta = value; setHorizontalValue(m_horizontalValue - m_horizontalDelta); emit horizontalWheelMoved(); -- GitLab