diff --git a/src/plugins/vcsbase/diffhighlighter.cpp b/src/plugins/vcsbase/diffhighlighter.cpp index 359ff634b4c316f28bcdf5aa647e7745545639c8..5a1ca59ee12ddc753e237b778b26f243a253d869 100644 --- a/src/plugins/vcsbase/diffhighlighter.cpp +++ b/src/plugins/vcsbase/diffhighlighter.cpp @@ -34,6 +34,7 @@ #include <QtCore/QDebug> #include <QtCore/QtAlgorithms> #include <QtCore/QRegExp> +#include <QtGui/QBrush> namespace VCSBase { @@ -57,6 +58,7 @@ struct DiffHighlighterPrivate { const QChar m_diffInIndicator; const QChar m_diffOutIndicator; QTextCharFormat m_formats[NumDiffFormats]; + QTextCharFormat m_addedTrailingWhiteSpaceFormat; }; DiffHighlighterPrivate::DiffHighlighterPrivate(const QRegExp &filePattern) : @@ -96,20 +98,53 @@ DiffHighlighter::~DiffHighlighter() delete m_d; } +// Check trailing spaces +static inline int trimmedLength(const QString &in) +{ + for (int pos = in.length() - 1; pos >= 0; pos--) + if (!in.at(pos).isSpace()) + return pos + 1; + return 0; +} + void DiffHighlighter::highlightBlock(const QString &text) { if (text.isEmpty()) return; + const int length = text.length(); const DiffFormats format = m_d->analyzeLine(text); - if (format != DiffTextFormat) - setFormat(0, text.length(), m_d->m_formats[format]); + switch (format) { + case DiffTextFormat: + break; + case DiffInFormat: { + // Mark trailing whitespace. + const int trimmedLen = trimmedLength(text); + setFormat(0, trimmedLen, m_d->m_formats[format]); + if (trimmedLen != length) + setFormat(trimmedLen, length - trimmedLen, m_d->m_addedTrailingWhiteSpaceFormat); + } + break; + default: + setFormat(0, length, m_d->m_formats[format]); + break; + } +} + +static inline QTextCharFormat invertedColorFormat(const QTextCharFormat &in) +{ + QTextCharFormat rc = in; + rc.setForeground(in.background()); + rc.setBackground(in.foreground()); + return rc; } void DiffHighlighter::setFormats(const QVector<QTextCharFormat> &s) { if (s.size() == NumDiffFormats) { qCopy(s.constBegin(), s.constEnd(), m_d->m_formats); + // Display trailing blanks with colors swapped + m_d->m_addedTrailingWhiteSpaceFormat = invertedColorFormat(m_d->m_formats[DiffInFormat]); } else { qWarning("%s: insufficient setting size: %d", Q_FUNC_INFO, s.size()); }