From bc711e755cc64ba443fd0c252771e6d5152bf27e Mon Sep 17 00:00:00 2001 From: Le Tan Date: Wed, 26 Sep 2018 19:24:18 +0800 Subject: [PATCH] VTextDocumentLayout: bug fix in relayout() --- src/vtextdocumentlayout.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/vtextdocumentlayout.cpp b/src/vtextdocumentlayout.cpp index 8acab03b..a6f92e77 100644 --- a/src/vtextdocumentlayout.cpp +++ b/src/vtextdocumentlayout.cpp @@ -557,7 +557,7 @@ void VTextDocumentLayout::updateOffsetBefore(const QTextBlock &p_block) blk = blk.next(); while (blk.isValid() && blk.blockNumber() <= blockNum) { BlockLayoutInfo *ninfo = VTextBlockData::layoutInfo(blk); - Q_ASSERT(!ninfo->isNull()); + V_ASSERT(!ninfo->isNull()); ninfo->m_offset = offset; offset = ninfo->bottom(); blk = blk.next(); @@ -570,6 +570,8 @@ void VTextDocumentLayout::updateOffsetBefore(const QTextBlock &p_block) } } +// NOTICE: It will skip non-layouted or offset-non-changed blocks. +// So if you relayout separated blocks, you need to updateOffsetAfter() for each of them. void VTextDocumentLayout::updateOffsetAfter(const QTextBlock &p_block) { BlockLayoutInfo *info = VTextBlockData::layoutInfo(p_block); @@ -975,28 +977,31 @@ void VTextDocumentLayout::relayout(const OrderedIntSet &p_blocks) QTextDocument *doc = document(); // Need to relayout and update blocks in ascending order. - QTextBlock startBlock; + QVector blocks; + blocks.reserve(p_blocks.size()); for (auto bn = p_blocks.keyBegin(); bn != p_blocks.keyEnd(); ++bn) { QTextBlock block = doc->findBlockByNumber(*bn); if (block.isValid()) { - if (!startBlock.isValid()) { - startBlock = block; - } - + blocks.append(block); clearBlockLayout(block); layoutBlock(block); } } - if (!startBlock.isValid()) { + if (blocks.isEmpty()) { return; } - updateOffset(startBlock); + // Need to update offset for each of these discontinuous blocks, because + // the offset of the non-touched blocks may be the same but there are still + // touched blocks after them. + for (auto & blk : blocks) { + updateOffset(blk); + } updateDocumentSize(); - qreal offset = VTextBlockData::layoutInfo(startBlock)->m_offset; + qreal offset = VTextBlockData::layoutInfo(blocks.first())->m_offset; emit update(QRectF(0., offset, 1000000000., 1000000000.)); }