diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-16 12:24:53 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-16 12:24:53 +0100 |
commit | 3087a43e482789d90474bca42bef317a9a87da10 (patch) | |
tree | fc6100b366e4a4d1d36329cb1a62f7ec80af8511 /src/controls | |
parent | ef885485a19f0e70273650d88312af0195c32920 (diff) | |
parent | 495ef4fbb9766a766dcc6390636f785bf7bb09d9 (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts:
src/controls/qquickstyle.cpp
src/templates/qquickcontrol.cpp
src/templates/qquickcontrol_p.h
src/templates/qquickpopup.cpp
tests/auto/controls/data/tst_combobox.qml
tests/auto/controls/data/tst_control.qml
Change-Id: Ib7853d5ee5c4444872cd5c2d789e20d229c955d1
Diffstat (limited to 'src/controls')
-rw-r--r-- | src/controls/qquickstyle.cpp | 119 | ||||
-rw-r--r-- | src/controls/qquickstyle_p.h | 2 |
2 files changed, 59 insertions, 62 deletions
diff --git a/src/controls/qquickstyle.cpp b/src/controls/qquickstyle.cpp index 320148c3..38099044 100644 --- a/src/controls/qquickstyle.cpp +++ b/src/controls/qquickstyle.cpp @@ -52,49 +52,58 @@ static QQuickStyle *attachedStyle(const QMetaObject *type, QObject *object, bool return qobject_cast<QQuickStyle *>(qmlAttachedPropertiesObject(&idx, object, type, create)); } -static QQuickStyle *findParentStyle(const QMetaObject *type, QObject *parent) +static QQuickStyle *findParentStyle(const QMetaObject *type, QObject *object) { - if (!parent) - return nullptr; - - QQuickStyle *style = attachedStyle(type, parent); - if (style) - return style; - - // lookup object parent (window/popup) - QObject *grandParent = parent->parent(); - if (grandParent) { - QQuickStyle *style = findParentStyle(type, grandParent); - if (style) - return style; - } - - QQuickItem *item = qobject_cast<QQuickItem *>(parent); + QQuickItem *item = qobject_cast<QQuickItem *>(object); if (item) { - // lookup parent items + // lookup parent items and popups QQuickItem *parent = item->parentItem(); - if (parent) { - QQuickStyle *style = findParentStyle(type, parent); + while (parent) { + QQuickStyle *style = attachedStyle(type, parent); if (style) return style; + + QQuickPopup *popup = qobject_cast<QQuickPopup *>(parent->parent()); + if (popup) + return attachedStyle(type, popup); + + parent = parent->parentItem(); } // fallback to item's window - QQuickStyle *style = findParentStyle(type, item->window()); + QQuickStyle *style = attachedStyle(type, item->window()); if (style) return style; + } else { + // lookup popup's window + QQuickPopup *popup = qobject_cast<QQuickPopup *>(object); + if (popup) + return attachedStyle(type, popup->popupItem()->window()); + } + + // lookup parent window + QQuickWindow *window = qobject_cast<QQuickWindow *>(object); + if (window) { + QQuickWindow *parentWindow = qobject_cast<QQuickWindow *>(window->parent()); + if (parentWindow) { + QQuickStyle *style = attachedStyle(type, window); + if (style) + return style; + } } // fallback to engine (global) - QQmlEngine *engine = qmlEngine(parent); - if (engine) { - QByteArray name = QByteArray("_q_") + type->className(); - QQuickStyle *style = engine->property(name).value<QQuickStyle*>(); - if (!style) { - style = attachedStyle(type, engine, true); - engine->setProperty(name, QVariant::fromValue(style)); + if (object) { + QQmlEngine *engine = qmlEngine(object); + if (engine) { + QByteArray name = QByteArray("_q_") + type->className(); + QQuickStyle *style = engine->property(name).value<QQuickStyle*>(); + if (!style) { + style = attachedStyle(type, engine, true); + engine->setProperty(name, QVariant::fromValue(style)); + } + return style; } - return style; } return nullptr; @@ -106,7 +115,8 @@ static QList<QQuickStyle *> findChildStyles(const QMetaObject *type, QObject *ob QQuickItem *item = qobject_cast<QQuickItem *>(object); if (!item) { - if (QQuickWindow *window = qobject_cast<QQuickWindow *>(object)) { + QQuickWindow *window = qobject_cast<QQuickWindow *>(object); + if (window) { item = window->contentItem(); const auto windowChildren = window->children(); @@ -118,12 +128,6 @@ static QList<QQuickStyle *> findChildStyles(const QMetaObject *type, QObject *ob children += style; } } - } else if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(object)) { - item = popup->popupItem(); - - QQuickStyle *style = attachedStyle(type, popup); - if (style) - children += style; } } @@ -136,17 +140,6 @@ static QList<QQuickStyle *> findChildStyles(const QMetaObject *type, QObject *ob else children += findChildStyles(type, child); } - - const auto itemChildren = item->children(); - for (QObject *child : itemChildren) { - if (!qobject_cast<QQuickItem *>(child)) { - QQuickStyle *style = attachedStyle(type, child); - if (style) - children += style; - else - children += findChildStyles(type, child); - } - } } return children; @@ -154,14 +147,14 @@ static QList<QQuickStyle *> findChildStyles(const QMetaObject *type, QObject *ob QQuickStyle::QQuickStyle(QObject *parent) : QObject(parent) { - QQuickItem *item = qobject_cast<QQuickItem *>(parent); + QQuickItem *item = parentItem(); if (item) QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent); } QQuickStyle::~QQuickStyle() { - QQuickItem *item = qobject_cast<QQuickItem *>(parent()); + QQuickItem *item = parentItem(); if (item) QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent); @@ -183,6 +176,17 @@ QSharedPointer<QSettings> QQuickStyle::settings(const QString &group) return QSharedPointer<QSettings>(); } +QQuickItem *QQuickStyle::parentItem() const +{ + QQuickItem *item = qobject_cast<QQuickItem *>(parent()); + if (!item) { + QQuickPopup *popup = qobject_cast<QQuickPopup *>(parent()); + if (popup) + item = popup->popupItem(); + } + return item; +} + QList<QQuickStyle *> QQuickStyle::childStyles() const { return m_childStyles; @@ -208,16 +212,11 @@ void QQuickStyle::setParentStyle(QQuickStyle *style) void QQuickStyle::init() { - QObject *parent = QObject::parent(); - if (!parent) - return; - - QQuickItem *parentItem = qobject_cast<QQuickItem *>(parent); - QQuickStyle *parentStyle = findParentStyle(metaObject(), parentItem ? parentItem->parentItem() : parent->parent()); + QQuickStyle *parentStyle = findParentStyle(metaObject(), parent()); if (parentStyle) setParentStyle(parentStyle); - const QList<QQuickStyle *> children = findChildStyles(metaObject(), parent); + const QList<QQuickStyle *> children = findChildStyles(metaObject(), parent()); for (QQuickStyle *child : children) child->setParentStyle(this); } @@ -230,12 +229,8 @@ void QQuickStyle::parentStyleChange(QQuickStyle *newParent, QQuickStyle *oldPare void QQuickStyle::itemParentChanged(QQuickItem *item, QQuickItem *parent) { - QQuickStyle *style = attachedStyle(metaObject(), item); - if (style) { - QQuickStyle *parentStyle = findParentStyle(metaObject(), parent); - if (parentStyle) - style->setParentStyle(parentStyle); - } + Q_UNUSED(parent); + setParentStyle(findParentStyle(metaObject(), item)); } QT_END_NAMESPACE diff --git a/src/controls/qquickstyle_p.h b/src/controls/qquickstyle_p.h index 36a2320c..2a1d3d00 100644 --- a/src/controls/qquickstyle_p.h +++ b/src/controls/qquickstyle_p.h @@ -72,6 +72,8 @@ public: protected: void init(); + QQuickItem *parentItem() const; + QList<QQuickStyle *> childStyles() const; QQuickStyle *parentStyle() const; |