diff options
author | Mitch Curtis <mitch.curtis@digia.com> | 2014-07-10 17:16:09 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@digia.com> | 2014-07-17 11:24:08 +0200 |
commit | a38f8d96fc5781e6d99eadbd435f408f8729ac1b (patch) | |
tree | 2cc384a71da65359779a4365a9f910c19b6545dc /src/quick | |
parent | 112efda64ba24e7d9255a36065223e9800a50c21 (diff) |
Add QQuickFontMetrics.
This will be a private C++ type that is exposed to QtQuick 2.4 as
FontMetrics.
[ChangeLog][QtQuick] Added QQuickFontMetrics, which provides a subset
of QFontMetricsF's API.
Change-Id: Iac31e5a555bd8f1dc0904b8de0408e5f1a402b25
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/util/qquickfontmetrics.cpp | 334 | ||||
-rw-r--r-- | src/quick/util/qquickfontmetrics_p.h | 114 | ||||
-rw-r--r-- | src/quick/util/qquickutilmodule.cpp | 3 | ||||
-rw-r--r-- | src/quick/util/util.pri | 6 |
4 files changed, 455 insertions, 2 deletions
diff --git a/src/quick/util/qquickfontmetrics.cpp b/src/quick/util/qquickfontmetrics.cpp new file mode 100644 index 0000000000..bf533995a5 --- /dev/null +++ b/src/quick/util/qquickfontmetrics.cpp @@ -0,0 +1,334 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQuick 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 "qquickfontmetrics_p.h" + +#include <QFont> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype FontMetrics + \instantiates QQuickFontMetrics + \inqmlmodule QtQuick + \ingroup qtquick-text-utility + \brief Provides metrics for a given font + + FontMetrics calculates the size of characters and strings for a given font. + + It provides a subset of the C++ \l QFontMetricsF API, with the added + ability to change the font that is used for calculations via the \l font + property. + + \code + FontMetrics { + id: fontMetrics + font.family: "Arial" + } + + Rectangle { + width: fontMetrics.height() * 4 + height: fontMetrics.height() * 2 + } + \endcode + + \sa QFontMetricsF +*/ +QQuickFontMetrics::QQuickFontMetrics(QObject *parent) : + QObject(parent), + m_metrics(m_font) +{ +} + +QQuickFontMetrics::~QQuickFontMetrics() +{ +} + +/*! + \qmlproperty font QtQuick::FontMetrics::font + + This property holds the font used for the metrics calculations. +*/ +QFont QQuickFontMetrics::font() const +{ + return m_font; +} + +void QQuickFontMetrics::setFont(const QFont &font) +{ + if (m_font != font) { + m_font = font; + m_metrics = QFontMetricsF(m_font); + emit fontChanged(m_font); + } +} + +/*! + \qmlproperty real QtQuick::FontMetrics::ascent + + This property holds the ascent of the font. + + \sa {QFontMetricsF::ascent()}, descent, height +*/ +qreal QQuickFontMetrics::ascent() const +{ + return m_metrics.ascent(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::descent + + This property holds the descent of the font. + + \sa {QFontMetricsF::descent()}, ascent, height +*/ +qreal QQuickFontMetrics::descent() const +{ + return m_metrics.descent(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::height + + This property holds the height of the font. + + \sa {QFontMetricsF::height()} +*/ +qreal QQuickFontMetrics::height() const +{ + return m_metrics.height(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::leading + + This property holds the leading of the font. + + \sa {QFontMetricsF::leading()} +*/ +qreal QQuickFontMetrics::leading() const +{ + return m_metrics.leading(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::lineSpacing + + This property holds the distance from one base line to the next. + + \sa {QFontMetricsF::lineSpacing()} +*/ +qreal QQuickFontMetrics::lineSpacing() const +{ + return m_metrics.lineSpacing(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::minimumLeftBearing + + This property holds the minimum left bearing of the font. + + \sa {QFontMetricsF::minLeftBearing()} +*/ +qreal QQuickFontMetrics::minimumLeftBearing() const +{ + return m_metrics.minLeftBearing(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::minimumRightBearing + + This property holds the minimum right bearing of the font. + + \sa {QFontMetricsF::minRightBearing()} +*/ +qreal QQuickFontMetrics::minimumRightBearing() const +{ + return m_metrics.minRightBearing(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::maximumCharacterWidth + + This property holds the width of the widest character in the font. + + \sa {QFontMetricsF::maxWidth()} +*/ +qreal QQuickFontMetrics::maximumCharacterWidth() const +{ + return m_metrics.maxWidth(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::xHeight + + This property holds the 'x' height of the font. + + \sa {QFontMetricsF::xHeight()} +*/ +qreal QQuickFontMetrics::xHeight() const +{ + return m_metrics.xHeight(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::averageCharacterWidth + + This property holds the average width of glyphs in the font. + + \sa {QFontMetricsF::averageCharWidth()} +*/ +qreal QQuickFontMetrics::averageCharacterWidth() const +{ + return m_metrics.averageCharWidth(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::underlinePosition + + This property holds the distance from the base line to where an underscore + should be drawn. + + \sa {QFontMetricsF::underlinePos()}, overlinePosition, strikeOutPosition +*/ +qreal QQuickFontMetrics::underlinePosition() const +{ + return m_metrics.underlinePos(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::overlinePosition + + This property holds the distance from the base line to where an overline + should be drawn. + + \sa {QFontMetricsF::overlinePos()}, underlinePosition, strikeOutPosition +*/ +qreal QQuickFontMetrics::overlinePosition() const +{ + return m_metrics.overlinePos(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::strikeOutPosition + + This property holds the distance from the base line to where the strikeout + line should be drawn. + + \sa {QFontMetricsF::strikeOutPos()}, overlinePosition, underlinePosition +*/ +qreal QQuickFontMetrics::strikeOutPosition() const +{ + return m_metrics.strikeOutPos(); +} + +/*! + \qmlproperty real QtQuick::FontMetrics::lineWidth + + This property holds the width of the underline and strikeout lines, + adjusted for the point size of the font. + + \sa {QFontMetricsF::lineWidth()} +*/ +qreal QQuickFontMetrics::lineWidth() const +{ + return m_metrics.lineWidth(); +} + +/*! + \qmlmethod qreal QtQuick::FontMetrics::advanceWidth(string text) + + This method returns the advance in pixels of the characters in \a text. + This is the distance from the position of the string to where the next + string should be drawn. + + \sa {QFontMetricsF::width()}, height() +*/ +qreal QQuickFontMetrics::advanceWidth(const QString &text) const +{ + return m_metrics.width(text); +} + +/*! + \qmlmethod rect QtQuick::FontMetrics::boundingRect(string text) + + This method returns the bounding rectangle of the characters in the string + specified by \a text. + + \sa {QFontMetricsF::boundingRect()}, tightBoundingRect() +*/ +QRectF QQuickFontMetrics::boundingRect(const QString &text) const +{ + return m_metrics.boundingRect(text); +} + +/*! + \qmlmethod rect QtQuick::FontMetrics::tightBoundingRect(string text) + + This method returns a tight bounding rectangle around the characters in the + string specified by \a text. + + \sa {QFontMetricsF::tightBoundingRect()}, boundingRect() +*/ +QRectF QQuickFontMetrics::tightBoundingRect(const QString &text) const +{ + return m_metrics.tightBoundingRect(text); +} + +/*! + \qmlmethod string QtQuick::FontMetrics::elidedText(string text, enum mode, + qreal width, int flags) + + This method returns a returns an elided version of the string (i.e., a + string with "..." in it) if the string \a text is wider than \a width. + Otherwise, returns the original string. + + The \a flags argument is optional and currently only supports + \l {Qt::TextShowMnemonic}. + + \sa {QFontMetricsF::elidedText()} +*/ +QString QQuickFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, qreal width, int flags) const +{ + return m_metrics.elidedText(text, mode, width, flags); +} + +QT_END_NAMESPACE diff --git a/src/quick/util/qquickfontmetrics_p.h b/src/quick/util/qquickfontmetrics_p.h new file mode 100644 index 0000000000..4017fd4061 --- /dev/null +++ b/src/quick/util/qquickfontmetrics_p.h @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQuick 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$ +** +****************************************************************************/ + +#ifndef QQUICKFONTMETRICS_H +#define QQUICKFONTMETRICS_H + +#include <qqml.h> + +#include <QtGui/QFontMetricsF> +#include <QtCore/QObject> + +QT_BEGIN_NAMESPACE + +class QFont; + +class Q_AUTOTEST_EXPORT QQuickFontMetrics : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) + Q_PROPERTY(qreal ascent READ ascent NOTIFY fontChanged) + Q_PROPERTY(qreal descent READ descent NOTIFY fontChanged) + Q_PROPERTY(qreal height READ height NOTIFY fontChanged) + Q_PROPERTY(qreal leading READ leading NOTIFY fontChanged) + Q_PROPERTY(qreal lineSpacing READ lineSpacing NOTIFY fontChanged) + Q_PROPERTY(qreal minimumLeftBearing READ minimumLeftBearing NOTIFY fontChanged) + Q_PROPERTY(qreal minimumRightBearing READ minimumRightBearing NOTIFY fontChanged) + Q_PROPERTY(qreal maximumCharacterWidth READ maximumCharacterWidth NOTIFY fontChanged) + Q_PROPERTY(qreal xHeight READ xHeight NOTIFY fontChanged) + Q_PROPERTY(qreal averageCharacterWidth READ averageCharacterWidth NOTIFY fontChanged) + Q_PROPERTY(qreal underlinePosition READ underlinePosition NOTIFY fontChanged) + Q_PROPERTY(qreal overlinePosition READ overlinePosition NOTIFY fontChanged) + Q_PROPERTY(qreal strikeOutPosition READ strikeOutPosition NOTIFY fontChanged) + Q_PROPERTY(qreal lineWidth READ lineWidth NOTIFY fontChanged) +public: + explicit QQuickFontMetrics(QObject *parent = 0); + ~QQuickFontMetrics(); + + QFont font() const; + void setFont(const QFont &font); + + qreal ascent() const; + qreal descent() const; + qreal height() const; + qreal leading() const; + qreal lineSpacing() const; + qreal minimumLeftBearing() const; + qreal minimumRightBearing() const; + qreal maximumCharacterWidth() const; + + qreal xHeight() const; + qreal averageCharacterWidth() const; + + qreal underlinePosition() const; + qreal overlinePosition() const; + qreal strikeOutPosition() const; + qreal lineWidth() const; + + Q_INVOKABLE qreal advanceWidth(const QString &text) const; + Q_INVOKABLE QRectF boundingRect(const QString &text) const; + Q_INVOKABLE QRectF tightBoundingRect(const QString &text) const; + Q_INVOKABLE QString elidedText(const QString &text, Qt::TextElideMode mode, qreal width, int flags = 0) const; + +Q_SIGNALS: + void fontChanged(const QFont &font); + +private: + QFont m_font; + QFontMetricsF m_metrics; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickFontMetrics) + +#endif // QQUICKFONTMETRICS_H diff --git a/src/quick/util/qquickutilmodule.cpp b/src/quick/util/qquickutilmodule.cpp index a6e907713a..1d82cfca43 100644 --- a/src/quick/util/qquickutilmodule.cpp +++ b/src/quick/util/qquickutilmodule.cpp @@ -45,6 +45,7 @@ #include "qquickbehavior_p.h" #include "qquicksmoothedanimation_p.h" #include "qquickfontloader_p.h" +#include "qquickfontmetrics_p.h" #include "qquickpropertychanges_p.h" #include "qquickspringanimation_p.h" #include "qquickstategroup_p.h" @@ -106,4 +107,6 @@ void QQuickUtilModule::defineModule() qRegisterMetaType<QKeySequence::StandardKey>(); qmlRegisterUncreatableType<QKeySequence, 2>("QtQuick", 2, 2, "StandardKey", QStringLiteral("Cannot create an instance of StandardKey.")); + + qmlRegisterType<QQuickFontMetrics>("QtQuick", 2, 4, "FontMetrics"); } diff --git a/src/quick/util/util.pri b/src/quick/util/util.pri index ce409bd10d..35553070dc 100644 --- a/src/quick/util/util.pri +++ b/src/quick/util/util.pri @@ -26,7 +26,8 @@ SOURCES += \ $$PWD/qquickanimator.cpp \ $$PWD/qquickanimatorjob.cpp \ $$PWD/qquickanimatorcontroller.cpp \ - $$PWD/qquickprofiler.cpp + $$PWD/qquickprofiler.cpp \ + $$PWD/qquickfontmetrics.cpp HEADERS += \ $$PWD/qquickapplication_p.h\ @@ -60,4 +61,5 @@ HEADERS += \ $$PWD/qquickanimator_p_p.h \ $$PWD/qquickanimatorjob_p.h \ $$PWD/qquickanimatorcontroller_p.h \ - $$PWD/qquickprofiler_p.h + $$PWD/qquickprofiler_p.h \ + $$PWD/qquickfontmetrics_p.h |