diff --git a/src/plugins/texteditor/textdocumentlayout.cpp b/src/plugins/texteditor/textdocumentlayout.cpp index a2f292e9c71..111a47ca067 100644 --- a/src/plugins/texteditor/textdocumentlayout.cpp +++ b/src/plugins/texteditor/textdocumentlayout.cpp @@ -387,12 +387,12 @@ TextDocumentLayout::~TextDocumentLayout() void TextDocumentLayout::setParentheses(const QTextBlock &block, const Parentheses &parentheses) { - if (parentheses.isEmpty()) { - if (TextBlockUserData *userData = textUserData(block)) - userData->clearParentheses(); - } else { - userData(block)->setParentheses(parentheses); - } + if (TextDocumentLayout::parentheses(block) == parentheses) + return; + + userData(block)->setParentheses(parentheses); + if (auto layout = qobject_cast(block.document()->documentLayout())) + emit layout->parenthesesChanged(block); } Parentheses TextDocumentLayout::parentheses(const QTextBlock &block) @@ -684,4 +684,18 @@ void TextDocumentLayout::FoldValidator::finalize() } } +QDebug operator<<(QDebug debug, const Parenthesis &parenthesis) +{ + QDebugStateSaver saver(debug); + debug << (parenthesis.type == Parenthesis::Opened ? "Opening " : "Closing ") << parenthesis.chr + << " at " << parenthesis.pos; + + return debug; +} + +bool Parenthesis::operator==(const Parenthesis &other) const +{ + return pos == other.pos && chr == other.chr && source == other.source && type == other.type; +} + } // namespace TextEditor diff --git a/src/plugins/texteditor/textdocumentlayout.h b/src/plugins/texteditor/textdocumentlayout.h index 776552a7efd..69b0159860e 100644 --- a/src/plugins/texteditor/textdocumentlayout.h +++ b/src/plugins/texteditor/textdocumentlayout.h @@ -52,8 +52,12 @@ struct TEXTEDITOR_EXPORT Parenthesis QChar chr; Utils::Id source; Type type = Opened; + + bool operator==(const Parenthesis &other) const; }; +TEXTEDITOR_EXPORT QDebug operator<<(QDebug debug, const Parenthesis &parenthesis); + class TEXTEDITOR_EXPORT CodeFormatterData { public: @@ -231,6 +235,7 @@ public: signals: void updateExtraArea(); void foldChanged(const int blockNumber, bool folded); + void parenthesesChanged(const QTextBlock block); }; } // namespace TextEditor diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 5f0fa3a48b0..bad4e22c40d 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1058,6 +1058,7 @@ void TextEditorWidgetPrivate::ctor(const QSharedPointer &doc) // parentheses matcher m_formatRange = true; m_parenthesesMatchingTimer.setSingleShot(true); + m_parenthesesMatchingTimer.setInterval(50); QObject::connect(&m_parenthesesMatchingTimer, &QTimer::timeout, this, &TextEditorWidgetPrivate::_q_matchParentheses); @@ -2714,7 +2715,7 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e) skip_event: if (!ro && e->key() == Qt::Key_Delete && d->m_parenthesesMatchingEnabled) - d->m_parenthesesMatchingTimer.start(50); + d->m_parenthesesMatchingTimer.start(); if (!ro && d->m_contentsChanged && isPrintableText(eventText) && !inOverwriteMode) d->m_codeAssistant.process(); @@ -3428,6 +3429,9 @@ void TextEditorWidgetPrivate::setupDocumentSignals() QObject::connect(documentLayout, &TextDocumentLayout::updateExtraArea, this, &TextEditorWidgetPrivate::scheduleUpdateHighlightScrollBar); + QObject::connect(documentLayout, &TextDocumentLayout::parenthesesChanged, + &m_parenthesesMatchingTimer, QOverload<>::of(&QTimer::start)); + QObject::connect(documentLayout, &QAbstractTextDocumentLayout::documentSizeChanged, this, &TextEditorWidgetPrivate::scheduleUpdateHighlightScrollBar); @@ -5431,7 +5435,7 @@ void TextEditorWidgetPrivate::updateHighlights() // Delay update when no matching is displayed yet, to avoid flicker if (q->extraSelections(TextEditorWidget::ParenthesesMatchingSelection).isEmpty() && m_bracketsAnimator == nullptr) { - m_parenthesesMatchingTimer.start(50); + m_parenthesesMatchingTimer.start(); } else { // when we uncheck "highlight matching parentheses" // we need clear current selection before viewport update