diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-10-24 17:38:06 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-10-26 10:13:22 +0000 |
commit | 935daea1cdd9247d04618fcd67eb2a935060d1db (patch) | |
tree | df16bd763fc6f7ae8938d0fd1f70fdb35da3da0d | |
parent | 25d6d137a90ca9e3ce654adcc454c23de4622a49 (diff) |
Page: support spacing
Add spacing support into QQuickPageLayout. Having spacing and padding
separately gives more fine-grained control over the layout. Spacing is
inserted between the header, content, and footer, but only when the
respective building blocks are visible.
Change-Id: Ia26a4c33c2756a603ca6d53aefac3a66414b36d3
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/imports/controls/Page.qml | 4 | ||||
-rw-r--r-- | src/imports/controls/material/Page.qml | 4 | ||||
-rw-r--r-- | src/imports/controls/universal/Page.qml | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol.cpp | 17 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpage.cpp | 7 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpage_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpagelayout.cpp | 8 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_page.qml | 40 |
9 files changed, 73 insertions, 13 deletions
diff --git a/src/imports/controls/Page.qml b/src/imports/controls/Page.qml index fbed527f..edd8d628 100644 --- a/src/imports/controls/Page.qml +++ b/src/imports/controls/Page.qml @@ -48,8 +48,8 @@ T.Page { footer && footer.visible ? footer.implicitWidth : 0) + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding - + (header && header.visible ? header.implicitHeight : 0) - + (footer && footer.visible ? footer.implicitHeight : 0)) + + (header && header.visible ? header.implicitHeight + spacing : 0) + + (footer && footer.visible ? footer.implicitHeight + spacing : 0)) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) diff --git a/src/imports/controls/material/Page.qml b/src/imports/controls/material/Page.qml index 707d471e..c91b16c1 100644 --- a/src/imports/controls/material/Page.qml +++ b/src/imports/controls/material/Page.qml @@ -47,8 +47,8 @@ T.Page { footer && footer.visible ? footer.implicitWidth : 0) + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding - + (header && header.visible ? header.implicitHeight : 0) - + (footer && footer.visible ? footer.implicitHeight : 0)) + + (header && header.visible ? header.implicitHeight + spacing : 0) + + (footer && footer.visible ? footer.implicitHeight + spacing : 0)) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) diff --git a/src/imports/controls/universal/Page.qml b/src/imports/controls/universal/Page.qml index 9bd85751..e8c7bd4a 100644 --- a/src/imports/controls/universal/Page.qml +++ b/src/imports/controls/universal/Page.qml @@ -47,8 +47,8 @@ T.Page { footer && footer.visible ? footer.implicitWidth : 0) + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding - + (header && header.visible ? header.implicitHeight : 0) - + (footer && footer.visible ? footer.implicitHeight : 0)) + + (header && header.visible ? header.implicitHeight + spacing : 0) + + (footer && footer.visible ? footer.implicitHeight + spacing : 0)) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index e1df04cc..b1f6bd5f 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -766,10 +766,13 @@ qreal QQuickControl::spacing() const void QQuickControl::setSpacing(qreal spacing) { Q_D(QQuickControl); - if (!qFuzzyCompare(d->spacing, spacing)) { - d->spacing = spacing; - emit spacingChanged(); - } + if (qFuzzyCompare(d->spacing, spacing)) + return; + + qreal oldSpacing = d->spacing; + d->spacing = spacing; + emit spacingChanged(); + spacingChange(spacing, oldSpacing); } void QQuickControl::resetSpacing() @@ -1291,6 +1294,12 @@ void QQuickControl::mirrorChange() emit mirroredChanged(); } +void QQuickControl::spacingChange(qreal newSpacing, qreal oldSpacing) +{ + Q_UNUSED(newSpacing); + Q_UNUSED(oldSpacing); +} + void QQuickControl::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) { Q_D(QQuickControl); diff --git a/src/quicktemplates2/qquickcontrol_p.h b/src/quicktemplates2/qquickcontrol_p.h index 7187344a..3bc21684 100644 --- a/src/quicktemplates2/qquickcontrol_p.h +++ b/src/quicktemplates2/qquickcontrol_p.h @@ -189,6 +189,7 @@ protected: virtual void fontChange(const QFont &newFont, const QFont &oldFont); virtual void hoverChange(); virtual void mirrorChange(); + virtual void spacingChange(qreal newSpacing, qreal oldSpacing); virtual void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding); virtual void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem); virtual void localeChange(const QLocale &newLocale, const QLocale &oldLocale); diff --git a/src/quicktemplates2/qquickpage.cpp b/src/quicktemplates2/qquickpage.cpp index 0098cb93..432c8c63 100644 --- a/src/quicktemplates2/qquickpage.cpp +++ b/src/quicktemplates2/qquickpage.cpp @@ -349,6 +349,13 @@ void QQuickPage::paddingChange(const QMarginsF &newPadding, const QMarginsF &old d->layout->update(); } +void QQuickPage::spacingChange(qreal newSpacing, qreal oldSpacing) +{ + Q_D(QQuickPage); + QQuickControl::spacingChange(newSpacing, oldSpacing); + d->layout->update(); +} + #ifndef QT_NO_ACCESSIBILITY QAccessible::Role QQuickPage::accessibleRole() const { diff --git a/src/quicktemplates2/qquickpage_p.h b/src/quicktemplates2/qquickpage_p.h index c63b11d7..36ba9fff 100644 --- a/src/quicktemplates2/qquickpage_p.h +++ b/src/quicktemplates2/qquickpage_p.h @@ -100,6 +100,7 @@ protected: void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) override; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) override; + void spacingChange(qreal newSpacing, qreal oldSpacing) override; #ifndef QT_NO_ACCESSIBILITY QAccessible::Role accessibleRole() const override; diff --git a/src/quicktemplates2/qquickpagelayout.cpp b/src/quicktemplates2/qquickpagelayout.cpp index a1747b47..b787dd08 100644 --- a/src/quicktemplates2/qquickpagelayout.cpp +++ b/src/quicktemplates2/qquickpagelayout.cpp @@ -142,17 +142,19 @@ void QQuickPageLayout::update() const qreal hh = m_header && m_header->isVisible() ? m_header->height() : 0; const qreal fh = m_footer && m_footer->isVisible() ? m_footer->height() : 0; + const qreal hsp = hh > 0 ? m_control->spacing() : 0; + const qreal fsp = fh > 0 ? m_control->spacing() : 0; - content->setY(hh + m_control->topPadding()); + content->setY(m_control->topPadding() + hh + hsp); content->setX(m_control->leftPadding()); content->setWidth(m_control->availableWidth()); - content->setHeight(m_control->availableHeight() - hh - fh); + content->setHeight(m_control->availableHeight() - hh - fh - hsp - fsp); if (m_header) m_header->setWidth(m_control->width()); if (m_footer) { - m_footer->setY(m_control->height() - fh); + m_footer->setY(m_control->height() - m_footer->height()); m_footer->setWidth(m_control->width()); } } diff --git a/tests/auto/controls/data/tst_page.qml b/tests/auto/controls/data/tst_page.qml index a1cdbf8e..9b52236e 100644 --- a/tests/auto/controls/data/tst_page.qml +++ b/tests/auto/controls/data/tst_page.qml @@ -226,4 +226,44 @@ TestCase { control.destroy() } + + function test_spacing_data() { + return [ + { tag: "content", header: false, content: true, footer: false }, + { tag: "header,content", header: true, content: true, footer: false }, + { tag: "content,footer", header: false, content: true, footer: true }, + { tag: "header,content,footer", header: true, content: true, footer: true }, + { tag: "header,footer", header: true, content: false, footer: true }, + { tag: "header", header: true, content: false, footer: false }, + { tag: "footer", header: false, content: false, footer: true }, + ] + } + + function test_spacing(data) { + var control = page.createObject(testCase, {spacing: 20, width: 100, height: 100}) + verify(control) + + control.contentItem.visible = data.content + control.header = toolBar.createObject(control.contentItem, {visible: data.header}) + control.footer = toolBar.createObject(control.contentItem, {visible: data.footer}) + + compare(control.header.x, 0) + compare(control.header.y, 0) + compare(control.header.width, control.width) + verify(control.header.height > 0) + + compare(control.footer.x, 0) + compare(control.footer.y, control.height - control.footer.height) + compare(control.footer.width, control.width) + verify(control.footer.height > 0) + + compare(control.contentItem.x, control.leftPadding) + compare(control.contentItem.y, control.topPadding + (data.header ? control.header.height + control.spacing : 0)) + compare(control.contentItem.width, control.availableWidth) + compare(control.contentItem.height, control.availableHeight + - (data.header ? control.header.height + control.spacing : 0) + - (data.footer ? control.footer.height + control.spacing : 0)) + + control.destroy() + } } |