UnifiedDiffEditor: Fix indent visualization

Add TextEditor::setVisualIndentOffset() protected helper.

Change-Id: I0755a732d07dec651c090dd6afd87d293453f0e1
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Jarek Kobus
2022-10-20 13:47:13 +02:00
parent 3c9303c3b9
commit 243f66f97d
3 changed files with 17 additions and 6 deletions

View File

@@ -36,6 +36,8 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent)
: SelectableTextEditorWidget("DiffEditor.UnifiedDiffEditor", parent) : SelectableTextEditorWidget("DiffEditor.UnifiedDiffEditor", parent)
, m_controller(this) , m_controller(this)
{ {
setVisualIndentOffset(1);
connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged, connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged,
this, &UnifiedDiffEditorWidget::setFontSettings); this, &UnifiedDiffEditorWidget::setFontSettings);
setFontSettings(TextEditorSettings::fontSettings()); setFontSettings(TextEditorSettings::fontSettings());

View File

@@ -810,6 +810,7 @@ public:
using UndoMultiCursor = QList<UndoCursor>; using UndoMultiCursor = QList<UndoCursor>;
QStack<UndoMultiCursor> m_undoCursorStack; QStack<UndoMultiCursor> m_undoCursorStack;
QList<int> m_visualIndentCache; QList<int> m_visualIndentCache;
int m_visualIndentOffset = 0;
}; };
class TextEditorWidgetFind : public BaseTextFind class TextEditorWidgetFind : public BaseTextFind
@@ -1699,6 +1700,11 @@ QString TextEditorWidget::selectedText() const
return d->m_cursors.selectedText(); return d->m_cursors.selectedText();
} }
void TextEditorWidget::setVisualIndentOffset(int offset)
{
d->m_visualIndentOffset = qMax(0, offset);
}
void TextEditorWidgetPrivate::updateCannotDecodeInfo() void TextEditorWidgetPrivate::updateCannotDecodeInfo()
{ {
q->setReadOnly(m_document->hasDecodingError()); q->setReadOnly(m_document->hasDecodingError());
@@ -4388,7 +4394,7 @@ int TextEditorWidgetPrivate::indentDepthForBlock(const QTextBlock &block)
const auto blockDepth = [&](const QTextBlock &block) { const auto blockDepth = [&](const QTextBlock &block) {
int depth = m_visualIndentCache.value(block.blockNumber(), -1); int depth = m_visualIndentCache.value(block.blockNumber(), -1);
if (depth < 0) { if (depth < 0) {
const QString text = block.text(); const QString text = block.text().mid(m_visualIndentOffset);
depth = text.simplified().isEmpty() ? -1 : tabSettings.indentationColumn(text); depth = text.simplified().isEmpty() ? -1 : tabSettings.indentationColumn(text);
} }
return depth; return depth;
@@ -4448,18 +4454,19 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data,
return; return;
const TabSettings &tabSettings = m_document->tabSettings(); const TabSettings &tabSettings = m_document->tabSettings();
const qreal horizontalAdvance = QFontMetricsF(q->font()).horizontalAdvance( const qreal horizontalAdvance = QFontMetricsF(q->font()).horizontalAdvance(' ');
QString(tabSettings.m_indentSize, QChar(' '))); const qreal fullHorizontalAdvance = horizontalAdvance * tabSettings.m_indentSize;
painter.save(); painter.save();
painter.setPen(data.visualWhitespaceFormat.foreground().color()); painter.setPen(data.visualWhitespaceFormat.foreground().color());
const QTextLine textLine = blockData.layout->lineAt(0); const QTextLine textLine = blockData.layout->lineAt(0);
const QRectF rect = textLine.naturalTextRect(); 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; int paintColumn = 0;
const QString text = data.block.text(); const QString text = data.block.text().mid(m_visualIndentOffset);
while (paintColumn < depth) { while (paintColumn < depth) {
if (x >= 0) { if (x >= 0) {
int paintPosition = tabSettings.positionAtColumn(text, paintColumn); int paintPosition = tabSettings.positionAtColumn(text, paintColumn);
@@ -4470,7 +4477,7 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data,
const QLineF line(top, bottom); const QLineF line(top, bottom);
painter.drawLine(line); painter.drawLine(line);
} }
x += horizontalAdvance; x += fullHorizontalAdvance;
paintColumn += tabSettings.m_indentSize; paintColumn += tabSettings.m_indentSize;
} }
painter.restore(); painter.restore();

View File

@@ -537,6 +537,8 @@ protected:
virtual void finalizeInitializationAfterDuplication(TextEditorWidget *) {} virtual void finalizeInitializationAfterDuplication(TextEditorWidget *) {}
static QTextCursor flippedCursor(const QTextCursor &cursor); static QTextCursor flippedCursor(const QTextCursor &cursor);
void setVisualIndentOffset(int offset);
public: public:
QString selectedText() const; QString selectedText() const;