diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index 51fba77eb88..b6851411693 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -373,7 +373,7 @@ QAction *TextDocument::createDiffAgainstCurrentFileAction( return diffAction; } -void TextDocument::insertSuggestion(const QString text, const QTextBlock &block) +void TextDocument::insertSuggestion(const QString &text, const QTextBlock &block) { TextDocumentLayout::userData(block)->setReplacement(block.text() + text); TextDocumentLayout::updateReplacmentFormats(block, fontSettings()); diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h index 7a5797b7ca5..8ddfe9effb1 100644 --- a/src/plugins/texteditor/textdocument.h +++ b/src/plugins/texteditor/textdocument.h @@ -144,7 +144,7 @@ public: static QAction *createDiffAgainstCurrentFileAction(QObject *parent, const std::function &filePath); - void insertSuggestion(const QString text, const QTextBlock &block); + void insertSuggestion(const QString &text, const QTextBlock &block); #ifdef WITH_TESTS void setSilentReload(); diff --git a/src/plugins/texteditor/textdocumentlayout.cpp b/src/plugins/texteditor/textdocumentlayout.cpp index c160204e2f3..8738f43bd15 100644 --- a/src/plugins/texteditor/textdocumentlayout.cpp +++ b/src/plugins/texteditor/textdocumentlayout.cpp @@ -345,7 +345,7 @@ void TextBlockUserData::setCodeFormatterData(CodeFormatterData *data) m_codeFormatterData = data; } -void TextBlockUserData::setReplacement(const QString replacement) +void TextBlockUserData::setReplacement(const QString &replacement) { m_replacement.reset(new QTextDocument(replacement)); m_replacement->setDocumentLayout(new TextDocumentLayout(m_replacement.get())); @@ -528,30 +528,32 @@ QByteArray TextDocumentLayout::expectedRawStringSuffix(const QTextBlock &block) void TextDocumentLayout::updateReplacmentFormats(const QTextBlock &block, const FontSettings &fontSettings) { - if (TextBlockUserData *userData = textUserData(block)) { - if (QTextDocument *replacement = userData->replacement()) { - const QTextCharFormat replacementFormat = fontSettings.toTextCharFormat( - TextStyles{C_TEXT, {C_DISABLED_CODE}}); - QTextCursor cursor(replacement); - cursor.select(QTextCursor::Document); - cursor.setCharFormat(fontSettings.toTextCharFormat(C_TEXT)); - cursor.setPosition(block.length() - 1); - cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); - cursor.setCharFormat(replacementFormat); - replacement->firstBlock().layout()->setFormats(block.layout()->formats()); - } + if (QTextDocument *replacement = replacementDocument(block)) { + const QTextCharFormat replacementFormat = fontSettings.toTextCharFormat( + TextStyles{C_TEXT, {C_DISABLED_CODE}}); + QTextCursor cursor(replacement); + cursor.select(QTextCursor::Document); + cursor.setCharFormat(fontSettings.toTextCharFormat(C_TEXT)); + cursor.setPosition(block.length() - 1); + cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); + cursor.setCharFormat(replacementFormat); + replacement->firstBlock().layout()->setFormats(block.layout()->formats()); } } QString TextDocumentLayout::replacement(const QTextBlock &block) { - if (TextBlockUserData *userData = textUserData(block)) { - if (QTextDocument *replacement = userData->replacement()) - return replacement->toPlainText().mid(block.length() - 1); - } + if (QTextDocument *replacement = replacementDocument(block)) + return replacement->toPlainText().mid(block.length() - 1); return {}; } +QTextDocument *TextDocumentLayout::replacementDocument(const QTextBlock &block) +{ + TextBlockUserData *userData = textUserData(block); + return userData ? userData->replacement() : nullptr; +} + void TextDocumentLayout::requestExtraAreaUpdate() { emit updateExtraArea(); @@ -682,10 +684,8 @@ static QRectF replacementBoundingRect(const QTextDocument *replacement) QRectF TextDocumentLayout::blockBoundingRect(const QTextBlock &block) const { - if (TextBlockUserData *userData = textUserData(block)) { - if (auto replacement = userData->replacement()) - return replacementBoundingRect(replacement); - } + if (QTextDocument *replacement = replacementDocument(block)) + return replacementBoundingRect(replacement); QRectF boundingRect = QPlainTextDocumentLayout::blockBoundingRect(block); diff --git a/src/plugins/texteditor/textdocumentlayout.h b/src/plugins/texteditor/textdocumentlayout.h index 5da2dd8f997..7a2e7e948e9 100644 --- a/src/plugins/texteditor/textdocumentlayout.h +++ b/src/plugins/texteditor/textdocumentlayout.h @@ -126,7 +126,7 @@ public: QByteArray expectedRawStringSuffix() { return m_expectedRawStringSuffix; } void setExpectedRawStringSuffix(const QByteArray &suffix) { m_expectedRawStringSuffix = suffix; } - void setReplacement(const QString replacement); + void setReplacement(const QString &replacement); void clearReplacement() { m_replacement.reset(); } QTextDocument *replacement() const { return m_replacement.get(); } @@ -179,6 +179,7 @@ public: static QByteArray expectedRawStringSuffix(const QTextBlock &block); static void updateReplacmentFormats(const QTextBlock &block, const FontSettings &fontSettings); static QString replacement(const QTextBlock &block); + static QTextDocument *replacementDocument(const QTextBlock &block); class TEXTEDITOR_EXPORT FoldValidator { diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ca0ba9268c9..71bb7e639ad 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1853,13 +1853,13 @@ TextEditorWidget *TextEditorWidget::fromEditor(const IEditor *editor) void TextEditorWidgetPrivate::editorContentsChange(int position, int charsRemoved, int charsAdded) { if (m_suggestionBlock.isValid()) { - if (TextBlockUserData *data = TextDocumentLayout::textUserData(m_suggestionBlock)) { - if (auto replacementDocument = data->replacement()) { - if (replacementDocument->firstBlock().text().startsWith(m_suggestionBlock.text())) - TextDocumentLayout::updateReplacmentFormats(m_suggestionBlock, m_document->fontSettings()); - else - clearCurrentSuggestion(); - } + if (QTextDocument *replacementDocument = TextDocumentLayout::replacementDocument( + m_suggestionBlock)) { + if (replacementDocument->firstBlock().text().startsWith(m_suggestionBlock.text())) + TextDocumentLayout::updateReplacmentFormats(m_suggestionBlock, + m_document->fontSettings()); + else + clearCurrentSuggestion(); } } @@ -2994,8 +2994,6 @@ void TextEditorWidgetPrivate::universalHelper() { // Test function for development. Place your new fangled experiment here to // give it proper scrutiny before pushing it onto others. - - insertSuggestion("Teste\nWeste\nBeste", q->textCursor().block()); } void TextEditorWidget::doSetTextCursor(const QTextCursor &cursor, bool keepMultiSelection) @@ -4449,18 +4447,16 @@ void TextEditorWidgetPrivate::paintAdditionalVisualWhitespaces(PaintEventData &d } if (!nextBlockIsValid) { // paint EOF symbol if (m_suggestionBlock.isValid() && data.block == m_suggestionBlock) { - if (TextBlockUserData *userData = TextDocumentLayout::textUserData( + if (QTextDocument *replacement = TextDocumentLayout::replacementDocument( m_suggestionBlock)) { - if (QTextDocument *replacement = userData->replacement()) { - const QTextBlock lastReplacementBlock = replacement->lastBlock(); - for (QTextBlock block = replacement->firstBlock(); - block != lastReplacementBlock && block.isValid(); - block = block.next()) { - top += replacement->documentLayout()->blockBoundingRect(block).height(); - } - layout = lastReplacementBlock.layout(); - lineCount = layout->lineCount(); + const QTextBlock lastReplacementBlock = replacement->lastBlock(); + for (QTextBlock block = replacement->firstBlock(); + block != lastReplacementBlock && block.isValid(); + block = block.next()) { + top += replacement->documentLayout()->blockBoundingRect(block).height(); } + layout = lastReplacementBlock.layout(); + lineCount = layout->lineCount(); } } QTextLine line = layout->lineAt(lineCount - 1); @@ -4468,10 +4464,10 @@ void TextEditorWidgetPrivate::paintAdditionalVisualWhitespaces(PaintEventData &d int h = 4; lineRect.adjust(0, 0, -1, -1); QPainterPath path; - QPointF pos(lineRect.topRight() + QPointF(h+4, line.ascent())); + QPointF pos(lineRect.topRight() + QPointF(h + 4, line.ascent())); path.moveTo(pos); path.lineTo(pos + QPointF(-h, -h)); - path.lineTo(pos + QPointF(0, -2*h)); + path.lineTo(pos + QPointF(0, -2 * h)); path.lineTo(pos + QPointF(h, -h)); path.closeSubpath(); painter.setBrush(painter.pen().color()); @@ -4937,19 +4933,17 @@ void TextEditorWidget::paintBlock(QPainter *painter, const QVector &selections, const QRect &clipRect) const { - if (TextBlockUserData *userData = TextDocumentLayout::textUserData(block)) { - if (QTextDocument *replacement = userData->replacement()) { - QTextBlock replacementBlock = replacement->firstBlock(); - QPointF replacementOffset = offset; - replacementOffset.rx() += document()->documentMargin(); - while (replacementBlock.isValid()) { - replacementBlock.layout()->draw(painter, replacementOffset, selections, clipRect); - replacementOffset.ry() - += replacement->documentLayout()->blockBoundingRect(replacementBlock).height(); - replacementBlock = replacementBlock.next(); - } - return; + if (QTextDocument *replacement = TextDocumentLayout::replacementDocument(block)) { + QTextBlock replacementBlock = replacement->firstBlock(); + QPointF replacementOffset = offset; + replacementOffset.rx() += document()->documentMargin(); + while (replacementBlock.isValid()) { + replacementBlock.layout()->draw(painter, replacementOffset, selections, clipRect); + replacementOffset.ry() + += replacement->documentLayout()->blockBoundingRect(replacementBlock).height(); + replacementBlock = replacementBlock.next(); } + return; } block.layout()->draw(painter, offset, selections, clipRect);