diff options
author | David Schulz <david.schulz@qt.io> | 2022-08-04 08:42:48 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2022-08-04 09:09:58 +0000 |
commit | 674efc0f95dc86a174920914543b857cef667535 (patch) | |
tree | f74f86a82b8d5b66be45ef5076ca0b9cb023b879 | |
parent | 67903cec2f0d602fc6f39b9dce33a0d5f96c8beb (diff) |
TextEditor: schedule update document layout
When generating a lot of text marks we do not need to update the
document for every mark and every property that changes.
Change-Id: Ibba80138f6ebcbbe30a4f741979df69ad62608c1
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/plugins/texteditor/textdocument.cpp | 13 | ||||
-rw-r--r-- | src/plugins/texteditor/textdocument.h | 1 | ||||
-rw-r--r-- | src/plugins/texteditor/textdocumentlayout.cpp | 14 | ||||
-rw-r--r-- | src/plugins/texteditor/textdocumentlayout.h | 5 | ||||
-rw-r--r-- | src/plugins/texteditor/textmark.cpp | 2 |
5 files changed, 31 insertions, 4 deletions
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<TextDocumentLayout*>(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) |