aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quicktemplates2/qquickcontainer.cpp4
-rw-r--r--src/quicktemplates2/qquickcontrol.cpp95
-rw-r--r--src/quicktemplates2/qquickcontrol_p.h8
-rw-r--r--src/quicktemplates2/qquickcontrol_p_p.h7
-rw-r--r--src/quicktemplates2/qquickpane.cpp20
-rw-r--r--src/quicktemplates2/qquickpane_p_p.h3
-rw-r--r--tests/auto/controls/data/tst_control.qml44
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() {