diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-12-15 12:34:03 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-12-19 09:35:21 +0000 |
commit | f5c13e141c9c9bf7b131da6948ebcfc01d82f160 (patch) | |
tree | 3f5e6d409612f36f230a7bb4e3eefc08940cca7e /src | |
parent | 6b89293b99e763589181fd1f75470712f52cee3c (diff) |
Popups: use deferred execution
QQuickPopup is backed by a QQuickControl subclass aka QQuickPopupItem.
However, since the QML engine sees "background" and "contentItem" as
properties of QQuickPopup, we must ensure that the deferred properties
are executed for the QQuickPopup wrapper object.
Task-number: QTBUG-50992
Change-Id: I2ec055b382e41530a6f4a740cb80853c0181c21a
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p_p.h | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 3 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpagelayout.cpp | 13 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopup.cpp | 11 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopup_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopupitem.cpp | 30 |
6 files changed, 51 insertions, 11 deletions
diff --git a/src/quicktemplates2/qquickcontrol_p_p.h b/src/quicktemplates2/qquickcontrol_p_p.h index d8b1dd40..81fa03a4 100644 --- a/src/quicktemplates2/qquickcontrol_p_p.h +++ b/src/quicktemplates2/qquickcontrol_p_p.h @@ -127,8 +127,8 @@ public: static bool calcHoverEnabled(const QQuickItem *item); #endif - void executeContentItem(bool complete = false); - void executeBackground(bool complete = false); + virtual void executeContentItem(bool complete = false); + virtual void executeBackground(bool complete = false); static void destroyDelegate(QObject *object, QObject *parent); diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index 52c048a6..13c738ac 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -38,6 +38,7 @@ #include "qquickmenu_p_p.h" #include "qquickmenuitem_p.h" #include "qquickcontrol_p_p.h" +#include "qquickpopupitem_p_p.h" #include <QtGui/qevent.h> #include <QtQml/private/qqmlobjectmodel_p.h> @@ -449,6 +450,8 @@ QVariant QQuickMenu::contentModel() const QQmlListProperty<QObject> QQuickMenu::contentData() { Q_D(QQuickMenu); + if (!d->contentItem) + QQuickControlPrivate::get(d->popupItem)->executeContentItem(); return QQmlListProperty<QObject>(this, d, QQuickMenuPrivate::contentData_append, QQuickMenuPrivate::contentData_count, diff --git a/src/quicktemplates2/qquickpagelayout.cpp b/src/quicktemplates2/qquickpagelayout.cpp index 99d4fe23..595db560 100644 --- a/src/quicktemplates2/qquickpagelayout.cpp +++ b/src/quicktemplates2/qquickpagelayout.cpp @@ -36,6 +36,7 @@ #include "qquickpagelayout_p_p.h" #include "qquickcontrol_p.h" +#include "qquickcontrol_p_p.h" #include "qquicktoolbar_p.h" #include "qquicktabbar_p.h" #include "qquickdialogbuttonbox_p.h" @@ -140,17 +141,19 @@ bool QQuickPageLayout::setFooter(QQuickItem *footer) void QQuickPageLayout::update() { - QQuickItem *content = m_control->contentItem(); + QQuickItem *content = QQuickControlPrivate::get(m_control)->contentItem; const qreal hh = m_header && m_header->isVisible() ? m_header->height() : 0; const qreal fh = m_footer && m_footer->isVisible() ? m_footer->height() : 0; const qreal hsp = hh > 0 ? m_control->spacing() : 0; const qreal fsp = fh > 0 ? m_control->spacing() : 0; - content->setY(m_control->topPadding() + hh + hsp); - content->setX(m_control->leftPadding()); - content->setWidth(m_control->availableWidth()); - content->setHeight(m_control->availableHeight() - hh - fh - hsp - fsp); + if (content) { + content->setY(m_control->topPadding() + hh + hsp); + content->setX(m_control->leftPadding()); + content->setWidth(m_control->availableWidth()); + content->setHeight(m_control->availableHeight() - hh - fh - hsp - fsp); + } if (m_header) m_header->setWidth(m_control->width()); diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index ce4072e5..bb5ce660 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -261,6 +261,7 @@ void QQuickPopupPrivate::init() popupItem->setVisible(false); q->setParentItem(qobject_cast<QQuickItem *>(parent)); QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged); + QObject::connect(popupItem, &QQuickControl::backgroundChanged, q, &QQuickPopup::backgroundChanged); QObject::connect(popupItem, &QQuickControl::contentItemChanged, q, &QQuickPopup::contentItemChanged); positioner = new QQuickPopupPositioner(q); } @@ -1428,11 +1429,7 @@ QQuickItem *QQuickPopup::background() const void QQuickPopup::setBackground(QQuickItem *background) { Q_D(QQuickPopup); - if (d->popupItem->background() == background) - return; - d->popupItem->setBackground(background); - emit backgroundChanged(); } /*! @@ -1485,6 +1482,9 @@ void QQuickPopup::setContentItem(QQuickItem *item) QQmlListProperty<QObject> QQuickPopup::contentData() { Q_D(QQuickPopup); + QQuickControlPrivate *p = QQuickControlPrivate::get(d->popupItem); + if (!p->contentItem) + p->executeContentItem(); return QQmlListProperty<QObject>(d->popupItem->contentItem(), nullptr, QQuickItemPrivate::data_append, QQuickItemPrivate::data_count, @@ -1886,6 +1886,9 @@ void QQuickPopup::classBegin() { Q_D(QQuickPopup); d->complete = false; + QQmlContext *context = qmlContext(this); + if (context) + QQmlEngine::setContextForObject(d->popupItem, context); d->popupItem->classBegin(); } diff --git a/src/quicktemplates2/qquickpopup_p.h b/src/quicktemplates2/qquickpopup_p.h index 199f7e4c..16e46755 100644 --- a/src/quicktemplates2/qquickpopup_p.h +++ b/src/quicktemplates2/qquickpopup_p.h @@ -115,6 +115,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickPopup : public QObject, public QQml Q_PROPERTY(QQuickTransition *exit READ exit WRITE setExit NOTIFY exitChanged FINAL) // 2.1 (Qt 5.8) Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing RESET resetSpacing NOTIFY spacingChanged FINAL REVISION 1) + Q_CLASSINFO("DeferredPropertyNames", "background,contentItem") Q_CLASSINFO("DefaultProperty", "contentData") public: diff --git a/src/quicktemplates2/qquickpopupitem.cpp b/src/quicktemplates2/qquickpopupitem.cpp index bd667835..db335a06 100644 --- a/src/quicktemplates2/qquickpopupitem.cpp +++ b/src/quicktemplates2/qquickpopupitem.cpp @@ -39,6 +39,7 @@ #include "qquickshortcutcontext_p_p.h" #include "qquickcontrol_p_p.h" #include "qquickpopup_p_p.h" +#include "qquickdeferredexecute_p_p.h" #include <QtGui/private/qshortcutmap_p.h> #include <QtGui/private/qguiapplication_p.h> @@ -59,6 +60,9 @@ public: QQuickItem *getContentItem() override; + void executeContentItem(bool complete = false) override; + void executeBackground(bool complete = false) override; + int backId; int escapeId; QQuickPopup *popup; @@ -100,6 +104,32 @@ QQuickItem *QQuickPopupItemPrivate::getContentItem() return new QQuickItem(q); } +static inline QString contentItemName() { return QStringLiteral("contentItem"); } + +void QQuickPopupItemPrivate::executeContentItem(bool complete) +{ + if (contentItem.wasExecuted()) + return; + + if (!contentItem) + quickBeginDeferred(popup, contentItemName(), contentItem); + if (complete) + quickCompleteDeferred(popup, contentItemName(), contentItem); +} + +static inline QString backgroundName() { return QStringLiteral("background"); } + +void QQuickPopupItemPrivate::executeBackground(bool complete) +{ + if (background.wasExecuted()) + return; + + if (!background) + quickBeginDeferred(popup, backgroundName(), background); + if (complete) + quickCompleteDeferred(popup, backgroundName(), background); +} + QQuickPopupItem::QQuickPopupItem(QQuickPopup *popup) : QQuickControl(*(new QQuickPopupItemPrivate(popup)), nullptr) { |