diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index 195a48f62c6..8c560c14959 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -970,6 +970,13 @@ void TextDocument::updateLayout() const documentLayout->requestUpdate(); } +void TextDocument::scheduleUpdateLayout() const +{ + auto documentLayout = qobject_cast(d->m_document.documentLayout()); + QTC_ASSERT(documentLayout, return); + documentLayout->scheduleUpdate(); +} + TextMarks TextDocument::marks() const { return d->m_marksCache; @@ -1001,7 +1008,7 @@ bool TextDocument::addMark(TextMark *mark) documentLayout->hasMarks = true; documentLayout->maxMarkWidthFactor = newMaxWidthFactor; if (fullUpdate) - documentLayout->requestUpdate(); + documentLayout->scheduleUpdate(); else documentLayout->requestExtraAreaUpdate(); return true; @@ -1080,7 +1087,7 @@ void TextDocument::removeMark(TextMark *mark) removeMarkFromMarksCache(mark); emit markRemoved(mark); mark->setBaseTextDocument(nullptr); - updateLayout(); + scheduleUpdateLayout(); } void TextDocument::updateMark(TextMark *mark) @@ -1092,7 +1099,7 @@ void TextDocument::updateMark(TextMark *mark) userData->removeMark(mark); userData->addMark(mark); } - updateLayout(); + scheduleUpdateLayout(); } void TextDocument::moveMark(TextMark *mark, int previousLine) diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h index b66046c076b..b11d1a3a588 100644 --- a/src/plugins/texteditor/textdocument.h +++ b/src/plugins/texteditor/textdocument.h @@ -112,6 +112,7 @@ public: TextMarks marksAt(int line) const; void removeMark(TextMark *mark); void updateLayout() const; + void scheduleUpdateLayout() const; void updateMark(TextMark *mark); void moveMark(TextMark *mark, int previousLine); void removeMarkFromMarksCache(TextMark *mark); diff --git a/src/plugins/texteditor/textdocumentlayout.cpp b/src/plugins/texteditor/textdocumentlayout.cpp index 64a7375f369..beabf503dfd 100644 --- a/src/plugins/texteditor/textdocumentlayout.cpp +++ b/src/plugins/texteditor/textdocumentlayout.cpp @@ -638,6 +638,20 @@ void TextDocumentLayout::updateMarksBlock(const QTextBlock &block) } } +void TextDocumentLayout::scheduleUpdate() +{ + if (m_updateScheduled) + return; + m_updateScheduled = true; + QMetaObject::invokeMethod(this, &TextDocumentLayout::requestUpdateNow, Qt::QueuedConnection); +} + +void TextDocumentLayout::requestUpdateNow() +{ + m_updateScheduled = false; + requestUpdate(); +} + QRectF TextDocumentLayout::blockBoundingRect(const QTextBlock &block) const { QRectF boundingRect = QPlainTextDocumentLayout::blockBoundingRect(block); diff --git a/src/plugins/texteditor/textdocumentlayout.h b/src/plugins/texteditor/textdocumentlayout.h index 3bed9f7bc5d..1b0bb8b5e18 100644 --- a/src/plugins/texteditor/textdocumentlayout.h +++ b/src/plugins/texteditor/textdocumentlayout.h @@ -237,6 +237,11 @@ public: void documentReloaded(TextMarks marks, TextDocument *baseextDocument); void updateMarksLineNumber(); void updateMarksBlock(const QTextBlock &block); + void scheduleUpdate(); + void requestUpdateNow(); + +private: + bool m_updateScheduled = false; signals: void updateExtraArea(); diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp index 386bd72ef27..72f89e7648c 100644 --- a/src/plugins/texteditor/textmark.cpp +++ b/src/plugins/texteditor/textmark.cpp @@ -242,7 +242,7 @@ void TextMark::removedFromEditor() void TextMark::updateMarker() { if (m_baseTextDocument) - m_baseTextDocument->updateLayout(); + m_baseTextDocument->scheduleUpdateLayout(); } void TextMark::setPriority(TextMark::Priority prioriy)