diff options
| author | Thomas Tanner <trtanner@btinternet.com> | 2015-12-19 20:49:54 +0000 |
|---|---|---|
| committer | Thomas Tanner <trtanner@btinternet.com> | 2015-12-19 20:49:54 +0000 |
| commit | 5f5184ebfe9a6b7102654863cbb390a610ab1563 (patch) | |
| tree | b7a52083cc2b1c92bf5a90e0548d00fab76849ed /src | |
| parent | 30b29635f67d6ab1cd00b6787ab58bf36934da55 (diff) | |
Changes to support getting list of mods / esps to activate from game plugin
Diffstat (limited to 'src')
| -rw-r--r-- | src/activatemodsdialog.cpp | 22 | ||||
| -rw-r--r-- | src/activatemodsdialog.h | 10 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 95 | ||||
| -rw-r--r-- | src/mainwindow.h | 3 | ||||
| -rw-r--r-- | src/modinfo.h | 1 | ||||
| -rw-r--r-- | src/organizercore.cpp | 35 | ||||
| -rw-r--r-- | src/organizercore.h | 29 | ||||
| -rw-r--r-- | src/organizerproxy.cpp | 8 | ||||
| -rw-r--r-- | src/organizerproxy.h | 5 | ||||
| -rw-r--r-- | src/transfersavesdialog.cpp | 6 |
10 files changed, 111 insertions, 103 deletions
diff --git a/src/activatemodsdialog.cpp b/src/activatemodsdialog.cpp index fd56ae3e..5ef0a4e5 100644 --- a/src/activatemodsdialog.cpp +++ b/src/activatemodsdialog.cpp @@ -21,9 +21,14 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "ui_activatemodsdialog.h"
#include <QComboBox>
+#include <QHeaderView>
#include <QLabel>
+#include <QString>
+#include <QTableWidget>
-ActivateModsDialog::ActivateModsDialog(const std::map<QString, std::vector<QString> > &missingPlugins, QWidget *parent)
+#include <QtGlobal>
+
+ActivateModsDialog::ActivateModsDialog(SaveGameInfo::MissingAssets const &missingAssets, QWidget *parent)
: TutorableDialog("ActivateMods", parent), ui(new Ui::ActivateModsDialog)
{
ui->setupUi(this);
@@ -40,18 +45,17 @@ ActivateModsDialog::ActivateModsDialog(const std::map<QString, std::vector<QStri int row = 0;
- modsTable->setRowCount(missingPlugins.size());
+ modsTable->setRowCount(missingAssets.size());
- for (std::map<QString, std::vector<QString> >::const_iterator espIter = missingPlugins.begin();
- espIter != missingPlugins.end(); ++espIter, ++row) {
- modsTable->setCellWidget(row, 0, new QLabel(espIter->first));
- if (espIter->second.size() == 0) {
+ for (SaveGameInfo::MissingAssets::const_iterator espIter = missingAssets.begin();
+ espIter != missingAssets.end(); ++espIter, ++row) {
+ modsTable->setCellWidget(row, 0, new QLabel(espIter.key()));
+ if (espIter->size() == 0) {
modsTable->setCellWidget(row, 1, new QLabel(tr("not found")));
} else {
QComboBox* combo = new QComboBox();
- for (std::vector<QString>::const_iterator modIter = espIter->second.begin();
- modIter != espIter->second.end(); ++modIter) {
- combo->addItem(*modIter);
+ for (QString const &mod : espIter.value()) {
+ combo->addItem(mod);
}
modsTable->setCellWidget(row, 1, combo);
}
diff --git a/src/activatemodsdialog.h b/src/activatemodsdialog.h index 08dbad8d..f36b5fde 100644 --- a/src/activatemodsdialog.h +++ b/src/activatemodsdialog.h @@ -20,8 +20,14 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #ifndef ACTIVATEMODSDIALOG_H
#define ACTIVATEMODSDIALOG_H
+#include "savegameinfo.h"
#include "tutorabledialog.h"
-#include <map>
+
+#include <QObject>
+
+class QString;
+class QWidget;
+
#include <set>
namespace Ui {
@@ -42,7 +48,7 @@ public: * @param missingPlugins a map containing missing plugins that need to be activated
* @param parent ... Defaults to 0.
**/
- explicit ActivateModsDialog(const std::map<QString, std::vector<QString> > &missingPlugins, QWidget *parent = 0);
+ explicit ActivateModsDialog(SaveGameInfo::MissingAssets const &missingAssets, QWidget *parent = 0);
~ActivateModsDialog();
/**
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 03233398..0b551c5b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -31,6 +31,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "isavegame.h"
#include "nexusinterface.h"
#include "organizercore.h"
+#include "pluginlistsortproxy.h"
#include "previewgenerator.h"
#include "savegameinfo.h"
#include "spawn.h"
@@ -104,6 +105,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QIODevice>
#include <QIcon>
#include <QInputDialog>
+#include <QItemSelection>
#include <QItemSelectionModel>
#include <QJsonArray>
#include <QJsonDocument>
@@ -124,6 +126,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QPushButton>
#include <QRadioButton>
#include <QRect>
+#include <QRegExp>
#include <QResizeEvent>
#include <QSettings>
#include <QScopedPointer>
@@ -134,6 +137,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QToolButton>
#include <QToolTip>
#include <QTranslator>
+#include <QTreeWidget>
#include <QUrl>
#include <QVariantList>
#include <QWhatsThis>
@@ -3258,78 +3262,9 @@ void MainWindow::deleteSavegame_clicked() }
-void MainWindow::fixMods_clicked()
+void MainWindow::fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets)
{
- QListWidgetItem *selectedItem = ui->savegameList->currentItem();
-
- if (selectedItem == nullptr)
- return;
-
- // if required, parse the save game
- if (selectedItem->data(Qt::UserRole).isNull()) {
- QVariant temp;
- SaveGameGamebryo *save = getSaveGame(selectedItem->data(Qt::UserRole).toString());
- save->setParent(selectedItem->listWidget());
- temp.setValue(save);
- selectedItem->setData(Qt::UserRole, temp);
- }
-
- const SaveGameGamebryo *save = getSaveGame(selectedItem);
-
- // collect the list of missing plugins
- std::map<QString, std::vector<QString> > missingPlugins;
-
- for (int i = 0; i < save->numPlugins(); ++i) {
- const QString &pluginName = save->plugin(i);
- if (!m_OrganizerCore.pluginList()->isEnabled(pluginName)) {
- missingPlugins[pluginName] = std::vector<QString>();
- }
- }
-
- // figure out, for each esp/esm, which mod, if any, contains it
- QStringList espFilter("*.esp");
- espFilter.append("*.esm");
-
- // search in data
- {
- QDir dataDir(m_OrganizerCore.managedGame()->dataDirectory());
- QStringList esps = dataDir.entryList(espFilter);
- for (const QString &esp : esps) {
- std::map<QString, std::vector<QString> >::iterator iter = missingPlugins.find(esp);
- if (iter != missingPlugins.end()) {
- iter->second.push_back("<data>");
- }
- }
- }
-
- // search in mods
- for (unsigned int i = 0; i < m_OrganizerCore.currentProfile()->numRegularMods(); ++i) {
- int modIndex = m_OrganizerCore.currentProfile()->modIndexByPriority(i);
- ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex);
-
- QStringList esps = QDir(modInfo->absolutePath()).entryList(espFilter);
- for (const QString &esp : esps) {
- std::map<QString, std::vector<QString> >::iterator iter = missingPlugins.find(esp);
- if (iter != missingPlugins.end()) {
- iter->second.push_back(modInfo->name());
- }
- }
- }
-
- // search in overwrite
- {
- QDir overwriteDir(qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::overwritePath()));
- QStringList esps = overwriteDir.entryList(espFilter);
- for (const QString &esp : esps) {
- std::map<QString, std::vector<QString> >::iterator iter = missingPlugins.find(esp);
- if (iter != missingPlugins.end()) {
- iter->second.push_back("<overwrite>");
- }
- }
- }
-
-
- ActivateModsDialog dialog(missingPlugins, this);
+ ActivateModsDialog dialog(missingAssets, this);
if (dialog.exec() == QDialog::Accepted) {
// activate the required mods, then enable all esps
std::set<QString> modsToActivate = dialog.getModsToActivate();
@@ -3356,13 +3291,25 @@ void MainWindow::on_savegameList_customContextMenuRequested(const QPoint &pos) {
QItemSelectionModel *selection = ui->savegameList->selectionModel();
- if (!selection->hasSelection())
+ if (!selection->hasSelection()) {
return;
+ }
QMenu menu;
+ QAction *action = menu.addAction(tr("Enable Mods..."));
+ action->setEnabled(false);
- if (!(selection->selectedIndexes().count() > 1))
- menu.addAction(tr("Fix Mods..."), this, SLOT(fixMods_clicked()));
+ if (selection->selectedIndexes().count() == 1) {
+ SaveGameInfo const *info = this->m_OrganizerCore.managedGame()->feature<SaveGameInfo>();
+ if (info != nullptr) {
+ QString save = ui->savegameList->currentItem()->data(Qt::UserRole).toString();
+ SaveGameInfo::MissingAssets missing = info->getMissingAssets(save);
+ if (missing.size() != 0) {
+ connect(action, &QAction::triggered, this, [this, missing]{ fixMods_clicked(missing); });
+ action->setEnabled(true);
+ }
+ }
+ }
QString deleteMenuLabel = tr("Delete %n save(s)", "", selection->selectedIndexes().count());
diff --git a/src/mainwindow.h b/src/mainwindow.h index 04e9f221..a8c3ec0e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -28,6 +28,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "iuserinterface.h"
#include "modinfo.h"
#include "modlistsortproxy.h"
+#include "savegameinfo.h"
#include "tutorialcontrol.h"
//Note the commented headers here can be replaced with forward references,
@@ -393,7 +394,7 @@ private slots: void information_clicked();
// savegame context menu
void deleteSavegame_clicked();
- void fixMods_clicked();
+ void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets);
// data-tree context menu
void writeDataToFile();
void openDataFile();
diff --git a/src/modinfo.h b/src/modinfo.h index ae22ccd8..c10232da 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -22,7 +22,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "imodinterface.h"
#include "versioninfo.h"
-//#include <directoryentry.h>
class QDateTime;
class QDir;
diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 06a6dba4..e92ecb97 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1,15 +1,19 @@ #include "organizercore.h"
+#include "imodinterface.h"
#include "iplugingame.h"
-#include "mainwindow.h"
+#include "iuserinterface.h"
+#include "loadmechanism.h"
#include "messagedialog.h"
+#include "modlistsortproxy.h"
+#include "plugincontainer.h"
+#include "pluginlistsortproxy.h"
#include "logbuffer.h"
#include "credentialsdialog.h"
#include "filedialogmemory.h"
#include "lockeddialog.h"
#include "modinfodialog.h"
#include "spawn.h"
-#include "safewritefile.h"
#include "syncoverwritedialog.h"
#include "nxmaccessmanager.h"
#include <ipluginmodpage.h>
@@ -17,18 +21,27 @@ #include <directoryentry.h>
#include <scopeguard.h>
#include <utility.h>
-#include <appconfig.h>
+#include "appconfig.h"
#include <report.h>
#include <questionboxmemory.h>
-#include <QNetworkInterface>
-#include <QMessageBox>
-#include <QDialogButtonBox>
#include <QApplication>
+#include <QDialogButtonBox>
+#include <QMessageBox>
+#include <QNetworkInterface>
+#include <QProcess>
+#include <QTimer>
+#include <QWidget>
+
+#include <QtDebug>
#include <Psapi.h>
+#include <exception>
#include <functional>
+#include <memory>
+#include <set>
+#include <utility>
using namespace MOShared;
@@ -867,6 +880,16 @@ ModList *OrganizerCore::modList() return &m_ModList;
}
+QStringList OrganizerCore::modsSortedByProfilePriority() const
+{
+ QStringList res;
+ for (unsigned int i = 0; i < currentProfile()->numRegularMods(); ++i) {
+ int modIndex = currentProfile()->modIndexByPriority(i);
+ res.push_back(ModInfo::getByIndex(modIndex)->name());
+ }
+ return res;
+}
+
void OrganizerCore::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir ¤tDirectory, bool closeAfterStart, const QString &steamAppID)
{
LockedDialog *dialog = new LockedDialog(qApp->activeWindow());
diff --git a/src/organizercore.h b/src/organizercore.h index 5cfbaca4..b50b3e9f 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -2,30 +2,42 @@ #define ORGANIZERCORE_H
-#include "profile.h"
#include "selfupdater.h"
-#include "iuserinterface.h"
+#include "iuserinterface.h" //should be class IUserInterface;
#include "settings.h"
#include "modlist.h"
+#include "modinfo.h"
#include "pluginlist.h"
#include "directoryrefresher.h"
#include "installationmanager.h"
#include "downloadmanager.h"
-#include "modlistsortproxy.h"
-#include "pluginlistsortproxy.h"
#include "executableslist.h"
-#include <directoryentry.h>
#include <imoinfo.h>
#include <iplugindiagnose.h>
-#include <iplugingame.h>
#include <versioninfo.h>
-#include <guessedvalue.h>
#include <delayedfilewriter.h>
#include <boost/signals2.hpp>
+
+class ModListSortProxy;
+class PluginListSortProxy;
+class Profile;
+namespace MOBase { template <typename T> class GuessedValue; }
+namespace MOShared { class DirectoryEntry; }
+
+#include <QDir>
+#include <QList>
+#include <QObject>
#include <QSettings>
#include <QString>
+#include <QStringList>
#include <QThread>
+class QNetworkReply;
+class QUrl;
+class QWidget;
+
+#include <functional>
+#include <vector>
class PluginContainer;
@@ -89,7 +101,7 @@ public: m_ExecutablesList = executablesList;
}
- Profile *currentProfile() { return m_CurrentProfile; }
+ Profile *currentProfile() const { return m_CurrentProfile; }
void setCurrentProfile(const QString &profileName);
std::vector<QString> enabledArchives();
@@ -155,6 +167,7 @@ public: bool onAboutToRun(const std::function<bool (const QString &)> &func);
bool onFinishedRun(const std::function<void (const QString &, unsigned int)> &func);
void refreshModList(bool saveChanges = true);
+ QStringList modsSortedByProfilePriority() const;
//std::vector<std::pair<QString, QString> > fileMapping();
diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index ba07c154..474f0837 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -1,6 +1,7 @@ #include "organizerproxy.h"
-#include <appconfig.h>
+#include "appconfig.h"
+#include "organizercore.h"
#include <QApplication>
@@ -170,3 +171,8 @@ MOBase::IPluginGame const *OrganizerProxy::managedGame() const {
return m_Proxied->managedGame();
}
+
+QStringList OrganizerProxy::modsSortedByProfilePriority() const
+{
+ return m_Proxied->modsSortedByProfilePriority();
+}
diff --git a/src/organizerproxy.h b/src/organizerproxy.h index 62a35498..2a0fc397 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -3,7 +3,8 @@ #include <imoinfo.h>
-#include "mainwindow.h"
+
+class OrganizerCore;
class OrganizerProxy : public MOBase::IOrganizer
{
@@ -47,6 +48,8 @@ public: virtual MOBase::IPluginGame const *managedGame() const;
+ virtual QStringList modsSortedByProfilePriority() const;
+
private:
OrganizerCore *m_Proxied;
diff --git a/src/transfersavesdialog.cpp b/src/transfersavesdialog.cpp index a2201a69..b6be108b 100644 --- a/src/transfersavesdialog.cpp +++ b/src/transfersavesdialog.cpp @@ -84,6 +84,12 @@ public: {
return new DummySave(file);
}
+
+ virtual MissingAssets getMissingAssets(QString const &) const override
+ {
+ return {};
+ }
+
};
} //end anonymous namespace
|
