aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2022-08-04 08:42:48 +0200
committerDavid Schulz <david.schulz@qt.io>2022-08-04 09:09:58 +0000
commit674efc0f95dc86a174920914543b857cef667535 (patch)
treef74f86a82b8d5b66be45ef5076ca0b9cb023b879
parent67903cec2f0d602fc6f39b9dce33a0d5f96c8beb (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.cpp13
-rw-r--r--src/plugins/texteditor/textdocument.h1
-rw-r--r--src/plugins/texteditor/textdocumentlayout.cpp14
-rw-r--r--src/plugins/texteditor/textdocumentlayout.h5
-rw-r--r--src/plugins/texteditor/textmark.cpp2
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)