aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2018-05-16 23:48:36 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2018-05-23 06:55:36 +0000
commit3813b1b94325fc76b7bf45c4dc79b5ea26b05860 (patch)
tree1193c70a537963dc16cfd52857aa97b4b7e2a7bf
parent9478053838ae2d950b162c2b93a2a400c82d9bf7 (diff)
QQuickAttachedObject: use pimpl
Preparing for making the functionality public for use in 3rdparty styles. Task-number: QTBUG-67062 Change-Id: I301c4567bdc75b5520d0ac11b91df04dda954227 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quickcontrols2/qquickattachedobject.cpp129
-rw-r--r--src/quickcontrols2/qquickattachedobject_p.h19
2 files changed, 81 insertions, 67 deletions
diff --git a/src/quickcontrols2/qquickattachedobject.cpp b/src/quickcontrols2/qquickattachedobject.cpp
index bada982e..8b75e42a 100644
--- a/src/quickcontrols2/qquickattachedobject.cpp
+++ b/src/quickcontrols2/qquickattachedobject.cpp
@@ -36,8 +36,10 @@
#include "qquickattachedobject_p.h"
+#include <QtCore/qpointer.h>
#include <QtQuick/qquickwindow.h>
#include <QtQuick/private/qquickitem_p.h>
+#include <QtQuick/private/qquickitemchangelistener_p.h>
#include <QtQuickTemplates2/private/qquickpopup_p.h>
QT_BEGIN_NAMESPACE
@@ -154,44 +156,102 @@ static QQuickItem *findAttachedItem(QObject *parent)
return item;
}
-QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent)
+class QQuickAttachedObjectPrivate : public QObjectPrivate, public QQuickItemChangeListener
{
- attachTo(parent);
+ Q_DECLARE_PUBLIC(QQuickAttachedObject)
+
+public:
+ static QQuickAttachedObjectPrivate *get(QQuickAttachedObject *attachedObject)
+ {
+ return attachedObject->d_func();
+ }
+
+ void attachTo(QObject *object);
+ void detachFrom(QObject *object);
+
+ void itemWindowChanged(QQuickWindow *window);
+ void itemParentChanged(QQuickItem *item, QQuickItem *parent) override;
+
+ QList<QQuickAttachedObject *> attachedChildren;
+ QPointer<QQuickAttachedObject> attachedParent;
+};
+
+void QQuickAttachedObjectPrivate::attachTo(QObject *object)
+{
+ QQuickItem *item = findAttachedItem(object);
+ if (item) {
+ connect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObjectPrivate::itemWindowChanged);
+ QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent);
+ }
+}
+
+void QQuickAttachedObjectPrivate::detachFrom(QObject *object)
+{
+ QQuickItem *item = findAttachedItem(object);
+ if (item) {
+ disconnect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObjectPrivate::itemWindowChanged);
+ QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent);
+ }
+}
+
+void QQuickAttachedObjectPrivate::itemWindowChanged(QQuickWindow *window)
+{
+ Q_Q(QQuickAttachedObject);
+ QQuickAttachedObject *attachedParent = nullptr;
+ QQuickItem *item = qobject_cast<QQuickItem *>(q->sender());
+ if (item)
+ attachedParent = findAttachedParent(q->metaObject(), item);
+ if (!attachedParent)
+ attachedParent = attachedObject(q->metaObject(), window);
+ q->setAttachedParent(attachedParent);
+}
+
+void QQuickAttachedObjectPrivate::itemParentChanged(QQuickItem *item, QQuickItem *parent)
+{
+ Q_Q(QQuickAttachedObject);
+ Q_UNUSED(parent);
+ q->setAttachedParent(findAttachedParent(q->metaObject(), item));
}
-QQuickAttachedObject::QQuickAttachedObject(QObjectPrivate &dd, QObject *parent)
- : QObject(dd, parent)
+QQuickAttachedObject::QQuickAttachedObject(QObject *parent)
+ : QObject(*(new QQuickAttachedObjectPrivate), parent)
{
- attachTo(parent);
+ Q_D(QQuickAttachedObject);
+ d->attachTo(parent);
}
QQuickAttachedObject::~QQuickAttachedObject()
{
- detachFrom(parent());
+ Q_D(QQuickAttachedObject);
+ d->detachFrom(parent());
setAttachedParent(nullptr);
}
QList<QQuickAttachedObject *> QQuickAttachedObject::attachedChildren() const
{
- return m_attachedChildren;
+ Q_D(const QQuickAttachedObject);
+ return d->attachedChildren;
}
QQuickAttachedObject *QQuickAttachedObject::attachedParent() const
{
- return m_attachedParent;
+ Q_D(const QQuickAttachedObject);
+ return d->attachedParent;
}
void QQuickAttachedObject::setAttachedParent(QQuickAttachedObject *parent)
{
- if (m_attachedParent != parent) {
- QQuickAttachedObject *oldParent = m_attachedParent;
- if (m_attachedParent)
- m_attachedParent->m_attachedChildren.removeOne(this);
- m_attachedParent = parent;
- if (parent)
- parent->m_attachedChildren.append(this);
- attachedParentChange(parent, oldParent);
- }
+ Q_D(QQuickAttachedObject);
+ if (d->attachedParent == parent)
+ return;
+
+ QQuickAttachedObject *oldParent = d->attachedParent;
+ if (d->attachedParent)
+ QQuickAttachedObjectPrivate::get(d->attachedParent)->attachedChildren.removeOne(this);
+ d->attachedParent = parent;
+ if (parent)
+ QQuickAttachedObjectPrivate::get(parent)->attachedChildren.append(this);
+ attachedParentChange(parent, oldParent);
}
void QQuickAttachedObject::init()
@@ -211,39 +271,4 @@ void QQuickAttachedObject::attachedParentChange(QQuickAttachedObject *newParent,
Q_UNUSED(oldParent);
}
-void QQuickAttachedObject::itemWindowChanged(QQuickWindow *window)
-{
- QQuickAttachedObject *attachedParent = nullptr;
- QQuickItem *item = qobject_cast<QQuickItem *>(sender());
- if (item)
- attachedParent = findAttachedParent(metaObject(), item);
- if (!attachedParent)
- attachedParent = attachedObject(metaObject(), window);
- setAttachedParent(attachedParent);
-}
-
-void QQuickAttachedObject::itemParentChanged(QQuickItem *item, QQuickItem *parent)
-{
- Q_UNUSED(parent);
- 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 5d4194ef..1e90c082 100644
--- a/src/quickcontrols2/qquickattachedobject_p.h
+++ b/src/quickcontrols2/qquickattachedobject_p.h
@@ -49,17 +49,14 @@
//
#include <QtQml/qqml.h>
-#include <QtCore/qlist.h>
#include <QtCore/qobject.h>
-#include <QtCore/qpointer.h>
-#include <QtQuick/private/qquickitemchangelistener_p.h>
#include <QtQuickControls2/private/qtquickcontrols2global_p.h>
QT_BEGIN_NAMESPACE
-class QQuickWindow;
+class QQuickAttachedObjectPrivate;
-class Q_QUICKCONTROLS2_PRIVATE_EXPORT QQuickAttachedObject : public QObject, public QQuickItemChangeListener
+class Q_QUICKCONTROLS2_PRIVATE_EXPORT QQuickAttachedObject : public QObject
{
Q_OBJECT
@@ -73,21 +70,13 @@ public:
void setAttachedParent(QQuickAttachedObject *parent);
protected:
- QQuickAttachedObject(QObjectPrivate &dd, QObject *parent = nullptr);
-
void init();
virtual void attachedParentChange(QQuickAttachedObject *newParent, QQuickAttachedObject *oldParent);
- void itemWindowChanged(QQuickWindow *window);
- void itemParentChanged(QQuickItem *item, QQuickItem *parent) override;
-
private:
- void attachTo(QObject *object);
- void detachFrom(QObject *object);
-
- QList<QQuickAttachedObject *> m_attachedChildren;
- QPointer<QQuickAttachedObject> m_attachedParent;
+ Q_DISABLE_COPY(QQuickAttachedObject)
+ Q_DECLARE_PRIVATE(QQuickAttachedObject)
};
QT_END_NAMESPACE