diff options
Diffstat (limited to 'src/quick/items/qquicktext.cpp')
-rw-r--r-- | src/quick/items/qquicktext.cpp | 111 |
1 files changed, 63 insertions, 48 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index e6c9a9b763..f64b0cdb19 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -254,8 +254,11 @@ QQuickTextPrivate::~QQuickTextPrivate() { delete elideLayout; delete textLine; textLine = 0; - qDeleteAll(imgTags); - imgTags.clear(); + + if (extra.isAllocated()) { + qDeleteAll(extra->imgTags); + extra->imgTags.clear(); + } } qreal QQuickTextPrivate::getImplicitWidth() const @@ -305,8 +308,8 @@ void QQuickTextPrivate::updateLayout() updateOnComponentComplete = false; layoutTextElided = false; - if (!visibleImgTags.isEmpty()) - visibleImgTags.clear(); + if (extra.isAllocated()) + extra->visibleImgTags.clear(); needToUpdateLayout = false; // Setup instance of QTextLayout for all cases other than richtext @@ -316,7 +319,10 @@ void QQuickTextPrivate::updateLayout() layout.setFont(font); // needs temporary bool because formatModifiesFontSize is in a bit-field bool fontSizeModified = false; - QQuickStyledText::parse(text, layout, imgTags, q->baseUrl(), qmlContext(q), !maximumLineCountValid, &fontSizeModified); + QList<QQuickStyledTextImgTag*> someImgTags = extra.isAllocated() ? extra->imgTags : QList<QQuickStyledTextImgTag*>(); + QQuickStyledText::parse(text, layout, someImgTags, q->baseUrl(), qmlContext(q), !maximumLineCountValid, &fontSizeModified); + if (someImgTags.size() || extra.isAllocated()) + extra.value().imgTags = someImgTags; formatModifiesFontSize = fontSizeModified; multilengthEos = -1; } else { @@ -373,7 +379,7 @@ void QQuickText::imageDownloadFinished() if (d->extra.isAllocated() && d->extra->nbActiveDownloads == 0) { bool needToUpdateLayout = false; - foreach (QQuickStyledTextImgTag *img, d->visibleImgTags) { + foreach (QQuickStyledTextImgTag *img, d->extra->visibleImgTags) { if (!img->size.isValid()) { img->size = img->pix->implicitSize(); needToUpdateLayout = true; @@ -705,8 +711,8 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const baseline) } bool shouldUseDesignMetrics = renderType != QQuickText::NativeRendering; - if (!visibleImgTags.isEmpty()) - visibleImgTags.clear(); + if (extra.isAllocated()) + extra->visibleImgTags.clear(); layout.setCacheEnabled(true); QTextOption textOption = layout.textOption(); if (textOption.alignment() != q->effectiveHAlign() @@ -1106,7 +1112,7 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal Q_Q(QQuickText); line.setLineWidth(lineWidth); - if (imgTags.isEmpty()) { + if (extra.isAllocated() && extra->imgTags.isEmpty()) { line.setPosition(QPointF(line.position().x(), height)); height += (lineHeightMode() == QQuickText::FixedHeight) ? lineHeight() : line.height() * lineHeight(); return; @@ -1118,39 +1124,41 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal QList<QQuickStyledTextImgTag *> imagesInLine; - foreach (QQuickStyledTextImgTag *image, imgTags) { - if (image->position >= line.textStart() && - image->position < line.textStart() + line.textLength()) { - - if (!image->pix) { - QUrl url = q->baseUrl().resolved(image->url); - image->pix = new QQuickPixmap(qmlEngine(q), url, image->size); - if (image->pix->isLoading()) { - image->pix->connectFinished(q, SLOT(imageDownloadFinished())); - if (!extra.isAllocated() || !extra->nbActiveDownloads) - extra.value().nbActiveDownloads = 0; - extra->nbActiveDownloads++; - } else if (image->pix->isReady()) { - if (!image->size.isValid()) { - image->size = image->pix->implicitSize(); - // if the size of the image was not explicitly set, we need to - // call updateLayout() once again. - needToUpdateLayout = true; + if (extra.isAllocated()) { + foreach (QQuickStyledTextImgTag *image, extra->imgTags) { + if (image->position >= line.textStart() && + image->position < line.textStart() + line.textLength()) { + + if (!image->pix) { + QUrl url = q->baseUrl().resolved(image->url); + image->pix = new QQuickPixmap(qmlEngine(q), url, image->size); + if (image->pix->isLoading()) { + image->pix->connectFinished(q, SLOT(imageDownloadFinished())); + if (!extra.isAllocated() || !extra->nbActiveDownloads) + extra.value().nbActiveDownloads = 0; + extra->nbActiveDownloads++; + } else if (image->pix->isReady()) { + if (!image->size.isValid()) { + image->size = image->pix->implicitSize(); + // if the size of the image was not explicitly set, we need to + // call updateLayout() once again. + needToUpdateLayout = true; + } + } else if (image->pix->isError()) { + qmlInfo(q) << image->pix->error(); } - } else if (image->pix->isError()) { - qmlInfo(q) << image->pix->error(); } - } - qreal ih = qreal(image->size.height()); - if (image->align == QQuickStyledTextImgTag::Top) - image->pos.setY(0); - else if (image->align == QQuickStyledTextImgTag::Middle) - image->pos.setY((textHeight / 2.0) - (ih / 2.0)); - else - image->pos.setY(textHeight - ih); - imagesInLine << image; - textTop = qMax(textTop, qAbs(image->pos.y())); + qreal ih = qreal(image->size.height()); + if (image->align == QQuickStyledTextImgTag::Top) + image->pos.setY(0); + else if (image->align == QQuickStyledTextImgTag::Middle) + image->pos.setY((textHeight / 2.0) - (ih / 2.0)); + else + image->pos.setY(textHeight - ih); + imagesInLine << image; + textTop = qMax(textTop, qAbs(image->pos.y())); + } } } @@ -1158,7 +1166,7 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal totalLineHeight = qMax(totalLineHeight, textTop + image->pos.y() + image->size.height()); image->pos.setX(line.cursorToX(image->position)); image->pos.setY(image->pos.y() + height + textTop); - visibleImgTags << image; + extra->visibleImgTags << image; } line.setPosition(QPointF(line.position().x(), height + textTop)); @@ -1500,8 +1508,11 @@ void QQuickText::setText(const QString &n) d->textHasChanged = true; d->implicitWidthValid = false; d->implicitHeightValid = false; - qDeleteAll(d->imgTags); - d->imgTags.clear(); + + if (d->extra.isAllocated()) { + qDeleteAll(d->extra->imgTags); + d->extra->imgTags.clear(); + } d->updateLayout(); setAcceptHoverEvents(d->richText || d->styledText); emit textChanged(d->text); @@ -2078,8 +2089,10 @@ void QQuickText::setBaseUrl(const QUrl &url) } if (d->styledText) { d->textHasChanged = true; - qDeleteAll(d->imgTags); - d->imgTags.clear(); + if (d->extra.isAllocated()) { + qDeleteAll(d->extra->imgTags); + d->extra->imgTags.clear(); + } d->updateLayout(); } emit baseUrlChanged(); @@ -2256,10 +2269,12 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data if (d->elideLayout) node->addTextLayout(QPointF(dx, dy), d->elideLayout, color, d->style, styleColor, linkColor); - foreach (QQuickStyledTextImgTag *img, d->visibleImgTags) { - QQuickPixmap *pix = img->pix; - if (pix && pix->isReady()) - node->addImage(QRectF(img->pos.x() + dx, img->pos.y() + dy, pix->width(), pix->height()), pix->image()); + if (d->extra.isAllocated()) { + foreach (QQuickStyledTextImgTag *img, d->extra->visibleImgTags) { + QQuickPixmap *pix = img->pix; + if (pix && pix->isReady()) + node->addImage(QRectF(img->pos.x() + dx, img->pos.y() + dy, pix->width(), pix->height()), pix->image()); + } } } |