diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2018-02-21 23:11:25 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2018-04-12 09:13:58 +0000 |
commit | 5bd9d44bc7f78ca5946bdef788f1da63b2356a65 (patch) | |
tree | 4ec113f3d28a5796919073f0e249b1a0d7699029 /src | |
parent | 8428c9f4429139e3fa137400bd0721030416c8b2 (diff) |
Control: add implicitBackgroundWidth|Height properties
[ChangeLog][Controls][Control] Added implicitBackgroundWidth and
implicitBackgroundHeight properties that can be used to simplify
complex implicit size bindings.
Task-number: QTBUG-60156
Change-Id: Ia68df187c2a458c84de19f867d76a643134e8b69
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-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 |
6 files changed, 116 insertions, 21 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; |