TextEditor: optimize setting refactor markers

emitting requestBlockUpdate is not for free so limitting it to blocks
that have changed improve the performance notable for documents with a
lot of refactoring markers.

Change-Id: Ie288a367d1d1d6a9f4359e37ff8486a1dfe36752
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2023-06-09 13:15:20 +02:00
parent 590cdf4f61
commit c547c8615f
8 changed files with 48 additions and 24 deletions

View File

@@ -8572,6 +8572,38 @@ void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &markers)
emit requestBlockUpdate(marker.cursor.block());
}
void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &newMarkers, const Utils::Id &type)
{
RefactorMarkers markers = d->m_refactorOverlay->markers();
auto first = std::partition(markers.begin(),
markers.end(),
[type](const RefactorMarker &marker) {
return marker.type == type;
});
for (auto it = markers.begin(); it != first; ++it)
emit requestBlockUpdate(it->cursor.block());
markers.erase(markers.begin(), first);
markers.append(newMarkers);
d->m_refactorOverlay->setMarkers(markers);
for (const RefactorMarker &marker : newMarkers)
emit requestBlockUpdate(marker.cursor.block());
}
void TextEditorWidget::clearRefactorMarkers(const Utils::Id &type)
{
RefactorMarkers markers = d->m_refactorOverlay->markers();
for (auto it = markers.begin(); it != markers.end();) {
if (it->type == type) {
emit requestBlockUpdate(it->cursor.block());
it = markers.erase(it);
} else {
++it;
}
}
d->m_refactorOverlay->setMarkers(markers);
}
bool TextEditorWidget::inFindScope(const QTextCursor &cursor) const
{
return d->m_find->inScope(cursor);