diff options
Diffstat (limited to 'src/declarative/util')
-rw-r--r-- | src/declarative/util/qdeclarativetextdocument.cpp | 197 | ||||
-rw-r--r-- | src/declarative/util/qdeclarativetextdocument_p.h | 119 | ||||
-rw-r--r-- | src/declarative/util/qdeclarativeutilmodule.cpp | 2 | ||||
-rw-r--r-- | src/declarative/util/util.pri | 6 |
4 files changed, 322 insertions, 2 deletions
diff --git a/src/declarative/util/qdeclarativetextdocument.cpp b/src/declarative/util/qdeclarativetextdocument.cpp new file mode 100644 index 0000000000..53d6111b9b --- /dev/null +++ b/src/declarative/util/qdeclarativetextdocument.cpp @@ -0,0 +1,197 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia 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. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qdeclarativetextdocument_p.h> +#include <qdeclarativestyledtext_p.h> +#include <QApplication> +#include <QTextLayout> +#include <QList> +#include <private/qobject_p.h> + +QT_BEGIN_NAMESPACE + +QDeclarativeTextLine::QDeclarativeTextLine(QDeclarativeTextDocument* doc) + : QObject(0) +{ + _doc = doc; + _x = 0; + _y = 0; +} + +qreal QDeclarativeTextLine::x() const +{ + return _x; +} + +void QDeclarativeTextLine::setX(qreal x) +{ + _x = x; + _doc->doLayout(); +} + +qreal QDeclarativeTextLine::y() const +{ + return _y; +} + +void QDeclarativeTextLine::setY(qreal y) +{ + _y = y; + _doc->doLayout(); +} + +class QDeclarativeTextDocumentPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QDeclarativeTextDocument) + +public: + QString text; + qreal width; + QTextLayout layout; + QList<QDeclarativeTextLine*> lines; +}; + +QDeclarativeTextDocument::QDeclarativeTextDocument(QObject *parent) + : QObject(*(new QDeclarativeTextDocumentPrivate), parent) +{ + Q_D(QDeclarativeTextDocument); + d->text = QString(); + d->width = 0.0; +} + +QDeclarativeTextDocument::~QDeclarativeTextDocument() +{ +} + +qreal QDeclarativeTextDocument::width() const +{ + Q_D(const QDeclarativeTextDocument); + return d->width; +} + +void QDeclarativeTextDocument::setWidth(qreal w) +{ + Q_D(QDeclarativeTextDocument); + + if (w != d->width) { + d->width = w; + emit widthChanged(); + } +} + +QString QDeclarativeTextDocument::text() const +{ + Q_D(const QDeclarativeTextDocument); + return d->text; +} + +void QDeclarativeTextDocument::setText(const QString& text) +{ + Q_D(QDeclarativeTextDocument); + + if (text != d->text) { + d->text = text; +// d->layout.setText(text); + QDeclarativeStyledText::parse(text, d->layout); + emit textChanged(); + doLayout(); + } +} + +QObject *QDeclarativeTextDocument::lineAt(int i) const +{ + Q_D(const QDeclarativeTextDocument); + return d->lines.at(i); +} + +void QDeclarativeTextDocument::doLayout() +{ + Q_D(QDeclarativeTextDocument); + QTextOption textOption = d->layout.textOption(); + textOption.setAlignment(Qt::AlignJustify); + d->layout.setTextOption(textOption); + + qreal height = 0; + d->layout.clearLayout(); + d->layout.beginLayout(); + + int i = 0; + int l = 0; + + bool firstPass = d->lines.isEmpty(); + + forever { + QTextLine line = d->layout.createLine(); + + if (!line.isValid()) + break; + if (d->width) + line.setLineWidth(d->width); + + if (!firstPass) { + QDeclarativeTextLine *tl = d->lines.at(l); + line.setPosition(QPointF(line.position().x() + tl->x(), height * tl->y() / 100)); + } else { + line.setPosition(QPointF(line.position().x(), height)); + QDeclarativeTextLine *tline = new QDeclarativeTextLine(this); + d->lines << tline; + } + height += line.height(); + i += line.textLength(); + ++l; + } + d->layout.endLayout(); + emit textLayoutChanged(); +} + +int QDeclarativeTextDocument::lineCount() const +{ + Q_D(const QDeclarativeTextDocument); + return d->lines.count(); +} + +QTextLayout *QDeclarativeTextDocument::layout() +{ + Q_D(QDeclarativeTextDocument); + return &d->layout; +} + +QT_END_NAMESPACE diff --git a/src/declarative/util/qdeclarativetextdocument_p.h b/src/declarative/util/qdeclarativetextdocument_p.h new file mode 100644 index 0000000000..33d5f67583 --- /dev/null +++ b/src/declarative/util/qdeclarativetextdocument_p.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia 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. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDECLARATIVETEXTDOCUMENT_H +#define QDECLARATIVETEXTDOCUMENT_H + +#include <qdeclarative.h> + +#include <QtCore/qobject.h> +#include <QDebug> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Declarative) + +class QDeclarativeTextDocumentPrivate; +class QTextLayout; +class QDeclarativeTextDocument; + +class Q_AUTOTEST_EXPORT QDeclarativeTextLine : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal x READ x WRITE setX) + Q_PROPERTY(qreal y READ y WRITE setY) + +public: + QDeclarativeTextLine(QDeclarativeTextDocument* doc); + qreal x() const; + void setX(qreal x); + qreal y() const; + void setY(qreal y); + +private: + QDeclarativeTextDocument* _doc; + qreal _x; + qreal _y; +}; + +class Q_AUTOTEST_EXPORT QDeclarativeTextDocument : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QDeclarativeTextDocument) + + Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged) + +public: + QDeclarativeTextDocument(QObject *parent = 0); + ~QDeclarativeTextDocument(); + + qreal width() const; + void setWidth(qreal); + + QString text() const; + void setText(const QString&); + + QTextLayout *layout(); + + int lineCount() const; + + Q_INVOKABLE QObject *lineAt(int i) const; + + void doLayout(); + +Q_SIGNALS: + void textLayoutChanged(); + void widthChanged(); + void textChanged(); + void lineCountChanged(); +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QDeclarativeTextDocument) + +QT_END_HEADER + +#endif // QDECLARATIVETEXTDOCUMENT_H diff --git a/src/declarative/util/qdeclarativeutilmodule.cpp b/src/declarative/util/qdeclarativeutilmodule.cpp index 4bea2e651a..6786b1cb9f 100644 --- a/src/declarative/util/qdeclarativeutilmodule.cpp +++ b/src/declarative/util/qdeclarativeutilmodule.cpp @@ -63,6 +63,7 @@ #include "private/qdeclarativestyledtext_p.h" #include "private/qdeclarativesystempalette_p.h" #include "private/qdeclarativetimeline_p_p.h" +#include "private/qdeclarativetextdocument_p.h" #include "private/qdeclarativetimer_p.h" #include "private/qdeclarativetransitionmanager_p_p.h" #include "private/qdeclarativetransition_p.h" @@ -78,6 +79,7 @@ void QDeclarativeUtilModule::defineModule() { qmlRegisterUncreatableType<QDeclarativeApplication>("QtQuick",1,1,"Application", QDeclarativeApplication::tr("Application is an abstract class")); + qmlRegisterType<QDeclarativeTextDocument>("QtQuick",2,0,"TextLayout"); qmlRegisterType<QDeclarativeAnchorAnimation>("QtQuick",1,0,"AnchorAnimation"); qmlRegisterType<QDeclarativeAnchorChanges>("QtQuick",1,0,"AnchorChanges"); qmlRegisterType<QDeclarativeBehavior>("QtQuick",1,0,"Behavior"); diff --git a/src/declarative/util/util.pri b/src/declarative/util/util.pri index 4bd1f1bb1b..61bee8e760 100644 --- a/src/declarative/util/util.pri +++ b/src/declarative/util/util.pri @@ -29,7 +29,8 @@ SOURCES += \ $$PWD/qdeclarativestyledtext.cpp \ $$PWD/qdeclarativelistmodelworkeragent.cpp \ $$PWD/qdeclarativechangeset.cpp \ - $$PWD/qlistmodelinterface.cpp + $$PWD/qlistmodelinterface.cpp \ + $$PWD/qdeclarativetextdocument.cpp HEADERS += \ $$PWD/qdeclarativeapplication_p.h \ @@ -65,7 +66,8 @@ HEADERS += \ $$PWD/qdeclarativestyledtext_p.h \ $$PWD/qdeclarativelistmodelworkeragent_p.h \ $$PWD/qdeclarativechangeset_p.h \ - $$PWD/qlistmodelinterface_p.h + $$PWD/qlistmodelinterface_p.h \ + $$PWD/qdeclarativetextdocument_p.h contains(QT_CONFIG, xmlpatterns) { QT+=xmlpatterns |