TextEditor: update matching parenthesis in the editor

... after updating the parenthesis in the layout

Task-number: QTCREATORBUG-26183
Change-Id: I346046fbc3932b94227c1ac5bee6b0d7c44651e1
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2021-09-24 09:59:50 +02:00
parent 0524e9236f
commit 421e06393f
3 changed files with 31 additions and 8 deletions

View File

@@ -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<TextDocumentLayout *>(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

View File

@@ -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

View File

@@ -1058,6 +1058,7 @@ void TextEditorWidgetPrivate::ctor(const QSharedPointer<TextDocument> &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