diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-04-10 14:54:37 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-11 12:55:09 +0000 |
commit | a6be134c9d3656e90cf10f1326b05ff085a1e23c (patch) | |
tree | 2f7f8f80d823f4526186ea7bb9560bb217409a95 /src/quickcontrols2/qquickiconlabel.cpp | |
parent | b7a95c2fd1cee0b2f8d1a98bfcd2711dca446f04 (diff) |
Add QQuickIconLabel::alignment
The contents of menu items and item delegates must be aligned to
the left in left-to-right UIs, or to the right in right-to-left UIs.
Change-Id: Ib4064f6a8162306d446189cadebb80e12d3cd35d
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src/quickcontrols2/qquickiconlabel.cpp')
-rw-r--r-- | src/quickcontrols2/qquickiconlabel.cpp | 100 |
1 files changed, 71 insertions, 29 deletions
diff --git a/src/quickcontrols2/qquickiconlabel.cpp b/src/quickcontrols2/qquickiconlabel.cpp index 793bb255..5f263f49 100644 --- a/src/quickcontrols2/qquickiconlabel.cpp +++ b/src/quickcontrols2/qquickiconlabel.cpp @@ -37,6 +37,7 @@ #include "qquickiconlabel_p.h" #include "qquickiconlabel_p_p.h" +#include <QtGui/private/qguiapplication_p.h> #include <QtQuick/private/qquickitem_p.h> QT_BEGIN_NAMESPACE @@ -45,6 +46,7 @@ QQuickIconLabelPrivate::QQuickIconLabelPrivate() : icon(nullptr), label(nullptr), display(QQuickIconLabel::TextBesideIcon), + alignment(Qt::AlignCenter), spacing(0), mirrored(false), topPadding(0), @@ -71,25 +73,42 @@ void QQuickIconLabelPrivate::updateImplicitSize() q->setImplicitSize(implicitWidth, implicitHeight); } +// adapted from QStyle::alignedRect() +static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle) +{ + alignment = QGuiApplicationPrivate::visualAlignment(mirrored ? Qt::RightToLeft : Qt::LeftToRight, alignment); + qreal x = rectangle.x(); + qreal y = rectangle.y(); + const qreal w = size.width(); + const qreal h = size.height(); + if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter) + y += rectangle.height() / 2 - h / 2; + else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom) + y += rectangle.height() - h; + if ((alignment & Qt::AlignRight) == Qt::AlignRight) + x += rectangle.width() - w; + else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter) + x += rectangle.width() / 2 - w / 2; + return QRectF(x, y, w, h); +} + void QQuickIconLabelPrivate::layout() { if (!componentComplete) return; - const qreal horizontalPadding = leftPadding + rightPadding; - const qreal verticalPadding = topPadding + bottomPadding; - const qreal availableWidth = width - horizontalPadding; - const qreal availableHeight = height - verticalPadding; - const qreal horizontalCenter = width / 2; - const qreal verticalCenter = height / 2; + const qreal availableWidth = width - leftPadding - rightPadding; + const qreal availableHeight = height - topPadding - bottomPadding; switch (display) { case QQuickIconLabel::IconOnly: if (icon) { - icon->setSize(QSizeF(qMin(icon->implicitWidth(), availableWidth), - qMin(icon->implicitHeight(), availableHeight))); - icon->setPosition(QPointF(horizontalCenter - icon->width() / 2, - verticalCenter - icon->height() / 2)); + const QRectF iconRect = alignedRect(mirrored, alignment, + QSizeF(qMin(icon->implicitWidth(), availableWidth), + qMin(icon->implicitHeight(), availableHeight)), + QRectF(leftPadding, topPadding, availableWidth, availableHeight)); + icon->setSize(iconRect.size()); + icon->setPosition(iconRect.topLeft()); icon->setVisible(true); } if (label) @@ -97,10 +116,12 @@ void QQuickIconLabelPrivate::layout() break; case QQuickIconLabel::TextOnly: if (label) { - label->setSize(QSizeF(qMin(label->implicitWidth(), availableWidth), - qMin(label->implicitHeight(), availableHeight))); - label->setPosition(QPointF(horizontalCenter - label->width() / 2, - verticalCenter - label->height() / 2)); + const QRectF textRect = alignedRect(mirrored, alignment, + QSizeF(qMin(label->implicitWidth(), availableWidth), + qMin(label->implicitHeight(), availableHeight)), + QRectF(leftPadding, topPadding, availableWidth, availableHeight)); + label->setSize(textRect.size()); + label->setPosition(textRect.topLeft()); label->setVisible(true); } if (icon) @@ -109,32 +130,34 @@ void QQuickIconLabelPrivate::layout() case QQuickIconLabel::TextBesideIcon: default: // Work out the sizes first, as the positions depend on them. - qreal iconWidth = 0; - qreal textWidth = 0; + QSizeF iconSize(0, 0); + QSizeF textSize(0, 0); if (icon) { - icon->setSize(QSizeF(qMin(icon->implicitWidth(), availableWidth), - qMin(icon->implicitHeight(), availableHeight))); - iconWidth = icon->width(); + iconSize.setWidth(qMin(icon->implicitWidth(), availableWidth)); + iconSize.setHeight(qMin(icon->implicitHeight(), availableHeight)); } qreal effectiveSpacing = 0; if (label) { - if (iconWidth > 0) + if (!iconSize.isEmpty()) effectiveSpacing = spacing; - label->setSize(QSizeF(qMin(label->implicitWidth(), availableWidth - iconWidth - effectiveSpacing), - qMin(label->implicitHeight(), availableHeight))); - textWidth = label->width(); + textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing)); + textSize.setHeight(qMin(label->implicitHeight(), availableHeight)); } - const qreal combinedWidth = iconWidth + effectiveSpacing + textWidth; - const qreal contentX = horizontalCenter - combinedWidth / 2; + const QRectF combinedRect = alignedRect(mirrored, alignment, + QSizeF(iconSize.width() + effectiveSpacing + textSize.width(), + qMax(iconSize.height(), textSize.height())), + QRectF(leftPadding, topPadding, availableWidth, availableHeight)); if (icon) { - icon->setPosition(QPointF(mirrored ? contentX + combinedWidth - iconWidth : contentX, - verticalCenter - icon->height() / 2)); + const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter, iconSize, combinedRect); + icon->setSize(iconRect.size()); + icon->setPosition(iconRect.topLeft()); icon->setVisible(true); } if (label) { - label->setPosition(QPointF(mirrored ? contentX : contentX + combinedWidth - label->width(), - verticalCenter - label->height() / 2)); + const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter, textSize, combinedRect); + label->setSize(textRect.size()); + label->setPosition(textRect.topLeft()); label->setVisible(true); } break; @@ -294,6 +317,25 @@ void QQuickIconLabel::setMirrored(bool mirrored) d->layout(); } +Qt::Alignment QQuickIconLabel::alignment() const +{ + Q_D(const QQuickIconLabel); + return d->alignment; +} + +void QQuickIconLabel::setAlignment(Qt::Alignment alignment) +{ + Q_D(QQuickIconLabel); + const int valign = alignment & Qt::AlignVertical_Mask; + const int halign = alignment & Qt::AlignHorizontal_Mask; + const uint align = (valign ? valign : Qt::AlignVCenter) | (halign ? halign : Qt::AlignHCenter); + if (d->alignment == align) + return; + + d->alignment = static_cast<Qt::Alignment>(align); + d->layout(); +} + qreal QQuickIconLabel::topPadding() const { Q_D(const QQuickIconLabel); |