forked from qt-creator/qt-creator
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:
@@ -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());
|
||||||
|
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user