From 0e3636a4692c9cf89d994f3fe5c1c110b4c6ee61 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 26 Sep 2016 13:35:13 +0200 Subject: 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 --- src/imports/controls/Dialog.qml | 2 -- src/imports/controls/Drawer.qml | 4 ---- src/imports/controls/Frame.qml | 4 ---- src/imports/controls/GroupBox.qml | 4 ---- src/imports/controls/Page.qml | 4 ---- src/imports/controls/Pane.qml | 4 ---- src/imports/controls/Popup.qml | 2 -- src/imports/controls/ToolBar.qml | 4 ---- src/imports/controls/material/Dialog.qml | 2 -- src/imports/controls/material/Drawer.qml | 2 -- src/imports/controls/material/Frame.qml | 2 -- src/imports/controls/material/GroupBox.qml | 2 -- src/imports/controls/material/Page.qml | 2 -- src/imports/controls/material/Pane.qml | 2 -- src/imports/controls/material/Popup.qml | 2 -- src/imports/controls/material/ToolBar.qml | 2 -- src/imports/controls/universal/Dialog.qml | 2 -- src/imports/controls/universal/Drawer.qml | 2 -- src/imports/controls/universal/Frame.qml | 2 -- src/imports/controls/universal/GroupBox.qml | 2 -- src/imports/controls/universal/Page.qml | 2 -- src/imports/controls/universal/Pane.qml | 2 -- src/imports/controls/universal/Popup.qml | 2 -- src/imports/controls/universal/ToolBar.qml | 2 -- src/quicktemplates2/qquickcontrol.cpp | 9 +++++++-- src/quicktemplates2/qquickcontrol_p_p.h | 2 ++ src/quicktemplates2/qquickpage.cpp | 14 ++++++++++++-- src/quicktemplates2/qquickpane.cpp | 12 ++++++++++-- src/quicktemplates2/qquickpane_p_p.h | 2 ++ src/quicktemplates2/qquickpopup.cpp | 10 ++++++++++ 30 files changed, 43 insertions(+), 66 deletions(-) (limited to 'src') diff --git a/src/imports/controls/Dialog.qml b/src/imports/controls/Dialog.qml index 18760d3f..c90ae6fc 100644 --- a/src/imports/controls/Dialog.qml +++ b/src/imports/controls/Dialog.qml @@ -55,8 +55,6 @@ T.Dialog { padding: 12 - contentItem: Item { } - background: Rectangle { border.color: Default.frameDarkColor } diff --git a/src/imports/controls/Drawer.qml b/src/imports/controls/Drawer.qml index eca9b949..689b6240 100644 --- a/src/imports/controls/Drawer.qml +++ b/src/imports/controls/Drawer.qml @@ -63,10 +63,6 @@ T.Drawer { exit: Transition { SmoothedAnimation { velocity: 5 } } //! [exit] - //! [contentItem] - contentItem: Item { } - //! [contentItem] - //! [background] background: Rectangle { Rectangle { diff --git a/src/imports/controls/Frame.qml b/src/imports/controls/Frame.qml index e1148496..ef716f72 100644 --- a/src/imports/controls/Frame.qml +++ b/src/imports/controls/Frame.qml @@ -50,10 +50,6 @@ T.Frame { padding: 12 - //! [contentItem] - contentItem: Item { } - //! [contentItem] - //! [background] background: Rectangle { color: "transparent" diff --git a/src/imports/controls/GroupBox.qml b/src/imports/controls/GroupBox.qml index 7a20225d..1b3afd66 100644 --- a/src/imports/controls/GroupBox.qml +++ b/src/imports/controls/GroupBox.qml @@ -54,10 +54,6 @@ T.GroupBox { padding: 12 topPadding: padding + (label && label.implicitWidth > 0 ? label.implicitHeight + spacing : 0) - //! [contentItem] - contentItem: Item { } - //! [contentItem] - //! [label] label: Text { x: control.leftPadding diff --git a/src/imports/controls/Page.qml b/src/imports/controls/Page.qml index 1abb06a3..39080de7 100644 --- a/src/imports/controls/Page.qml +++ b/src/imports/controls/Page.qml @@ -42,10 +42,6 @@ import QtQuick.Templates 2.1 as T T.Page { id: control - //! [contentItem] - contentItem: Item { } - //! [contentItem] - //! [background] background: Rectangle { color: Default.backgroundColor diff --git a/src/imports/controls/Pane.qml b/src/imports/controls/Pane.qml index 7066560a..3f6e43a9 100644 --- a/src/imports/controls/Pane.qml +++ b/src/imports/controls/Pane.qml @@ -50,10 +50,6 @@ T.Pane { padding: 12 - //! [contentItem] - contentItem: Item { } - //! [contentItem] - //! [background] background: Rectangle { color: Default.backgroundColor diff --git a/src/imports/controls/Popup.qml b/src/imports/controls/Popup.qml index c9e9d60e..92ac19ed 100644 --- a/src/imports/controls/Popup.qml +++ b/src/imports/controls/Popup.qml @@ -52,8 +52,6 @@ T.Popup { padding: 12 - contentItem: Item { } - background: Rectangle { border.color: Default.frameDarkColor } diff --git a/src/imports/controls/ToolBar.qml b/src/imports/controls/ToolBar.qml index 70c61c78..cc61a95b 100644 --- a/src/imports/controls/ToolBar.qml +++ b/src/imports/controls/ToolBar.qml @@ -48,10 +48,6 @@ T.ToolBar { contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) - //! [contentItem] - contentItem: Item { } - //! [contentItem] - //! [background] background: Rectangle { implicitHeight: 40 diff --git a/src/imports/controls/material/Dialog.qml b/src/imports/controls/material/Dialog.qml index 55ff671b..8141eb8c 100644 --- a/src/imports/controls/material/Dialog.qml +++ b/src/imports/controls/material/Dialog.qml @@ -70,8 +70,6 @@ T.Dialog { NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 } } - contentItem: Item { } - background: Rectangle { radius: 2 color: control.Material.dialogColor diff --git a/src/imports/controls/material/Drawer.qml b/src/imports/controls/material/Drawer.qml index efb394d1..d6603b04 100644 --- a/src/imports/controls/material/Drawer.qml +++ b/src/imports/controls/material/Drawer.qml @@ -53,8 +53,6 @@ T.Drawer { enter: Transition { SmoothedAnimation { velocity: 5 } } exit: Transition { SmoothedAnimation { velocity: 5 } } - contentItem: Item { } - background: Rectangle { color: control.Material.dialogColor diff --git a/src/imports/controls/material/Frame.qml b/src/imports/controls/material/Frame.qml index 4c8b7f01..45b8b263 100644 --- a/src/imports/controls/material/Frame.qml +++ b/src/imports/controls/material/Frame.qml @@ -50,8 +50,6 @@ T.Frame { padding: 12 - contentItem: Item { } - background: Rectangle { radius: 2 color: control.Material.elevation > 0 ? control.Material.backgroundColor : "transparent" diff --git a/src/imports/controls/material/GroupBox.qml b/src/imports/controls/material/GroupBox.qml index 48827792..945c5a8c 100644 --- a/src/imports/controls/material/GroupBox.qml +++ b/src/imports/controls/material/GroupBox.qml @@ -54,8 +54,6 @@ T.GroupBox { padding: 12 topPadding: padding + (label && label.implicitWidth > 0 ? label.implicitHeight + spacing : 0) - contentItem: Item {} - label: Text { x: control.leftPadding width: control.availableWidth diff --git a/src/imports/controls/material/Page.qml b/src/imports/controls/material/Page.qml index f829788e..887a139d 100644 --- a/src/imports/controls/material/Page.qml +++ b/src/imports/controls/material/Page.qml @@ -41,8 +41,6 @@ import QtQuick.Controls.Material 2.1 T.Page { id: control - contentItem: Item { } - background: Rectangle { color: control.Material.backgroundColor } diff --git a/src/imports/controls/material/Pane.qml b/src/imports/controls/material/Pane.qml index d9828a2a..95e0a8c2 100644 --- a/src/imports/controls/material/Pane.qml +++ b/src/imports/controls/material/Pane.qml @@ -50,8 +50,6 @@ T.Pane { padding: 12 - contentItem: Item { } - background: Rectangle { color: control.Material.backgroundColor radius: control.Material.elevation > 0 ? 2 : 0 diff --git a/src/imports/controls/material/Popup.qml b/src/imports/controls/material/Popup.qml index 2cd85846..2654aaf4 100644 --- a/src/imports/controls/material/Popup.qml +++ b/src/imports/controls/material/Popup.qml @@ -66,8 +66,6 @@ T.Popup { NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 } } - contentItem: Item { } - background: Rectangle { radius: 2 color: control.Material.dialogColor diff --git a/src/imports/controls/material/ToolBar.qml b/src/imports/controls/material/ToolBar.qml index 0da814f1..ac6e8bf3 100644 --- a/src/imports/controls/material/ToolBar.qml +++ b/src/imports/controls/material/ToolBar.qml @@ -52,8 +52,6 @@ T.ToolBar { Material.foreground: Material.toolTextColor - contentItem: Item { } - background: Rectangle { implicitHeight: 48 color: control.Material.toolBarColor diff --git a/src/imports/controls/universal/Dialog.qml b/src/imports/controls/universal/Dialog.qml index 1a2d6839..bda9bbb1 100644 --- a/src/imports/controls/universal/Dialog.qml +++ b/src/imports/controls/universal/Dialog.qml @@ -57,8 +57,6 @@ T.Dialog { topPadding: 18 bottomPadding: 0 - contentItem: Item { } - background: Rectangle { color: control.Universal.chromeMediumLowColor border.color: control.Universal.chromeHighColor diff --git a/src/imports/controls/universal/Drawer.qml b/src/imports/controls/universal/Drawer.qml index c3dece6e..846d7031 100644 --- a/src/imports/controls/universal/Drawer.qml +++ b/src/imports/controls/universal/Drawer.qml @@ -57,8 +57,6 @@ T.Drawer { enter: Transition { SmoothedAnimation { velocity: 5 } } exit: Transition { SmoothedAnimation { velocity: 5 } } - contentItem: Item { } - background: Rectangle { color: control.Universal.chromeMediumLowColor Rectangle { diff --git a/src/imports/controls/universal/Frame.qml b/src/imports/controls/universal/Frame.qml index 8c0118b0..9bd34292 100644 --- a/src/imports/controls/universal/Frame.qml +++ b/src/imports/controls/universal/Frame.qml @@ -49,8 +49,6 @@ T.Frame { padding: 12 - contentItem: Item { } - background: Rectangle { color: "transparent" border.color: control.Universal.chromeDisabledLowColor diff --git a/src/imports/controls/universal/GroupBox.qml b/src/imports/controls/universal/GroupBox.qml index fea4efae..d45505c7 100644 --- a/src/imports/controls/universal/GroupBox.qml +++ b/src/imports/controls/universal/GroupBox.qml @@ -53,8 +53,6 @@ T.GroupBox { padding: 12 topPadding: padding + (label && label.implicitWidth > 0 ? label.implicitHeight + spacing : 0) - contentItem: Item { } - label: Text { x: control.leftPadding width: control.availableWidth diff --git a/src/imports/controls/universal/Page.qml b/src/imports/controls/universal/Page.qml index eca623f1..4f2d6ff7 100644 --- a/src/imports/controls/universal/Page.qml +++ b/src/imports/controls/universal/Page.qml @@ -41,8 +41,6 @@ import QtQuick.Controls.Universal 2.1 T.Page { id: control - contentItem: Item { } - background: Rectangle { color: control.Universal.background } diff --git a/src/imports/controls/universal/Pane.qml b/src/imports/controls/universal/Pane.qml index 183f278c..2a459630 100644 --- a/src/imports/controls/universal/Pane.qml +++ b/src/imports/controls/universal/Pane.qml @@ -49,8 +49,6 @@ T.Pane { padding: 12 - contentItem: Item { } - background: Rectangle { color: control.Universal.background } diff --git a/src/imports/controls/universal/Popup.qml b/src/imports/controls/universal/Popup.qml index 36e87449..67dfa45c 100644 --- a/src/imports/controls/universal/Popup.qml +++ b/src/imports/controls/universal/Popup.qml @@ -51,8 +51,6 @@ T.Popup { padding: 12 - contentItem: Item { } - background: Rectangle { color: control.Universal.chromeMediumLowColor border.color: control.Universal.chromeHighColor diff --git a/src/imports/controls/universal/ToolBar.qml b/src/imports/controls/universal/ToolBar.qml index 49889e19..5535a337 100644 --- a/src/imports/controls/universal/ToolBar.qml +++ b/src/imports/controls/universal/ToolBar.qml @@ -47,8 +47,6 @@ T.ToolBar { contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) - contentItem: Item { } - background: Rectangle { implicitHeight: 48 // AppBarThemeCompactHeight color: control.Universal.chromeMediumColor 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(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 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 QQuickPage::contentData() { Q_D(QQuickPage); - return QQmlListProperty(d->contentItem, nullptr, + return QQmlListProperty(d->getContentItem(), nullptr, QQuickItemPrivate::data_append, QQuickItemPrivate::data_count, QQuickItemPrivate::data_at, @@ -248,7 +258,7 @@ QQmlListProperty QQuickPage::contentData() QQmlListProperty QQuickPage::contentChildren() { Q_D(QQuickPage); - return QQmlListProperty(d->contentItem, nullptr, + return QQmlListProperty(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 QQuickPane::contentData() { Q_D(QQuickPane); - return QQmlListProperty(d->contentItem, nullptr, + return QQmlListProperty(d->getContentItem(), nullptr, QQuickItemPrivate::data_append, QQuickItemPrivate::data_count, QQuickItemPrivate::data_at, @@ -214,7 +222,7 @@ QQmlListProperty QQuickPane::contentData() QQmlListProperty QQuickPane::contentChildren() { Q_D(QQuickPane); - return QQmlListProperty(d->contentItem, nullptr, + return QQmlListProperty(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) { -- cgit v1.2.3