diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp index 9c7864a9cbd86b828663e881d76eb643f80a29d5..8f45cd7f63816e22ddff3c6c4ca8de2e205603c4 100644 --- a/src/plugins/texteditor/tabsettings.cpp +++ b/src/plugins/texteditor/tabsettings.cpp @@ -143,6 +143,18 @@ int TabSettings::indentationColumn(const QString &text) const return columnAt(text, firstNonSpace(text)); } +int TabSettings::maximumPadding(const QString &text) const +{ + int fns = columnAt(text, firstNonSpace(text)); + int i = fns; + while (i > 0) { + if (text.at(i-1) != QLatin1Char(' ')) + break; + --i; + } + return fns - i; +} + int TabSettings::trailingWhitespaces(const QString &text) const { @@ -286,7 +298,7 @@ QString TabSettings::indentationString(int startColumn, int targetColumn, const return s; } -void TabSettings::indentLine(QTextBlock block, int newIndent) const +void TabSettings::indentLine(QTextBlock block, int newIndent, int padding) const { const QString text = block.text(); const int oldBlockLength = text.size(); @@ -295,8 +307,15 @@ void TabSettings::indentLine(QTextBlock block, int newIndent) const if (indentationColumn(text) == newIndent) return; - const QString indentString = indentationString(0, newIndent, block); - newIndent = indentString.length(); + QString indentString; + + if (!m_spacesForTabs && m_tabSize == m_indentSize) { + // user likes tabs for spaces and uses tabs for indentation, preserve padding + indentString = indentationString(0, newIndent - padding, block); + indentString += QString(padding, QLatin1Char(' ')); + } else { + indentString = indentationString(0, newIndent, block); + } if (oldBlockLength == indentString.length() && text == indentString) return; @@ -321,8 +340,15 @@ void TabSettings::reindentLine(QTextBlock block, int delta) const if (oldIndent == newIndent) return; - const QString indentString = indentationString(0, newIndent, block); - newIndent = indentString.length(); + QString indentString; + if (!m_spacesForTabs && m_tabSize == m_indentSize) { + // user likes tabs for spaces and uses tabs for indentation, preserve padding + int padding = qMin(maximumPadding(text), newIndent); + indentString = indentationString(0, newIndent - padding, block); + indentString += QString(padding, QLatin1Char(' ')); + } else { + indentString = indentationString(0, newIndent, block); + } if (oldBlockLength == indentString.length() && text == indentString) return; diff --git a/src/plugins/texteditor/tabsettings.h b/src/plugins/texteditor/tabsettings.h index 59ae3d4c009355e1ea6d7e74c989d1bc43591291..3a15787b0986560d169dc111f4c046baf93ae198 100644 --- a/src/plugins/texteditor/tabsettings.h +++ b/src/plugins/texteditor/tabsettings.h @@ -65,10 +65,11 @@ struct TEXTEDITOR_EXPORT TabSettings QString indentationString(int startColumn, int targetColumn, const QTextBlock ¤tBlock = QTextBlock()) const; QString indentationString(const QString &text) const; int indentationColumn(const QString &text) const; + int maximumPadding(const QString &text) const; bool cursorIsAtBeginningOfLine(const QTextCursor &cursor) const; - void indentLine(QTextBlock block, int newIndent) const; + void indentLine(QTextBlock block, int newIndent, int padding = 0) const; void reindentLine(QTextBlock block, int delta) const; int trailingWhitespaces(const QString &text) const;