diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 6982ccbeb83..56627add292 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -687,6 +687,8 @@ public: { QRectF rect; const TextMark *mark; + friend bool operator==(const AnnotationRect &a, const AnnotationRect &b) + { return a.mark == b.mark && a.rect == b.rect; } }; QMap> m_annotationRects; QRectF getLastLineLineRect(const QTextBlock &block); @@ -4020,7 +4022,7 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, const PaintEventBlockData &blockData, QPainter &painter) { - m_annotationRects.remove(data.block.blockNumber()); + const QList previousRects = m_annotationRects.take(data.block.blockNumber()); if (!m_displaySettings.m_displayAnnotations) return; @@ -4080,6 +4082,7 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, } } + QList newRects; for (const TextMark *mark : std::as_const(marks)) { boundingRect = QRectF(x, boundingRect.top(), q->viewport()->width() - x, boundingRect.height()); if (boundingRect.isEmpty()) @@ -4094,8 +4097,16 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, x = boundingRect.right(); offset = itemOffset / 2; - m_annotationRects[data.block.blockNumber()].append({boundingRect, mark}); + newRects.append({boundingRect, mark}); } + + if (previousRects != newRects) { + for (const AnnotationRect &annotationRect : qAsConst(newRects)) + q->viewport()->update(annotationRect.rect.toAlignedRect()); + for (const AnnotationRect &annotationRect : previousRects) + q->viewport()->update(annotationRect.rect.toAlignedRect()); + } + m_annotationRects[data.block.blockNumber()] = newRects; } QColor blendRightMarginColor(const FontSettings &settings, bool areaColor)