diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index c76a171f..0319ea75 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -454,6 +454,8 @@ void MultiMC::initGlobalSettings(bool test_mode) m_settings->registerSetting("ConsoleFont", defaultMonospace); } m_settings->registerSetting("ConsoleFontSize", defaultSize); + m_settings->registerSetting("ConsoleMaxLines", 100000); + m_settings->registerSetting("ConsoleOverflowStop", true); FTBPlugin::initialize(m_settings); diff --git a/application/pages/LogPage.cpp b/application/pages/LogPage.cpp index 7d2013cc..3fade26f 100644 --- a/application/pages/LogPage.cpp +++ b/application/pages/LogPage.cpp @@ -8,6 +8,7 @@ #include #include "BaseProcess.h" +#include #include "GuiUtil.h" LogPage::LogPage(BaseProcess *proc, QWidget *parent) @@ -29,6 +30,18 @@ LogPage::LogPage(BaseProcess *proc, QWidget *parent) } defaultFormat->setFont(QFont(fontFamily, fontSize)); + // ensure we don't eat all the RAM + auto lineSetting = MMC->settings()->getSetting("ConsoleMaxLines"); + int maxLines = lineSetting->get().toInt(&conversionOk); + if(!conversionOk) + { + maxLines = lineSetting->defValue().toInt(); + qWarning() << "ConsoleMaxLines has nonsensical value, defaulting to" << maxLines; + } + ui->text->setMaximumBlockCount(maxLines); + + m_stopOnOverflow = MMC->settings()->get("ConsoleOverflowStop").toBool(); + auto findShortcut = new QShortcut(QKeySequence(QKeySequence::Find), this); connect(findShortcut, SIGNAL(activated()), SLOT(findActivated())); auto findNextShortcut = new QShortcut(QKeySequence(QKeySequence::FindNext), this); @@ -126,6 +139,11 @@ void LogPage::findPreviousActivated() } } +void LogPage::setParentContainer(BasePageContainer * container) +{ + m_parentContainer = container; +} + void LogPage::write(QString data, MessageLevel::Enum mode) { if (!m_write_active) @@ -135,6 +153,26 @@ void LogPage::write(QString data, MessageLevel::Enum mode) return; } } + if(m_stopOnOverflow && m_write_active) + { + if(mode != MessageLevel::PrePost && mode != MessageLevel::MultiMC) + { + if(ui->text->blockCount() >= ui->text->maximumBlockCount()) + { + m_write_active = false; + data = tr("MultiMC stopped watching the game log because the log length surpassed %1 lines.\n" + "You may have to fix your mods because the game is still loggging to files and" + " likely wasting harddrive space at an alarming rate!") + .arg(ui->text->maximumBlockCount()); + mode = MessageLevel::Fatal; + ui->trackLogCheckbox->setCheckState(Qt::Unchecked); + if(!isVisible()) + { + m_parentContainer->selectPage(id()); + } + } + } + } // save the cursor so it can be restored. auto savedCursor = ui->text->cursor(); diff --git a/application/pages/LogPage.h b/application/pages/LogPage.h index 15c123d7..0cbf3d23 100644 --- a/application/pages/LogPage.h +++ b/application/pages/LogPage.h @@ -53,6 +53,7 @@ public: return "Minecraft-Logs"; } virtual bool shouldDisplay() const; + virtual void setParentContainer(BasePageContainer *); private slots: /** @@ -81,6 +82,8 @@ private: bool m_scroll_active = true; int m_saved_offset = 0; bool m_write_active = true; + bool m_stopOnOverflow = true; QTextCharFormat * defaultFormat; + BasePageContainer * m_parentContainer; }; diff --git a/application/pages/global/MultiMCPage.cpp b/application/pages/global/MultiMCPage.cpp index 65f258b5..b5389e25 100644 --- a/application/pages/global/MultiMCPage.cpp +++ b/application/pages/global/MultiMCPage.cpp @@ -299,6 +299,8 @@ void MultiMCPage::applySettings() QString consoleFontFamily = ui->consoleFont->currentFont().family(); s->set("ConsoleFont", consoleFontFamily); s->set("ConsoleFontSize", ui->fontSizeBox->value()); + s->set("ConsoleMaxLines", ui->lineLimitSpinBox->value()); + s->set("ConsoleOverflowStop", ui->checkStopLogging->checkState() != Qt::Unchecked); // FTB s->set("TrackFTBInstances", ui->trackFtbBox->isChecked()); @@ -388,6 +390,8 @@ void MultiMCPage::loadSettings() } ui->fontSizeBox->setValue(fontSize); refreshFontPreview(); + ui->lineLimitSpinBox->setValue(s->get("ConsoleMaxLines").toInt()); + ui->checkStopLogging->setChecked(s->get("ConsoleOverflowStop").toBool()); // FTB ui->trackFtbBox->setChecked(s->get("TrackFTBInstances").toBool()); diff --git a/application/pages/global/MultiMCPage.ui b/application/pages/global/MultiMCPage.ui index 3faafc6e..cf748812 100644 --- a/application/pages/global/MultiMCPage.ui +++ b/application/pages/global/MultiMCPage.ui @@ -7,7 +7,7 @@ 0 0 487 - 519 + 557 @@ -433,6 +433,47 @@ + + + + History limit + + + + + + Stop logging when log overflows + + + + + + + + 0 + 0 + + + + lines + + + 10000 + + + 1000000 + + + 10000 + + + 100000 + + + + + + @@ -520,6 +561,8 @@ themeComboBox showConsoleCheck autoCloseConsoleCheck + lineLimitSpinBox + checkStopLogging consoleFont fontSizeBox fontPreview