summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-03-13 17:17:05 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2020-03-17 09:39:12 +0000
commit0ff5bf75e16f1383967405ad34628a38d6c60768 (patch)
tree913ba1f2e2105717402ece34523aeac8f976ff52 /src
parentf88789081d3d83031bfac3734c4e9c5e89afd188 (diff)
downloadqt-creator-0ff5bf75e16f1383967405ad34628a38d6c60768.tar.gz
Move some code from OutputWindow to OutputFormatter
That's where it belongs: The logic there is applicable to all output formatters, not just those used via an output window. Change-Id: Idf4ca8d22631ca96feb97553f28724c0275e0bf8 Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/libs/utils/outputformatter.cpp77
-rw-r--r--src/libs/utils/outputformatter.h10
-rw-r--r--src/plugins/coreplugin/outputwindow.cpp72
-rw-r--r--src/plugins/coreplugin/outputwindow.h1
-rw-r--r--src/plugins/python/pythonrunconfiguration.cpp6
-rw-r--r--src/plugins/qtsupport/qtoutputformatter.cpp14
-rw-r--r--src/plugins/vcsbase/vcsoutputformatter.cpp6
-rw-r--r--src/plugins/vcsbase/vcsoutputformatter.h2
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.cpp5
9 files changed, 98 insertions, 95 deletions
diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp
index 5ed3d2f7d4..940b7cee10 100644
--- a/src/libs/utils/outputformatter.cpp
+++ b/src/libs/utils/outputformatter.cpp
@@ -25,6 +25,7 @@
#include "ansiescapecodehandler.h"
#include "outputformatter.h"
+#include "synchronousprocess.h"
#include "theme/theme.h"
#include <QPlainTextEdit>
@@ -42,6 +43,8 @@ public:
QTextCursor cursor;
AnsiEscapeCodeHandler escapeCodeHandler;
bool boldFontEnabled = true;
+ bool enforceNewline = false;
+ bool prependCarriageReturn = false;
};
} // namespace Internal
@@ -69,14 +72,14 @@ void OutputFormatter::setPlainTextEdit(QPlainTextEdit *plainText)
initFormats();
}
-void OutputFormatter::appendMessage(const QString &text, OutputFormat format)
+void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format)
{
if (!d->cursor.atEnd() && text.startsWith('\n'))
d->cursor.movePosition(QTextCursor::End);
- appendMessage(text, d->formats[format]);
+ doAppendMessage(text, d->formats[format]);
}
-void OutputFormatter::appendMessage(const QString &text, const QTextCharFormat &format)
+void OutputFormatter::doAppendMessage(const QString &text, const QTextCharFormat &format)
{
const QList<FormattedText> formattedTextList = parseAnsi(text, format);
for (const FormattedText &output : formattedTextList)
@@ -169,6 +172,12 @@ void OutputFormatter::handleLink(const QString &href)
Q_UNUSED(href)
}
+void OutputFormatter::clear()
+{
+ d->enforceNewline = false;
+ d->prependCarriageReturn = false;
+}
+
void OutputFormatter::setBoldFontEnabled(bool enabled)
{
d->boldFontEnabled = enabled;
@@ -182,4 +191,66 @@ void OutputFormatter::flush()
d->escapeCodeHandler.endFormatScope();
}
+void OutputFormatter::appendMessage(const QString &text, OutputFormat format)
+{
+ QString out = text;
+ if (d->prependCarriageReturn) {
+ d->prependCarriageReturn = false;
+ out.prepend('\r');
+ }
+ out = SynchronousProcess::normalizeNewlines(out);
+ if (out.endsWith('\r')) {
+ d->prependCarriageReturn = true;
+ out.chop(1);
+ }
+
+ if (format == ErrorMessageFormat || format == NormalMessageFormat) {
+ doAppendMessage(doNewlineEnforcement(out), format);
+ } else {
+ const bool sameLine = format == StdOutFormatSameLine || format == StdErrFormatSameLine;
+ if (sameLine) {
+ bool enforceNewline = d->enforceNewline;
+ d->enforceNewline = false;
+ if (enforceNewline) {
+ out.prepend('\n');
+ } else {
+ const int newline = out.indexOf('\n');
+ plainTextEdit()->moveCursor(QTextCursor::End);
+ if (newline != -1) {
+ doAppendMessage(out.left(newline), format);// doesn't enforce new paragraph like appendPlainText
+ out = out.mid(newline);
+ }
+ }
+
+ if (out.isEmpty()) {
+ d->enforceNewline = true;
+ } else {
+ if (out.endsWith('\n')) {
+ d->enforceNewline = true;
+ out.chop(1);
+ }
+ doAppendMessage(out, format);
+ }
+ } else {
+ doAppendMessage(doNewlineEnforcement(out), format);
+ }
+ }
+}
+
+QString OutputFormatter::doNewlineEnforcement(const QString &out)
+{
+ QString s = out;
+ if (d->enforceNewline) {
+ s.prepend('\n');
+ d->enforceNewline = false;
+ }
+
+ if (s.endsWith('\n')) {
+ d->enforceNewline = true; // make appendOutputInline put in a newline next time
+ s.chop(1);
+ }
+
+ return s;
+}
+
} // namespace Utils
diff --git a/src/libs/utils/outputformatter.h b/src/libs/utils/outputformatter.h
index d1023c356d..e97eca6ce7 100644
--- a/src/libs/utils/outputformatter.h
+++ b/src/libs/utils/outputformatter.h
@@ -54,10 +54,11 @@ public:
void flush();
- virtual void appendMessage(const QString &text, OutputFormat format);
+ void appendMessage(const QString &text, OutputFormat format);
+
virtual void handleLink(const QString &href);
virtual QList<QWidget *> toolbarWidgets() const { return {}; }
- virtual void clear() {}
+ virtual void clear();
void setBoldFontEnabled(bool enabled);
static QTextCharFormat linkFormat(const QTextCharFormat &inputFormat, const QString &href);
@@ -66,11 +67,14 @@ protected:
virtual void clearLastLine();
QTextCharFormat charFormat(OutputFormat format) const;
QList<FormattedText> parseAnsi(const QString &text, const QTextCharFormat &format);
+ virtual void doAppendMessage(const QString &text, OutputFormat format);
void append(const QString &text, const QTextCharFormat &format);
QTextCursor &cursor() const;
private:
- virtual void appendMessage(const QString &text, const QTextCharFormat &format);
+ QString doNewlineEnforcement(const QString &out);
+
+ virtual void doAppendMessage(const QString &text, const QTextCharFormat &format);
Internal::OutputFormatterPrivate *d;
};
diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp
index 1bc44bb45d..eb605b51f8 100644
--- a/src/plugins/coreplugin/outputwindow.cpp
+++ b/src/plugins/coreplugin/outputwindow.cpp
@@ -30,7 +30,6 @@
#include "icore.h"
#include <utils/outputformatter.h>
-#include <utils/synchronousprocess.h>
#include <QAction>
#include <QCursor>
@@ -65,8 +64,6 @@ public:
QString settingsKey;
OutputFormatter defaultFormatter;
- bool enforceNewline = false;
- bool prependCarriageReturn = false;
bool scrollToBottom = true;
bool linksActive = true;
bool zoomEnabled = false;
@@ -362,23 +359,6 @@ void OutputWindow::filterNewContent()
scrollToBottom();
}
-QString OutputWindow::doNewlineEnforcement(const QString &out)
-{
- d->scrollToBottom = true;
- QString s = out;
- if (d->enforceNewline) {
- s.prepend('\n');
- d->enforceNewline = false;
- }
-
- if (s.endsWith('\n')) {
- d->enforceNewline = true; // make appendOutputInline put in a newline next time
- s.chop(1);
- }
-
- return s;
-}
-
void OutputWindow::setMaxCharCount(int count)
{
d->maxCharCount = count;
@@ -393,16 +373,6 @@ int OutputWindow::maxCharCount() const
void OutputWindow::appendMessage(const QString &output, OutputFormat format)
{
QString out = output;
- if (d->prependCarriageReturn) {
- d->prependCarriageReturn = false;
- out.prepend('\r');
- }
- out = SynchronousProcess::normalizeNewlines(out);
- if (out.endsWith('\r')) {
- d->prependCarriageReturn = true;
- out.chop(1);
- }
-
if (out.size() > d->maxCharCount) {
// Current line alone exceeds limit, we need to cut it.
out.truncate(d->maxCharCount);
@@ -425,44 +395,8 @@ void OutputWindow::appendMessage(const QString &output, OutputFormat format)
}
const bool atBottom = isScrollbarAtBottom() || m_scrollTimer.isActive();
-
- if (format == ErrorMessageFormat || format == NormalMessageFormat) {
- d->formatter->appendMessage(doNewlineEnforcement(out), format);
- } else {
-
- bool sameLine = format == StdOutFormatSameLine
- || format == StdErrFormatSameLine;
-
- if (sameLine) {
- d->scrollToBottom = true;
-
- bool enforceNewline = d->enforceNewline;
- d->enforceNewline = false;
-
- if (enforceNewline) {
- out.prepend('\n');
- } else {
- const int newline = out.indexOf('\n');
- moveCursor(QTextCursor::End);
- if (newline != -1) {
- d->formatter->appendMessage(out.left(newline), format);// doesn't enforce new paragraph like appendPlainText
- out = out.mid(newline);
- }
- }
-
- if (out.isEmpty()) {
- d->enforceNewline = true;
- } else {
- if (out.endsWith('\n')) {
- d->enforceNewline = true;
- out.chop(1);
- }
- d->formatter->appendMessage(out, format);
- }
- } else {
- d->formatter->appendMessage(doNewlineEnforcement(out), format);
- }
- }
+ d->scrollToBottom = true;
+ d->formatter->appendMessage(out, format);
if (atBottom) {
if (m_lastMessage.elapsed() < 5) {
@@ -511,8 +445,6 @@ QMimeData *OutputWindow::createMimeDataFromSelection() const
void OutputWindow::clear()
{
- d->enforceNewline = false;
- d->prependCarriageReturn = false;
QPlainTextEdit::clear();
d->formatter->clear();
}
diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h
index 5172cf737a..a90e9ced66 100644
--- a/src/plugins/coreplugin/outputwindow.h
+++ b/src/plugins/coreplugin/outputwindow.h
@@ -103,7 +103,6 @@ private:
QTimer m_scrollTimer;
QElapsedTimer m_lastMessage;
void enableUndoRedo();
- QString doNewlineEnforcement(const QString &out);
void filterNewContent();
Internal::OutputWindowPrivate *d = nullptr;
diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp
index 1783b46930..c05e318c0c 100644
--- a/src/plugins/python/pythonrunconfiguration.cpp
+++ b/src/plugins/python/pythonrunconfiguration.cpp
@@ -71,7 +71,7 @@ public:
}
private:
- void appendMessage(const QString &text, OutputFormat format) final
+ void doAppendMessage(const QString &text, OutputFormat format) final
{
const bool isTrace = (format == StdErrFormat
|| format == StdErrFormatSameLine)
@@ -79,7 +79,7 @@ private:
|| text.startsWith("\nTraceback (most recent call last):"));
if (!isTrace) {
- OutputFormatter::appendMessage(text, format);
+ OutputFormatter::doAppendMessage(text, format);
return;
}
@@ -110,7 +110,7 @@ private:
task.description += ' ';
task.description += line.trimmed();
}
- OutputFormatter::appendMessage('\n' + line, format);
+ OutputFormatter::doAppendMessage('\n' + line, format);
}
}
if (!tasks.isEmpty()) {
diff --git a/src/plugins/qtsupport/qtoutputformatter.cpp b/src/plugins/qtsupport/qtoutputformatter.cpp
index d426e1fabd..b2179f33f5 100644
--- a/src/plugins/qtsupport/qtoutputformatter.cpp
+++ b/src/plugins/qtsupport/qtoutputformatter.cpp
@@ -92,7 +92,7 @@ public:
explicit QtOutputFormatter(Target *target);
~QtOutputFormatter() override;
- void appendMessage(const QString &text, Utils::OutputFormat format) override;
+ void doAppendMessage(const QString &text, Utils::OutputFormat format) override;
void handleLink(const QString &href) override;
protected:
@@ -105,7 +105,7 @@ private:
void appendMessagePart(const QString &txt, const QTextCharFormat &fmt);
void appendLine(const LinkResult &lr, const QString &line, Utils::OutputFormat format);
void appendLine(const LinkResult &lr, const QString &line, const QTextCharFormat &format);
- void appendMessage(const QString &text, const QTextCharFormat &format) override;
+ void doAppendMessage(const QString &text, const QTextCharFormat &format) override;
QtOutputFormatterPrivate *d;
friend class QtSupportPlugin; // for testing
@@ -163,9 +163,9 @@ LinkResult QtOutputFormatter::matchLine(const QString &line) const
return lr;
}
-void QtOutputFormatter::appendMessage(const QString &txt, OutputFormat format)
+void QtOutputFormatter::doAppendMessage(const QString &txt, OutputFormat format)
{
- appendMessage(txt, charFormat(format));
+ doAppendMessage(txt, charFormat(format));
}
void QtOutputFormatter::appendMessagePart(const QString &txt, const QTextCharFormat &fmt)
@@ -209,7 +209,7 @@ void QtOutputFormatter::appendMessagePart(const QString &txt, const QTextCharFor
cursor().insertText(deferredText, fmt);
}
-void QtOutputFormatter::appendMessage(const QString &txt, const QTextCharFormat &format)
+void QtOutputFormatter::doAppendMessage(const QString &txt, const QTextCharFormat &format)
{
if (!cursor().atEnd())
cursor().movePosition(QTextCursor::End);
@@ -558,7 +558,7 @@ void QtSupportPlugin::testQtOutputFormatter_appendMessage()
QFETCH(QTextCharFormat, inputFormat);
QFETCH(QTextCharFormat, outputFormat);
- formatter.appendMessage(inputText, inputFormat);
+ formatter.doAppendMessage(inputText, inputFormat);
QCOMPARE(edit.toPlainText(), outputText);
QCOMPARE(edit.currentCharFormat(), outputFormat);
@@ -579,7 +579,7 @@ void QtSupportPlugin::testQtOutputFormatter_appendMixedAssertAndAnsi()
"file://test.cpp:123 "
"Blue\n";
- formatter.appendMessage(inputText, QTextCharFormat());
+ formatter.doAppendMessage(inputText, QTextCharFormat());
QCOMPARE(edit.toPlainText(), outputText);
diff --git a/src/plugins/vcsbase/vcsoutputformatter.cpp b/src/plugins/vcsbase/vcsoutputformatter.cpp
index 9e454da544..2b2e2a3796 100644
--- a/src/plugins/vcsbase/vcsoutputformatter.cpp
+++ b/src/plugins/vcsbase/vcsoutputformatter.cpp
@@ -42,14 +42,14 @@ VcsOutputFormatter::VcsOutputFormatter() :
{
}
-void VcsOutputFormatter::appendMessage(const QString &text, Utils::OutputFormat format)
+void VcsOutputFormatter::doAppendMessage(const QString &text, Utils::OutputFormat format)
{
QRegularExpressionMatchIterator it = m_regexp.globalMatch(text);
int begin = 0;
while (it.hasNext()) {
const QRegularExpressionMatch match = it.next();
const QTextCharFormat normalFormat = charFormat(format);
- OutputFormatter::appendMessage(text.mid(begin, match.capturedStart() - begin), format);
+ OutputFormatter::doAppendMessage(text.mid(begin, match.capturedStart() - begin), format);
QTextCursor tc = plainTextEdit()->textCursor();
QStringView url = match.capturedView();
begin = match.capturedEnd();
@@ -61,7 +61,7 @@ void VcsOutputFormatter::appendMessage(const QString &text, Utils::OutputFormat
tc.insertText(url.toString(), linkFormat(normalFormat, url.toString()));
tc.movePosition(QTextCursor::End);
}
- OutputFormatter::appendMessage(text.mid(begin), format);
+ OutputFormatter::doAppendMessage(text.mid(begin), format);
}
void VcsOutputFormatter::handleLink(const QString &href)
diff --git a/src/plugins/vcsbase/vcsoutputformatter.h b/src/plugins/vcsbase/vcsoutputformatter.h
index b9fd8c6c7e..fe1bae89fd 100644
--- a/src/plugins/vcsbase/vcsoutputformatter.h
+++ b/src/plugins/vcsbase/vcsoutputformatter.h
@@ -37,7 +37,7 @@ class VcsOutputFormatter : public Utils::OutputFormatter
public:
VcsOutputFormatter();
~VcsOutputFormatter() override = default;
- void appendMessage(const QString &text, Utils::OutputFormat format) override;
+ void doAppendMessage(const QString &text, Utils::OutputFormat format) override;
void handleLink(const QString &href) override;
void fillLinkContextMenu(QMenu *menu, const QString &workingDirectory, const QString &href);
diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp
index 1cff2dc4b7..2391a1bb03 100644
--- a/src/plugins/vcsbase/vcsoutputwindow.cpp
+++ b/src/plugins/vcsbase/vcsoutputwindow.cpp
@@ -228,10 +228,7 @@ void OutputWindowPlainTextEdit::appendLines(const QString &s, const QString &rep
const int previousLineCount = document()->lineCount();
- const QChar newLine('\n');
- const QChar lastChar = s.at(s.size() - 1);
- const bool appendNewline = (lastChar != '\r' && lastChar != newLine);
- m_formatter->appendMessage(appendNewline ? s + newLine : s, m_format);
+ m_formatter->appendMessage(s, m_format);
// Scroll down
moveCursor(QTextCursor::End);