GH-1874 do not allow updating while an instance is running
This is a nasty hack. Proper solution will require moving all update related functionality out of the main window. Running instances and updating should be mutually exclusive.
This commit is contained in:
		| @@ -561,14 +561,17 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow | ||||
| 		updateNewsLabel(); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if(BuildConfig.UPDATER_ENABLED) | ||||
| 	{ | ||||
| 		bool updatesAllowed = MMC->updatesAreAllowed(); | ||||
| 		updatesAllowedChanged(updatesAllowed); | ||||
| 		// set up the updater object. | ||||
| 		auto updater = MMC->updateChecker(); | ||||
| 		connect(updater.get(), &UpdateChecker::updateAvailable, this, &MainWindow::updateAvailable); | ||||
| 		connect(updater.get(), &UpdateChecker::noUpdateFound, this, &MainWindow::updateNotAvailable); | ||||
| 		// if automatic update checks are allowed, start one. | ||||
| 		if (MMC->settings()->get("AutoUpdate").toBool()) | ||||
| 		if (MMC->settings()->get("AutoUpdate").toBool() && updatesAllowed) | ||||
| 		{ | ||||
| 			updater->checkForUpdate(MMC->settings()->get("UpdateChannel").toString(), false); | ||||
| 		} | ||||
| @@ -795,6 +798,15 @@ void MainWindow::repopulateAccountsMenu() | ||||
| 	accountMenu->addAction(manageAccountsAction); | ||||
| } | ||||
|  | ||||
| void MainWindow::updatesAllowedChanged(bool allowed) | ||||
| { | ||||
| 	if(!BuildConfig.UPDATER_ENABLED) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 	ui->actionCheckUpdate->setEnabled(allowed); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Assumes the sender is a QAction | ||||
|  */ | ||||
| @@ -896,6 +908,11 @@ void MainWindow::updateNewsLabel() | ||||
|  | ||||
| void MainWindow::updateAvailable(GoUpdate::Status status) | ||||
| { | ||||
| 	if(!MMC->updatesAreAllowed()) | ||||
| 	{ | ||||
| 		updateNotAvailable(); | ||||
| 		return; | ||||
| 	} | ||||
| 	UpdateDialog dlg; | ||||
| 	UpdateAction action = (UpdateAction)dlg.exec(); | ||||
| 	switch (action) | ||||
| @@ -955,6 +972,10 @@ void MainWindow::notificationsChanged() | ||||
|  | ||||
| void MainWindow::downloadUpdates(GoUpdate::Status status) | ||||
| { | ||||
| 	if(!MMC->updatesAreAllowed()) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 	qDebug() << "Downloading updates."; | ||||
| 	ProgressDialog updateDlg(this); | ||||
| 	status.rootPath = MMC->root(); | ||||
|   | ||||
| @@ -54,6 +54,7 @@ public: | ||||
|  | ||||
| 	void checkInstancePathForProblems(); | ||||
|  | ||||
| 	void updatesAllowedChanged(bool allowed); | ||||
| signals: | ||||
| 	void isClosing(); | ||||
|  | ||||
|   | ||||
| @@ -965,7 +965,7 @@ bool MultiMC::launch(InstancePtr instance, bool online, BaseProfilerFactory *pro | ||||
| 		} | ||||
| 		connect(controller.get(), &LaunchController::succeeded, this, &MultiMC::controllerSucceeded); | ||||
| 		connect(controller.get(), &LaunchController::failed, this, &MultiMC::controllerFailed); | ||||
| 		m_runningInstances ++; | ||||
| 		addRunningInstance(); | ||||
| 		controller->start(); | ||||
| 		return true; | ||||
| 	} | ||||
| @@ -994,6 +994,38 @@ bool MultiMC::kill(InstancePtr instance) | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| void MultiMC::addRunningInstance() | ||||
| { | ||||
| 	m_runningInstances ++; | ||||
| 	if(m_runningInstances == 1) | ||||
| 	{ | ||||
| 		emit updateAllowedChanged(false); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void MultiMC::subRunningInstance() | ||||
| { | ||||
| 	if(m_runningInstances == 0) | ||||
| 	{ | ||||
| 		qCritical() << "Something went really wrong and we now have less than 0 running instances... WTF"; | ||||
| 		return; | ||||
| 	} | ||||
| 	m_runningInstances --; | ||||
| 	if(m_runningInstances == 0) | ||||
| 	{ | ||||
| 		emit updateAllowedChanged(true); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| bool MultiMC::shouldExitNow() const | ||||
| { | ||||
| 	return m_runningInstances == 0 && m_openWindows == 0; | ||||
| } | ||||
|  | ||||
| bool MultiMC::updatesAreAllowed() | ||||
| { | ||||
| 	return m_runningInstances == 0; | ||||
| } | ||||
|  | ||||
| void MultiMC::controllerSucceeded() | ||||
| { | ||||
| @@ -1012,10 +1044,10 @@ void MultiMC::controllerSucceeded() | ||||
| 		} | ||||
| 	} | ||||
| 	extras.controller.reset(); | ||||
| 	m_runningInstances --; | ||||
| 	subRunningInstance(); | ||||
|  | ||||
| 	// quit when there are no more windows. | ||||
| 	if(m_openWindows == 0 && m_runningInstances == 0) | ||||
| 	if(shouldExitNow()) | ||||
| 	{ | ||||
| 		m_status = Status::Succeeded; | ||||
| 		exit(0); | ||||
| @@ -1033,10 +1065,10 @@ void MultiMC::controllerFailed(const QString& error) | ||||
|  | ||||
| 	// on failure, do... nothing | ||||
| 	extras.controller.reset(); | ||||
| 	m_runningInstances --; | ||||
| 	subRunningInstance(); | ||||
|  | ||||
| 	// quit when there are no more windows. | ||||
| 	if(m_openWindows == 0 && m_runningInstances == 0) | ||||
| 	if(shouldExitNow()) | ||||
| 	{ | ||||
| 		m_status = Status::Failed; | ||||
| 		exit(1); | ||||
| @@ -1066,6 +1098,7 @@ MainWindow* MultiMC::showMainWindow(bool minimized) | ||||
| 		} | ||||
|  | ||||
| 		m_mainWindow->checkInstancePathForProblems(); | ||||
| 		connect(this, &MultiMC::updateAllowedChanged, m_mainWindow, &MainWindow::updatesAllowedChanged); | ||||
| 		connect(m_mainWindow, &MainWindow::isClosing, this, &MultiMC::on_windowClose); | ||||
| 		m_openWindows++; | ||||
| 	} | ||||
| @@ -1155,7 +1188,7 @@ void MultiMC::on_windowClose() | ||||
| 		m_mainWindow = nullptr; | ||||
| 	} | ||||
| 	// quit when there are no more windows. | ||||
| 	if(m_openWindows == 0 && m_runningInstances == 0) | ||||
| 	if(shouldExitNow()) | ||||
| 	{ | ||||
| 		exit(0); | ||||
| 	} | ||||
|   | ||||
| @@ -151,6 +151,11 @@ public: | ||||
| 		return m_runningInstances; | ||||
| 	} | ||||
|  | ||||
| 	bool updatesAreAllowed(); | ||||
|  | ||||
| signals: | ||||
| 	void updateAllowedChanged(bool status); | ||||
|  | ||||
| public slots: | ||||
| 	bool launch(InstancePtr instance, bool online = true, BaseProfilerFactory *profiler = nullptr); | ||||
| 	bool kill(InstancePtr instance); | ||||
| @@ -186,6 +191,11 @@ private: | ||||
| 	// sets the fatal error message and m_status to Failed. | ||||
| 	void showFatalErrorMessage(const QString & title, const QString & content); | ||||
|  | ||||
| private: | ||||
| 	void addRunningInstance(); | ||||
| 	void subRunningInstance(); | ||||
| 	bool shouldExitNow() const; | ||||
|  | ||||
| private: | ||||
| 	QDateTime startTime; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Petr Mrázek
					Petr Mrázek