diff options
-rw-r--r-- | src/quicktemplates2/qquickcontainer.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol.cpp | 95 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p.h | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p_p.h | 7 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane.cpp | 20 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane_p_p.h | 3 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_control.qml | 44 |
7 files changed, 152 insertions, 29 deletions
diff --git a/src/quicktemplates2/qquickcontainer.cpp b/src/quicktemplates2/qquickcontainer.cpp index 06c1b092..b3d0e705 100644 --- a/src/quicktemplates2/qquickcontainer.cpp +++ b/src/quicktemplates2/qquickcontainer.cpp @@ -381,16 +381,20 @@ void QQuickContainerPrivate::itemDestroyed(QQuickItem *item) int index = contentModel->indexOf(item, nullptr); if (index != -1) removeItem(index, item); + else + QQuickControlPrivate::itemDestroyed(item); } void QQuickContainerPrivate::itemImplicitWidthChanged(QQuickItem *item) { + QQuickControlPrivate::itemImplicitWidthChanged(item); if (item == contentItem) updateContentWidth(); } void QQuickContainerPrivate::itemImplicitHeightChanged(QQuickItem *item) { + QQuickControlPrivate::itemImplicitHeightChanged(item); if (item == contentItem) updateContentHeight(); } diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index 32147329..7a1bb496 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -97,6 +97,8 @@ QT_BEGIN_NAMESPACE \sa ApplicationWindow, Container */ +static const QQuickItemPrivate::ChangeTypes ImplicitSizeChanges = QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed; + static bool isKeyFocusReason(Qt::FocusReason reason) { return reason == Qt::TabFocusReason || reason == Qt::BacktabFocusReason || reason == Qt::ShortcutFocusReason; @@ -729,6 +731,44 @@ void QQuickControlPrivate::updateBaselineOffset() q->QQuickItem::setBaselineOffset(getTopPadding() + contentItem->baselineOffset()); } +void QQuickControlPrivate::addImplicitSizeListener(QQuickItem *item) +{ + if (!item) + return; + QQuickItemPrivate::get(item)->addItemChangeListener(this, ImplicitSizeChanges); +} + +void QQuickControlPrivate::removeImplicitSizeListener(QQuickItem *item) +{ + if (!item) + return; + QQuickItemPrivate::get(item)->removeItemChangeListener(this, ImplicitSizeChanges); +} + +void QQuickControlPrivate::itemImplicitWidthChanged(QQuickItem *item) +{ + Q_Q(QQuickControl); + if (item == background) + emit q->implicitBackgroundWidthChanged(); +} + +void QQuickControlPrivate::itemImplicitHeightChanged(QQuickItem *item) +{ + Q_Q(QQuickControl); + if (item == background) + emit q->implicitBackgroundHeightChanged(); +} + +void QQuickControlPrivate::itemDestroyed(QQuickItem *item) +{ + Q_Q(QQuickControl); + if (item == background) { + background = nullptr; + emit q->implicitBackgroundWidthChanged(); + emit q->implicitBackgroundHeightChanged(); + } +} + QQuickControl::QQuickControl(QQuickItem *parent) : QQuickItem(*(new QQuickControlPrivate), parent) { @@ -743,6 +783,12 @@ QQuickControl::QQuickControl(QQuickControlPrivate &dd, QQuickItem *parent) d->init(); } +QQuickControl::~QQuickControl() +{ + Q_D(QQuickControl); + d->removeImplicitSizeListener(d->background); +} + void QQuickControl::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) { Q_D(QQuickControl); @@ -1361,15 +1407,26 @@ void QQuickControl::setBackground(QQuickItem *background) if (!d->background.isExecuting()) d->cancelBackground(); + const qreal oldImplicitBackgroundWidth = implicitBackgroundWidth(); + const qreal oldImplicitBackgroundHeight = implicitBackgroundHeight(); + + d->removeImplicitSizeListener(d->background); delete d->background; d->background = background; + if (background) { background->setParentItem(this); if (qFuzzyIsNull(background->z())) background->setZ(-1); if (isComponentComplete()) d->resizeBackground(); + d->addImplicitSizeListener(background); } + + if (!qFuzzyCompare(oldImplicitBackgroundWidth, implicitBackgroundWidth())) + emit implicitBackgroundWidthChanged(); + if (!qFuzzyCompare(oldImplicitBackgroundHeight, implicitBackgroundHeight())) + emit implicitBackgroundHeightChanged(); if (!d->background.isExecuting()) emit backgroundChanged(); } @@ -1563,6 +1620,44 @@ void QQuickControl::resetVerticalPadding() d->setVerticalPadding(0, true); } +/*! + \since QtQuick.Controls 2.5 (Qt 5.12) + \qmlproperty real QtQuick.Controls::Control::implicitBackgroundWidth + \readonly + + This property holds the implicit background width. + + The value is equal to \c {background ? background.implicitWidth : 0}. + + \sa implicitBackgroundHeight +*/ +qreal QQuickControl::implicitBackgroundWidth() const +{ + Q_D(const QQuickControl); + if (!d->background) + return 0; + return d->background->implicitWidth(); +} + +/*! + \since QtQuick.Controls 2.5 (Qt 5.12) + \qmlproperty real QtQuick.Controls::Control::implicitBackgroundHeight + \readonly + + This property holds the implicit background height. + + The value is equal to \c {background ? background.implicitHeight : 0}. + + \sa implicitBackgroundWidth +*/ +qreal QQuickControl::implicitBackgroundHeight() const +{ + Q_D(const QQuickControl); + if (!d->background) + return 0; + return d->background->implicitHeight(); +} + void QQuickControl::classBegin() { Q_D(QQuickControl); diff --git a/src/quicktemplates2/qquickcontrol_p.h b/src/quicktemplates2/qquickcontrol_p.h index 6e7cb42f..bde03e94 100644 --- a/src/quicktemplates2/qquickcontrol_p.h +++ b/src/quicktemplates2/qquickcontrol_p.h @@ -85,10 +85,13 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickControl : public QQuickItem // 2.5 (Qt 5.12) Q_PROPERTY(qreal horizontalPadding READ horizontalPadding WRITE setHorizontalPadding RESET resetHorizontalPadding NOTIFY horizontalPaddingChanged FINAL REVISION 5) Q_PROPERTY(qreal verticalPadding READ verticalPadding WRITE setVerticalPadding RESET resetVerticalPadding NOTIFY verticalPaddingChanged FINAL REVISION 5) + Q_PROPERTY(qreal implicitBackgroundWidth READ implicitBackgroundWidth NOTIFY implicitBackgroundWidthChanged FINAL REVISION 5) + Q_PROPERTY(qreal implicitBackgroundHeight READ implicitBackgroundHeight NOTIFY implicitBackgroundHeightChanged FINAL REVISION 5) Q_CLASSINFO("DeferredPropertyNames", "background,contentItem") public: explicit QQuickControl(QQuickItem *parent = nullptr); + ~QQuickControl(); QFont font() const; void setFont(const QFont &font); @@ -169,6 +172,9 @@ public: void setVerticalPadding(qreal padding); void resetVerticalPadding(); + qreal implicitBackgroundWidth() const; + qreal implicitBackgroundHeight() const; + Q_SIGNALS: void fontChanged(); void availableWidthChanged(); @@ -195,6 +201,8 @@ Q_SIGNALS: // 2.5 (Qt 5.12) Q_REVISION(5) void horizontalPaddingChanged(); Q_REVISION(5) void verticalPaddingChanged(); + Q_REVISION(5) void implicitBackgroundWidthChanged(); + Q_REVISION(5) void implicitBackgroundHeightChanged(); protected: virtual QFont defaultFont() const; diff --git a/src/quicktemplates2/qquickcontrol_p_p.h b/src/quicktemplates2/qquickcontrol_p_p.h index 37cd63dd..5c0d253e 100644 --- a/src/quicktemplates2/qquickcontrol_p_p.h +++ b/src/quicktemplates2/qquickcontrol_p_p.h @@ -159,6 +159,13 @@ public: void updateBaselineOffset(); + void addImplicitSizeListener(QQuickItem *item); + void removeImplicitSizeListener(QQuickItem *item); + + void itemImplicitWidthChanged(QQuickItem *item) override; + void itemImplicitHeightChanged(QQuickItem *item) override; + void itemDestroyed(QQuickItem *item) override; + struct ExtraData { ExtraData(); bool hasTopPadding; diff --git a/src/quicktemplates2/qquickpane.cpp b/src/quicktemplates2/qquickpane.cpp index cf89822a..d4c38fb6 100644 --- a/src/quicktemplates2/qquickpane.cpp +++ b/src/quicktemplates2/qquickpane.cpp @@ -107,8 +107,6 @@ QT_BEGIN_NAMESPACE {Focus Management in Qt Quick Controls 2} */ -static const QQuickItemPrivate::ChangeTypes ImplicitSizeChanges = QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed; - QQuickPanePrivate::QQuickPanePrivate() : hasContentWidth(false), hasContentHeight(false), @@ -135,30 +133,16 @@ QQuickItem *QQuickPanePrivate::getContentItem() return new QQuickContentItem(q); } -void QQuickPanePrivate::addImplicitSizeListener(QQuickItem *item) -{ - if (!item) - return; - - QQuickItemPrivate::get(item)->addItemChangeListener(this, ImplicitSizeChanges); -} - -void QQuickPanePrivate::removeImplicitSizeListener(QQuickItem *item) -{ - if (!item) - return; - - QQuickItemPrivate::get(item)->removeItemChangeListener(this, ImplicitSizeChanges); -} - void QQuickPanePrivate::itemImplicitWidthChanged(QQuickItem *item) { + QQuickControlPrivate::itemImplicitWidthChanged(item); if (item == contentItem || item == firstChild) updateContentWidth(); } void QQuickPanePrivate::itemImplicitHeightChanged(QQuickItem *item) { + QQuickControlPrivate::itemImplicitHeightChanged(item); if (item == contentItem || item == firstChild) updateContentHeight(); } diff --git a/src/quicktemplates2/qquickpane_p_p.h b/src/quicktemplates2/qquickpane_p_p.h index b5802c26..2e09d82d 100644 --- a/src/quicktemplates2/qquickpane_p_p.h +++ b/src/quicktemplates2/qquickpane_p_p.h @@ -70,9 +70,6 @@ public: qreal getContentWidth() const; qreal getContentHeight() const; - void addImplicitSizeListener(QQuickItem *item); - void removeImplicitSizeListener(QQuickItem *item); - void itemImplicitWidthChanged(QQuickItem *item) override; void itemImplicitHeightChanged(QQuickItem *item) override; void itemDestroyed(QQuickItem *item) override; diff --git a/tests/auto/controls/data/tst_control.qml b/tests/auto/controls/data/tst_control.qml index 83d141db..29a76e50 100644 --- a/tests/auto/controls/data/tst_control.qml +++ b/tests/auto/controls/data/tst_control.qml @@ -1134,20 +1134,48 @@ TestCase { var control = createTemporaryObject(component, testCase) verify(control) + var implicitWidthSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "implicitWidthChanged"}) + verify(implicitWidthSpy.valid) + + var implicitHeightSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "implicitHeightChanged"}) + verify(implicitHeightSpy.valid) + + var implicitBackgroundWidthSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "implicitBackgroundWidthChanged"}) + verify(implicitBackgroundWidthSpy.valid) + + var implicitBackgroundHeightSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "implicitBackgroundHeightChanged"}) + verify(implicitBackgroundHeightSpy.valid) + + var implicitWidthChanges = 0 + var implicitHeightChanges = 0 + var implicitBackgroundWidthChanges = 0 + var implicitBackgroundHeightChanges = 0 + compare(control.implicitWidth, 0) compare(control.implicitHeight, 0) - - control.contentItem = rectangle.createObject(control, {implicitWidth: 10, implicitHeight: 20}) - compare(control.implicitWidth, 10) - compare(control.implicitHeight, 20) + compare(control.implicitBackgroundWidth, 0) + compare(control.implicitBackgroundHeight, 0) control.background = rectangle.createObject(control, {implicitWidth: 20, implicitHeight: 30}) compare(control.implicitWidth, 20) compare(control.implicitHeight, 30) - - control.padding = 100 - compare(control.implicitWidth, 210) - compare(control.implicitHeight, 220) + compare(control.implicitBackgroundWidth, 20) + compare(control.implicitBackgroundHeight, 30) + compare(implicitWidthSpy.count, ++implicitWidthChanges) + compare(implicitHeightSpy.count, ++implicitHeightChanges) + compare(implicitBackgroundWidthSpy.count, ++implicitBackgroundWidthChanges) + compare(implicitBackgroundHeightSpy.count, ++implicitBackgroundHeightChanges) + + control.background.implicitWidth += 1 + control.background.implicitHeight += 1 + compare(control.implicitWidth, 21) + compare(control.implicitHeight, 31) + compare(control.implicitBackgroundWidth, 21) + compare(control.implicitBackgroundHeight, 31) + compare(implicitWidthSpy.count, ++implicitWidthChanges) + compare(implicitHeightSpy.count, ++implicitHeightChanges) + compare(implicitBackgroundWidthSpy.count, ++implicitBackgroundWidthChanges) + compare(implicitBackgroundHeightSpy.count, ++implicitBackgroundHeightChanges) } function test_baseline() { |