Browse Source

bug-fix: VTextEdit::visibleBlockRange() may get wrong range before updating document size after preview

Le Tan 7 years ago
parent
commit
4de97522a1
3 changed files with 24 additions and 0 deletions
  1. 9 0
      src/vpreviewmanager.cpp
  2. 13 0
      src/vtextedit.cpp
  3. 2 0
      src/vtextedit.h

+ 9 - 0
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);
 }

+ 13 - 0
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)

+ 2 - 0
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;