aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-12-11 16:02:40 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-12-13 16:08:08 +0000
commit59f72376602c306f6322c9482e2201f1cc9e3819 (patch)
tree483847b9b5662465b921298acac63b6e70672dbc /src
parent2567cb8e405b72a50cdba0cffd98aa2f4ede3c54 (diff)
RangeSlider: use deferred execution
Task-number: QTBUG-50992 Change-Id: Ibbc946c3402c65f9b100fc74dde04e4d439c8535 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/quicktemplates2/qquickrangeslider.cpp47
-rw-r--r--src/quicktemplates2/qquickrangeslider_p.h3
2 files changed, 44 insertions, 6 deletions
diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp
index 274c887d..44c00f68 100644
--- a/src/quicktemplates2/qquickrangeslider.cpp
+++ b/src/quicktemplates2/qquickrangeslider.cpp
@@ -36,6 +36,7 @@
#include "qquickrangeslider_p.h"
#include "qquickcontrol_p_p.h"
+#include "qquickdeferredexecute_p_p.h"
#include <QtCore/qscopedpointer.h>
#include <QtQuick/private/qquickwindow_p.h>
@@ -109,13 +110,15 @@ public:
void setPosition(qreal position, bool ignoreOtherPosition = false);
void updatePosition(bool ignoreOtherPosition = false);
+ void executeHandle(bool complete = false);
+
static QQuickRangeSliderNodePrivate *get(QQuickRangeSliderNode *node);
qreal value;
bool isPendingValue;
qreal pendingValue;
qreal position;
- QQuickItem *handle;
+ QQuickDeferredPointer<QQuickItem> handle;
QQuickRangeSlider *slider;
bool pressed;
bool hovered;
@@ -149,6 +152,20 @@ void QQuickRangeSliderNodePrivate::updatePosition(bool ignoreOtherPosition)
setPosition(pos, ignoreOtherPosition);
}
+static inline QString handleName() { return QStringLiteral("handle"); }
+
+void QQuickRangeSliderNodePrivate::executeHandle(bool complete)
+{
+ Q_Q(QQuickRangeSliderNode);
+ if (handle.wasExecuted())
+ return;
+
+ if (!handle)
+ quickBeginDeferred(q, handleName(), handle);
+ if (complete)
+ quickCompleteDeferred(q, handleName(), handle);
+}
+
QQuickRangeSliderNodePrivate *QQuickRangeSliderNodePrivate::get(QQuickRangeSliderNode *node)
{
return node->d_func();
@@ -227,7 +244,9 @@ qreal QQuickRangeSliderNode::visualPosition() const
QQuickItem *QQuickRangeSliderNode::handle() const
{
- Q_D(const QQuickRangeSliderNode);
+ QQuickRangeSliderNodePrivate *d = const_cast<QQuickRangeSliderNodePrivate *>(d_func());
+ if (!d->handle)
+ d->executeHandle();
return d->handle;
}
@@ -237,7 +256,7 @@ void QQuickRangeSliderNode::setHandle(QQuickItem *handle)
if (d->handle == handle)
return;
- QQuickControlPrivate::destroyDelegate(d->handle, d->slider);
+ delete d->handle;
d->handle = handle;
if (handle) {
if (!handle->parentItem())
@@ -263,7 +282,8 @@ void QQuickRangeSliderNode::setHandle(QQuickItem *handle)
handle->setActiveFocusOnTab(true);
}
- emit handleChanged();
+ if (!d->handle.isExecuting())
+ emit handleChanged();
}
bool QQuickRangeSliderNode::isPressed() const
@@ -1045,13 +1065,28 @@ void QQuickRangeSlider::mirrorChange()
emit d->second->visualPositionChanged();
}
-void QQuickRangeSlider::componentComplete()
+void QQuickRangeSlider::classBegin()
{
Q_D(QQuickRangeSlider);
- QQuickControl::componentComplete();
+ QQuickControl::classBegin();
+ QQmlContext *context = qmlContext(this);
+ if (context) {
+ QQmlEngine::setContextForObject(d->first, context);
+ QQmlEngine::setContextForObject(d->second, context);
+ }
+}
+
+void QQuickRangeSlider::componentComplete()
+{
+ Q_D(QQuickRangeSlider);
QQuickRangeSliderNodePrivate *firstPrivate = QQuickRangeSliderNodePrivate::get(d->first);
QQuickRangeSliderNodePrivate *secondPrivate = QQuickRangeSliderNodePrivate::get(d->second);
+ firstPrivate->executeHandle(true);
+ secondPrivate->executeHandle(true);
+ d->executeBackground(true);
+
+ QQuickControl::componentComplete();
if (firstPrivate->isPendingValue || secondPrivate->isPendingValue
|| !qFuzzyCompare(d->from, defaultFrom) || !qFuzzyCompare(d->to, defaultTo)) {
diff --git a/src/quicktemplates2/qquickrangeslider_p.h b/src/quicktemplates2/qquickrangeslider_p.h
index fc5a1d99..cc071974 100644
--- a/src/quicktemplates2/qquickrangeslider_p.h
+++ b/src/quicktemplates2/qquickrangeslider_p.h
@@ -67,6 +67,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickRangeSlider : public QQuickControl
Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL)
// 2.2 (Qt 5.9)
Q_PROPERTY(bool live READ live WRITE setLive NOTIFY liveChanged FINAL REVISION 2)
+ Q_CLASSINFO("DeferredPropertyNames", "background")
public:
explicit QQuickRangeSlider(QQuickItem *parent = nullptr);
@@ -124,6 +125,7 @@ protected:
void touchEvent(QTouchEvent *event) override;
#endif
void mirrorChange() override;
+ void classBegin() override;
void componentComplete() override;
#if QT_CONFIG(accessibility)
@@ -149,6 +151,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickRangeSliderNode : public QObject
Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL)
// 2.1 (Qt 5.8)
Q_PROPERTY(bool hovered READ isHovered WRITE setHovered NOTIFY hoveredChanged FINAL REVISION 1)
+ Q_CLASSINFO("DeferredPropertyNames", "handle")
public:
explicit QQuickRangeSliderNode(qreal value, QQuickRangeSlider *slider);