aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickcontrols2/qquickiconlabel.cpp
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2017-04-03 10:28:08 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-07 18:39:10 +0000
commitaff4825e85a84c0e4132b43131b4a38514b316d8 (patch)
treee39875fce59262ca226fa516a09a9d11a1c1bb92 /src/quickcontrols2/qquickiconlabel.cpp
parentd3a16a910f1174ecba46625953f04ae0849e931f (diff)
Rename QQuickDisplayLayout to QQuickIconLabel
There are some performance improvements planned that require changes to the class, resulting in it no longer being a layout "container". Change-Id: Ie29f2f95eebb64b3b018746f93763fdbe79625f0 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src/quickcontrols2/qquickiconlabel.cpp')
-rw-r--r--src/quickcontrols2/qquickiconlabel.cpp417
1 files changed, 417 insertions, 0 deletions
diff --git a/src/quickcontrols2/qquickiconlabel.cpp b/src/quickcontrols2/qquickiconlabel.cpp
new file mode 100644
index 00000000..0c31f6c6
--- /dev/null
+++ b/src/quickcontrols2/qquickiconlabel.cpp
@@ -0,0 +1,417 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickiconlabel_p.h"
+#include "qquickiconlabel_p_p.h"
+
+#include <QtQuick/private/qquickitem_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QQuickIconLabelPrivate::QQuickIconLabelPrivate()
+ : icon(nullptr),
+ text(nullptr),
+ display(QQuickIconLabel::TextBesideIcon),
+ spacing(0),
+ mirrored(false),
+ topPadding(0),
+ leftPadding(0),
+ rightPadding(0),
+ bottomPadding(0)
+{
+}
+
+void QQuickIconLabelPrivate::updateImplicitSize()
+{
+ Q_Q(QQuickIconLabel);
+ if (!q->isComponentComplete())
+ return;
+
+ const bool showIcon = icon && display != QQuickIconLabel::TextOnly;
+ const bool showText = text && display != QQuickIconLabel::IconOnly;
+ const qreal horizontalPadding = leftPadding + rightPadding;
+ const qreal verticalPadding = topPadding + bottomPadding;
+ const qreal iconImplicitWidth = showIcon ? icon->implicitWidth() : 0;
+ const qreal iconImplicitHeight = showIcon ? icon->implicitHeight() : 0;
+ const qreal textImplicitWidth = showText ? text->implicitWidth() : 0;
+ const qreal textImplicitHeight = showText ? text->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);
+}
+
+void QQuickIconLabelPrivate::layout()
+{
+ Q_Q(QQuickIconLabel);
+ if (!q->isComponentComplete())
+ return;
+
+ const qreal horizontalPadding = leftPadding + rightPadding;
+ const qreal verticalPadding = topPadding + bottomPadding;
+ const qreal w = q->width();
+ const qreal h = q->height();
+ const qreal availableWidth = w - horizontalPadding;
+ const qreal availableHeight = h - verticalPadding;
+ const qreal horizontalCenter = w / 2;
+ const qreal verticalCenter = h / 2;
+
+ switch (display) {
+ case QQuickIconLabel::IconOnly:
+ if (icon) {
+ icon->setWidth(qMin(icon->implicitWidth(), availableWidth));
+ icon->setHeight(qMin(icon->implicitHeight(), availableHeight));
+ icon->setX(horizontalCenter - icon->width() / 2);
+ icon->setY(verticalCenter - icon->height() / 2);
+ icon->setVisible(true);
+ }
+ if (text)
+ text->setVisible(false);
+ break;
+ case QQuickIconLabel::TextOnly:
+ if (text) {
+ text->setWidth(qMin(text->implicitWidth(), availableWidth));
+ text->setHeight(qMin(text->implicitHeight(), availableHeight));
+ text->setX(horizontalCenter - text->width() / 2);
+ text->setY(verticalCenter - text->height() / 2);
+ text->setVisible(true);
+ }
+ if (icon)
+ icon->setVisible(false);
+ break;
+ case QQuickIconLabel::TextBesideIcon:
+ default:
+ // Work out the sizes first, as the positions depend on them.
+ qreal iconWidth = 0;
+ qreal textWidth = 0;
+ if (icon) {
+ icon->setWidth(qMin(icon->implicitWidth(), availableWidth));
+ icon->setHeight(qMin(icon->implicitHeight(), availableHeight));
+ iconWidth = icon->width();
+ }
+ qreal effectiveSpacing = 0;
+ if (text) {
+ if (iconWidth > 0)
+ effectiveSpacing = spacing;
+ text->setWidth(qMin(text->implicitWidth(), availableWidth - iconWidth - effectiveSpacing));
+ text->setHeight(qMin(text->implicitHeight(), availableHeight));
+ textWidth = text->width();
+ }
+
+ const qreal combinedWidth = iconWidth + effectiveSpacing + textWidth;
+ const qreal contentX = horizontalCenter - combinedWidth / 2;
+ if (icon) {
+ icon->setX(mirrored ? contentX + combinedWidth - iconWidth : contentX);
+ icon->setY(verticalCenter - icon->height() / 2);
+ icon->setVisible(true);
+ }
+ if (text) {
+ text->setX(mirrored ? contentX : contentX + combinedWidth - text->width());
+ text->setY(verticalCenter - text->height() / 2);
+ text->setVisible(true);
+ }
+ break;
+ }
+}
+
+static const QQuickItemPrivate::ChangeTypes itemChangeTypes =
+ QQuickItemPrivate::ImplicitWidth
+ | QQuickItemPrivate::ImplicitHeight
+ | QQuickItemPrivate::Destroyed;
+
+void QQuickIconLabelPrivate::watchChanges(QQuickItem *item)
+{
+ QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
+ itemPrivate->addItemChangeListener(this, itemChangeTypes);
+}
+
+void QQuickIconLabelPrivate::unwatchChanges(QQuickItem* item)
+{
+ QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
+ itemPrivate->removeItemChangeListener(this, itemChangeTypes);
+}
+
+void QQuickIconLabelPrivate::itemImplicitWidthChanged(QQuickItem *)
+{
+ updateImplicitSize();
+ layout();
+}
+
+void QQuickIconLabelPrivate::itemImplicitHeightChanged(QQuickItem *)
+{
+ updateImplicitSize();
+ layout();
+}
+
+void QQuickIconLabelPrivate::itemDestroyed(QQuickItem *item)
+{
+ unwatchChanges(item);
+ if (item == icon)
+ icon = nullptr;
+ else if (item == text)
+ text = nullptr;
+}
+
+QQuickIconLabel::QQuickIconLabel(QQuickItem *parent)
+ : QQuickItem(*(new QQuickIconLabelPrivate), parent)
+{
+}
+
+QQuickIconLabel::~QQuickIconLabel()
+{
+ Q_D(QQuickIconLabel);
+ if (d->icon)
+ d->unwatchChanges(d->icon);
+ if (d->text)
+ d->unwatchChanges(d->text);
+}
+
+QQuickItem *QQuickIconLabel::icon() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->icon;
+}
+
+void QQuickIconLabel::setIcon(QQuickItem *icon)
+{
+ Q_D(QQuickIconLabel);
+ if (d->icon == icon)
+ return;
+
+ if (d->icon)
+ d->unwatchChanges(d->icon);
+
+ d->icon = icon;
+ if (d->icon) {
+ d->icon->setParentItem(this);
+ d->watchChanges(d->icon);
+ }
+
+ d->updateImplicitSize();
+ d->layout();
+
+ emit iconChanged();
+}
+
+QQuickItem *QQuickIconLabel::text() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->text;
+}
+
+void QQuickIconLabel::setText(QQuickItem *text)
+{
+ Q_D(QQuickIconLabel);
+ if (d->text == text)
+ return;
+
+ if (d->text)
+ d->unwatchChanges(d->text);
+
+ d->text = text;
+ if (d->text) {
+ d->text->setParentItem(this);
+ d->watchChanges(d->text);
+ }
+
+ d->updateImplicitSize();
+ d->layout();
+
+ emit textChanged();
+}
+
+QQuickIconLabel::Display QQuickIconLabel::display() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->display;
+}
+
+void QQuickIconLabel::setDisplay(Display display)
+{
+ Q_D(QQuickIconLabel);
+ if (d->display == display)
+ return;
+
+ d->display = display;
+ d->updateImplicitSize();
+ d->layout();
+ emit displayChanged();
+}
+
+qreal QQuickIconLabel::spacing() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->spacing;
+}
+
+void QQuickIconLabel::setSpacing(qreal spacing)
+{
+ Q_D(QQuickIconLabel);
+ if (qFuzzyCompare(d->spacing, spacing))
+ return;
+
+ d->spacing = spacing;
+ d->updateImplicitSize();
+ d->layout();
+ emit spacingChanged();
+}
+
+bool QQuickIconLabel::isMirrored() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->mirrored;
+}
+
+void QQuickIconLabel::setMirrored(bool mirrored)
+{
+ Q_D(QQuickIconLabel);
+ if (d->mirrored == mirrored)
+ return;
+
+ d->mirrored = mirrored;
+ d->updateImplicitSize();
+ d->layout();
+ emit mirroredChanged();
+}
+
+qreal QQuickIconLabel::topPadding() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->topPadding;
+}
+
+void QQuickIconLabel::setTopPadding(qreal padding)
+{
+ Q_D(QQuickIconLabel);
+ if (qFuzzyCompare(d->topPadding, padding))
+ return;
+
+ d->topPadding = padding;
+ d->updateImplicitSize();
+ d->layout();
+ emit topPaddingChanged();
+}
+
+void QQuickIconLabel::resetTopPadding()
+{
+ setTopPadding(0);
+}
+
+qreal QQuickIconLabel::leftPadding() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->leftPadding;
+}
+
+void QQuickIconLabel::setLeftPadding(qreal padding)
+{
+ Q_D(QQuickIconLabel);
+ if (qFuzzyCompare(d->leftPadding, padding))
+ return;
+
+ d->leftPadding = padding;
+ d->updateImplicitSize();
+ d->layout();
+ emit leftPaddingChanged();
+}
+
+void QQuickIconLabel::resetLeftPadding()
+{
+ setLeftPadding(0);
+}
+
+qreal QQuickIconLabel::rightPadding() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->rightPadding;
+}
+
+void QQuickIconLabel::setRightPadding(qreal padding)
+{
+ Q_D(QQuickIconLabel);
+ if (qFuzzyCompare(d->rightPadding, padding))
+ return;
+
+ d->rightPadding = padding;
+ d->updateImplicitSize();
+ d->layout();
+ emit rightPaddingChanged();
+}
+
+void QQuickIconLabel::resetRightPadding()
+{
+ setRightPadding(0);
+}
+
+qreal QQuickIconLabel::bottomPadding() const
+{
+ Q_D(const QQuickIconLabel);
+ return d->bottomPadding;
+}
+
+void QQuickIconLabel::setBottomPadding(qreal padding)
+{
+ Q_D(QQuickIconLabel);
+ if (qFuzzyCompare(d->bottomPadding, padding))
+ return;
+
+ d->bottomPadding = padding;
+ d->updateImplicitSize();
+ d->layout();
+ emit bottomPaddingChanged();
+}
+
+void QQuickIconLabel::resetBottomPadding()
+{
+ setBottomPadding(0);
+}
+
+void QQuickIconLabel::componentComplete()
+{
+ Q_D(QQuickIconLabel);
+ QQuickItem::componentComplete();
+ d->updateImplicitSize();
+ d->layout();
+}
+
+void QQuickIconLabel::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickIconLabel);
+ QQuickItem::geometryChanged(newGeometry, oldGeometry);
+ d->layout();
+}
+
+QT_END_NAMESPACE