diff options
author | Michael Brasser <michael.brasser@live.com> | 2016-06-13 16:52:22 -0500 |
---|---|---|
committer | Michael Brasser <michael.brasser@live.com> | 2016-06-16 13:50:33 +0000 |
commit | 6358e1365539d2ea26ec20617b58c0fed11d647e (patch) | |
tree | 88a9949f0b6c9128509f30477058896fb7e4da6e | |
parent | 458b4f0d37955b44c4f129541df2203cb8426296 (diff) |
Fix positioning of inline images in StyledText.
Fix horizontal positioning generally, and also address RTL specifically.
Change-Id: I8b75c11bc38e39da5cda302ee9b475bf0dc464e8
Task-number: QTBUG-54075
Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
-rw-r--r-- | src/quick/items/qquicktext.cpp | 5 | ||||
-rw-r--r-- | src/quick/util/qquickstyledtext.cpp | 15 | ||||
-rw-r--r-- | src/quick/util/qquickstyledtext_p.h | 3 |
3 files changed, 16 insertions, 7 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index aa8f04e55d..e67e2cee9c 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -1138,7 +1138,10 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal foreach (QQuickStyledTextImgTag *image, imagesInLine) { totalLineHeight = qMax(totalLineHeight, textTop + image->pos.y() + image->size.height()); - image->pos.setX(line.cursorToX(image->position)); + const int leadX = line.cursorToX(image->position); + const int trailX = line.cursorToX(image->position, QTextLine::Trailing); + const bool rtl = trailX < leadX; + image->pos.setX(leadX + (rtl ? (-image->offset - image->size.width()) : image->offset)); image->pos.setY(image->pos.y() + height + textTop); extra->visibleImgTags << image; } diff --git a/src/quick/util/qquickstyledtext.cpp b/src/quick/util/qquickstyledtext.cpp index c411207121..6dd9ca882b 100644 --- a/src/quick/util/qquickstyledtext.cpp +++ b/src/quick/util/qquickstyledtext.cpp @@ -652,10 +652,13 @@ bool QQuickStyledTextPrivate::parseAnchorAttributes(const QChar *&ch, const QStr void QQuickStyledTextPrivate::parseImageAttributes(const QChar *&ch, const QString &textIn, QString &textOut) { qreal imgWidth = 0.0; + QFontMetricsF fm(layout.font()); + const qreal spaceWidth = fm.width(QChar::Nbsp); + const bool trailingSpace = textOut.endsWith(space); if (!updateImagePositions) { QQuickStyledTextImgTag *image = new QQuickStyledTextImgTag; - image->position = textOut.length() + 1; + image->position = textOut.length() + (trailingSpace ? 0 : 1); QPair<QStringRef,QStringRef> attr; do { @@ -692,14 +695,16 @@ void QQuickStyledTextPrivate::parseImageAttributes(const QChar *&ch, const QStri } imgWidth = image->size.width(); + image->offset = -std::fmod(imgWidth, spaceWidth) / 2.0; imgTags->append(image); } else { // if we already have a list of img tags for this text // we only want to update the positions of these tags. QQuickStyledTextImgTag *image = imgTags->value(nbImages); - image->position = textOut.length() + 1; + image->position = textOut.length() + (trailingSpace ? 0 : 1); imgWidth = image->size.width(); + image->offset = -std::fmod(imgWidth, spaceWidth) / 2.0; QPair<QStringRef,QStringRef> attr; do { attr = parseAttribute(ch, textIn); @@ -707,9 +712,9 @@ void QQuickStyledTextPrivate::parseImageAttributes(const QChar *&ch, const QStri nbImages++; } - QFontMetricsF fm(layout.font()); - QString padding(qFloor(imgWidth / fm.width(QChar::Nbsp)), QChar::Nbsp); - textOut += QLatin1Char(' '); + QString padding(qFloor(imgWidth / spaceWidth), QChar::Nbsp); + if (!trailingSpace) + textOut += QLatin1Char(' '); textOut += padding; textOut += QLatin1Char(' '); } diff --git a/src/quick/util/qquickstyledtext_p.h b/src/quick/util/qquickstyledtext_p.h index cd6710ff26..d9f1a71739 100644 --- a/src/quick/util/qquickstyledtext_p.h +++ b/src/quick/util/qquickstyledtext_p.h @@ -62,7 +62,7 @@ class Q_AUTOTEST_EXPORT QQuickStyledTextImgTag { public: QQuickStyledTextImgTag() - : position(0), align(QQuickStyledTextImgTag::Bottom), pix(0) + : position(0), offset(0.0), align(QQuickStyledTextImgTag::Bottom), pix(0) { } ~QQuickStyledTextImgTag() { delete pix; } @@ -77,6 +77,7 @@ public: QPointF pos; QSize size; int position; + qreal offset; // this offset allows us to compensate for flooring reserved space Align align; QQuickPixmap *pix; }; |