diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/items.pri | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktext.cpp | 144 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p_p.h | 39 | ||||
-rw-r--r-- | src/quick/items/qquicktextdocument.cpp | 148 | ||||
-rw-r--r-- | src/quick/items/qquicktextdocument_p.h | 101 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextnodeengine.cpp | 3 |
7 files changed, 254 insertions, 184 deletions
diff --git a/src/quick/items/items.pri b/src/quick/items/items.pri index 0b98782566..ab966b6ccc 100644 --- a/src/quick/items/items.pri +++ b/src/quick/items/items.pri @@ -23,6 +23,7 @@ HEADERS += \ $$PWD/qquicktextcontrol_p.h \ $$PWD/qquicktextcontrol_p_p.h \ $$PWD/qquicktextdocument.h \ + $$PWD/qquicktextdocument_p.h \ $$PWD/qquicktextedit_p.h \ $$PWD/qquicktextedit_p_p.h \ $$PWD/qquicktextutil_p.h \ diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 3b5982c3d0..223219a3f9 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -40,6 +40,7 @@ #include "qquicktextnode_p.h" #include "qquickimage_p_p.h" #include "qquicktextutil_p.h" +#include "qquicktextdocument_p.h" #include <QtQuick/private/qsgtexture_p.h> @@ -113,149 +114,6 @@ void QQuickTextPrivate::init() q->setFlag(QQuickItem::ItemHasContents); } -QQuickTextDocumentWithImageResources::QQuickTextDocumentWithImageResources(QQuickItem *parent) -: QTextDocument(parent), outstanding(0) -{ - setUndoRedoEnabled(false); - documentLayout()->registerHandler(QTextFormat::ImageObject, this); - connect(this, SIGNAL(baseUrlChanged(QUrl)), this, SLOT(reset())); -} - -QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() -{ - if (!m_resources.isEmpty()) - qDeleteAll(m_resources); -} - -QVariant QQuickTextDocumentWithImageResources::loadResource(int type, const QUrl &name) -{ - QVariant resource = QTextDocument::loadResource(type, name); - if (resource.isNull() && type == QTextDocument::ImageResource) { - QQmlContext *context = qmlContext(parent()); - QUrl url = baseUrl().resolved(name); - QQuickPixmap *p = loadPixmap(context, url); - resource = p->image(); - } - - return resource; -} - -void QQuickTextDocumentWithImageResources::requestFinished() -{ - outstanding--; - if (outstanding == 0) { - markContentsDirty(0, characterCount()); - emit imagesLoaded(); - } -} - -QSizeF QQuickTextDocumentWithImageResources::intrinsicSize( - QTextDocument *, int, const QTextFormat &format) -{ - if (format.isImageFormat()) { - QTextImageFormat imageFormat = format.toImageFormat(); - - const int width = qRound(imageFormat.width()); - const bool hasWidth = imageFormat.hasProperty(QTextFormat::ImageWidth) && width > 0; - const int height = qRound(imageFormat.height()); - const bool hasHeight = imageFormat.hasProperty(QTextFormat::ImageHeight) && height > 0; - - QSizeF size(width, height); - if (!hasWidth || !hasHeight) { - QVariant res = resource(QTextDocument::ImageResource, QUrl(imageFormat.name())); - QImage image = res.value<QImage>(); - if (image.isNull()) { - if (!hasWidth) - size.setWidth(16); - if (!hasHeight) - size.setHeight(16); - return size; - } - QSize imgSize = image.size(); - - if (!hasWidth) { - if (!hasHeight) - size.setWidth(imgSize.width()); - else - size.setWidth(qRound(height * (imgSize.width() / (qreal) imgSize.height()))); - } - if (!hasHeight) { - if (!hasWidth) - size.setHeight(imgSize.height()); - else - size.setHeight(qRound(width * (imgSize.height() / (qreal) imgSize.width()))); - } - } - return size; - } - return QSizeF(); -} - -void QQuickTextDocumentWithImageResources::drawObject( - QPainter *, const QRectF &, QTextDocument *, int, const QTextFormat &) -{ -} - -QImage QQuickTextDocumentWithImageResources::image(const QTextImageFormat &format) -{ - QVariant res = resource(QTextDocument::ImageResource, QUrl(format.name())); - return res.value<QImage>(); -} - -void QQuickTextDocumentWithImageResources::reset() -{ - clearResources(); - markContentsDirty(0, characterCount()); -} - -QQuickPixmap *QQuickTextDocumentWithImageResources::loadPixmap( - QQmlContext *context, const QUrl &url) -{ - - QHash<QUrl, QQuickPixmap *>::Iterator iter = m_resources.find(url); - - if (iter == m_resources.end()) { - QQuickPixmap *p = new QQuickPixmap(context->engine(), url); - iter = m_resources.insert(url, p); - - if (p->isLoading()) { - p->connectFinished(this, SLOT(requestFinished())); - outstanding++; - } - } - - QQuickPixmap *p = *iter; - if (p->isError()) { - if (!errors.contains(url)) { - errors.insert(url); - qmlInfo(parent()) << p->error(); - } - } - return p; -} - -void QQuickTextDocumentWithImageResources::clearResources() -{ - foreach (QQuickPixmap *pixmap, m_resources) - pixmap->clear(this); - qDeleteAll(m_resources); - m_resources.clear(); - outstanding = 0; -} - -void QQuickTextDocumentWithImageResources::setText(const QString &text) -{ - clearResources(); - -#ifndef QT_NO_TEXTHTMLPARSER - setHtml(text); -#else - setPlainText(text); -#endif -} - -QSet<QUrl> QQuickTextDocumentWithImageResources::errors; - QQuickTextPrivate::~QQuickTextPrivate() { delete elideLayout; diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index acdf45dfad..c8cadcece9 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -196,45 +196,6 @@ public: static inline QQuickTextPrivate *get(QQuickText *t) { return t->d_func(); } }; -class QQuickPixmap; -class Q_AUTOTEST_EXPORT QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface -{ - Q_OBJECT - Q_INTERFACES(QTextObjectInterface) -public: - QQuickTextDocumentWithImageResources(QQuickItem *parent); - virtual ~QQuickTextDocumentWithImageResources(); - - void setText(const QString &); - int resourcesLoading() const { return outstanding; } - - QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format); - void drawObject(QPainter *p, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format); - - QImage image(const QTextImageFormat &format); - -public Q_SLOTS: - void clearResources(); - -Q_SIGNALS: - void imagesLoaded(); - -protected: - QVariant loadResource(int type, const QUrl &name); - - QQuickPixmap *loadPixmap(QQmlContext *context, const QUrl &name); - -private Q_SLOTS: - void reset(); - void requestFinished(); - -private: - QHash<QUrl, QQuickPixmap *> m_resources; - - int outstanding; - static QSet<QUrl> errors; -}; - QT_END_NAMESPACE #endif // QQUICKTEXT_P_P_H diff --git a/src/quick/items/qquicktextdocument.cpp b/src/quick/items/qquicktextdocument.cpp index b34ae24461..1f1359a3c3 100644 --- a/src/quick/items/qquicktextdocument.cpp +++ b/src/quick/items/qquicktextdocument.cpp @@ -32,11 +32,16 @@ ****************************************************************************/ #include "qquicktextdocument.h" +#include "qquicktextdocument_p.h" #include "qquicktextedit_p.h" #include "qquicktextedit_p_p.h" #include "qquicktext_p_p.h" +#include <QtQml/qqmlinfo.h> +#include <QtQml/qqmlcontext.h> +#include <QtQuick/private/qquickpixmapcache_p.h> + QT_BEGIN_NAMESPACE /*! @@ -78,4 +83,147 @@ QTextDocument* QQuickTextDocument::textDocument() const return d->document.data(); } +QQuickTextDocumentWithImageResources::QQuickTextDocumentWithImageResources(QQuickItem *parent) +: QTextDocument(parent), outstanding(0) +{ + setUndoRedoEnabled(false); + documentLayout()->registerHandler(QTextFormat::ImageObject, this); + connect(this, SIGNAL(baseUrlChanged(QUrl)), this, SLOT(reset())); +} + +QQuickTextDocumentWithImageResources::~QQuickTextDocumentWithImageResources() +{ + if (!m_resources.isEmpty()) + qDeleteAll(m_resources); +} + +QVariant QQuickTextDocumentWithImageResources::loadResource(int type, const QUrl &name) +{ + QVariant resource = QTextDocument::loadResource(type, name); + if (resource.isNull() && type == QTextDocument::ImageResource) { + QQmlContext *context = qmlContext(parent()); + QUrl url = baseUrl().resolved(name); + QQuickPixmap *p = loadPixmap(context, url); + resource = p->image(); + } + + return resource; +} + +void QQuickTextDocumentWithImageResources::requestFinished() +{ + outstanding--; + if (outstanding == 0) { + markContentsDirty(0, characterCount()); + emit imagesLoaded(); + } +} + +QSizeF QQuickTextDocumentWithImageResources::intrinsicSize( + QTextDocument *, int, const QTextFormat &format) +{ + if (format.isImageFormat()) { + QTextImageFormat imageFormat = format.toImageFormat(); + + const int width = qRound(imageFormat.width()); + const bool hasWidth = imageFormat.hasProperty(QTextFormat::ImageWidth) && width > 0; + const int height = qRound(imageFormat.height()); + const bool hasHeight = imageFormat.hasProperty(QTextFormat::ImageHeight) && height > 0; + + QSizeF size(width, height); + if (!hasWidth || !hasHeight) { + QVariant res = resource(QTextDocument::ImageResource, QUrl(imageFormat.name())); + QImage image = res.value<QImage>(); + if (image.isNull()) { + if (!hasWidth) + size.setWidth(16); + if (!hasHeight) + size.setHeight(16); + return size; + } + QSize imgSize = image.size(); + + if (!hasWidth) { + if (!hasHeight) + size.setWidth(imgSize.width()); + else + size.setWidth(qRound(height * (imgSize.width() / (qreal) imgSize.height()))); + } + if (!hasHeight) { + if (!hasWidth) + size.setHeight(imgSize.height()); + else + size.setHeight(qRound(width * (imgSize.height() / (qreal) imgSize.width()))); + } + } + return size; + } + return QSizeF(); +} + +void QQuickTextDocumentWithImageResources::drawObject( + QPainter *, const QRectF &, QTextDocument *, int, const QTextFormat &) +{ +} + +QImage QQuickTextDocumentWithImageResources::image(const QTextImageFormat &format) +{ + QVariant res = resource(QTextDocument::ImageResource, QUrl(format.name())); + return res.value<QImage>(); +} + +void QQuickTextDocumentWithImageResources::reset() +{ + clearResources(); + markContentsDirty(0, characterCount()); +} + +QQuickPixmap *QQuickTextDocumentWithImageResources::loadPixmap( + QQmlContext *context, const QUrl &url) +{ + + QHash<QUrl, QQuickPixmap *>::Iterator iter = m_resources.find(url); + + if (iter == m_resources.end()) { + QQuickPixmap *p = new QQuickPixmap(context->engine(), url); + iter = m_resources.insert(url, p); + + if (p->isLoading()) { + p->connectFinished(this, SLOT(requestFinished())); + outstanding++; + } + } + + QQuickPixmap *p = *iter; + if (p->isError()) { + if (!errors.contains(url)) { + errors.insert(url); + qmlInfo(parent()) << p->error(); + } + } + return p; +} + +void QQuickTextDocumentWithImageResources::clearResources() +{ + foreach (QQuickPixmap *pixmap, m_resources) + pixmap->clear(this); + qDeleteAll(m_resources); + m_resources.clear(); + outstanding = 0; +} + +void QQuickTextDocumentWithImageResources::setText(const QString &text) +{ + clearResources(); + +#ifndef QT_NO_TEXTHTMLPARSER + setHtml(text); +#else + setPlainText(text); +#endif +} + +QSet<QUrl> QQuickTextDocumentWithImageResources::errors; + QT_END_NAMESPACE diff --git a/src/quick/items/qquicktextdocument_p.h b/src/quick/items/qquicktextdocument_p.h new file mode 100644 index 0000000000..1a9d71fe1c --- /dev/null +++ b/src/quick/items/qquicktextdocument_p.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKTEXTDOCUMENT_P_H +#define QQUICKTEXTDOCUMENT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qhash.h> +#include <QtCore/qvariant.h> +#include <QtGui/qimage.h> +#include <QtGui/qtextdocument.h> +#include <QtGui/qabstracttextdocumentlayout.h> +#include <QtGui/qtextlayout.h> + +QT_BEGIN_NAMESPACE + +class QQuickItem; +class QQuickPixmap; +class QQmlContext; + +class Q_AUTOTEST_EXPORT QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface +{ + Q_OBJECT + Q_INTERFACES(QTextObjectInterface) +public: + QQuickTextDocumentWithImageResources(QQuickItem *parent); + virtual ~QQuickTextDocumentWithImageResources(); + + void setText(const QString &); + int resourcesLoading() const { return outstanding; } + + QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format); + void drawObject(QPainter *p, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format); + + QImage image(const QTextImageFormat &format); + +public Q_SLOTS: + void clearResources(); + +Q_SIGNALS: + void imagesLoaded(); + +protected: + QVariant loadResource(int type, const QUrl &name); + + QQuickPixmap *loadPixmap(QQmlContext *context, const QUrl &name); + +private Q_SLOTS: + void reset(); + void requestFinished(); + +private: + QHash<QUrl, QQuickPixmap *> m_resources; + + int outstanding; + static QSet<QUrl> errors; +}; + +QT_END_NAMESPACE + +#endif // QQUICKDOCUMENT_P_H diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 7cf3b449a0..8282c09770 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -34,7 +34,7 @@ #include "qquicktextedit_p.h" #include "qquicktextedit_p_p.h" #include "qquicktextcontrol_p.h" -#include "qquicktext_p_p.h" +#include "qquicktextdocument_p.h" #include "qquickevents_p_p.h" #include "qquickwindow.h" #include "qquicktextnode_p.h" diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp index 2b7f94d8bf..a65b98acd1 100644 --- a/src/quick/items/qquicktextnodeengine.cpp +++ b/src/quick/items/qquicktextnodeengine.cpp @@ -42,7 +42,8 @@ #include <QtGui/qtexttable.h> #include <QtGui/qtextlist.h> -#include <private/qquicktext_p_p.h> +#include <private/qquicktext_p.h> +#include <private/qquicktextdocument_p.h> #include <private/qtextdocumentlayout_p.h> #include <private/qtextimagehandler_p.h> #include <private/qrawfont_p.h> |