diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-09-26 13:35:13 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-09-26 14:38:00 +0000 |
commit | 0e3636a4692c9cf89d994f3fe5c1c110b4c6ee61 (patch) | |
tree | 35a6cce16c40ba0cde663ff8c41086d19b527dc9 /src/quicktemplates2 | |
parent | 11b066beb45e7da084c6f792cf9421d48d4b40bf (diff) |
Create contentItem lazily where possible
The existence of a content item is obligatory for such controls that
alias the contentData and contentChildren properties to the data and
children properties of the content item.
Even though we created empty content items in QML to ensure one always
exists, it did not not guarantee that a content item would exist for
custom styles. Furthermore, the empty content item was unnecessarily
created and destroyed when the property was overridden for a customized
control in QML.
This change creates the content item lazily where required, ensuring
that it always exists even for custom styles, but does not create it
in case a content item is supplied from QML.
Task-number: QTBUG-54347
Task-number: QTBUG-56038
Change-Id: I714ef4f8c366f0f449b922b2c16c0ec653fbd364
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r-- | src/quicktemplates2/qquickcontrol.cpp | 9 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p_p.h | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpage.cpp | 14 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane.cpp | 12 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane_p_p.h | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopup.cpp | 10 |
6 files changed, 43 insertions, 6 deletions
diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index 518255dd..6e35e64e 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -214,6 +214,11 @@ void QQuickControlPrivate::resizeContent() } } +QQuickItem *QQuickControlPrivate::getContentItem() +{ + return contentItem; +} + #ifndef QT_NO_ACCESSIBILITY void QQuickControlPrivate::accessibilityActiveChanged(bool active) { @@ -1082,8 +1087,8 @@ void QQuickControl::setBackground(QQuickItem *background) */ QQuickItem *QQuickControl::contentItem() const { - Q_D(const QQuickControl); - return d->contentItem; + QQuickControlPrivate *d = const_cast<QQuickControlPrivate *>(d_func()); + return d->getContentItem(); } void QQuickControl::setContentItem(QQuickItem *item) diff --git a/src/quicktemplates2/qquickcontrol_p_p.h b/src/quicktemplates2/qquickcontrol_p_p.h index 64f29986..26760510 100644 --- a/src/quicktemplates2/qquickcontrol_p_p.h +++ b/src/quicktemplates2/qquickcontrol_p_p.h @@ -88,6 +88,8 @@ public: void resizeBackground(); virtual void resizeContent(); + virtual QQuickItem *getContentItem(); + #ifndef QT_NO_ACCESSIBILITY void accessibilityActiveChanged(bool active) override; QAccessible::Role accessibleRole() const override; diff --git a/src/quicktemplates2/qquickpage.cpp b/src/quicktemplates2/qquickpage.cpp index 54e79fbe..88eb03bf 100644 --- a/src/quicktemplates2/qquickpage.cpp +++ b/src/quicktemplates2/qquickpage.cpp @@ -87,10 +87,20 @@ class QQuickPagePrivate : public QQuickControlPrivate Q_DECLARE_PUBLIC(QQuickPage) public: + QQuickItem *getContentItem() override; + QString title; QScopedPointer<QQuickPageLayout> layout; }; +QQuickItem *QQuickPagePrivate::getContentItem() +{ + Q_Q(QQuickPage); + if (!contentItem) + contentItem = new QQuickItem(q); + return contentItem; +} + QQuickPage::QQuickPage(QQuickItem *parent) : QQuickControl(*(new QQuickPagePrivate), parent) { @@ -225,7 +235,7 @@ void QQuickPage::setFooter(QQuickItem *footer) QQmlListProperty<QObject> QQuickPage::contentData() { Q_D(QQuickPage); - return QQmlListProperty<QObject>(d->contentItem, nullptr, + return QQmlListProperty<QObject>(d->getContentItem(), nullptr, QQuickItemPrivate::data_append, QQuickItemPrivate::data_count, QQuickItemPrivate::data_at, @@ -248,7 +258,7 @@ QQmlListProperty<QObject> QQuickPage::contentData() QQmlListProperty<QQuickItem> QQuickPage::contentChildren() { Q_D(QQuickPage); - return QQmlListProperty<QQuickItem>(d->contentItem, nullptr, + return QQmlListProperty<QQuickItem>(d->getContentItem(), nullptr, QQuickItemPrivate::children_append, QQuickItemPrivate::children_count, QQuickItemPrivate::children_at, diff --git a/src/quicktemplates2/qquickpane.cpp b/src/quicktemplates2/qquickpane.cpp index 9f9c139b..ea296eb6 100644 --- a/src/quicktemplates2/qquickpane.cpp +++ b/src/quicktemplates2/qquickpane.cpp @@ -108,6 +108,14 @@ QQuickPanePrivate::QQuickPanePrivate() : contentWidth(0), contentHeight(0) { } +QQuickItem *QQuickPanePrivate::getContentItem() +{ + Q_Q(QQuickPane); + if (!contentItem) + contentItem = new QQuickItem(q); + return contentItem; +} + QQuickPane::QQuickPane(QQuickItem *parent) : QQuickControl(*(new QQuickPanePrivate), parent) { @@ -191,7 +199,7 @@ void QQuickPane::setContentHeight(qreal height) QQmlListProperty<QObject> QQuickPane::contentData() { Q_D(QQuickPane); - return QQmlListProperty<QObject>(d->contentItem, nullptr, + return QQmlListProperty<QObject>(d->getContentItem(), nullptr, QQuickItemPrivate::data_append, QQuickItemPrivate::data_count, QQuickItemPrivate::data_at, @@ -214,7 +222,7 @@ QQmlListProperty<QObject> QQuickPane::contentData() QQmlListProperty<QQuickItem> QQuickPane::contentChildren() { Q_D(QQuickPane); - return QQmlListProperty<QQuickItem>(d->contentItem, nullptr, + return QQmlListProperty<QQuickItem>(d->getContentItem(), nullptr, QQuickItemPrivate::children_append, QQuickItemPrivate::children_count, QQuickItemPrivate::children_at, diff --git a/src/quicktemplates2/qquickpane_p_p.h b/src/quicktemplates2/qquickpane_p_p.h index acc0d0ab..62789664 100644 --- a/src/quicktemplates2/qquickpane_p_p.h +++ b/src/quicktemplates2/qquickpane_p_p.h @@ -61,6 +61,8 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickPanePrivate : public QQuickControlP public: QQuickPanePrivate(); + QQuickItem *getContentItem() override; + qreal contentWidth; qreal contentHeight; }; diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index d2625c3e..a8e07533 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -352,6 +352,8 @@ public: void resolveFont() override; + QQuickItem *getContentItem() override; + QQuickPopup *popup; }; @@ -378,6 +380,14 @@ void QQuickPopupItemPrivate::resolveFont() inheritFont(window->font()); } +QQuickItem *QQuickPopupItemPrivate::getContentItem() +{ + Q_Q(QQuickPopupItem); + if (!contentItem) + contentItem = new QQuickItem(q); + return contentItem; +} + QQuickPopupItem::QQuickPopupItem(QQuickPopup *popup) : QQuickControl(*(new QQuickPopupItemPrivate(popup)), nullptr) { |