diff options
Diffstat (limited to 'gui/ConsoleWindow.cpp')
-rw-r--r-- | gui/ConsoleWindow.cpp | 83 |
1 files changed, 57 insertions, 26 deletions
diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp index ec25b9cf..d8a1b69d 100644 --- a/gui/ConsoleWindow.cpp +++ b/gui/ConsoleWindow.cpp @@ -15,6 +15,7 @@ #include "ConsoleWindow.h" #include "ui_ConsoleWindow.h" +#include "MultiMC.h" #include <QScrollBar> #include <QMessageBox> @@ -22,16 +23,27 @@ #include <gui/Platform.h> #include <gui/dialogs/CustomMessageBox.h> -ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent) : - QDialog(parent), - ui(new Ui::ConsoleWindow), - m_mayclose(true), - proc(mcproc) +ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent) + : QMainWindow(parent), ui(new Ui::ConsoleWindow), proc(mcproc) { MultiMCPlatform::fixWM_CLASS(this); ui->setupUi(this); - this->setWindowFlags(Qt::Window); - connect(mcproc, SIGNAL(ended(BaseInstance*)), this, SLOT(onEnded(BaseInstance*))); + connect(mcproc, SIGNAL(log(QString, MessageLevel::Enum)), this, + SLOT(write(QString, MessageLevel::Enum))); + connect(mcproc, SIGNAL(ended(BaseInstance *, int, QProcess::ExitStatus)), this, + SLOT(onEnded(BaseInstance *, int, QProcess::ExitStatus))); + connect(mcproc, SIGNAL(prelaunch_failed(BaseInstance*,int,QProcess::ExitStatus)), this, + SLOT(onEnded(BaseInstance *, int, QProcess::ExitStatus))); + connect(mcproc, SIGNAL(launch_failed(BaseInstance*)), this, + SLOT(onLaunchFailed(BaseInstance*))); + + restoreState(QByteArray::fromBase64(MMC->settings()->get("ConsoleWindowState").toByteArray())); + restoreGeometry(QByteArray::fromBase64(MMC->settings()->get("ConsoleWindowGeometry").toByteArray())); + + if (mcproc->instance()->settings().get("ShowConsole").toBool()) + { + show(); + } } ConsoleWindow::~ConsoleWindow() @@ -54,32 +66,32 @@ void ConsoleWindow::writeColor(QString text, const char *color) void ConsoleWindow::write(QString data, MessageLevel::Enum mode) { if (data.endsWith('\n')) - data = data.left(data.length()-1); + data = data.left(data.length() - 1); QStringList paragraphs = data.split('\n'); - for(QString ¶graph : paragraphs) + for (QString ¶graph : paragraphs) { paragraph = paragraph.trimmed(); } QListIterator<QString> iter(paragraphs); if (mode == MessageLevel::MultiMC) - while(iter.hasNext()) + while (iter.hasNext()) writeColor(iter.next(), "blue"); else if (mode == MessageLevel::Error) - while(iter.hasNext()) + while (iter.hasNext()) writeColor(iter.next(), "red"); else if (mode == MessageLevel::Warning) - while(iter.hasNext()) + while (iter.hasNext()) writeColor(iter.next(), "orange"); else if (mode == MessageLevel::Fatal) - while(iter.hasNext()) + while (iter.hasNext()) writeColor(iter.next(), "pink"); else if (mode == MessageLevel::Debug) - while(iter.hasNext()) + while (iter.hasNext()) writeColor(iter.next(), "green"); // TODO: implement other MessageLevels else - while(iter.hasNext()) + while (iter.hasNext()) writeColor(iter.next()); } @@ -102,34 +114,53 @@ void ConsoleWindow::setMayClose(bool mayclose) ui->closeButton->setEnabled(false); } -void ConsoleWindow::closeEvent(QCloseEvent * event) +void ConsoleWindow::closeEvent(QCloseEvent *event) { - if(!m_mayclose) + if (!m_mayclose) event->ignore(); else - QDialog::closeEvent(event); + { + MMC->settings()->set("ConsoleWindowState", saveState().toBase64()); + MMC->settings()->set("ConsoleWindowGeometry", saveGeometry().toBase64()); + + emit isClosing(); + QMainWindow::closeEvent(event); + } } void ConsoleWindow::on_btnKillMinecraft_clicked() { ui->btnKillMinecraft->setEnabled(false); - auto response = CustomMessageBox::selectable(this, tr("Kill Minecraft?"), - tr("This can cause the instance to get corrupted and should only be used if Minecraft is frozen for some reason"), - QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes)->exec(); + auto response = CustomMessageBox::selectable( + this, tr("Kill Minecraft?"), + tr("This can cause the instance to get corrupted and should only be used if Minecraft " + "is frozen for some reason"), + QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes)->exec(); if (response == QMessageBox::Yes) proc->killMinecraft(); else ui->btnKillMinecraft->setEnabled(true); } -void ConsoleWindow::onEnded(BaseInstance *instance) +void ConsoleWindow::onEnded(BaseInstance *instance, int code, QProcess::ExitStatus status) { ui->btnKillMinecraft->setEnabled(false); - // TODO: Might need an option to forcefully close, even on an error - if(instance->settings().get("AutoCloseConsole").toBool()) + if (instance->settings().get("AutoCloseConsole").toBool()) { - // TODO: Check why this doesn't work - if (!proc->exitCode()) this->close(); + if (code == 0 && status != QProcess::CrashExit) + { + this->close(); + return; + } } + if(!isVisible()) + show(); +} + +void ConsoleWindow::onLaunchFailed(BaseInstance *instance) +{ + ui->btnKillMinecraft->setEnabled(false); + if(!isVisible()) + show(); } |