From 0b290018b52bc15534bedebe39f183e74eaee24e Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 3 Jan 2017 15:39:12 +0100 Subject: Revise QQuickDial internals Move the press/move/release/ungrab logic from mouse event handlers to QQuickDialPrivate methods that can be re-used for touch events. Change-Id: I6e4594a3b532d6049117a37b0880e16cc22cb6cf Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickdial.cpp | 100 ++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 36 deletions(-) (limited to 'src/quicktemplates2') diff --git a/src/quicktemplates2/qquickdial.cpp b/src/quicktemplates2/qquickdial.cpp index 0fb3811f..bd59f057 100644 --- a/src/quicktemplates2/qquickdial.cpp +++ b/src/quicktemplates2/qquickdial.cpp @@ -117,6 +117,11 @@ public: void updatePosition(); bool isLargeChange(const QPointF &eventPos, qreal proposedPosition) const; + void handlePress(const QPointF &point); + void handleMove(const QPointF &point); + void handleRelease(const QPointF &point); + void handleUngrab(); + qreal from; qreal to; qreal value; @@ -190,6 +195,61 @@ bool QQuickDialPrivate::isLargeChange(const QPointF &eventPos, qreal proposedPos return qAbs(proposedPosition - position) >= 0.5 && eventPos.y() >= height / 2; } +void QQuickDialPrivate::handlePress(const QPointF &point) +{ + Q_Q(QQuickDial); + pressPoint = point; + q->setPressed(true); +} + +void QQuickDialPrivate::handleMove(const QPointF &point) +{ + Q_Q(QQuickDial); + if (!q->keepMouseGrab()) + return; + const qreal oldPos = position; + qreal pos = positionAt(point); + if (snapMode == QQuickDial::SnapAlways) + pos = snapPosition(pos); + + if (wrap || (!wrap && !isLargeChange(point, pos))) { + if (live) + q->setValue(valueAt(pos)); + else + setPosition(pos); + if (!qFuzzyCompare(pos, oldPos)) + emit q->moved(); + } +} + +void QQuickDialPrivate::handleRelease(const QPointF &point) +{ + Q_Q(QQuickDial); + if (q->keepMouseGrab()) { + const qreal oldPos = position; + qreal pos = positionAt(point); + if (snapMode != QQuickDial::NoSnap) + pos = snapPosition(pos); + + if (wrap || (!wrap && !isLargeChange(point, pos))) + q->setValue(valueAt(pos)); + if (!qFuzzyCompare(pos, oldPos)) + emit q->moved(); + + q->setKeepMouseGrab(false); + } + + q->setPressed(false); + pressPoint = QPointF(); +} + +void QQuickDialPrivate::handleUngrab() +{ + Q_Q(QQuickDial); + pressPoint = QPointF(); + q->setPressed(false); +} + QQuickDial::QQuickDial(QQuickItem *parent) : QQuickControl(*(new QQuickDialPrivate), parent) { @@ -592,8 +652,7 @@ void QQuickDial::mousePressEvent(QMouseEvent *event) { Q_D(QQuickDial); QQuickControl::mousePressEvent(event); - d->pressPoint = event->localPos(); - setPressed(true); + d->handlePress(event->localPos()); } void QQuickDial::mouseMoveEvent(QMouseEvent *event) @@ -609,52 +668,21 @@ void QQuickDial::mouseMoveEvent(QMouseEvent *event) setKeepMouseGrab(overYDragThreshold); } } - if (keepMouseGrab()) { - const qreal oldPos = d->position; - qreal pos = d->positionAt(event->localPos()); - if (d->snapMode == SnapAlways) - pos = d->snapPosition(pos); - - if (d->wrap || (!d->wrap && !d->isLargeChange(event->localPos(), pos))) { - if (d->live) - setValue(d->valueAt(pos)); - else - d->setPosition(pos); - if (!qFuzzyCompare(pos, oldPos)) - emit moved(); - } - } + d->handleMove(event->localPos()); } void QQuickDial::mouseReleaseEvent(QMouseEvent *event) { Q_D(QQuickDial); QQuickControl::mouseReleaseEvent(event); - - if (keepMouseGrab()) { - const qreal oldPos = d->position; - qreal pos = d->positionAt(event->localPos()); - if (d->snapMode != NoSnap) - pos = d->snapPosition(pos); - - if (d->wrap || (!d->wrap && !d->isLargeChange(event->localPos(), pos))) - setValue(d->valueAt(pos)); - if (!qFuzzyCompare(pos, oldPos)) - emit moved(); - - setKeepMouseGrab(false); - } - - setPressed(false); - d->pressPoint = QPointF(); + d->handleRelease(event->localPos()); } void QQuickDial::mouseUngrabEvent() { Q_D(QQuickDial); QQuickControl::mouseUngrabEvent(); - d->pressPoint = QPointF(); - setPressed(false); + d->handleUngrab(); } void QQuickDial::wheelEvent(QWheelEvent *event) -- cgit v1.2.3