diff options
author | Joni Poikelin <joni.poikelin@theqtcompany.com> | 2016-03-10 08:28:35 +0200 |
---|---|---|
committer | Joni Poikelin <joni.poikelin@qt.io> | 2016-08-30 07:09:34 +0000 |
commit | 846d04cec8d946c28ddbeecc79c63553e0891736 (patch) | |
tree | 8440f18668a95bf8385f8e196a6249424a6b829f /src/controls | |
parent | 69b3136bae16897492d27558c5909cd61a5e598e (diff) | |
download | qtquickcontrols-846d04cec8d946c28ddbeecc79c63553e0891736.tar.gz |
RangeModel: Emit min/max and value changes after component is complete
Prevent extra value changed signal to be fired in case when Slider with
minimum > 0 and value > minimum are set.
Change-Id: I86824c403a7c0296f782d2eec7ed30acfc13b304
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/controls')
-rw-r--r-- | src/controls/Private/qquickrangemodel.cpp | 33 | ||||
-rw-r--r-- | src/controls/Private/qquickrangemodel_p.h | 7 | ||||
-rw-r--r-- | src/controls/Private/qquickrangemodel_p_p.h | 3 |
3 files changed, 38 insertions, 5 deletions
diff --git a/src/controls/Private/qquickrangemodel.cpp b/src/controls/Private/qquickrangemodel.cpp index 02ce0e57..36d7dd34 100644 --- a/src/controls/Private/qquickrangemodel.cpp +++ b/src/controls/Private/qquickrangemodel.cpp @@ -69,6 +69,9 @@ void QQuickRangeModelPrivate::init() posatmin = 0; posatmax = 0; inverted = false; + isComplete = false; + positionChanged = false; + valueChanged = false; } /*! @@ -155,10 +158,16 @@ void QQuickRangeModelPrivate::emitValueAndPositionIfChanged(const qreal oldValue // unchanged. This will be the case when operating with values outside range: const qreal newValue = q->value(); const qreal newPosition = q->position(); - if (!qFuzzyCompare(newValue, oldValue)) - emit q->valueChanged(newValue); - if (!qFuzzyCompare(newPosition, oldPosition)) - emit q->positionChanged(newPosition); + + if (isComplete) { + if (!qFuzzyCompare(newValue, oldValue)) + emit q->valueChanged(newValue); + if (!qFuzzyCompare(newPosition, oldPosition)) + emit q->positionChanged(newPosition); + } else { + positionChanged |= qFuzzyCompare(oldPosition, newPosition); + valueChanged |= !qFuzzyCompare(oldValue, newValue); + } } /*! @@ -346,6 +355,22 @@ qreal QQuickRangeModel::positionForValue(qreal value) const return d->publicPosition(unconstrainedPosition); } +void QQuickRangeModel::classBegin() +{ +} + +void QQuickRangeModel::componentComplete() +{ + Q_D(QQuickRangeModel); + d->isComplete = true; + emit minimumChanged(minimum()); + emit maximumChanged(maximum()); + if (d->valueChanged) + emit valueChanged(value()); + if (d->positionChanged) + emit positionChanged(position()); +} + /*! \property QQuickRangeModel::position \brief the current position of the model diff --git a/src/controls/Private/qquickrangemodel_p.h b/src/controls/Private/qquickrangemodel_p.h index 06d00202..47376ded 100644 --- a/src/controls/Private/qquickrangemodel_p.h +++ b/src/controls/Private/qquickrangemodel_p.h @@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE class QQuickRangeModelPrivate; -class QQuickRangeModel : public QObject +class QQuickRangeModel : public QObject, public QQmlParserStatus { Q_OBJECT Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged USER true) @@ -56,6 +56,8 @@ class QQuickRangeModel : public QObject Q_PROPERTY(qreal positionAtMaximum READ positionAtMaximum WRITE setPositionAtMaximum NOTIFY positionAtMaximumChanged) Q_PROPERTY(bool inverted READ inverted WRITE setInverted NOTIFY invertedChanged) + Q_INTERFACES(QQmlParserStatus) + public: QQuickRangeModel(QObject *parent = 0); virtual ~QQuickRangeModel(); @@ -87,6 +89,9 @@ public: Q_INVOKABLE qreal valueForPosition(qreal position) const; Q_INVOKABLE qreal positionForValue(qreal value) const; + void classBegin(); + void componentComplete(); + public Q_SLOTS: void toMinimum(); void toMaximum(); diff --git a/src/controls/Private/qquickrangemodel_p_p.h b/src/controls/Private/qquickrangemodel_p_p.h index 235ba069..6097ff3d 100644 --- a/src/controls/Private/qquickrangemodel_p_p.h +++ b/src/controls/Private/qquickrangemodel_p_p.h @@ -67,6 +67,9 @@ public: uint inverted : 1; QQuickRangeModel *q_ptr; + bool isComplete; + bool positionChanged; + bool valueChanged; inline qreal effectivePosAtMin() const { return inverted ? posatmax : posatmin; |