From 94669499fd943fc72095afd739a21cd8e675f14f Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 5 Aug 2014 17:42:54 +0200 Subject: 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 --- .../quick/qquicktextmetrics/qquicktextmetrics.pro | 10 ++ .../qquicktextmetrics/tst_qquicktextmetrics.cpp | 161 +++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 tests/auto/quick/qquicktextmetrics/qquicktextmetrics.pro create mode 100644 tests/auto/quick/qquicktextmetrics/tst_qquicktextmetrics.cpp (limited to 'tests/auto/quick/qquicktextmetrics') 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 +#include +#include +#include +#include +#include +#include + +#include + +#include + +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("text"); + QTest::addColumn("mode"); + QTest::addColumn("width"); + + QStringList strings; + strings << QString() + << QString::fromLatin1("") + << QString::fromLatin1("0") + << QString::fromLatin1("@@@@@@@") + << QString::fromLatin1("Hello"); + + QVector 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(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" -- cgit v1.2.3