diff options
author | Mitch Curtis <mitch.curtis@digia.com> | 2014-08-05 17:42:54 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@digia.com> | 2014-08-08 10:42:47 +0200 |
commit | 94669499fd943fc72095afd739a21cd8e675f14f (patch) | |
tree | d902820ebbc41f75699326fa1cf887ee49fc6746 /tests | |
parent | c0e47716c402da2333bfa4082c7b40e3b376135c (diff) |
Add declarative QQuickTextMetrics API from QQuickFontMetrics invokables
This allows use of a declarative API for the functions in QFontMetricsF
which take parameters. This solves the problem of QML expressions that
use QML methods not being re-evaluated when the internal data changes,
by allowing the user to set the arguments as properties of a
TextMetrics object, that would otherwise have to be passed to QML
methods.
For example:
FontMetrics {
id: fontMetrics
}
property rect r: fontMetrics.boundingRect("Blah")
At some point, the font of the FontMetrics object is changed, but r
will still represent the original bounding rect. Instead, the user will
now write:
TextMetrics {
id: textMetrics
text: "Blah"
}
property rect r: textMetrics.boundingRect
The QML methods remain in QQuickFontMetrics for those who need an
imperative API.
[ChangeLog][QtQuick] Added QQuickTextMetrics, which provides a
declarative API for the functions in QFontMetricsF which take
arguments.
Change-Id: I019dc4639531906fc751ba61281cc1c695742287
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quick/qquicktextmetrics/qquicktextmetrics.pro | 10 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextmetrics/tst_qquicktextmetrics.cpp | 161 |
2 files changed, 171 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktextmetrics/qquicktextmetrics.pro b/tests/auto/quick/qquicktextmetrics/qquicktextmetrics.pro new file mode 100644 index 0000000000..6ef68db8e2 --- /dev/null +++ b/tests/auto/quick/qquicktextmetrics/qquicktextmetrics.pro @@ -0,0 +1,10 @@ +CONFIG += testcase +TARGET = tst_qquicktextmetrics +osx:CONFIG -= app_bundle + +SOURCES += tst_qquicktextmetrics.cpp + +CONFIG += parallel_test + +QT += core gui qml quick-private testlib +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/quick/qquicktextmetrics/tst_qquicktextmetrics.cpp b/tests/auto/quick/qquicktextmetrics/tst_qquicktextmetrics.cpp new file mode 100644 index 0000000000..733b3d06b3 --- /dev/null +++ b/tests/auto/quick/qquicktextmetrics/tst_qquicktextmetrics.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QFont> +#include <QString> +#include <QtTest> +#include <QCoreApplication> +#include <QQmlComponent> +#include <QQmlEngine> +#include <QQuickItem> + +#include <QtQuick/private/qquicktextmetrics_p.h> + +#include <QFontMetricsF> + +class tst_QQuickTextMetrics : public QObject +{ + Q_OBJECT + +public: + tst_QQuickTextMetrics(); + +private Q_SLOTS: + void font(); + void functionsWithArguments_data(); + void functionsWithArguments(); +}; + +tst_QQuickTextMetrics::tst_QQuickTextMetrics() +{ +} + +void tst_QQuickTextMetrics::font() +{ + QQuickTextMetrics metrics; + + QSignalSpy fontSpy(&metrics, SIGNAL(fontChanged())); + QSignalSpy metricsSpy(&metrics, SIGNAL(metricsChanged())); + QFont font; + font.setPointSize(font.pointSize() + 1); + metrics.setFont(font); + QCOMPARE(fontSpy.count(), 1); + QCOMPARE(metricsSpy.count(), 1); +} + +Q_DECLARE_METATYPE(Qt::TextElideMode) + +void tst_QQuickTextMetrics::functionsWithArguments_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<Qt::TextElideMode>("mode"); + QTest::addColumn<qreal>("width"); + + QStringList strings; + strings << QString() + << QString::fromLatin1("") + << QString::fromLatin1("0") + << QString::fromLatin1("@@@@@@@") + << QString::fromLatin1("Hello"); + + QVector<Qt::TextElideMode> elideModes; + elideModes << Qt::ElideLeft << Qt::ElideMiddle << Qt::ElideRight << Qt::ElideNone; + + for (int stringIndex = 0; stringIndex < strings.size(); ++stringIndex) { + const QString string = strings.at(stringIndex); + + for (int elideModeIndex = 0; elideModeIndex < elideModes.size(); ++elideModeIndex) { + Qt::TextElideMode elideMode = static_cast<Qt::TextElideMode>(elideModes.at(elideModeIndex)); + + for (qreal width = 0; width < 100; width += 20) { + const QString tag = QString::fromLatin1("string=%1, mode=%2, width=%3").arg(string).arg(elideMode).arg(width); + QTest::newRow(qPrintable(tag)) << QString() << elideMode << width; + } + } + } +} + +void tst_QQuickTextMetrics::functionsWithArguments() +{ + QFETCH(QString, text); + QFETCH(Qt::TextElideMode, mode); + QFETCH(qreal, width); + + QQuickTextMetrics metrics; + // Ensures that the values actually change. + metrics.setText(text + "extra"); + metrics.setElideWidth(width + 1); + switch (mode) { + case Qt::ElideNone: metrics.setElide(Qt::ElideMiddle); break; + case Qt::ElideLeft: metrics.setElide(Qt::ElideRight); break; + case Qt::ElideMiddle: metrics.setElide(Qt::ElideNone); break; + case Qt::ElideRight: metrics.setElide(Qt::ElideLeft); break; + } + + QSignalSpy textSpy(&metrics, SIGNAL(textChanged())); + QSignalSpy metricsSpy(&metrics, SIGNAL(metricsChanged())); + metrics.setText(text); + QCOMPARE(textSpy.count(), 1); + QCOMPARE(metricsSpy.count(), 1); + + QSignalSpy elideSpy(&metrics, SIGNAL(elideChanged())); + metrics.setElide(mode); + QCOMPARE(elideSpy.count(), 1); + QCOMPARE(metricsSpy.count(), 2); + + QSignalSpy elideWidthSpy(&metrics, SIGNAL(elideWidthChanged())); + metrics.setElideWidth(width); + QCOMPARE(elideWidthSpy.count(), 1); + QCOMPARE(metricsSpy.count(), 3); + + QFontMetricsF expected = QFontMetricsF(QFont()); + + QCOMPARE(metrics.elidedText(), expected.elidedText(text, mode, width, 0)); + QCOMPARE(metrics.advanceWidth(), expected.width(text)); + QCOMPARE(metrics.boundingRect(), expected.boundingRect(text)); + QCOMPARE(metrics.width(), expected.boundingRect(text).width()); + QCOMPARE(metrics.height(), expected.boundingRect(text).height()); + QCOMPARE(metrics.tightBoundingRect(), expected.tightBoundingRect(text)); +} + +QTEST_MAIN(tst_QQuickTextMetrics) + +#include "tst_qquicktextmetrics.moc" |