From 243f66f97d49bf0c460991346522cb7c8a0265a5 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 20 Oct 2022 13:47:13 +0200 Subject: [PATCH] UnifiedDiffEditor: Fix indent visualization Add TextEditor::setVisualIndentOffset() protected helper. Change-Id: I0755a732d07dec651c090dd6afd87d293453f0e1 Reviewed-by: David Schulz --- .../diffeditor/unifieddiffeditorwidget.cpp | 2 ++ src/plugins/texteditor/texteditor.cpp | 19 +++++++++++++------ src/plugins/texteditor/texteditor.h | 2 ++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 6b4571b71e7..400e9877551 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -36,6 +36,8 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent) : SelectableTextEditorWidget("DiffEditor.UnifiedDiffEditor", parent) , m_controller(this) { + setVisualIndentOffset(1); + connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged, this, &UnifiedDiffEditorWidget::setFontSettings); setFontSettings(TextEditorSettings::fontSettings()); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 692c4bec1a7..f1d17faebcb 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -810,6 +810,7 @@ public: using UndoMultiCursor = QList; QStack m_undoCursorStack; QList m_visualIndentCache; + int m_visualIndentOffset = 0; }; class TextEditorWidgetFind : public BaseTextFind @@ -1699,6 +1700,11 @@ QString TextEditorWidget::selectedText() const return d->m_cursors.selectedText(); } +void TextEditorWidget::setVisualIndentOffset(int offset) +{ + d->m_visualIndentOffset = qMax(0, offset); +} + void TextEditorWidgetPrivate::updateCannotDecodeInfo() { q->setReadOnly(m_document->hasDecodingError()); @@ -4388,7 +4394,7 @@ int TextEditorWidgetPrivate::indentDepthForBlock(const QTextBlock &block) const auto blockDepth = [&](const QTextBlock &block) { int depth = m_visualIndentCache.value(block.blockNumber(), -1); if (depth < 0) { - const QString text = block.text(); + const QString text = block.text().mid(m_visualIndentOffset); depth = text.simplified().isEmpty() ? -1 : tabSettings.indentationColumn(text); } return depth; @@ -4448,18 +4454,19 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data, return; const TabSettings &tabSettings = m_document->tabSettings(); - const qreal horizontalAdvance = QFontMetricsF(q->font()).horizontalAdvance( - QString(tabSettings.m_indentSize, QChar(' '))); + const qreal horizontalAdvance = QFontMetricsF(q->font()).horizontalAdvance(' '); + const qreal fullHorizontalAdvance = horizontalAdvance * tabSettings.m_indentSize; painter.save(); painter.setPen(data.visualWhitespaceFormat.foreground().color()); const QTextLine textLine = blockData.layout->lineAt(0); const QRectF rect = textLine.naturalTextRect(); - qreal x = textLine.cursorToX(0) + data.offset.x() + qMax(0, q->cursorWidth() - 1); + qreal x = textLine.cursorToX(0) + data.offset.x() + qMax(0, q->cursorWidth() - 1) + + horizontalAdvance * m_visualIndentOffset; int paintColumn = 0; - const QString text = data.block.text(); + const QString text = data.block.text().mid(m_visualIndentOffset); while (paintColumn < depth) { if (x >= 0) { int paintPosition = tabSettings.positionAtColumn(text, paintColumn); @@ -4470,7 +4477,7 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data, const QLineF line(top, bottom); painter.drawLine(line); } - x += horizontalAdvance; + x += fullHorizontalAdvance; paintColumn += tabSettings.m_indentSize; } painter.restore(); diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 75ccb493578..801ab5cc3e5 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -537,6 +537,8 @@ protected: virtual void finalizeInitializationAfterDuplication(TextEditorWidget *) {} static QTextCursor flippedCursor(const QTextCursor &cursor); + void setVisualIndentOffset(int offset); + public: QString selectedText() const;