diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2017-04-03 10:28:08 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-07 18:39:10 +0000 |
commit | aff4825e85a84c0e4132b43131b4a38514b316d8 (patch) | |
tree | e39875fce59262ca226fa516a09a9d11a1c1bb92 /src/quickcontrols2/qquickiconlabel.cpp | |
parent | d3a16a910f1174ecba46625953f04ae0849e931f (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.cpp | 417 |
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 |