From 4de97522a1267854384dae3480d00f13e93531ee Mon Sep 17 00:00:00 2001 From: Le Tan Date: Mon, 28 May 2018 20:34:33 +0800 Subject: [PATCH] bug-fix: VTextEdit::visibleBlockRange() may get wrong range before updating document size after preview --- src/vpreviewmanager.cpp | 9 +++++++++ src/vtextedit.cpp | 13 +++++++++++++ src/vtextedit.h | 2 ++ 3 files changed, 24 insertions(+) diff --git a/src/vpreviewmanager.cpp b/src/vpreviewmanager.cpp index 36546a59..36c7d74d 100644 --- a/src/vpreviewmanager.cpp +++ b/src/vpreviewmanager.cpp @@ -590,4 +590,13 @@ void VPreviewManager::relayoutEditor(const OrderedIntSet &p_blocks) } m_editor->relayout(bs); + + // We may get the wrong visible block range before relayout() updating the document size. + OrderedIntSet after; + int afterFirst = m_editor->firstVisibleBlockNumber(); + for (int i = afterFirst; i < first; ++i) { + after.insert(i, QMapDummyValue()); + } + + m_editor->relayout(after); } diff --git a/src/vtextedit.cpp b/src/vtextedit.cpp index 175c977e..4de52a9d 100644 --- a/src/vtextedit.cpp +++ b/src/vtextedit.cpp @@ -277,6 +277,13 @@ void VTextEdit::updateLineNumberArea() } } +int VTextEdit::firstVisibleBlockNumber() const +{ + VTextDocumentLayout *layout = getLayout(); + Q_ASSERT(layout); + return layout->findBlockByPosition(QPointF(0, -contentOffsetY())); +} + QTextBlock VTextEdit::firstVisibleBlock() const { VTextDocumentLayout *layout = getLayout(); @@ -317,6 +324,8 @@ void VTextEdit::clearBlockImages() void VTextEdit::relayout(const OrderedIntSet &p_blocks) { getLayout()->relayout(p_blocks); + + updateLineNumberArea(); } void VTextEdit::relayoutVisibleBlocks() @@ -330,6 +339,8 @@ void VTextEdit::relayoutVisibleBlocks() } getLayout()->relayout(blocks); + + updateLineNumberArea(); } bool VTextEdit::containsImage(const QString &p_imageName) const @@ -419,6 +430,8 @@ void VTextEdit::setCursorLineBlockBg(const QColor &p_bg) void VTextEdit::relayout() { getLayout()->relayout(); + + updateLineNumberArea(); } void VTextEdit::setDisplayScaleFactor(qreal p_factor) diff --git a/src/vtextedit.h b/src/vtextedit.h index daba93b3..e7ea94ff 100644 --- a/src/vtextedit.h +++ b/src/vtextedit.h @@ -33,6 +33,8 @@ public: void setLineNumberColor(const QColor &p_foreground, const QColor &p_background); + int firstVisibleBlockNumber() const; + QTextBlock firstVisibleBlock() const; QTextBlock lastVisibleBlock() const;