diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2018-05-16 23:48:36 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2018-05-23 06:55:36 +0000 |
commit | 3813b1b94325fc76b7bf45c4dc79b5ea26b05860 (patch) | |
tree | 1193c70a537963dc16cfd52857aa97b4b7e2a7bf | |
parent | 9478053838ae2d950b162c2b93a2a400c82d9bf7 (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.cpp | 129 | ||||
-rw-r--r-- | src/quickcontrols2/qquickattachedobject_p.h | 19 |
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 |