浏览代码

refactoring

Laserlicht 9 月之前
父节点
当前提交
10b37ba265
共有 2 个文件被更改,包括 74 次插入36 次删除
  1. 69 36
      launcher/modManager/cmodlistview_moc.cpp
  2. 5 0
      launcher/modManager/cmodlistview_moc.h

+ 69 - 36
launcher/modManager/cmodlistview_moc.cpp

@@ -422,6 +422,42 @@ void CModListView::disableModInfo()
 	ui->updateButton->setVisible(false);
 }
 
+auto CModListView::buttonEnabledState(QString modName, ModState & mod)
+{
+	struct result {
+		bool disableVisible; bool enableVisible; bool installVisible; bool uninstallVisible; bool updateVisible;
+		bool disableEnabled; bool enableEnabled; bool installEnabled; bool uninstallEnabled; bool updateEnabled;
+		bool directoryEnabled; bool repositoryEnabled; 
+	} res;
+
+	QStringList notInstalledDependencies = getModsToInstall(modName);
+	QStringList unavailableDependencies = findUnavailableMods(notInstalledDependencies);
+	bool translationMismatch = 	mod.isTranslation() && CGeneralTextHandler::getPreferredLanguage() != mod.getBaseLanguage().toStdString();
+	bool modIsBeingDownloaded = enqueuedModDownloads.contains(mod.getID());
+
+	res.disableVisible = modStateModel->isModInstalled(mod.getID()) && modStateModel->isModEnabled(mod.getID());
+	res.enableVisible = modStateModel->isModInstalled(mod.getID()) && !modStateModel->isModEnabled(mod.getID());
+	res.installVisible = mod.isAvailable() && !mod.isSubmod();
+	res.uninstallVisible = mod.isInstalled() && !mod.isSubmod();
+	res.updateVisible = mod.isUpdateAvailable();
+
+	// Block buttons if action is not allowed at this time
+	res.disableEnabled = true;
+	res.enableEnabled = notInstalledDependencies.empty() && !translationMismatch;
+	res.installEnabled = unavailableDependencies.empty() && !modIsBeingDownloaded;
+	res.uninstallEnabled = true;
+	res.updateEnabled = unavailableDependencies.empty() && !modIsBeingDownloaded;
+
+#ifndef VCMI_MOBILE
+	res.directoryEnabled = mod.isInstalled();
+#else
+	res.directoryEnabled = false;
+#endif
+	res.repositoryEnabled = !mod.getDownloadUrl().isEmpty();
+
+	return res;
+}
+
 void CModListView::onCustomContextMenu(const QPoint &point)
 {
 	QModelIndex index = ui->allModsView->indexAt(point);
@@ -447,45 +483,40 @@ void CModListView::onCustomContextMenu(const QPoint &point)
 			}
 		};
 
+		auto state = buttonEnabledState(modName, mod);
+
 		addContextEntry(
-			modStateModel->isModInstalled(mod.getID()) && modStateModel->isModEnabled(mod.getID()),
+			state.disableEnabled && state.disableVisible,
 			tr("Disable"),
 			[this](ModState mod){ disableModByName(mod.getID()); }
 		);
 		addContextEntry(
-			modStateModel->isModInstalled(mod.getID()) && !modStateModel->isModEnabled(mod.getID()) && notInstalledDependencies.empty() && !translationMismatch,
+			state.enableEnabled && state.enableVisible,
 			tr("Enable"),
 			[this](ModState mod){ enableModByName(mod.getID());
 		});
 		addContextEntry(
-			mod.isAvailable() && !mod.isSubmod() && unavailableDependencies.empty() && !modIsBeingDownloaded,
+			state.installEnabled && state.installVisible,
 			tr("Install"),
 			[this](ModState mod){ doInstallMod(mod.getID()); }
 		);
 		addContextEntry(
-			mod.isInstalled() && !mod.isSubmod(),
+			state.uninstallEnabled && state.uninstallVisible,
 			tr("Uninstall"),
-			[this](ModState mod){
-				if(modStateModel->isModEnabled(mod.getID()))
-					manager->disableMod(mod.getID());
-				manager->uninstallMod(mod.getID());
-				reload();
-			}
+			[this](ModState mod){ doUninstallMod(mod.getID()); }
 		);
 		addContextEntry(
-			mod.isUpdateAvailable() && unavailableDependencies.empty() && !modIsBeingDownloaded,
+			state.updateEnabled && state.updateVisible,
 			tr("Update"),
 			[this](ModState mod){ doUpdateMod(mod.getID()); }
 		);
-#ifndef VCMI_MOBILE
 		addContextEntry(
-			mod.isInstalled(),
+			state.directoryEnabled,
 			tr("Open directory"),
 			[this](ModState mod){ openModDictionary(mod.getID()); }
 		);
-#endif
 		addContextEntry(
-			!mod.getDownloadUrl().isEmpty(),
+			state.repositoryEnabled,
 			tr("Open repository"),
 			[](ModState mod){
 				QUrl url(mod.getDownloadUrl());
@@ -529,23 +560,20 @@ void CModListView::selectMod(const QModelIndex & index)
 		Helper::enableScrollBySwiping(ui->modInfoBrowser);
 		Helper::enableScrollBySwiping(ui->changelogBrowser);
 
-		QStringList notInstalledDependencies = getModsToInstall(modName);
-		QStringList unavailableDependencies = findUnavailableMods(notInstalledDependencies);
-		bool translationMismatch = 	mod.isTranslation() && CGeneralTextHandler::getPreferredLanguage() != mod.getBaseLanguage().toStdString();
-		bool modIsBeingDownloaded = enqueuedModDownloads.contains(mod.getID());
+		auto state = buttonEnabledState(modName, mod);
 
-		ui->disableButton->setVisible(modStateModel->isModInstalled(mod.getID()) && modStateModel->isModEnabled(mod.getID()));
-		ui->enableButton->setVisible(modStateModel->isModInstalled(mod.getID()) && !modStateModel->isModEnabled(mod.getID()));
-		ui->installButton->setVisible(mod.isAvailable() && !mod.isSubmod());
-		ui->uninstallButton->setVisible(mod.isInstalled() && !mod.isSubmod());
-		ui->updateButton->setVisible(mod.isUpdateAvailable());
+		ui->disableButton->setVisible(state.disableVisible);
+		ui->enableButton->setVisible(state.enableVisible);
+		ui->installButton->setVisible(state.installVisible);
+		ui->uninstallButton->setVisible(state.uninstallVisible);
+		ui->updateButton->setVisible(state.updateVisible);
 
 		// Block buttons if action is not allowed at this time
-		ui->disableButton->setEnabled(true);
-		ui->enableButton->setEnabled(notInstalledDependencies.empty() && !translationMismatch);
-		ui->installButton->setEnabled(unavailableDependencies.empty() && !modIsBeingDownloaded);
-		ui->uninstallButton->setEnabled(true);
-		ui->updateButton->setEnabled(unavailableDependencies.empty() && !modIsBeingDownloaded);
+		ui->disableButton->setEnabled(state.disableEnabled);
+		ui->enableButton->setEnabled(state.enableEnabled);
+		ui->installButton->setEnabled(state.installEnabled);
+		ui->uninstallButton->setEnabled(state.uninstallEnabled);
+		ui->updateButton->setEnabled(state.updateEnabled);
 
 		loadScreenshots();
 	}
@@ -703,13 +731,7 @@ void CModListView::on_uninstallButton_clicked()
 {
 	QString modName = ui->allModsView->currentIndex().data(ModRoles::ModNameRole).toString();
 
-	if(modStateModel->isModExists(modName) && modStateModel->getMod(modName).isInstalled())
-	{
-		if(modStateModel->isModEnabled(modName))
-			manager->disableMod(modName);
-		manager->uninstallMod(modName);
-		reload();
-	}
+	doUninstallMod(modName);
 	
 	checkManagerErrors();
 }
@@ -1110,6 +1132,17 @@ void CModListView::doInstallMod(const QString & modName)
 	}
 }
 
+void CModListView::doUninstallMod(const QString & modName)
+{
+	if(modStateModel->isModExists(modName) && modStateModel->getMod(modName).isInstalled())
+	{
+		if(modStateModel->isModEnabled(modName))
+			manager->disableMod(modName);
+		manager->uninstallMod(modName);
+		reload();
+	}
+}
+
 bool CModListView::isModAvailable(const QString & modName)
 {
 	return modStateModel->isModExists(modName) && !modStateModel->isModInstalled(modName);

+ 5 - 0
launcher/modManager/cmodlistview_moc.h

@@ -64,6 +64,8 @@ class CModListView : public QWidget
 
 	void changeEvent(QEvent *event) override;
 
+	auto buttonEnabledState(QString modName, ModState & mod);
+
 public:
 	explicit CModListView(QWidget * parent = nullptr);
 	~CModListView();
@@ -82,6 +84,9 @@ public:
 	/// install mod by name
 	void doInstallMod(const QString & modName);
 
+	/// uninstall mod by name
+	void doUninstallMod(const QString & modName);
+
 	/// update mod by name
 	void doUpdateMod(const QString & modName);