diff options
Diffstat (limited to 'src/gui/text/qtextlist.cpp')
-rw-r--r-- | src/gui/text/qtextlist.cpp | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/src/gui/text/qtextlist.cpp b/src/gui/text/qtextlist.cpp index fc61e54cda..7ec8b6215e 100644 --- a/src/gui/text/qtextlist.cpp +++ b/src/gui/text/qtextlist.cpp @@ -86,7 +86,7 @@ QTextList::~QTextList() int QTextList::count() const { Q_D(const QTextList); - return d->blocks.count(); + return d->blocks.size(); } /*! @@ -145,7 +145,10 @@ QString QTextList::itemText(const QTextBlock &blockIt) const const int style = format().style(); QString numberPrefix; - QString numberSuffix = "."_L1; + QString numberSuffix = u"."_s; + + // the number of the item might be offset by start, which defaults to 1 + const int itemNumber = item + format().start() - 1; if (format().hasProperty(QTextFormat::ListNumberPrefix)) numberPrefix = format().numberPrefix(); @@ -154,15 +157,21 @@ QString QTextList::itemText(const QTextBlock &blockIt) const switch (style) { case QTextListFormat::ListDecimal: - result = QString::number(item); + result = QString::number(itemNumber); break; // from the old richtext case QTextListFormat::ListLowerAlpha: case QTextListFormat::ListUpperAlpha: { + // match the html default behavior of falling back to decimal numbers + if (itemNumber < 1) { + result = QString::number(itemNumber); + break; + } + const char baseChar = style == QTextListFormat::ListUpperAlpha ? 'A' : 'a'; - int c = item; + int c = itemNumber; while (c > 0) { c--; result.prepend(QChar::fromUcs2(baseChar + (c % 26))); @@ -173,20 +182,21 @@ QString QTextList::itemText(const QTextBlock &blockIt) const case QTextListFormat::ListLowerRoman: case QTextListFormat::ListUpperRoman: { - if (item < 5000) { - QByteArray romanNumeral; + // match the html default behavior of falling back to decimal numbers + if (itemNumber < 1) { + result = QString::number(itemNumber); + } else if (itemNumber < 5000) { + QString romanNumeral; // works for up to 4999 items - static const char romanSymbolsLower[] = "iiivixxxlxcccdcmmmm"; - static const char romanSymbolsUpper[] = "IIIVIXXXLXCCCDCMMMM"; - QByteArray romanSymbols; // wrap to have "mid" + QLatin1StringView romanSymbols; if (style == QTextListFormat::ListLowerRoman) - romanSymbols = QByteArray::fromRawData(romanSymbolsLower, sizeof(romanSymbolsLower)); + romanSymbols = "iiivixxxlxcccdcmmmm"_L1; else - romanSymbols = QByteArray::fromRawData(romanSymbolsUpper, sizeof(romanSymbolsUpper)); + romanSymbols = "IIIVIXXXLXCCCDCMMMM"_L1; int c[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 }; - int n = item; + int n = itemNumber; for (int i = 12; i >= 0; n %= c[i], i--) { int q = n / c[i]; if (q > 0) { @@ -208,13 +218,12 @@ QString QTextList::itemText(const QTextBlock &blockIt) const numDigits = q; } - romanNumeral.append(romanSymbols.mid(startDigit, numDigits)); + romanNumeral.append(romanSymbols.sliced(startDigit, numDigits)); } } - result = QString::fromLatin1(romanNumeral); - } - else { - result = "?"_L1; + result = std::move(romanNumeral); + } else { + result = u"?"_s; } } |