TextEditor: Speed up updateCurrentLineHighlight

Only update the changed blocks and use sets instead of lists to
store the info and create the diff.

Change-Id: I08d81b326ceebdc6bf2ba322886b7bf5671b2769
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Artem Sokolovskii
2023-02-07 16:30:40 +01:00
parent f06bc4ab5a
commit 8491441257

View File

@@ -775,7 +775,7 @@ public:
QList<QTextCursor> m_autoCompleteHighlightPos; QList<QTextCursor> m_autoCompleteHighlightPos;
void updateAutoCompleteHighlight(); void updateAutoCompleteHighlight();
QList<int> m_cursorBlockNumbers; QSet<int> m_cursorBlockNumbers;
int m_blockCount = 0; int m_blockCount = 0;
QPoint m_markDragStart; QPoint m_markDragStart;
@@ -5372,21 +5372,18 @@ void TextEditorWidgetPrivate::updateCurrentLineHighlight()
q->viewport()->update(updateRect); q->viewport()->update(updateRect);
} }
}; };
QList<int> cursorBlockNumbers;
for (const QTextCursor &c : m_cursors) { QSet<int> cursorBlockNumbers;
int cursorBlockNumber = c.blockNumber(); for (const QTextCursor &c : m_cursors)
if (!m_cursorBlockNumbers.contains(cursorBlockNumber)) cursorBlockNumbers.insert(c.blockNumber());
updateBlock(c.block());
if (!cursorBlockNumbers.contains(c.blockNumber())) const QSet<int> updateBlockNumbers = (cursorBlockNumbers - m_cursorBlockNumbers)
cursorBlockNumbers << c.blockNumber(); + (m_cursorBlockNumbers - cursorBlockNumbers);
}
if (m_cursorBlockNumbers != cursorBlockNumbers) { for (const int blockNumber : updateBlockNumbers)
for (int oldBlock : m_cursorBlockNumbers) { updateBlock(m_document->document()->findBlockByNumber(blockNumber));
if (!cursorBlockNumbers.contains(oldBlock))
updateBlock(m_document->document()->findBlockByNumber(oldBlock));
}
m_cursorBlockNumbers = cursorBlockNumbers; m_cursorBlockNumbers = cursorBlockNumbers;
}
} }
void TextEditorWidget::slotCursorPositionChanged() void TextEditorWidget::slotCursorPositionChanged()