From 4503d45b93721e516e949419f3b9c6b796a7c13e Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 10 Apr 2017 15:42:03 +0200 Subject: Implement QQuickIconLabel::TextUnderIcon This will be the default for TabButton and RoundButton. Change-Id: I9ccb0d35f33a80fe7e3da26617ed6f42232afe17 Reviewed-by: J-P Nurmi --- src/quickcontrols2/qquickiconlabel.cpp | 44 ++++++++++++++++++++-- src/quickcontrols2/qquickiconlabel_p.h | 2 +- src/quicktemplates2/qquickabstractbutton_p.h | 2 +- tests/auto/controls/data/tst_button.qml | 13 +++++++ tests/auto/controls/data/tst_toolbutton.qml | 13 +++++++ tests/auto/qquickiconlabel/tst_qquickiconlabel.cpp | 29 ++++++++++++++ 6 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/quickcontrols2/qquickiconlabel.cpp b/src/quickcontrols2/qquickiconlabel.cpp index 5f263f49..cfb733ac 100644 --- a/src/quickcontrols2/qquickiconlabel.cpp +++ b/src/quickcontrols2/qquickiconlabel.cpp @@ -68,9 +68,11 @@ void QQuickIconLabelPrivate::updateImplicitSize() const qreal textImplicitWidth = showText ? label->implicitWidth() : 0; const qreal textImplicitHeight = showText ? label->implicitHeight() : 0; const qreal effectiveSpacing = showText && showIcon && icon->implicitWidth() > 0 ? spacing : 0; - const qreal implicitWidth = iconImplicitWidth + textImplicitWidth + effectiveSpacing + horizontalPadding; - const qreal implicitHeight = qMax(iconImplicitHeight, textImplicitHeight) + verticalPadding; - q->setImplicitSize(implicitWidth, implicitHeight); + const qreal implicitWidth = display == QQuickIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing + : qMax(iconImplicitWidth, textImplicitWidth); + const qreal implicitHeight = display == QQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing + : qMax(iconImplicitHeight, textImplicitHeight); + q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding); } // adapted from QStyle::alignedRect() @@ -127,6 +129,42 @@ void QQuickIconLabelPrivate::layout() if (icon) icon->setVisible(false); break; + + case QQuickIconLabel::TextUnderIcon: { + // Work out the sizes first, as the positions depend on them. + QSizeF iconSize; + QSizeF textSize; + if (icon) { + iconSize.setWidth(qMin(icon->implicitWidth(), availableWidth)); + iconSize.setHeight(qMin(icon->implicitHeight(), availableHeight)); + } + qreal effectiveSpacing = 0; + if (label) { + if (!iconSize.isEmpty()) + effectiveSpacing = spacing; + textSize.setWidth(qMin(label->implicitWidth(), availableWidth)); + textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing)); + } + + QRectF combinedRect = alignedRect(mirrored, alignment, + QSizeF(qMax(iconSize.width(), textSize.width()), + iconSize.height() + effectiveSpacing + textSize.height()), + QRectF(leftPadding, topPadding, availableWidth, availableHeight)); + if (icon) { + QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize, combinedRect); + icon->setSize(iconRect.size()); + icon->setPosition(iconRect.topLeft()); + icon->setVisible(true); + } + if (label) { + QRectF textRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignBottom, textSize, combinedRect); + label->setSize(textRect.size()); + label->setPosition(textRect.topLeft()); + label->setVisible(true); + } + break; + } + case QQuickIconLabel::TextBesideIcon: default: // Work out the sizes first, as the positions depend on them. diff --git a/src/quickcontrols2/qquickiconlabel_p.h b/src/quickcontrols2/qquickiconlabel_p.h index 3dbae3fc..880d088e 100644 --- a/src/quickcontrols2/qquickiconlabel_p.h +++ b/src/quickcontrols2/qquickiconlabel_p.h @@ -74,7 +74,7 @@ public: IconOnly, TextOnly, TextBesideIcon, - TextUnderIcon // unused, but reserved for future use + TextUnderIcon }; Q_ENUM(Display) diff --git a/src/quicktemplates2/qquickabstractbutton_p.h b/src/quicktemplates2/qquickabstractbutton_p.h index 40ef892c..daa34735 100644 --- a/src/quicktemplates2/qquickabstractbutton_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p.h @@ -105,7 +105,7 @@ public: IconOnly, TextOnly, TextBesideIcon, - TextUnderIcon // unused, but reserved for future use + TextUnderIcon }; Q_ENUM(Display) diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml index c25df3c2..aa9e5751 100644 --- a/tests/auto/controls/data/tst_button.qml +++ b/tests/auto/controls/data/tst_button.qml @@ -453,9 +453,11 @@ TestCase { return [ { "tag": "IconOnly", display: Button.IconOnly }, { "tag": "TextOnly", display: Button.TextOnly }, + { "tag": "TextUnderIcon", display: Button.TextUnderIcon }, { "tag": "TextBesideIcon", display: Button.TextBesideIcon }, { "tag": "IconOnly, mirrored", display: Button.IconOnly, mirrored: true }, { "tag": "TextOnly, mirrored", display: Button.TextOnly, mirrored: true }, + { "tag": "TextUnderIcon, mirrored", display: Button.TextUnderIcon, mirrored: true }, { "tag": "TextBesideIcon, mirrored", display: Button.TextBesideIcon, mirrored: true } ] } @@ -482,11 +484,20 @@ TestCase { compare(iconImage.visible, true) compare(label.visible, false) compare(iconImage.x, (control.availableWidth - iconImage.width) / 2) + compare(iconImage.y, (control.availableHeight - iconImage.height) / 2) break; case Button.TextOnly: compare(iconImage.visible, false) compare(label.visible, true) compare(label.x, (control.availableWidth - label.width) / 2) + compare(label.y, (control.availableHeight - label.height) / 2) + break; + case Button.TextUnderIcon: + compare(iconImage.visible, true) + compare(label.visible, true) + compare(iconImage.x, (control.availableWidth - iconImage.width) / 2) + compare(label.x, (control.availableWidth - label.width) / 2) + verify(iconImage.y < label.y) break; case Button.TextBesideIcon: compare(iconImage.visible, true) @@ -495,6 +506,8 @@ TestCase { verify(label.x < iconImage.x) else verify(iconImage.x < label.x) + compare(iconImage.y, (control.availableHeight - iconImage.height) / 2) + compare(label.y, (control.availableHeight - label.height) / 2) break; } } diff --git a/tests/auto/controls/data/tst_toolbutton.qml b/tests/auto/controls/data/tst_toolbutton.qml index 982f930a..58daf119 100644 --- a/tests/auto/controls/data/tst_toolbutton.qml +++ b/tests/auto/controls/data/tst_toolbutton.qml @@ -186,9 +186,11 @@ TestCase { return [ { "tag": "IconOnly", display: ToolButton.IconOnly }, { "tag": "TextOnly", display: ToolButton.TextOnly }, + { "tag": "TextUnderIcon", display: ToolButton.TextUnderIcon }, { "tag": "TextBesideIcon", display: ToolButton.TextBesideIcon }, { "tag": "IconOnly, mirrored", display: ToolButton.IconOnly, mirrored: true }, { "tag": "TextOnly, mirrored", display: ToolButton.TextOnly, mirrored: true }, + { "tag": "TextUnderIcon, mirrored", display: ToolButton.TextUnderIcon, mirrored: true }, { "tag": "TextBesideIcon, mirrored", display: ToolButton.TextBesideIcon, mirrored: true } ] } @@ -215,11 +217,20 @@ TestCase { compare(iconImage.visible, true) compare(label.visible, false) compare(iconImage.x, (control.availableWidth - iconImage.width) / 2) + compare(iconImage.y, (control.availableHeight - iconImage.height) / 2) break; case ToolButton.TextOnly: compare(iconImage.visible, false) compare(label.visible, true) compare(label.x, (control.availableWidth - label.width) / 2) + compare(label.y, (control.availableHeight - label.height) / 2) + break; + case ToolButton.TextUnderIcon: + compare(iconImage.visible, true) + compare(label.visible, true) + compare(iconImage.x, (control.availableWidth - iconImage.width) / 2) + compare(label.x, (control.availableWidth - label.width) / 2) + verify(iconImage.y < label.y) break; case ToolButton.TextBesideIcon: compare(iconImage.visible, true) @@ -228,6 +239,8 @@ TestCase { verify(label.x < iconImage.x) else verify(iconImage.x < label.x) + compare(iconImage.y, (control.availableHeight - iconImage.height) / 2) + compare(label.y, (control.availableHeight - label.height) / 2) break; } } diff --git a/tests/auto/qquickiconlabel/tst_qquickiconlabel.cpp b/tests/auto/qquickiconlabel/tst_qquickiconlabel.cpp index 3012af20..e1cada68 100644 --- a/tests/auto/qquickiconlabel/tst_qquickiconlabel.cpp +++ b/tests/auto/qquickiconlabel/tst_qquickiconlabel.cpp @@ -69,13 +69,24 @@ void tst_qquickiconlabel::display_data() typedef QVector DisplayVector; QQuickIconLabel::Display IconOnly = QQuickIconLabel::IconOnly; QQuickIconLabel::Display TextOnly = QQuickIconLabel::TextOnly; + QQuickIconLabel::Display TextUnderIcon = QQuickIconLabel::TextUnderIcon; QQuickIconLabel::Display TextBesideIcon = QQuickIconLabel::TextBesideIcon; QTest::addRow("IconOnly") << (DisplayVector() << IconOnly) << false << -1.0 << -1.0 << 0.0; QTest::addRow("TextOnly") << (DisplayVector() << TextOnly) << false << -1.0 << -1.0 << 0.0; + QTest::addRow("TextUnderIcon") << (DisplayVector() << TextUnderIcon) << false << -1.0 << -1.0 << 10.0; QTest::addRow("TextBesideIcon") << (DisplayVector() << TextBesideIcon) << false << -1.0 << -1.0 << 10.0; QTest::addRow("IconOnly, spacing=10") << (DisplayVector() << IconOnly) << false << -1.0 << -1.0 << 10.0; QTest::addRow("TextOnly, spacing=10") << (DisplayVector() << TextOnly) << false << -1.0 << -1.0 << 10.0; + QTest::addRow("TextUnderIcon, spacing=10") << (DisplayVector() << TextUnderIcon) << false << -1.0 << -1.0 << 0.0; + QTest::addRow("TextUnderIcon => IconOnly => TextUnderIcon") + << (DisplayVector() << TextUnderIcon << IconOnly << TextUnderIcon) << false << -1.0 << -1.0 << 0.0; + QTest::addRow("TextUnderIcon => IconOnly => TextUnderIcon, labelWidth=400") + << (DisplayVector() << TextUnderIcon << IconOnly << TextUnderIcon) << false << 400.0 << -1.0 << 0.0; + QTest::addRow("TextUnderIcon => TextOnly => TextUnderIcon") + << (DisplayVector() << TextUnderIcon << TextOnly << TextUnderIcon) << false << -1.0 << -1.0 << 0.0; + QTest::addRow("TextUnderIcon => TextOnly => TextUnderIcon, labelWidth=400") + << (DisplayVector() << TextUnderIcon << TextOnly << TextUnderIcon) << false << 400.0 << -1.0 << 0.0; QTest::addRow("TextBesideIcon, spacing=10") << (DisplayVector() << TextBesideIcon) << false << -1.0 << -1.0 << 0.0; QTest::addRow("TextBesideIcon => IconOnly => TextBesideIcon") << (DisplayVector() << TextBesideIcon << IconOnly << TextBesideIcon) << false << -1.0 << -1.0 << 0.0; @@ -87,6 +98,7 @@ void tst_qquickiconlabel::display_data() << (DisplayVector() << TextBesideIcon << TextOnly << TextBesideIcon) << false << 400.0 << -1.0 << 0.0; QTest::addRow("IconOnly, mirrored") << (DisplayVector() << IconOnly) << true << -1.0 << -1.0 << 0.0; QTest::addRow("TextOnly, mirrored") << (DisplayVector() << TextOnly) << true << -1.0 << -1.0 << 0.0; + QTest::addRow("TextUnderIcon, mirrored") << (DisplayVector() << TextUnderIcon) << true << -1.0 << -1.0 << 0.0; QTest::addRow("TextBesideIcon, mirrored") << (DisplayVector() << TextBesideIcon) << true << -1.0 << -1.0 << 0.0; } @@ -168,6 +180,23 @@ void tst_qquickiconlabel::display() QCOMPARE(label->implicitWidth(), text->implicitWidth() + horizontalPadding); QCOMPARE(label->implicitHeight(), text->implicitHeight() + verticalPadding); break; + case QQuickIconLabel::TextUnderIcon: { + const qreal combinedHeight = icon->height() + label->spacing() + text->height(); + const qreal contentY = verticalCenter - combinedHeight / 2; + QCOMPARE(icon->x(), horizontalCenter - icon->width() / 2); + QCOMPARE(icon->y(), contentY); + QCOMPARE(icon->width(), icon->implicitWidth()); + QCOMPARE(icon->height(), icon->implicitHeight()); + QCOMPARE(icon->isVisible(), true); + QCOMPARE(text->x(), horizontalCenter - text->width() / 2); + QCOMPARE(text->y(), contentY + icon->height() + label->spacing()); + QCOMPARE(text->width(), text->implicitWidth()); + QCOMPARE(text->height(), text->implicitHeight()); + QCOMPARE(text->isVisible(), true); + QCOMPARE(label->implicitWidth(), qMax(icon->implicitWidth(), text->implicitWidth()) + horizontalPadding); + QCOMPARE(label->implicitHeight(), combinedHeight + verticalPadding); + break; + } case QQuickIconLabel::TextBesideIcon: default: const qreal combinedWidth = icon->width() + label->spacing() + text->width(); -- cgit v1.2.3