diff --git a/plugins/autotest/testresultdelegate.cpp b/plugins/autotest/testresultdelegate.cpp index 51226270e73..86a12323a7d 100644 --- a/plugins/autotest/testresultdelegate.cpp +++ b/plugins/autotest/testresultdelegate.cpp @@ -17,8 +17,10 @@ ** ****************************************************************************/ +#include "autotestplugin.h" #include "testresultdelegate.h" #include "testresultmodel.h" +#include "testsettings.h" #include #include @@ -28,6 +30,8 @@ namespace Autotest { namespace Internal { +const static int outputLimit = 100000; + TestResultDelegate::TestResultDelegate(QObject *parent) : QStyledItemDelegate(parent) { @@ -124,6 +128,11 @@ void TestResultDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op int leading = fm.leading(); int fontHeight = fm.height(); output.replace(QLatin1Char('\n'), QChar::LineSeparator); + + if (AutotestPlugin::instance()->settings()->limitResultOutput + && output.length() > outputLimit) + output = output.left(outputLimit).append(QLatin1String("...")); + QTextLayout tl(output); tl.setFont(painter->font()); QTextOption txtOption; @@ -143,8 +152,9 @@ void TestResultDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op tl.draw(painter, QPoint(positions.textAreaLeft(), positions.top())); } else { painter->setClipRect(positions.textArea()); + // cut output before generating elided text as this takes quite long for exhaustive output painter->drawText(positions.textAreaLeft(), positions.top() + fm.ascent(), - fm.elidedText(output, Qt::ElideRight, positions.textAreaWidth())); + fm.elidedText(output.left(2000), Qt::ElideRight, positions.textAreaWidth())); } QString file = testResult.fileName(); @@ -222,6 +232,11 @@ QSize TestResultDelegate::sizeHint(const QStyleOptionViewItem &option, const QMo int height = 0; int leading = fm.leading(); + + if (AutotestPlugin::instance()->settings()->limitResultOutput + && output.length() > outputLimit) + output = output.left(outputLimit).append(QLatin1String("...")); + QTextLayout tl(output); tl.setFont(opt.font); QTextOption txtOption; diff --git a/plugins/autotest/testsettings.cpp b/plugins/autotest/testsettings.cpp index 06567842157..3a11b8c66b9 100644 --- a/plugins/autotest/testsettings.cpp +++ b/plugins/autotest/testsettings.cpp @@ -29,10 +29,12 @@ static const char timeoutKey[] = "Timeout"; static const char metricsKey[] = "Metrics"; static const char omitInternalKey[] = "OmitInternal"; static const char omitRunConfigWarnKey[] = "OmitRCWarnings"; +static const char limitResultOutputKey[] = "LimitResultOutput"; static const int defaultTimeout = 60000; TestSettings::TestSettings() - : timeout(defaultTimeout), metrics(Walltime), omitInternalMssg(true), omitRunConfigWarn(false) + : timeout(defaultTimeout), metrics(Walltime), omitInternalMssg(true), omitRunConfigWarn(false), + limitResultOutput(true) { } @@ -43,6 +45,7 @@ void TestSettings::toSettings(QSettings *s) const s->setValue(QLatin1String(metricsKey), metrics); s->setValue(QLatin1String(omitInternalKey), omitInternalMssg); s->setValue(QLatin1String(omitRunConfigWarnKey), omitRunConfigWarn); + s->setValue(QLatin1String(limitResultOutputKey), limitResultOutput); s->endGroup(); } @@ -71,13 +74,15 @@ void TestSettings::fromSettings(const QSettings *s) metrics = intToMetrics(s->value(root + QLatin1String(metricsKey), Walltime).toInt()); omitInternalMssg = s->value(root + QLatin1String(omitInternalKey), true).toBool(); omitRunConfigWarn = s->value(root + QLatin1String(omitRunConfigWarnKey), false).toBool(); + limitResultOutput = s->value(root + QLatin1String(limitResultOutputKey), true).toBool(); } bool TestSettings::equals(const TestSettings &rhs) const { return timeout == rhs.timeout && metrics == rhs.metrics && omitInternalMssg == rhs.omitInternalMssg - && omitRunConfigWarn == rhs.omitRunConfigWarn; + && omitRunConfigWarn == rhs.omitRunConfigWarn + && limitResultOutput == rhs.limitResultOutput; } QString TestSettings::metricsTypeToOption(const MetricsType type) diff --git a/plugins/autotest/testsettings.h b/plugins/autotest/testsettings.h index c7ff22c3ff2..520edde6fc6 100644 --- a/plugins/autotest/testsettings.h +++ b/plugins/autotest/testsettings.h @@ -49,6 +49,7 @@ struct TestSettings MetricsType metrics; bool omitInternalMssg; bool omitRunConfigWarn; + bool limitResultOutput; }; inline bool operator==(const TestSettings &s1, const TestSettings &s2) { return s1.equals(s2); } diff --git a/plugins/autotest/testsettingspage.cpp b/plugins/autotest/testsettingspage.cpp index 53ab2c71a10..e65bff754a4 100644 --- a/plugins/autotest/testsettingspage.cpp +++ b/plugins/autotest/testsettingspage.cpp @@ -41,6 +41,7 @@ void TestSettingsWidget::setSettings(const TestSettings &settings) m_ui.timeoutSpin->setValue(settings.timeout / 1000); // we store milliseconds m_ui.omitInternalMsgCB->setChecked(settings.omitInternalMssg); m_ui.omitRunConfigWarnCB->setChecked(settings.omitRunConfigWarn); + m_ui.limitResultOutputCB->setChecked(settings.limitResultOutput); switch (settings.metrics) { case MetricsType::Walltime: @@ -69,6 +70,7 @@ TestSettings TestSettingsWidget::settings() const result.timeout = m_ui.timeoutSpin->value() * 1000; // we display seconds result.omitInternalMssg = m_ui.omitInternalMsgCB->isChecked(); result.omitRunConfigWarn = m_ui.omitRunConfigWarnCB->isChecked(); + result.limitResultOutput = m_ui.limitResultOutputCB->isChecked(); if (m_ui.walltimeRB->isChecked()) result.metrics = MetricsType::Walltime; diff --git a/plugins/autotest/testsettingspage.ui b/plugins/autotest/testsettingspage.ui index b7154268835..bc3c6f6b0c5 100644 --- a/plugins/autotest/testsettingspage.ui +++ b/plugins/autotest/testsettingspage.ui @@ -13,7 +13,7 @@ Form - + 9 @@ -103,6 +103,19 @@ + + + + Limit result output to 100000 characters. + + + Limit result output + + + true + + +