diff options
-rw-r--r-- | application/MainWindow.cpp | 21 | ||||
-rw-r--r-- | application/MultiMC.cpp | 10 | ||||
-rw-r--r-- | application/MultiMC.h | 6 |
3 files changed, 32 insertions, 5 deletions
diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index bf9da0dc..70a0fbf1 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -1356,12 +1356,27 @@ void MainWindow::on_actionViewSelectedInstFolder_triggered() void MainWindow::closeEvent(QCloseEvent *event) { - // Save the window state and geometry. + if(MMC->numRunningInstances()) + { + auto resBtn = QMessageBox::question( + this, + tr("Do you want to close MultiMC?"), + tr("<p>You still have instances running.</p><p>Closing MultiMC will result in inaccurate time tracking and no Minecraft crash handling.</p><p>Are you sure?</p>"), + QMessageBox::No | QMessageBox::Yes, + QMessageBox::Yes + ); + if (resBtn != QMessageBox::Yes) + { + event->ignore(); + return; + } + } + // no running instances or user said yes. + event->accept(); + // Save the window state and geometry. MMC->settings()->set("MainWindowState", saveState().toBase64()); MMC->settings()->set("MainWindowGeometry", saveGeometry().toBase64()); - - QMainWindow::closeEvent(event); QApplication::exit(); } diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index c6ac2b63..3c637077 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -1104,6 +1104,7 @@ void MultiMC::launch(InstancePtr instance, bool online, BaseProfilerFactory *pro connect(controller.get(), &LaunchController::succeeded, this, &MultiMC::controllerSucceeded); connect(controller.get(), &LaunchController::failed, this, &MultiMC::controllerFailed); controller->start(); + m_runningInstances ++; } else if (instance->isRunning()) { @@ -1118,6 +1119,7 @@ void MultiMC::controllerSucceeded() return; auto id = controller->id(); auto & extras = m_instanceExtras[id]; + // on success, do... if (controller->instance()->settings()->get("AutoCloseConsole").toBool()) { @@ -1127,8 +1129,10 @@ void MultiMC::controllerSucceeded() } } extras.controller.reset(); + m_runningInstances --; + // quit when there are no more windows. - if(m_openWindows == 0) + if(m_openWindows == 0 && m_runningInstances == 0) { m_status = Status::Succeeded; quit(); @@ -1146,8 +1150,10 @@ void MultiMC::controllerFailed(const QString& error) // on failure, do... nothing extras.controller.reset(); + m_runningInstances --; + // quit when there are no more windows. - if(m_openWindows == 0) + if(m_openWindows == 0 && m_runningInstances == 0) { m_status = Status::Failed; quit(); diff --git a/application/MultiMC.h b/application/MultiMC.h index 7f45e873..b4087ef3 100644 --- a/application/MultiMC.h +++ b/application/MultiMC.h @@ -144,6 +144,11 @@ public: InstanceWindow *showInstanceWindow(InstancePtr instance, QString page = QString()); MainWindow *showMainWindow(bool minimized = false); + size_t numRunningInstances() + { + return m_runningInstances; + } + public slots: void launch(InstancePtr instance, bool online = true, BaseProfilerFactory *profiler = nullptr); @@ -208,6 +213,7 @@ private: }; std::map<QString, InstanceXtras> m_instanceExtras; size_t m_openWindows = 0; + size_t m_runningInstances = 0; // main window, if any MainWindow * m_mainWindow = nullptr; |