ProjectExplorer: Optionally discard excessive application output

Analogous to 4740ecfecf.

Task-number: QTCREATORBUG-31449
Change-Id: I41f1b16bc49ba4a4bb9beefec656ca674f7c7ee1
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2024-08-26 13:55:00 +02:00
parent 84c754de66
commit b02a16a89f
2 changed files with 17 additions and 0 deletions

View File

@@ -63,6 +63,7 @@ const char POP_UP_FOR_DEBUG_OUTPUT_KEY[] = "ProjectExplorer/Settings/ShowDebugOu
const char CLEAN_OLD_OUTPUT_KEY[] = "ProjectExplorer/Settings/CleanOldAppOutput"; const char CLEAN_OLD_OUTPUT_KEY[] = "ProjectExplorer/Settings/CleanOldAppOutput";
const char MERGE_CHANNELS_KEY[] = "ProjectExplorer/Settings/MergeStdErrAndStdOut"; const char MERGE_CHANNELS_KEY[] = "ProjectExplorer/Settings/MergeStdErrAndStdOut";
const char WRAP_OUTPUT_KEY[] = "ProjectExplorer/Settings/WrapAppOutput"; const char WRAP_OUTPUT_KEY[] = "ProjectExplorer/Settings/WrapAppOutput";
const char DISCARD_OUTPUT_KEY[] = "ProjectExplorer/Settings/DiscardAppOutput";
const char MAX_LINES_KEY[] = "ProjectExplorer/Settings/MaxAppOutputLines"; const char MAX_LINES_KEY[] = "ProjectExplorer/Settings/MaxAppOutputLines";
static QObject *debuggerPlugin() static QObject *debuggerPlugin()
@@ -430,6 +431,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc)
ow->setWindowIcon(Icons::WINDOW.icon()); ow->setWindowIcon(Icons::WINDOW.icon());
ow->setWordWrapEnabled(m_settings.wrapOutput); ow->setWordWrapEnabled(m_settings.wrapOutput);
ow->setMaxCharCount(m_settings.maxCharCount); ow->setMaxCharCount(m_settings.maxCharCount);
ow->setDiscardExcessiveOutput(m_settings.discardExcessiveOutput);
auto updateFontSettings = [ow] { auto updateFontSettings = [ow] {
ow->setBaseFont(TextEditor::TextEditorSettings::fontSettings().font()); ow->setBaseFont(TextEditor::TextEditorSettings::fontSettings().font());
@@ -474,6 +476,7 @@ void AppOutputPane::updateFromSettings()
for (const RunControlTab &tab : std::as_const(m_runControlTabs)) { for (const RunControlTab &tab : std::as_const(m_runControlTabs)) {
tab.window->setWordWrapEnabled(m_settings.wrapOutput); tab.window->setWordWrapEnabled(m_settings.wrapOutput);
tab.window->setMaxCharCount(m_settings.maxCharCount); tab.window->setMaxCharCount(m_settings.maxCharCount);
tab.window->setDiscardExcessiveOutput(m_settings.discardExcessiveOutput);
} }
} }
@@ -543,6 +546,7 @@ const AppOutputPaneMode kDebugOutputModeDefault = AppOutputPaneMode::FlashOnOutp
const bool kCleanOldOutputDefault = false; const bool kCleanOldOutputDefault = false;
const bool kMergeChannelsDefault = false; const bool kMergeChannelsDefault = false;
const bool kWrapOutputDefault = true; const bool kWrapOutputDefault = true;
const bool kDiscardOutputDefault = false;
void AppOutputPane::storeSettings() const void AppOutputPane::storeSettings() const
{ {
@@ -556,6 +560,8 @@ void AppOutputPane::storeSettings() const
s->setValueWithDefault(CLEAN_OLD_OUTPUT_KEY, m_settings.cleanOldOutput, kCleanOldOutputDefault); s->setValueWithDefault(CLEAN_OLD_OUTPUT_KEY, m_settings.cleanOldOutput, kCleanOldOutputDefault);
s->setValueWithDefault(MERGE_CHANNELS_KEY, m_settings.mergeChannels, kMergeChannelsDefault); s->setValueWithDefault(MERGE_CHANNELS_KEY, m_settings.mergeChannels, kMergeChannelsDefault);
s->setValueWithDefault(WRAP_OUTPUT_KEY, m_settings.wrapOutput, kWrapOutputDefault); s->setValueWithDefault(WRAP_OUTPUT_KEY, m_settings.wrapOutput, kWrapOutputDefault);
s->setValueWithDefault(
DISCARD_OUTPUT_KEY, m_settings.discardExcessiveOutput, kDiscardOutputDefault);
s->setValueWithDefault(MAX_LINES_KEY, s->setValueWithDefault(MAX_LINES_KEY,
m_settings.maxCharCount / 100, m_settings.maxCharCount / 100,
Core::Constants::DEFAULT_MAX_CHAR_COUNT / 100); Core::Constants::DEFAULT_MAX_CHAR_COUNT / 100);
@@ -573,6 +579,7 @@ void AppOutputPane::loadSettings()
m_settings.cleanOldOutput = s->value(CLEAN_OLD_OUTPUT_KEY, kCleanOldOutputDefault).toBool(); m_settings.cleanOldOutput = s->value(CLEAN_OLD_OUTPUT_KEY, kCleanOldOutputDefault).toBool();
m_settings.mergeChannels = s->value(MERGE_CHANNELS_KEY, kMergeChannelsDefault).toBool(); m_settings.mergeChannels = s->value(MERGE_CHANNELS_KEY, kMergeChannelsDefault).toBool();
m_settings.wrapOutput = s->value(WRAP_OUTPUT_KEY, kWrapOutputDefault).toBool(); m_settings.wrapOutput = s->value(WRAP_OUTPUT_KEY, kWrapOutputDefault).toBool();
m_settings.discardExcessiveOutput = s->value(DISCARD_OUTPUT_KEY, kDiscardOutputDefault).toBool();
m_settings.maxCharCount = s->value(MAX_LINES_KEY, m_settings.maxCharCount = s->value(MAX_LINES_KEY,
Core::Constants::DEFAULT_MAX_CHAR_COUNT / 100).toInt() * 100; Core::Constants::DEFAULT_MAX_CHAR_COUNT / 100).toInt() * 100;
} }
@@ -850,6 +857,12 @@ public:
const AppOutputSettings &settings = appOutputPane().settings(); const AppOutputSettings &settings = appOutputPane().settings();
m_wrapOutputCheckBox.setText(Tr::tr("Word-wrap output")); m_wrapOutputCheckBox.setText(Tr::tr("Word-wrap output"));
m_wrapOutputCheckBox.setChecked(settings.wrapOutput); m_wrapOutputCheckBox.setChecked(settings.wrapOutput);
m_discardOutputCheckBox.setText(Tr::tr("Discard excessive output"));
m_discardOutputCheckBox.setToolTip(
Tr::tr(
"If this option is enabled, application output will be discarded if it "
"continuously comes in faster than it can be handled."));
m_discardOutputCheckBox.setChecked(settings.discardExcessiveOutput);
m_cleanOldOutputCheckBox.setText(Tr::tr("Clear old output on a new run")); m_cleanOldOutputCheckBox.setText(Tr::tr("Clear old output on a new run"));
m_cleanOldOutputCheckBox.setChecked(settings.cleanOldOutput); m_cleanOldOutputCheckBox.setChecked(settings.cleanOldOutput);
m_mergeChannelsCheckBox.setText(Tr::tr("Merge stderr and stdout")); m_mergeChannelsCheckBox.setText(Tr::tr("Merge stderr and stdout"));
@@ -870,6 +883,7 @@ public:
const auto layout = new QVBoxLayout(this); const auto layout = new QVBoxLayout(this);
layout->addWidget(&m_wrapOutputCheckBox); layout->addWidget(&m_wrapOutputCheckBox);
layout->addWidget(&m_cleanOldOutputCheckBox); layout->addWidget(&m_cleanOldOutputCheckBox);
layout->addWidget(&m_discardOutputCheckBox);
layout->addWidget(&m_mergeChannelsCheckBox); layout->addWidget(&m_mergeChannelsCheckBox);
const auto maxCharsLayout = new QHBoxLayout; const auto maxCharsLayout = new QHBoxLayout;
const QString msg = Tr::tr("Limit output to %1 characters"); const QString msg = Tr::tr("Limit output to %1 characters");
@@ -891,6 +905,7 @@ public:
{ {
AppOutputSettings s; AppOutputSettings s;
s.wrapOutput = m_wrapOutputCheckBox.isChecked(); s.wrapOutput = m_wrapOutputCheckBox.isChecked();
s.discardExcessiveOutput = m_discardOutputCheckBox.isChecked();
s.cleanOldOutput = m_cleanOldOutputCheckBox.isChecked(); s.cleanOldOutput = m_cleanOldOutputCheckBox.isChecked();
s.mergeChannels = m_mergeChannelsCheckBox.isChecked(); s.mergeChannels = m_mergeChannelsCheckBox.isChecked();
s.runOutputMode = static_cast<AppOutputPaneMode>( s.runOutputMode = static_cast<AppOutputPaneMode>(
@@ -904,6 +919,7 @@ public:
private: private:
QCheckBox m_wrapOutputCheckBox; QCheckBox m_wrapOutputCheckBox;
QCheckBox m_discardOutputCheckBox;
QCheckBox m_cleanOldOutputCheckBox; QCheckBox m_cleanOldOutputCheckBox;
QCheckBox m_mergeChannelsCheckBox; QCheckBox m_mergeChannelsCheckBox;
QComboBox m_runOutputModeComboBox; QComboBox m_runOutputModeComboBox;

View File

@@ -39,6 +39,7 @@ public:
bool cleanOldOutput = false; bool cleanOldOutput = false;
bool mergeChannels = false; bool mergeChannels = false;
bool wrapOutput = false; bool wrapOutput = false;
bool discardExcessiveOutput = false;
int maxCharCount = Core::Constants::DEFAULT_MAX_CHAR_COUNT; int maxCharCount = Core::Constants::DEFAULT_MAX_CHAR_COUNT;
}; };