From 04502964550874bef7cb35d3a6f642f8ab7c61c2 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 6 Jan 2017 16:48:38 +0100 Subject: Add ScrollBar::snapMode [ChangeLog][Controls][ScrollBar] Added snapMode property incremental or discrete scrolling. Task-number: QTBUG-56569 Change-Id: Id0d463b85063a62b7df6307af8fe8b203155a5de Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickscrollbar.cpp | 65 +++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 4 deletions(-) (limited to 'src/quicktemplates2/qquickscrollbar.cpp') diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index a4ed68bf..c862002b 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -158,7 +158,7 @@ class QQuickScrollBarPrivate : public QQuickControlPrivate public: QQuickScrollBarPrivate() : size(0), position(0), stepSize(0), offset(0), active(false), pressed(false), moving(false), - orientation(Qt::Vertical) + orientation(Qt::Vertical), snapMode(QQuickScrollBar::NoSnap) { } @@ -167,6 +167,7 @@ public: return bar->d_func(); } + qreal snapPosition(qreal position) const; qreal positionAt(const QPointF &point) const; void updateActive(); void resizeContent() override; @@ -184,8 +185,18 @@ public: bool pressed; bool moving; Qt::Orientation orientation; + QQuickScrollBar::SnapMode snapMode; }; +qreal QQuickScrollBarPrivate::snapPosition(qreal position) const +{ + const qreal effectiveStep = stepSize * (1.0 - size); + if (qFuzzyIsNull(effectiveStep)) + return position; + + return qRound(position / effectiveStep) * effectiveStep; +} + qreal QQuickScrollBarPrivate::positionAt(const QPointF &point) const { Q_Q(const QQuickScrollBar); @@ -228,13 +239,19 @@ void QQuickScrollBarPrivate::handlePress(const QPointF &point) void QQuickScrollBarPrivate::handleMove(const QPointF &point) { Q_Q(QQuickScrollBar); - q->setPosition(qBound(0.0, positionAt(point) - offset, 1.0 - size)); + qreal pos = qBound(0.0, positionAt(point) - offset, 1.0 - size); + if (snapMode == QQuickScrollBar::SnapAlways) + pos = snapPosition(pos); + q->setPosition(pos); } void QQuickScrollBarPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickScrollBar); - q->setPosition(qBound(0.0, positionAt(point) - offset, 1.0 - size)); + qreal pos = qBound(0.0, positionAt(point) - offset, 1.0 - size); + if (snapMode != QQuickScrollBar::NoSnap) + pos = snapPosition(pos); + q->setPosition(pos); offset = 0.0; q->setPressed(false); } @@ -325,7 +342,7 @@ void QQuickScrollBar::setPosition(qreal position) This property holds the step size. The default value is \c 0.0. - \sa increase(), decrease() + \sa snapMode, increase(), decrease() */ qreal QQuickScrollBar::stepSize() const { @@ -424,6 +441,46 @@ void QQuickScrollBar::setOrientation(Qt::Orientation orientation) emit orientationChanged(); } +/*! + \since QtQuick.Controls 2.2 + \qmlproperty enumeration QtQuick.Controls::ScrollBar::snapMode + + This property holds the snap mode. + + Possible values: + \value ScrollBar.NoSnap The scrollbar does not snap (default). + \value ScrollBar.SnapAlways The scrollbar snaps while dragged. + \value ScrollBar.SnapOnRelease The scrollbar does not snap while being dragged, but only after released. + + In the following table, the various modes are illustrated with animations. + The movement and the \l stepSize (\c 0.25) are identical in each animation. + + \table + \header + \row \li \b Value \li \b Example + \row \li \c ScrollBar.NoSnap \li \image qtquickcontrols2-scrollbar-nosnap.gif + \row \li \c ScrollBar.SnapAlways \li \image qtquickcontrols2-scrollbar-snapalways.gif + \row \li \c ScrollBar.SnapOnRelease \li \image qtquickcontrols2-scrollbar-snaponrelease.gif + \endtable + + \sa stepSize +*/ +QQuickScrollBar::SnapMode QQuickScrollBar::snapMode() const +{ + Q_D(const QQuickScrollBar); + return d->snapMode; +} + +void QQuickScrollBar::setSnapMode(SnapMode mode) +{ + Q_D(QQuickScrollBar); + if (d->snapMode == mode) + return; + + d->snapMode = mode; + emit snapModeChanged(); +} + /*! \qmlmethod void QtQuick.Controls::ScrollBar::increase() -- cgit v1.2.3