From 978550b6c75b204fad433437d153794ae98eea9f Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 7 Feb 2012 17:52:52 +1000 Subject: Resolve StyledText img tags relative to baseUrl. Change-Id: I954195d52330c65e851b7c0fcdb6c8dabf29335d Reviewed-by: Yann Bodson --- src/quick/items/qquicktext.cpp | 10 ++++++++-- src/quick/util/qdeclarativestyledtext.cpp | 18 ++++++++++++------ src/quick/util/qdeclarativestyledtext_p.h | 2 ++ 3 files changed, 22 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index acf2d17061..14016777c1 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -298,7 +298,7 @@ void QQuickTextPrivate::updateLayout() if (!richText) { if (textHasChanged) { if (styledText && !text.isEmpty()) { - QDeclarativeStyledText::parse(text, layout, imgTags, qmlContext(q), !maximumLineCountValid); + QDeclarativeStyledText::parse(text, layout, imgTags, q->baseUrl(), qmlContext(q), !maximumLineCountValid); } else { layout.clearAdditionalFormats(); QString tmp = text; @@ -893,7 +893,7 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal image->position < line.textStart() + line.textLength()) { if (!image->pix) { - QUrl url = qmlContext(q)->resolvedUrl(image->url); + QUrl url = q->baseUrl().resolved(image->url); image->pix = new QDeclarativePixmap(qmlEngine(q), url, image->size); if (image->pix->isLoading()) { image->pix->connectFinished(q, SLOT(imageDownloadFinished())); @@ -1752,6 +1752,12 @@ void QQuickText::setBaseUrl(const QUrl &url) if (d->doc) d->doc->setBaseUrl(url); + if (d->styledText) { + d->textHasChanged = true; + qDeleteAll(d->imgTags); + d->imgTags.clear(); + d->updateLayout(); + } emit baseUrlChanged(); } } diff --git a/src/quick/util/qdeclarativestyledtext.cpp b/src/quick/util/qdeclarativestyledtext.cpp index 39ea6b1a22..3023fc53dc 100644 --- a/src/quick/util/qdeclarativestyledtext.cpp +++ b/src/quick/util/qdeclarativestyledtext.cpp @@ -83,9 +83,10 @@ public: QDeclarativeStyledTextPrivate(const QString &t, QTextLayout &l, QList &imgTags, + const QUrl &baseUrl, QDeclarativeContext *context, bool preloadImages) - : text(t), layout(l), imgTags(&imgTags), baseFont(layout.font()), hasNewLine(false), nbImages(0), updateImagePositions(false) + : text(t), layout(l), imgTags(&imgTags), baseFont(layout.font()), baseUrl(baseUrl), hasNewLine(false), nbImages(0), updateImagePositions(false) , preFormat(false), prependSpace(false), hasSpace(true), preloadImages(preloadImages), context(context) { } @@ -117,6 +118,7 @@ public: QList *imgTags; QFont baseFont; QStack listStack; + QUrl baseUrl; bool hasNewLine; int nbImages; bool updateImagePositions; @@ -155,9 +157,11 @@ const QChar QDeclarativeStyledTextPrivate::lineFeed(QLatin1Char('\n')); const QChar QDeclarativeStyledTextPrivate::space(QLatin1Char(' ')); QDeclarativeStyledText::QDeclarativeStyledText(const QString &string, QTextLayout &layout, - QList &imgTags, QDeclarativeContext *context, + QList &imgTags, + const QUrl &baseUrl, + QDeclarativeContext *context, bool preloadImages) - : d(new QDeclarativeStyledTextPrivate(string, layout, imgTags, context, preloadImages)) + : d(new QDeclarativeStyledTextPrivate(string, layout, imgTags, baseUrl, context, preloadImages)) { } @@ -167,12 +171,14 @@ QDeclarativeStyledText::~QDeclarativeStyledText() } void QDeclarativeStyledText::parse(const QString &string, QTextLayout &layout, - QList &imgTags, QDeclarativeContext *context, + QList &imgTags, + const QUrl &baseUrl, + QDeclarativeContext *context, bool preloadImages) { if (string.isEmpty()) return; - QDeclarativeStyledText styledText(string, layout, imgTags, context, preloadImages); + QDeclarativeStyledText styledText(string, layout, imgTags, baseUrl, context, preloadImages); styledText.d->parse(); } @@ -657,7 +663,7 @@ void QDeclarativeStyledTextPrivate::parseImageAttributes(const QChar *&ch, const // if we don't know its size but the image is a local image, // we load it in the pixmap cache and save its implicit size // to avoid a relayout later on. - QUrl url = context->resolvedUrl(image->url); + QUrl url = baseUrl.resolved(image->url); if (url.isLocalFile()) { QDeclarativePixmap *pix = new QDeclarativePixmap(context->engine(), url, image->size); if (pix && pix->isReady()) { diff --git a/src/quick/util/qdeclarativestyledtext_p.h b/src/quick/util/qdeclarativestyledtext_p.h index 1c9086e7d1..aa6ae3f869 100644 --- a/src/quick/util/qdeclarativestyledtext_p.h +++ b/src/quick/util/qdeclarativestyledtext_p.h @@ -83,12 +83,14 @@ class Q_AUTOTEST_EXPORT QDeclarativeStyledText public: static void parse(const QString &string, QTextLayout &layout, QList &imgTags, + const QUrl &baseUrl, QDeclarativeContext *context, bool preloadImages); private: QDeclarativeStyledText(const QString &string, QTextLayout &layout, QList &imgTags, + const QUrl &baseUrl, QDeclarativeContext *context, bool preloadImages); ~QDeclarativeStyledText(); -- cgit v1.2.3