From b44e70d58dac92a21d905565370357d296942209 Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Fri, 6 Sep 2013 18:48:41 +0200 Subject: [PATCH 1/7] started kill instance feature --- logic/MinecraftProcess.cpp | 5 +++++ logic/MinecraftProcess.h | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index d34be835..3d82008b 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -138,6 +138,11 @@ void MinecraftProcess::finish(int code, ExitStatus status) emit ended(); } +void MinecraftProcess::killMinecraft() +{ + killed = true; +} + void MinecraftProcess::launch() { if (!m_instance->settings().get("PreLaunchCommand").toString().isEmpty()) diff --git a/logic/MinecraftProcess.h b/logic/MinecraftProcess.h index 516bf986..248ad807 100644 --- a/logic/MinecraftProcess.h +++ b/logic/MinecraftProcess.h @@ -59,6 +59,8 @@ public: void setMinecraftArguments(QStringList args); + void killMinecraft(); + signals: /** * @brief emitted when mc has finished and the PostLaunchCommand was run @@ -83,4 +85,6 @@ protected slots: void finish(int, QProcess::ExitStatus status); void on_stdErr(); void on_stdOut(); +private: + bool killed; }; From f897a200e2607fd99116a3ab4bb9ba757a52139b Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Fri, 6 Sep 2013 22:40:50 +0200 Subject: [PATCH 2/7] Made instace killing actually work --- MultiMC.pro | 3 ++- gui/consolewindow.cpp | 24 ++++++++++++++++++++++-- gui/consolewindow.h | 4 +++- gui/consolewindow.ui | 7 +++++++ gui/mainwindow.cpp | 2 +- logic/MinecraftProcess.cpp | 8 +++++++- main.cpp | 2 +- 7 files changed, 43 insertions(+), 7 deletions(-) diff --git a/MultiMC.pro b/MultiMC.pro index b3b7faff..b82b2294 100644 --- a/MultiMC.pro +++ b/MultiMC.pro @@ -40,7 +40,8 @@ FORMS += gui/mainwindow.ui \ gui/settingsdialog.ui \ gui/modeditwindow.ui \ gui/instancesettings.ui \ - gui/logindialog.ui + gui/logindialog.ui \ + gui/consolewindow.ui RESOURCES += \ multimc.qrc diff --git a/gui/consolewindow.cpp b/gui/consolewindow.cpp index 811900a2..f2bc662a 100644 --- a/gui/consolewindow.cpp +++ b/gui/consolewindow.cpp @@ -2,11 +2,13 @@ #include "ui_consolewindow.h" #include +#include -ConsoleWindow::ConsoleWindow(QWidget *parent) : +ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent) : QDialog(parent), ui(new Ui::ConsoleWindow), - m_mayclose(true) + m_mayclose(true), + proc(mcproc) { ui->setupUi(this); } @@ -40,6 +42,9 @@ void ConsoleWindow::write(QString data, MessageLevel::Enum mode) else if (mode == MessageLevel::Error) while(iter.hasNext()) writeColor(iter.next(), "red"); + else if (mode == MessageLevel::Warning) + while(iter.hasNext()) + writeColor(iter.next(), "orange"); // TODO: implement other MessageLevels else while(iter.hasNext()) @@ -72,3 +77,18 @@ void ConsoleWindow::closeEvent(QCloseEvent * event) else QDialog::closeEvent(event); } + +void ConsoleWindow::on_btnKillMinecraft_clicked() +{ + ui->btnKillMinecraft->setEnabled(false); + QMessageBox r_u_sure; + r_u_sure.setText("Kill Minecraft?"); + r_u_sure.setInformativeText("This can cause the instance to get corrupted and should only be used if Minecraft is frozen for some reason"); + r_u_sure.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + r_u_sure.setDefaultButton(QMessageBox::Yes); + if (r_u_sure.exec() == QMessageBox::Yes) + proc->killMinecraft(); + else + ui->btnKillMinecraft->setEnabled(true); + r_u_sure.close(); +} \ No newline at end of file diff --git a/gui/consolewindow.h b/gui/consolewindow.h index 60bec69f..d4485a45 100644 --- a/gui/consolewindow.h +++ b/gui/consolewindow.h @@ -13,7 +13,7 @@ class ConsoleWindow : public QDialog Q_OBJECT public: - explicit ConsoleWindow(QWidget *parent = 0); + explicit ConsoleWindow(MinecraftProcess *proc, QWidget *parent = 0); ~ConsoleWindow(); /** @@ -48,12 +48,14 @@ public slots: private slots: void on_closeButton_clicked(); + void on_btnKillMinecraft_clicked(); protected: void closeEvent(QCloseEvent *); private: Ui::ConsoleWindow *ui; + MinecraftProcess *proc; bool m_mayclose; }; diff --git a/gui/consolewindow.ui b/gui/consolewindow.ui index 9a766543..8dc80015 100644 --- a/gui/consolewindow.ui +++ b/gui/consolewindow.ui @@ -62,6 +62,13 @@ + + + + Kill Minecraft + + + diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 4ccc12b6..75996c5d 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -538,7 +538,7 @@ void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response) if(!proc) return; - console = new ConsoleWindow(); + console = new ConsoleWindow(proc); console->show(); connect(proc, SIGNAL(log(QString, MessageLevel::Enum)), console, SLOT(write(QString, MessageLevel::Enum))); diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 3d82008b..6ac5b886 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -120,7 +120,12 @@ void MinecraftProcess::finish(int code, ExitStatus status) //TODO: error handling } - emit log("Minecraft exited."); + // TODO: Localization + + if (!killed) + emit log("Minecraft exited."); + else + emit log("Minecraft was killed by user.", MessageLevel::Error); m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code)); @@ -141,6 +146,7 @@ void MinecraftProcess::finish(int code, ExitStatus status) void MinecraftProcess::killMinecraft() { killed = true; + kill(); } void MinecraftProcess::launch() diff --git a/main.cpp b/main.cpp index 72b0f225..12ef1ce7 100644 --- a/main.cpp +++ b/main.cpp @@ -71,7 +71,7 @@ private slots: //FIXME: report error return; } - console = new ConsoleWindow(); + console = new ConsoleWindow(proc); console->show(); connect(proc, SIGNAL(ended()), SLOT(onTerminated())); From 0990a1103c7eafd099e3ef9650f542eb34a6a818 Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Fri, 6 Sep 2013 23:01:40 +0200 Subject: [PATCH 3/7] Made Offline user name default to 'Offline' if the textbox is left empty --- gui/mainwindow.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 75996c5d..7d1e1510 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -492,7 +492,10 @@ void MainWindow::doLogin(const QString& errorMsg) } else { - m_activeLogin = {loginDlg->getUsername(), QString("Offline"), qint64(-1)}; + QString user = loginDlg->getUsername(); + if (user.length() == 0) + user = QString("Offline"); + m_activeLogin = {user, QString("Offline"), qint64(-1)}; m_activeInst = m_selectedInstance; launchInstance(m_activeInst, m_activeLogin); } From 3fd2d025a1aa0bbc72ac69a34828ef5942255143 Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Fri, 6 Sep 2013 23:52:17 +0200 Subject: [PATCH 4/7] Made main window hide on instace exit --- AppSettings.cpp | 5 +++-- gui/consolewindow.cpp | 8 +++++++- gui/consolewindow.h | 1 + gui/mainwindow.cpp | 17 +++++++++++++++++ gui/mainwindow.h | 3 +++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/AppSettings.cpp b/AppSettings.cpp index 403af1dc..8b0265eb 100644 --- a/AppSettings.cpp +++ b/AppSettings.cpp @@ -67,6 +67,7 @@ AppSettings::AppSettings(QObject *parent) : registerSetting(new Setting("PreLaunchCommand", "")); registerSetting(new Setting("PostExitCommand", "")); - // The cat - registerSetting(new Setting("TheCat", false)); + // Misc + registerSetting(new Setting("TheCat", false)); // The Cat + registerSetting(new Setting("NoHide", false)); // Shall the main window hide on instance launch } diff --git a/gui/consolewindow.cpp b/gui/consolewindow.cpp index f2bc662a..f95d2742 100644 --- a/gui/consolewindow.cpp +++ b/gui/consolewindow.cpp @@ -11,6 +11,7 @@ ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent) : proc(mcproc) { ui->setupUi(this); + connect(mcproc, SIGNAL(ended()), this, SLOT(onEnded())); } ConsoleWindow::~ConsoleWindow() @@ -91,4 +92,9 @@ void ConsoleWindow::on_btnKillMinecraft_clicked() else ui->btnKillMinecraft->setEnabled(true); r_u_sure.close(); -} \ No newline at end of file +} + +void ConsoleWindow::onEnded() +{ + ui->btnKillMinecraft->setEnabled(false); +} diff --git a/gui/consolewindow.h b/gui/consolewindow.h index d4485a45..6a6c9e50 100644 --- a/gui/consolewindow.h +++ b/gui/consolewindow.h @@ -49,6 +49,7 @@ public slots: private slots: void on_closeButton_clicked(); void on_btnKillMinecraft_clicked(); + void onEnded(); protected: void closeEvent(QCloseEvent *); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 7d1e1510..82ae41d9 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -541,10 +541,21 @@ void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response) if(!proc) return; + // Prepare GUI: If it shall stay open disable the required parts + if (globalSettings->get("NoHide").toBool()) + { + ui->actionLaunchInstance->setEnabled(false); + } + else + { + this->hide(); + } + console = new ConsoleWindow(proc); console->show(); connect(proc, SIGNAL(log(QString, MessageLevel::Enum)), console, SLOT(write(QString, MessageLevel::Enum))); + connect(proc, SIGNAL(ended()), this, SLOT(instanceEnded())); proc->launch(); } @@ -673,3 +684,9 @@ void MainWindow::on_actionEditInstNotes_triggered() linst->setNotes(noteedit.getText()); } } + +void MainWindow::instanceEnded() +{ + this->show(); + ui->actionLaunchInstance->setEnabled(m_selectedInstance); +} diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 42f118b1..e8a6cbcf 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -111,6 +111,8 @@ private slots: void on_actionChangeInstLWJGLVersion_triggered(); + void instanceEnded(); + void on_actionInstanceSettings_triggered(); public slots: @@ -128,6 +130,7 @@ protected: bool eventFilter(QObject *obj, QEvent *ev); void setCatBackground(bool enabled); private: + Ui::MainWindow *ui; KCategoryDrawer * drawer; KCategorizedView * view; From c985f68b729454b9f3c7188e0b2f1af4530411be Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Fri, 6 Sep 2013 23:58:10 +0200 Subject: [PATCH 5/7] Made main window hide on instace exit --- gui/consolewindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/consolewindow.cpp b/gui/consolewindow.cpp index f95d2742..04b77285 100644 --- a/gui/consolewindow.cpp +++ b/gui/consolewindow.cpp @@ -97,4 +97,5 @@ void ConsoleWindow::on_btnKillMinecraft_clicked() void ConsoleWindow::onEnded() { ui->btnKillMinecraft->setEnabled(false); + if (!proc->exitCode()) this->close(); } From 5cac21ca6387a3cbd5492b933c5ad6d7b76b8bc7 Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Sat, 7 Sep 2013 00:02:05 +0200 Subject: [PATCH 6/7] Enough main window hiding magic for now --- gui/consolewindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/consolewindow.cpp b/gui/consolewindow.cpp index 04b77285..aba876c8 100644 --- a/gui/consolewindow.cpp +++ b/gui/consolewindow.cpp @@ -97,5 +97,6 @@ void ConsoleWindow::on_btnKillMinecraft_clicked() void ConsoleWindow::onEnded() { ui->btnKillMinecraft->setEnabled(false); - if (!proc->exitCode()) this->close(); + // TODO: Check why this doesn't work + if (!proc->exitCode()) this->close(); } From dab2bbe4e79cfd8b3b72b8d2fd0e5bd66e0281a9 Mon Sep 17 00:00:00 2001 From: Stiepen22 Date: Sun, 8 Sep 2013 15:02:52 +0200 Subject: [PATCH 7/7] Added console coloring and made the log not contain any usernames/session ids --- gui/consolewindow.cpp | 8 +++++++- gui/mainwindow.cpp | 1 + logic/MinecraftProcess.cpp | 30 +++++++++++++++++++++--------- logic/MinecraftProcess.h | 5 +++++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/gui/consolewindow.cpp b/gui/consolewindow.cpp index aba876c8..8ea90d45 100644 --- a/gui/consolewindow.cpp +++ b/gui/consolewindow.cpp @@ -23,7 +23,7 @@ void ConsoleWindow::writeColor(QString text, const char *color) { // append a paragraph if (color != nullptr) - ui->text->appendHtml(QString("%2").arg(color).arg(text)); + ui->text->appendHtml(QString("%2").arg(color).arg(text)); else ui->text->appendPlainText(text); // scroll down @@ -46,6 +46,12 @@ void ConsoleWindow::write(QString data, MessageLevel::Enum mode) else if (mode == MessageLevel::Warning) while(iter.hasNext()) writeColor(iter.next(), "orange"); + else if (mode == MessageLevel::Fatal) + while(iter.hasNext()) + writeColor(iter.next(), "pink"); + else if (mode == MessageLevel::Debug) + while(iter.hasNext()) + writeColor(iter.next(), "green"); // TODO: implement other MessageLevels else while(iter.hasNext()) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 82ae41d9..152773e7 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -556,6 +556,7 @@ void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response) connect(proc, SIGNAL(log(QString, MessageLevel::Enum)), console, SLOT(write(QString, MessageLevel::Enum))); connect(proc, SIGNAL(ended()), this, SLOT(instanceEnded())); + proc->setLogin(m_activeLogin.username, m_activeLogin.sessionID); proc->launch(); } diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 6ac5b886..c33d34a8 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -84,17 +84,14 @@ void MinecraftProcess::on_stdErr() for(int i = 0; i < lines.size() - 1; i++) { QString & line = lines[i]; - MessageLevel::Enum level = MessageLevel::Error; - if(line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || line.contains("[FINER]") || line.contains("[FINEST]") ) - level = MessageLevel::Message; - if(line.contains("[SEVERE]") || line.contains("[WARNING]") || line.contains("[STDERR]")) - level = MessageLevel::Error; - emit log(lines[i].toLocal8Bit(), level); + emit log(line.replace(username, "").replace(sessionID, "").toLocal8Bit(), getLevel(line, MessageLevel::Error)); } if(!complete) m_err_leftover = lines.last(); } + + void MinecraftProcess::on_stdOut() { QByteArray data = readAllStandardOutput(); @@ -106,7 +103,7 @@ void MinecraftProcess::on_stdOut() for(int i = 0; i < lines.size() - 1; i++) { QString & line = lines[i]; - emit log(lines[i].toLocal8Bit(), MessageLevel::Message); + emit log(line.replace(username, "").replace(sessionID, "").toLocal8Bit(), getLevel(line, MessageLevel::Message)); } if(!complete) m_out_leftover = lines.last(); @@ -167,7 +164,7 @@ void MinecraftProcess::launch() emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); QString JavaPath = m_instance->settings().get("JavaPath").toString(); emit log(QString("Java path: '%1'").arg(JavaPath)); - emit log(QString("Arguments: '%1'").arg(m_args.join("' '"))); + emit log(QString("Arguments: '%1'").arg(m_args.join("' '").replace(username, "").replace(sessionID, ""))); start(JavaPath, m_args); if (!waitForStarted()) { @@ -177,4 +174,19 @@ void MinecraftProcess::launch() } } - +MessageLevel::Enum MinecraftProcess::getLevel(const QString &line, MessageLevel::Enum level) +{ + + if(line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || line.contains("[FINER]") || line.contains("[FINEST]") ) + level = MessageLevel::Message; + if(line.contains("[SEVERE]") || line.contains("[STDERR]")) + level = MessageLevel::Error; + if(line.contains("[WARNING]")) + level = MessageLevel::Warning; + if(line.contains("Exception in thread") || line.contains(" at ")) + level = MessageLevel::Fatal; + if(line.contains("[DEBUG]")) + level = MessageLevel::Debug; + return level; + +} \ No newline at end of file diff --git a/logic/MinecraftProcess.h b/logic/MinecraftProcess.h index 248ad807..a1dfa23f 100644 --- a/logic/MinecraftProcess.h +++ b/logic/MinecraftProcess.h @@ -61,6 +61,8 @@ public: void killMinecraft(); + inline void setLogin(QString user, QString sid) { username = user; sessionID = sid; } + signals: /** * @brief emitted when mc has finished and the PostLaunchCommand was run @@ -87,4 +89,7 @@ protected slots: void on_stdOut(); private: bool killed; + MessageLevel::Enum getLevel(const QString &message, MessageLevel::Enum defaultLevel); + QString sessionID; + QString username; };