aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-07-15 16:56:01 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-07-20 09:43:39 +0000
commit11a56ee8f3a4d6e6514f16ae928891ce8a976572 (patch)
tree88e7a67efcde74c8f3e5cb62134d84882f7175d2
parentb3c6d85479c1646f890cc7aaa94f5f920a051ed6 (diff)
Tumbler: don't crash if attached to a non-Item
Change-Id: I84702195fa09af53697c987efd8c87afd429f3c4 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquicktumbler.cpp28
-rw-r--r--src/quicktemplates2/qquicktumbler_p.h2
2 files changed, 16 insertions, 14 deletions
diff --git a/src/quicktemplates2/qquicktumbler.cpp b/src/quicktemplates2/qquicktumbler.cpp
index 608044ec..f2c548bb 100644
--- a/src/quicktemplates2/qquicktumbler.cpp
+++ b/src/quicktemplates2/qquicktumbler.cpp
@@ -36,6 +36,7 @@
#include "qquicktumbler_p.h"
+#include <QtQml/qqmlinfo.h>
#include <QtQuick/private/qquickflickable_p.h>
#include <QtQuickTemplates2/private/qquickcontrol_p_p.h>
#include <QtQuickTemplates2/private/qquicktumbler_p_p.h>
@@ -441,13 +442,7 @@ void QQuickTumbler::resetWrap()
QQuickTumblerAttached *QQuickTumbler::qmlAttachedProperties(QObject *object)
{
- QQuickItem *delegateItem = qobject_cast<QQuickItem *>(object);
- if (!delegateItem) {
- qWarning() << "Tumbler: attached properties of Tumbler must be accessed through a delegate item";
- return nullptr;
- }
-
- return new QQuickTumblerAttached(delegateItem);
+ return new QQuickTumblerAttached(object);
}
void QQuickTumbler::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
@@ -674,11 +669,15 @@ class QQuickTumblerAttachedPrivate : public QObjectPrivate, public QQuickItemCha
{
Q_DECLARE_PUBLIC(QQuickTumblerAttached)
public:
- QQuickTumblerAttachedPrivate(QQuickItem *delegateItem) :
+ QQuickTumblerAttachedPrivate() :
tumbler(nullptr),
index(-1),
displacement(0)
{
+ }
+
+ void init(QQuickItem *delegateItem)
+ {
if (!delegateItem->parentItem()) {
qWarning() << "Tumbler: attached properties must be accessed through a delegate item that has a parent";
return;
@@ -699,9 +698,6 @@ public:
}
}
- ~QQuickTumblerAttachedPrivate() {
- }
-
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) override;
void itemChildAdded(QQuickItem *, QQuickItem *) override;
void itemChildRemoved(QQuickItem *, QQuickItem *) override;
@@ -788,10 +784,16 @@ void QQuickTumblerAttachedPrivate::_q_calculateDisplacement()
emit q->displacementChanged();
}
-QQuickTumblerAttached::QQuickTumblerAttached(QQuickItem *delegateItem) :
- QObject(*(new QQuickTumblerAttachedPrivate(delegateItem)), delegateItem)
+QQuickTumblerAttached::QQuickTumblerAttached(QObject *parent) :
+ QObject(*(new QQuickTumblerAttachedPrivate), parent)
{
Q_D(QQuickTumblerAttached);
+ QQuickItem *delegateItem = qobject_cast<QQuickItem *>(parent);
+ if (delegateItem)
+ d->init(delegateItem);
+ else if (parent)
+ qmlInfo(parent) << "Tumbler: attached properties of Tumbler must be accessed through a delegate item";
+
if (d->tumbler) {
// When the Tumbler is completed, wrapChanged() is emitted to let QQuickTumblerView
// know that it can create the view. The view itself might instantiate delegates
diff --git a/src/quicktemplates2/qquicktumbler_p.h b/src/quicktemplates2/qquicktumbler_p.h
index d047aa96..1c8cfa18 100644
--- a/src/quicktemplates2/qquicktumbler_p.h
+++ b/src/quicktemplates2/qquicktumbler_p.h
@@ -128,7 +128,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickTumblerAttached : public QObject
Q_PROPERTY(qreal displacement READ displacement NOTIFY displacementChanged FINAL)
public:
- explicit QQuickTumblerAttached(QQuickItem *delegateItem);
+ explicit QQuickTumblerAttached(QObject *parent = nullptr);
~QQuickTumblerAttached();
QQuickTumbler *tumbler() const;