aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-03-22 14:54:06 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-03-22 16:29:15 +0000
commitf1a87abffefe446eaf22be13c8b574b8373f13dd (patch)
tree022cc0c17028992696e564865c18bf5b3e521746 /src
parent4354efee0f009833947fb0e129da0933deb555fb (diff)
QQuickAttachedObject: align attaching and detaching
At construction time it was casting the parent to an item and falling back to popup if it wasn't an item, but at destruction time it was only doing the item cast. Unify the two so that both paths are tested when detaching too. Change-Id: Ic94d7686600d3502e195ded2d7007cb0fef76764 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/quickcontrols2/qquickattachedobject.cpp36
-rw-r--r--src/quickcontrols2/qquickattachedobject_p.h3
2 files changed, 28 insertions, 11 deletions
diff --git a/src/quickcontrols2/qquickattachedobject.cpp b/src/quickcontrols2/qquickattachedobject.cpp
index c21ebea5..e668c75c 100644
--- a/src/quickcontrols2/qquickattachedobject.cpp
+++ b/src/quickcontrols2/qquickattachedobject.cpp
@@ -143,7 +143,7 @@ static QList<QQuickAttachedObject *> findAttachedChildren(const QMetaObject *typ
return children;
}
-QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent)
+static QQuickItem *findAttachedItem(QObject *parent)
{
QQuickItem *item = qobject_cast<QQuickItem *>(parent);
if (!item) {
@@ -151,21 +151,17 @@ QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent)
if (popup)
item = popup->popupItem();
}
+ return item;
+}
- if (item) {
- connect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged);
- QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent);
- }
+QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent)
+{
+ attachTo(parent);
}
QQuickAttachedObject::~QQuickAttachedObject()
{
- QQuickItem *item = qobject_cast<QQuickItem *>(parent());
- if (item) {
- disconnect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged);
- QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent);
- }
-
+ detachFrom(parent());
setAttachedParent(nullptr);
}
@@ -226,4 +222,22 @@ void QQuickAttachedObject::itemParentChanged(QQuickItem *item, QQuickItem *paren
setAttachedParent(findAttachedParent(metaObject(), item));
}
+void QQuickAttachedObject::attachTo(QObject *object)
+{
+ QQuickItem *item = findAttachedItem(object);
+ if (item) {
+ connect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged);
+ QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent);
+ }
+}
+
+void QQuickAttachedObject::detachFrom(QObject *object)
+{
+ QQuickItem *item = findAttachedItem(object);
+ if (item) {
+ disconnect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged);
+ QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent);
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/quickcontrols2/qquickattachedobject_p.h b/src/quickcontrols2/qquickattachedobject_p.h
index 7fc0ce13..923bdef9 100644
--- a/src/quickcontrols2/qquickattachedobject_p.h
+++ b/src/quickcontrols2/qquickattachedobject_p.h
@@ -81,6 +81,9 @@ protected:
void itemParentChanged(QQuickItem *item, QQuickItem *parent) override;
private:
+ void attachTo(QObject *object);
+ void detachFrom(QObject *object);
+
QList<QQuickAttachedObject *> m_attachedChildren;
QPointer<QQuickAttachedObject> m_attachedParent;
};