diff options
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qcssparser.cpp | 7 | ||||
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 15 | ||||
-rw-r--r-- | src/gui/text/qtextdocumentfragment.cpp | 36 | ||||
-rw-r--r-- | src/gui/text/qtextdocumentfragment_p.h | 1 | ||||
-rw-r--r-- | src/gui/text/qtextdocumentlayout.cpp | 20 | ||||
-rw-r--r-- | src/gui/text/qtextengine.cpp | 89 | ||||
-rw-r--r-- | src/gui/text/qtextengine_p.h | 8 | ||||
-rw-r--r-- | src/gui/text/qtextformat.cpp | 32 | ||||
-rw-r--r-- | src/gui/text/qtextformat.h | 6 | ||||
-rw-r--r-- | src/gui/text/qtexthtmlparser.cpp | 7 | ||||
-rw-r--r-- | src/gui/text/qtextlayout.cpp | 25 | ||||
-rw-r--r-- | src/gui/text/qtextoption.cpp | 3 |
12 files changed, 147 insertions, 102 deletions
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index 64adeaa260..70623939e1 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -345,13 +345,6 @@ static const QCssKnownValue styleFeatures[NumKnownStyleFeatures - 1] = { { "none", StyleFeature_None } }; -#if defined(Q_CC_MSVC) && _MSC_VER < 1600 -static bool operator<(const QCssKnownValue &prop1, const QCssKnownValue &prop2) -{ - return QString::compare(QString::fromLatin1(prop1.name), QLatin1String(prop2.name), Qt::CaseInsensitive) < 0; -} -#endif - static bool operator<(const QString &name, const QCssKnownValue &prop) { return QString::compare(name, QLatin1String(prop.name), Qt::CaseInsensitive) < 0; diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 44d1b2f201..129a326ba2 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -2908,7 +2908,11 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block) html += QLatin1Char('>'); html += QLatin1String("<pre"); } else if (!list) { - html += QLatin1String("<p"); + int headingLevel = blockFormat.headingLevel(); + if (headingLevel > 0 && headingLevel <= 6) + html += QLatin1String("<h") + QString::number(headingLevel); + else + html += QLatin1String("<p"); } emitBlockAttributes(block); @@ -2931,8 +2935,13 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block) html += QLatin1String("</pre>"); else if (list) html += QLatin1String("</li>"); - else - html += QLatin1String("</p>"); + else { + int headingLevel = blockFormat.headingLevel(); + if (headingLevel > 0 && headingLevel <= 6) + html += QLatin1String("</h") + QString::number(headingLevel) + QLatin1Char('>'); + else + html += QLatin1String("</p>"); + } if (list) { if (list->itemNumber(block) == list->count() - 1) { // last item? close list diff --git a/src/gui/text/qtextdocumentfragment.cpp b/src/gui/text/qtextdocumentfragment.cpp index ea37695f4e..3ad49b3f88 100644 --- a/src/gui/text/qtextdocumentfragment.cpp +++ b/src/gui/text/qtextdocumentfragment.cpp @@ -420,7 +420,7 @@ static QTextListFormat::Style nextListStyle(QTextListFormat::Style style) } QTextHtmlImporter::QTextHtmlImporter(QTextDocument *_doc, const QString &_html, ImportMode mode, const QTextDocument *resourceProvider) - : indent(0), compressNextWhitespace(PreserveWhiteSpace), doc(_doc), importMode(mode) + : indent(0), headingLevel(0), compressNextWhitespace(PreserveWhiteSpace), doc(_doc), importMode(mode) { cursor = QTextCursor(doc); wsm = QTextHtmlParserNode::WhiteSpaceNormal; @@ -747,8 +747,28 @@ QTextHtmlImporter::ProcessNodeResult QTextHtmlImporter::processSpecialNodes() return ContinueWithNextNode; } + case Html_h1: + headingLevel = 1; + break; + case Html_h2: + headingLevel = 2; + break; + case Html_h3: + headingLevel = 3; + break; + case Html_h4: + headingLevel = 4; + break; + case Html_h5: + headingLevel = 5; + break; + case Html_h6: + headingLevel = 6; + break; + default: break; } + return ContinueWithCurrentNode; } @@ -832,6 +852,15 @@ bool QTextHtmlImporter::closeTag() } } break; + case Html_h1: + case Html_h2: + case Html_h3: + case Html_h4: + case Html_h5: + case Html_h6: + headingLevel = 0; + blockTagClosed = true; + break; default: if (closedNode->isBlock()) blockTagClosed = true; @@ -1093,6 +1122,11 @@ QTextHtmlImporter::ProcessNodeResult QTextHtmlImporter::processBlockNode() modifiedBlockFormat = true; } + if (headingLevel) { + block.setHeadingLevel(headingLevel); + modifiedBlockFormat = true; + } + if (currentNode->blockFormat.propertyCount() > 0) { modifiedBlockFormat = true; block.merge(currentNode->blockFormat); diff --git a/src/gui/text/qtextdocumentfragment_p.h b/src/gui/text/qtextdocumentfragment_p.h index e8699545f7..02a6a429fa 100644 --- a/src/gui/text/qtextdocumentfragment_p.h +++ b/src/gui/text/qtextdocumentfragment_p.h @@ -152,6 +152,7 @@ private: friend class QTypeInfo<List>; QVector<List> lists; int indent; + int headingLevel; // insert a named anchor the next time we emit a char format, // either in a block or in regular text diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp index 9877a23fa6..d04dd08058 100644 --- a/src/gui/text/qtextdocumentlayout.cpp +++ b/src/gui/text/qtextdocumentlayout.cpp @@ -399,26 +399,6 @@ static bool operator<(const QCheckPoint &checkPoint, int pos) return checkPoint.positionInFrame < pos; } -#if defined(Q_CC_MSVC) && _MSC_VER < 1600 -//The STL implementation of MSVC 2008 requires the definitions - -static bool operator<(const QCheckPoint &checkPoint1, const QCheckPoint &checkPoint2) -{ - return checkPoint1.y < checkPoint2.y; -} - -static bool operator<(QFixed y, const QCheckPoint &checkPoint) -{ - return y < checkPoint.y; -} - -static bool operator<(int pos, const QCheckPoint &checkPoint) -{ - return pos < checkPoint.positionInFrame; -} - -#endif - static void fillBackground(QPainter *p, const QRectF &rect, QBrush brush, const QPointF &origin, const QRectF &gradientRect = QRectF()) { p->save(); diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 5e38311fa1..2d1f0fa823 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1927,7 +1927,7 @@ const QCharAttributes *QTextEngine::attributes() const QVarLengthArray<QUnicodeTools::ScriptItem> scriptItems(layoutData->items.size()); for (int i = 0; i < layoutData->items.size(); ++i) { - const QScriptItem &si = layoutData->items[i]; + const QScriptItem &si = layoutData->items.at(i); scriptItems[i].position = si.position; scriptItems[i].script = si.analysis.script; } @@ -1944,14 +1944,14 @@ const QCharAttributes *QTextEngine::attributes() const void QTextEngine::shape(int item) const { - if (layoutData->items[item].analysis.flags == QScriptAnalysis::Object) { + if (layoutData->items.at(item).analysis.flags == QScriptAnalysis::Object) { ensureSpace(1); if (block.docHandle()) { docLayout()->resizeInlineObject(QTextInlineObject(item, const_cast<QTextEngine *>(this)), layoutData->items[item].position + block.position(), format(&layoutData->items[item])); } - } else if (layoutData->items[item].analysis.flags == QScriptAnalysis::Tab) { + } else if (layoutData->items.at(item).analysis.flags == QScriptAnalysis::Tab) { // set up at least the ascent/descent/leading of the script item for the tab fontEngine(layoutData->items[item], &layoutData->items[item].ascent, @@ -2064,7 +2064,7 @@ void QTextEngine::itemize() const case QChar::Space: case QChar::Nbsp: if (option.flags() & QTextOption::ShowTabsAndSpaces) { - analysis->flags = QScriptAnalysis::Space; + analysis->flags = (*uc == QChar::Space) ? QScriptAnalysis::Space : QScriptAnalysis::Nbsp; analysis->bidiLevel = bidi.baseLevel; break; } @@ -2193,9 +2193,9 @@ int QTextEngine::findItem(int strPos, int firstItem) const int right = layoutData->items.size()-1; while(left <= right) { int middle = ((right-left)/2)+left; - if (strPos > layoutData->items[middle].position) + if (strPos > layoutData->items.at(middle).position) left = middle+1; - else if(strPos < layoutData->items[middle].position) + else if (strPos < layoutData->items.at(middle).position) right = middle-1; else { return middle; @@ -2587,7 +2587,7 @@ void QTextEngine::justify(const QScriptLine &line) int end = line.from + (int)line.length + line.trailingSpaces; if (end == layoutData->string.length()) return; // no justification at end of paragraph - if (end && layoutData->items[findItem(end-1)].analysis.flags == QScriptAnalysis::LineOrParagraphSeparator) + if (end && layoutData->items.at(findItem(end - 1)).analysis.flags == QScriptAnalysis::LineOrParagraphSeparator) return; // no justification at the end of an explicitly separated line } @@ -2621,13 +2621,13 @@ void QTextEngine::justify(const QScriptLine &line) // store pointers to the glyph data that could get reallocated by the shaping // process. for (int i = 0; i < nItems; ++i) { - QScriptItem &si = layoutData->items[firstItem + i]; + const QScriptItem &si = layoutData->items.at(firstItem + i); if (!si.num_glyphs) shape(firstItem + i); } for (int i = 0; i < nItems; ++i) { - QScriptItem &si = layoutData->items[firstItem + i]; + const QScriptItem &si = layoutData->items.at(firstItem + i); int kashida_type = Justification_Arabic_Normal; int kashida_pos = -1; @@ -2923,7 +2923,7 @@ int QTextEngine::formatIndex(const QScriptItem *si) const if (specialData && !specialData->resolvedFormats.isEmpty()) { QTextFormatCollection *collection = formatCollection(); Q_ASSERT(collection); - return collection->indexForFormat(specialData->resolvedFormats.at(si - &layoutData->items[0])); + return collection->indexForFormat(specialData->resolvedFormats.at(si - &layoutData->items.at(0))); } QTextDocumentPrivate *p = block.docHandle(); @@ -3129,7 +3129,7 @@ QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int if (!attributes) return QString(); for (int i = 0; i < layoutData->items.size(); ++i) { - QScriptItem &si = layoutData->items[i]; + const QScriptItem &si = layoutData->items.at(i); if (!si.num_glyphs) shape(i); @@ -3314,24 +3314,29 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const QList<QTextOption::Tab> tabArray = option.tabs(); if (!tabArray.isEmpty()) { if (isRightToLeft()) { // rebase the tabArray positions. - QList<QTextOption::Tab> newTabs; - newTabs.reserve(tabArray.count()); - QList<QTextOption::Tab>::Iterator iter = tabArray.begin(); - while(iter != tabArray.end()) { - QTextOption::Tab tab = *iter; - if (tab.type == QTextOption::LeftTab) - tab.type = QTextOption::RightTab; - else if (tab.type == QTextOption::RightTab) - tab.type = QTextOption::LeftTab; - newTabs << tab; - ++iter; - } - tabArray = newTabs; - } - for (int i = 0; i < tabArray.size(); ++i) { - QFixed tab = QFixed::fromReal(tabArray[i].position) * dpiScale; + auto isLeftOrRightTab = [](const QTextOption::Tab &tab) { + return tab.type == QTextOption::LeftTab || tab.type == QTextOption::RightTab; + }; + const auto cbegin = tabArray.cbegin(); + const auto cend = tabArray.cend(); + const auto cit = std::find_if(cbegin, cend, isLeftOrRightTab); + if (cit != cend) { + const int index = std::distance(cbegin, cit); + auto iter = tabArray.begin() + index; + const auto end = tabArray.end(); + while (iter != end) { + QTextOption::Tab &tab = *iter; + if (tab.type == QTextOption::LeftTab) + tab.type = QTextOption::RightTab; + else if (tab.type == QTextOption::RightTab) + tab.type = QTextOption::LeftTab; + ++iter; + } + } + } + for (const QTextOption::Tab &tabSpec : qAsConst(tabArray)) { + QFixed tab = QFixed::fromReal(tabSpec.position) * dpiScale; if (tab > x) { // this is the tab we need. - QTextOption::Tab tabSpec = tabArray[i]; int tabSectionEnd = layoutData->string.count(); if (tabSpec.type == QTextOption::RightTab || tabSpec.type == QTextOption::CenterTab) { // find next tab to calculate the width required. @@ -3352,7 +3357,7 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const QFixed length; // Calculate the length of text between this tab and the tabSectionEnd for (int i=item; i < layoutData->items.count(); i++) { - QScriptItem &item = layoutData->items[i]; + const QScriptItem &item = layoutData->items.at(i); if (item.position > tabSectionEnd || item.position <= si.position) continue; shape(i); // first, lets make sure relevant text is already shaped @@ -3652,11 +3657,12 @@ int QTextEngine::lineNumberForTextPosition(int pos) return -1; } -void QTextEngine::insertionPointsForLine(int lineNum, QVector<int> &insertionPoints) +std::vector<int> QTextEngine::insertionPointsForLine(int lineNum) { QTextLineItemIterator iterator(this, lineNum); - insertionPoints.reserve(iterator.line.length); + std::vector<int> insertionPoints; + insertionPoints.reserve(size_t(iterator.line.length)); bool lastLine = lineNum >= lines.size() - 1; @@ -3674,25 +3680,22 @@ void QTextEngine::insertionPointsForLine(int lineNum, QVector<int> &insertionPoi insertionPoints.push_back(i); } } + return insertionPoints; } int QTextEngine::endOfLine(int lineNum) { - QVector<int> insertionPoints; - insertionPointsForLine(lineNum, insertionPoints); - + const auto insertionPoints = insertionPointsForLine(lineNum); if (insertionPoints.size() > 0) - return insertionPoints.constLast(); + return insertionPoints.back(); return 0; } int QTextEngine::beginningOfLine(int lineNum) { - QVector<int> insertionPoints; - insertionPointsForLine(lineNum, insertionPoints); - + const auto insertionPoints = insertionPointsForLine(lineNum); if (insertionPoints.size() > 0) - return insertionPoints.constFirst(); + return insertionPoints.front(); return 0; } @@ -3709,10 +3712,8 @@ int QTextEngine::positionAfterVisualMovement(int pos, QTextCursor::MoveOperation if (lineNum < 0) return pos; - QVector<int> insertionPoints; - insertionPointsForLine(lineNum, insertionPoints); - int i, max = insertionPoints.size(); - for (i = 0; i < max; i++) + const auto insertionPoints = insertionPointsForLine(lineNum); + for (size_t i = 0, max = insertionPoints.size(); i < max; ++i) if (pos == insertionPoints[i]) { if (moveRight) { if (i + 1 < max) @@ -3990,7 +3991,7 @@ QTextLineItemIterator::QTextLineItemIterator(QTextEngine *_eng, int _lineNum, co QVarLengthArray<uchar> levels(nItems); for (int i = 0; i < nItems; ++i) - levels[i] = eng->layoutData->items[i+firstItem].analysis.bidiLevel; + levels[i] = eng->layoutData->items.at(i + firstItem).analysis.bidiLevel; QTextEngine::bidiReorder(nItems, levels.data(), visualOrder.data()); eng->shapeLine(line); diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index f9eb055478..e9187ea605 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -74,6 +74,7 @@ #include <private/qunicodetools_p.h> #include <stdlib.h> +#include <vector> QT_BEGIN_NAMESPACE @@ -142,9 +143,10 @@ struct Q_AUTOTEST_EXPORT QScriptAnalysis LineOrParagraphSeparator = 4, Space = 5, SpaceTabOrObject = Space, - Tab = 6, + Nbsp = 6, + Tab = 7, TabOrObject = Tab, - Object = 7 + Object = 8 }; enum BidiFlags { BidiBN = 1, @@ -632,7 +634,7 @@ public: int nextLogicalPosition(int oldPos) const; int lineNumberForTextPosition(int pos); int positionAfterVisualMovement(int oldPos, QTextCursor::MoveOperation op); - void insertionPointsForLine(int lineNum, QVector<int> &insertionPoints); + std::vector<int> insertionPointsForLine(int lineNum); void resetFontEngineCache(); void enableDelayDecorations(bool enable = true) { delayDecorations = enable; } diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp index 08106db6ce..749a287941 100644 --- a/src/gui/text/qtextformat.cpp +++ b/src/gui/text/qtextformat.cpp @@ -514,7 +514,7 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt) \value BlockFormat The object formats a text block \value CharFormat The object formats a single character \value ListFormat The object formats a list - \omitvalue TableFormat Unused Value, a table's FormatType is FrameFormat. + \omitvalue TableFormat \omit Unused Value, a table's FormatType is FrameFormat. \endomit \value FrameFormat The object formats a frame \value UserFormat @@ -556,6 +556,8 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt) \value LineHeightType \value BlockNonBreakableLines \value BlockTrailingHorizontalRulerWidth The width of a horizontal ruler element. + \value HeadingLevel The level of a heading, for example 1 corresponds to an HTML H1 tag; otherwise 0. + This enum value has been added in Qt 5.12. Character properties @@ -2246,6 +2248,34 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const /*! + \fn void QTextBlockFormat::setHeadingLevel(int level) + \since 5.12 + + Sets the paragraph's heading level, where 1 is the highest-level heading + type (usually with the largest possible heading font size), and increasing + values are progressively deeper into the document (and usually with smaller + font sizes). For example when reading an HTML H1 tag, the heading level is + set to 1. Setting the heading level does not automatically change the font + size; however QTextDocumentFragment::fromHtml() sets both the heading level + and the font size simultaneously. + + If the paragraph is not a heading, the level should be set to 0 (the default). + + \sa headingLevel() +*/ + + +/*! + \fn int QTextBlockFormat::headingLevel() const + \since 5.12 + + Returns the paragraph's heading level if it is a heading, or 0 if not. + + \sa setHeadingLevel() +*/ + + +/*! \fn void QTextBlockFormat::setLineHeight(qreal height, int heightType) \since 4.8 diff --git a/src/gui/text/qtextformat.h b/src/gui/text/qtextformat.h index 28c3035537..8f8d3d4299 100644 --- a/src/gui/text/qtextformat.h +++ b/src/gui/text/qtextformat.h @@ -175,6 +175,7 @@ public: LineHeightType = 0x1049, BlockNonBreakableLines = 0x1050, BlockTrailingHorizontalRulerWidth = 0x1060, + HeadingLevel = 0x1070, // character properties FirstFontProperty = 0x1FE0, @@ -624,6 +625,11 @@ public: inline int indent() const { return intProperty(BlockIndent); } + inline void setHeadingLevel(int alevel) + { setProperty(HeadingLevel, alevel); } + inline int headingLevel() const + { return intProperty(HeadingLevel); } + inline void setLineHeight(qreal height, int heightType) { setProperty(LineHeight, height); setProperty(LineHeightType, heightType); } inline qreal lineHeight(qreal scriptLineHeight, qreal scaling) const; diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp index 9154182df1..4be800b251 100644 --- a/src/gui/text/qtexthtmlparser.cpp +++ b/src/gui/text/qtexthtmlparser.cpp @@ -448,13 +448,6 @@ static const QTextHtmlElement elements[Html_NumElements]= { { "var", Html_var, QTextHtmlElement::DisplayInline }, }; -#if defined(Q_CC_MSVC) && _MSC_VER < 1600 -static bool operator<(const QTextHtmlElement &e1, const QTextHtmlElement &e2) -{ - return QLatin1String(e1.name) < QLatin1String(e2.name); -} -#endif - static bool operator<(const QString &str, const QTextHtmlElement &e) { return str < QLatin1String(e.name); diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 6e824b2ed1..860d1e8c7c 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -1006,10 +1006,8 @@ static void addSelectedRegionsToPath(QTextEngine *eng, int lineNumber, const QPo } if (lastSelectionWidth > 0) { - QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight); - rect.moveLeft(qFloor(rect.left())); - rect.moveTop(qFloor(rect.top())); - region->addRect(rect); + const QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight); + region->addRect(rect.toAlignedRect()); } lastSelectionX = selectionX; @@ -1017,10 +1015,8 @@ static void addSelectedRegionsToPath(QTextEngine *eng, int lineNumber, const QPo } } if (lastSelectionWidth > 0) { - QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight); - rect.moveLeft(qFloor(rect.left())); - rect.moveTop(qFloor(rect.top())); - region->addRect(rect); + const QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight); + region->addRect(rect.toAlignedRect()); } } @@ -2135,7 +2131,7 @@ static void setPenAndDrawBackground(QPainter *p, const QPen &defaultPen, const Q QBrush bg = chf.background(); if (bg.style() != Qt::NoBrush && !chf.property(SuppressBackground).toBool()) - p->fillRect(QRectF(qFloor(r.x()), qFloor(r.y()), r.width(), r.height()), bg); + p->fillRect(r.toAlignedRect(), bg); if (c.style() != Qt::NoBrush) { p->setPen(QPen(c, 0)); } @@ -2614,12 +2610,13 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR QPainterPrivate::get(p)->drawTextItem(pos, gf, eng); } - if (si.analysis.flags == QScriptAnalysis::Space + if ((si.analysis.flags == QScriptAnalysis::Space + || si.analysis.flags == QScriptAnalysis::Nbsp) && (eng->option.flags() & QTextOption::ShowTabsAndSpaces)) { QBrush c = format.foreground(); if (c.style() != Qt::NoBrush) p->setPen(c.color()); - QChar visualSpace((ushort)0xb7); + QChar visualSpace(si.analysis.flags == QScriptAnalysis::Space ? (ushort)0xb7 : (ushort)0xb0); p->drawText(QPointF(iterator.x.toReal(), itemBaseLine.toReal()), visualSpace); p->setPen(pen); } @@ -2845,9 +2842,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const bool rtl = eng->isRightToLeft(); eng->shapeLine(line); - QVector<int> insertionPoints; - if (visual && rtl) - eng->insertionPointsForLine(lineNum, insertionPoints); + const auto insertionPoints = (visual && rtl) ? eng->insertionPointsForLine(lineNum) : std::vector<int>(); int nchars = 0; for (int i = 0; i < nItems; ++i) { int item = visualOrder[i]+firstItem; @@ -2979,7 +2974,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const continue; } if (rtl && nchars > 0) - return insertionPoints[lastLine ? nchars : nchars - 1]; + return insertionPoints[size_t(lastLine ? nchars : nchars - 1)]; } return eng->positionInLigature(&si, end, x, pos, -1, cpos == QTextLine::CursorOnCharacter); diff --git a/src/gui/text/qtextoption.cpp b/src/gui/text/qtextoption.cpp index a3fa0e7351..2c2c05567f 100644 --- a/src/gui/text/qtextoption.cpp +++ b/src/gui/text/qtextoption.cpp @@ -307,7 +307,8 @@ QList<QTextOption::Tab> QTextOption::tabs() const \value IncludeTrailingSpaces When this option is set, QTextLine::naturalTextWidth() and naturalTextRect() will return a value that includes the width of trailing spaces in the text; otherwise this width is excluded. - \value ShowTabsAndSpaces Visualize spaces with little dots, and tabs with little arrows. + \value ShowTabsAndSpaces Visualize spaces with little dots, and tabs with little arrows. Non-breaking spaces are + shown differently to breaking spaces. \value ShowLineAndParagraphSeparators Visualize line and paragraph separators with appropriate symbol characters. \value ShowDocumentTerminator Visualize the end of the document with a section sign. This enum value was added in Qt 5.7. |