From 30c177cb371e92fe5e4cfc600cf27586402cf0a8 Mon Sep 17 00:00:00 2001 From: Silarn Date: Mon, 16 Apr 2018 12:47:17 -0500 Subject: Support for multi-game downloads --- src/modinfo.cpp | 56 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 20 deletions(-) (limited to 'src/modinfo.cpp') diff --git a/src/modinfo.cpp b/src/modinfo.cpp index d80c636b..2cd3aec7 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -61,16 +61,16 @@ bool ModInfo::ByName(const ModInfo::Ptr &LHS, const ModInfo::Ptr &RHS) } -ModInfo::Ptr ModInfo::createFrom(const QDir &dir, DirectoryEntry **directoryStructure) +ModInfo::Ptr ModInfo::createFrom(PluginContainer *pluginContainer, QString gameName, const QDir &dir, DirectoryEntry **directoryStructure) { QMutexLocker locker(&s_Mutex); // int id = s_NextID++; static QRegExp backupExp(".*backup[0-9]*"); ModInfo::Ptr result; if (backupExp.exactMatch(dir.dirName())) { - result = ModInfo::Ptr(new ModInfoBackup(dir, directoryStructure)); + result = ModInfo::Ptr(new ModInfoBackup(pluginContainer, gameName, dir, directoryStructure)); } else { - result = ModInfo::Ptr(new ModInfoRegular(dir, directoryStructure)); + result = ModInfo::Ptr(new ModInfoRegular(pluginContainer, gameName, dir, directoryStructure)); } s_Collection.push_back(result); return result; @@ -80,10 +80,11 @@ ModInfo::Ptr ModInfo::createFromPlugin(const QString &modName, const QString &espName, const QStringList &bsaNames, ModInfo::EModType modType, - DirectoryEntry **directoryStructure) { + DirectoryEntry **directoryStructure, + PluginContainer *pluginContainer) { QMutexLocker locker(&s_Mutex); ModInfo::Ptr result = ModInfo::Ptr( - new ModInfoForeign(modName, espName, bsaNames, modType, directoryStructure)); + new ModInfoForeign(modName, espName, bsaNames, modType, directoryStructure, pluginContainer)); s_Collection.push_back(result); return result; } @@ -105,11 +106,11 @@ QString ModInfo::getContentTypeName(int contentType) } } -void ModInfo::createFromOverwrite() +void ModInfo::createFromOverwrite(PluginContainer *pluginContainer) { QMutexLocker locker(&s_Mutex); - s_Collection.push_back(ModInfo::Ptr(new ModInfoOverwrite)); + s_Collection.push_back(ModInfo::Ptr(new ModInfoOverwrite(pluginContainer))); } unsigned int ModInfo::getNumMods() @@ -207,6 +208,7 @@ unsigned int ModInfo::findMod(const boost::function &filter void ModInfo::updateFromDisc(const QString &modDirectory, DirectoryEntry **directoryStructure, + PluginContainer *pluginContainer, bool displayForeign, MOBase::IPluginGame const *game) { @@ -219,7 +221,7 @@ void ModInfo::updateFromDisc(const QString &modDirectory, mods.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); QDirIterator modIter(mods); while (modIter.hasNext()) { - createFrom(QDir(modIter.next()), directoryStructure); + createFrom(pluginContainer, game->gameShortName(), QDir(modIter.next()), directoryStructure); } } @@ -233,11 +235,12 @@ void ModInfo::updateFromDisc(const QString &modDirectory, unmanaged->referenceFile(modName).absoluteFilePath(), unmanaged->secondaryFiles(modName), modType, - directoryStructure); + directoryStructure, + pluginContainer); } } - createFromOverwrite(); + createFromOverwrite(pluginContainer); std::sort(s_Collection.begin(), s_Collection.end(), ModInfo::ByName); @@ -259,21 +262,21 @@ void ModInfo::updateIndices() } -ModInfo::ModInfo() +ModInfo::ModInfo(PluginContainer *pluginContainer) : m_Valid(false), m_PrimaryCategory(-1) { } -void ModInfo::checkChunkForUpdate(const std::vector &modIDs, QObject *receiver) +void ModInfo::checkChunkForUpdate(PluginContainer *pluginContainer, const std::vector &modIDs, QObject *receiver, QString gameName) { if (modIDs.size() != 0) { - NexusInterface::instance()->requestUpdates(modIDs, receiver, QVariant(), QString()); + NexusInterface::instance(pluginContainer)->requestUpdates(modIDs, receiver, QVariant(), gameName, QString()); } } -int ModInfo::checkAllForUpdate(QObject *receiver) +int ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver) { // technically this should be 255 but those requests can take nexus fairly long, produce // large output and may have been the cause of issue #1166 @@ -284,20 +287,33 @@ int ModInfo::checkAllForUpdate(QObject *receiver) //I ought to store this, it's used elsewhere IPluginGame const *game = qApp->property("managed_game").value(); - modIDs.push_back(game->nexusModOrganizerID()); + checkChunkForUpdate(pluginContainer, modIDs, receiver, game->gameShortName()); - for (const ModInfo::Ptr &mod : s_Collection) { + std::multimap> organizedGames; + for (auto mod : s_Collection) { if (mod->canBeUpdated()) { - modIDs.push_back(mod->getNexusID()); - if (modIDs.size() >= chunkSize) { - checkChunkForUpdate(modIDs, receiver); + organizedGames.insert(std::pair>(mod->getGameName(), mod)); + } + } + + QString currentGame = ""; + for (auto game : organizedGames) { + if (currentGame != game.first) { + if (currentGame != "") { + checkChunkForUpdate(pluginContainer, modIDs, receiver, currentGame); modIDs.clear(); } + currentGame = game.first; + } + modIDs.push_back(game.second->getNexusID()); + if (modIDs.size() >= chunkSize) { + checkChunkForUpdate(pluginContainer, modIDs, receiver, currentGame); + modIDs.clear(); } } - checkChunkForUpdate(modIDs, receiver); + checkChunkForUpdate(pluginContainer, modIDs, receiver, currentGame); return result; } -- cgit v1.3.1 From e02614ee1455f0ae9fb9ec9df3b928381ae98079 Mon Sep 17 00:00:00 2001 From: Silarn Date: Fri, 27 Apr 2018 01:57:59 -0500 Subject: Add alternative game flag and check --- src/modflagicondelegate.cpp | 1 + src/modinfo.cpp | 8 ++++---- src/modinfo.h | 5 +++-- src/modinfobackup.cpp | 4 ++-- src/modinfobackup.h | 2 +- src/modinforegular.cpp | 13 +++++++++---- src/modinforegular.h | 6 ++++-- src/modlist.cpp | 7 +++++++ src/organizercore.cpp | 2 +- 9 files changed, 32 insertions(+), 16 deletions(-) (limited to 'src/modinfo.cpp') diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp index 61df0a0d..8b54ab00 100644 --- a/src/modflagicondelegate.cpp +++ b/src/modflagicondelegate.cpp @@ -48,6 +48,7 @@ QString ModFlagIconDelegate::getFlagIcon(ModInfo::EFlag flag) const case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return ":/MO/gui/emblem_conflict_overwritten"; case ModInfo::FLAG_CONFLICT_MIXED: return ":/MO/gui/emblem_conflict_mixed"; case ModInfo::FLAG_CONFLICT_REDUNDANT: return ":MO/gui/emblem_conflict_redundant"; + case ModInfo::FLAG_ALTERNATE_GAME: return ":MO/gui/problem"; default: return QString(); } } diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 2cd3aec7..d916d982 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -61,16 +61,16 @@ bool ModInfo::ByName(const ModInfo::Ptr &LHS, const ModInfo::Ptr &RHS) } -ModInfo::Ptr ModInfo::createFrom(PluginContainer *pluginContainer, QString gameName, const QDir &dir, DirectoryEntry **directoryStructure) +ModInfo::Ptr ModInfo::createFrom(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &dir, DirectoryEntry **directoryStructure) { QMutexLocker locker(&s_Mutex); // int id = s_NextID++; static QRegExp backupExp(".*backup[0-9]*"); ModInfo::Ptr result; if (backupExp.exactMatch(dir.dirName())) { - result = ModInfo::Ptr(new ModInfoBackup(pluginContainer, gameName, dir, directoryStructure)); + result = ModInfo::Ptr(new ModInfoBackup(pluginContainer, game, dir, directoryStructure)); } else { - result = ModInfo::Ptr(new ModInfoRegular(pluginContainer, gameName, dir, directoryStructure)); + result = ModInfo::Ptr(new ModInfoRegular(pluginContainer, game, dir, directoryStructure)); } s_Collection.push_back(result); return result; @@ -221,7 +221,7 @@ void ModInfo::updateFromDisc(const QString &modDirectory, mods.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); QDirIterator modIter(mods); while (modIter.hasNext()) { - createFrom(pluginContainer, game->gameShortName(), QDir(modIter.next()), directoryStructure); + createFrom(pluginContainer, game, QDir(modIter.next()), directoryStructure); } } diff --git a/src/modinfo.h b/src/modinfo.h index 9e9f8971..19be2ca2 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -70,7 +70,8 @@ public: FLAG_CONFLICT_OVERWRITTEN, FLAG_CONFLICT_MIXED, FLAG_CONFLICT_REDUNDANT, - FLAG_PLUGIN_SELECTED + FLAG_PLUGIN_SELECTED, + FLAG_ALTERNATE_GAME }; enum EContent { @@ -191,7 +192,7 @@ public: * @param dir directory to create from * @return pointer to the info-structure of the newly created/added mod */ - static ModInfo::Ptr createFrom(PluginContainer *pluginContainer, QString gameName, const QDir &dir, MOShared::DirectoryEntry **directoryStructure); + static ModInfo::Ptr createFrom(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &dir, MOShared::DirectoryEntry **directoryStructure); /** * @brief create a new "foreign-managed" mod from a tuple of plugin and archives diff --git a/src/modinfobackup.cpp b/src/modinfobackup.cpp index b779dca1..6e307103 100644 --- a/src/modinfobackup.cpp +++ b/src/modinfobackup.cpp @@ -14,7 +14,7 @@ QString ModInfoBackup::getDescription() const } -ModInfoBackup::ModInfoBackup(PluginContainer *pluginContainer, QString gameName, const QDir &path, MOShared::DirectoryEntry **directoryStructure) - : ModInfoRegular(pluginContainer, gameName, path, directoryStructure) +ModInfoBackup::ModInfoBackup(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure) + : ModInfoRegular(pluginContainer, game, path, directoryStructure) { } diff --git a/src/modinfobackup.h b/src/modinfobackup.h index 0a59691b..da1fcd4a 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -33,7 +33,7 @@ public: private: - ModInfoBackup(PluginContainer *pluginContainer, QString gameName, const QDir &path, MOShared::DirectoryEntry **directoryStructure); + ModInfoBackup(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure); }; diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 045366ba..49fc3aa2 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -1,7 +1,6 @@ #include "modinforegular.h" #include "categories.h" -#include "iplugingame.h" #include "messagedialog.h" #include "report.h" #include "scriptextender.h" @@ -24,12 +23,13 @@ namespace { } } -ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, QString gameName, const QDir &path, DirectoryEntry **directoryStructure) +ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, const IPluginGame *game, const QDir &path, DirectoryEntry **directoryStructure) : ModInfoWithConflictInfo(pluginContainer, directoryStructure) - , m_GameName(gameName) , m_Name(path.dirName()) , m_Path(path.absolutePath()) , m_Repository() + , m_GameName(game->gameShortName()) + , m_IsAlternate(false) , m_MetaInfoChanged(false) , m_EndorsedState(ENDORSED_UNKNOWN) , m_NexusBridge(pluginContainer) @@ -38,6 +38,8 @@ ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, QString gameNam m_CreationTime = QFileInfo(path.absolutePath()).created(); // read out the meta-file for information readMeta(); + if (m_GameName.compare(game->gameShortName(), Qt::CaseInsensitive) != 0) + m_IsAlternate = true; connect(&m_NexusBridge, SIGNAL(descriptionAvailable(QString,int,QVariant,QVariant)) , this, SLOT(nxmDescriptionAvailable(QString,int,QVariant,QVariant))); @@ -73,7 +75,7 @@ void ModInfoRegular::readMeta() QSettings metaFile(m_Path + "/meta.ini", QSettings::IniFormat); m_Notes = metaFile.value("notes", "").toString(); QString tempGameName = metaFile.value("gameName", m_GameName).toString(); - if (tempGameName != "") m_GameName = tempGameName; + if (tempGameName.size()) m_GameName = tempGameName; m_NexusID = metaFile.value("modid", -1).toInt(); m_Version.parse(metaFile.value("version", "").toString()); m_NewestVersion = metaFile.value("newestVersion", "").toString(); @@ -433,6 +435,9 @@ std::vector ModInfoRegular::getFlags() const if (m_PluginSelected) { result.push_back(ModInfo::FLAG_PLUGIN_SELECTED); } + if (m_IsAlternate) { + result.push_back(ModInfo::FLAG_ALTERNATE_GAME); + } return result; } diff --git a/src/modinforegular.h b/src/modinforegular.h index cf13872c..c47f10c8 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -2,7 +2,6 @@ #define MODINFOREGULAR_H #include "modinfowithconflictinfo.h" - #include "nexusinterface.h" /** @@ -27,6 +26,8 @@ public: virtual bool isEmpty() const; + bool isAlternate() { return m_IsAlternate; } + /** * @brief test if there is a newer version of the mod * @@ -329,7 +330,7 @@ private slots: protected: - ModInfoRegular(PluginContainer *pluginContainer, QString gameName, const QDir &path, MOShared::DirectoryEntry **directoryStructure); + ModInfoRegular(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure); private: @@ -349,6 +350,7 @@ private: std::set> m_InstalledFileIDs; bool m_MetaInfoChanged; + bool m_IsAlternate; MOBase::VersionInfo m_NewestVersion; MOBase::VersionInfo m_IgnoredVersion; diff --git a/src/modlist.cpp b/src/modlist.cpp index 8c906822..aad88d1f 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -25,6 +25,7 @@ along with Mod Organizer. If not, see . #include "viewmarkingscrollbar.h" #include "modlistsortproxy.h" #include "settings.h" +#include "modinforegular.h" #include #include #include @@ -149,6 +150,7 @@ QString ModList::getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return tr("Overwritten files"); case ModInfo::FLAG_CONFLICT_MIXED: return tr("Overwrites & Overwritten"); case ModInfo::FLAG_CONFLICT_REDUNDANT: return tr("Redundant"); + case ModInfo::FLAG_ALTERNATE_GAME: return tr("Alternate game source"); default: return ""; } } @@ -759,6 +761,11 @@ IModList::ModStates ModList::state(unsigned int modIndex) const if (modInfo->isValid()) { result |= IModList::STATE_VALID; } + if (modInfo->isRegular()) { + QSharedPointer modInfoRegular = modInfo.staticCast(); + if (modInfoRegular->isAlternate()) + result |= IModList::STATE_ALTERNATE; + } if (modInfo->canBeEnabled()) { if (m_Profile->modEnabled(modIndex)) { result |= IModList::STATE_ACTIVE; diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 15596f75..69c28c5c 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -819,7 +819,7 @@ MOBase::IModInterface *OrganizerCore::createMod(GuessedValue &name) settingsFile.endArray(); } - return ModInfo::createFrom(m_PluginContainer, m_GamePlugin->gameShortName(), QDir(targetDirectory), &m_DirectoryStructure) + return ModInfo::createFrom(m_PluginContainer, m_GamePlugin, QDir(targetDirectory), &m_DirectoryStructure) .data(); } -- cgit v1.3.1 From 168da18aa51868ad3ac908affb55a8aabdba1aed Mon Sep 17 00:00:00 2001 From: Silarn Date: Wed, 2 May 2018 12:38:23 -0500 Subject: Fix MO endorsement check and add game to ModInfo s_ModsByModID --- src/downloadmanager.cpp | 8 ++++++++ src/downloadmanager.h | 8 ++++++++ src/mainwindow.cpp | 12 ++++++++++-- src/modinfo.cpp | 14 ++++++++------ src/modinfo.h | 4 ++-- src/organizercore.cpp | 3 ++- 6 files changed, 38 insertions(+), 11 deletions(-) (limited to 'src/modinfo.cpp') diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 097a1168..d9e86544 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -895,6 +895,14 @@ int DownloadManager::getModID(int index) const return m_ActiveDownloads.at(index)->m_FileInfo->modID; } +QString DownloadManager::getGameName(int index) const +{ + if ((index < 0) || (index >= m_ActiveDownloads.size())) { + throw MyException(tr("mod id: invalid download index %1").arg(index)); + } + return m_ActiveDownloads.at(index)->m_FileInfo->gameName; +} + bool DownloadManager::isHidden(int index) const { if ((index < 0) || (index >= m_ActiveDownloads.size())) { diff --git a/src/downloadmanager.h b/src/downloadmanager.h index 0ff77011..e1925040 100644 --- a/src/downloadmanager.h +++ b/src/downloadmanager.h @@ -288,6 +288,14 @@ public: **/ int getModID(int index) const; + /** + * @brief retrieve the game name of the downlaod specified by the index + * + * @param index index of the file to look up + * @return the game name + **/ + QString getGameName(int index) const; + /** * @brief determine if the specified file is supposed to be hidden * @param index index of the file to look up diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3933987e..a95b7b70 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4231,12 +4231,20 @@ void MainWindow::nxmUpdatesAvailable(const std::vector &modIDs, QVariant us QVariantList resultList = resultData.toList(); for (auto iter = resultList.begin(); iter != resultList.end(); ++iter) { QVariantMap result = iter->toMap(); - if (result["id"].toInt() == m_OrganizerCore.managedGame()->nexusModOrganizerID()) { + if (result["id"].toInt() == m_OrganizerCore.managedGame()->nexusModOrganizerID() + && result["game_id"].toInt() == m_OrganizerCore.managedGame()->nexusGameID()) { if (!result["voted_by_user"].toBool()) { ui->actionEndorseMO->setVisible(true); } } else { - std::vector info = ModInfo::getByModID(result["id"].toInt()); + QString gameName = m_OrganizerCore.managedGame()->gameShortName(); + for (IPluginGame *game : m_PluginContainer.plugins()) { + if (game->nexusGameID() == result["game_id"].toInt()) { + gameName = game->gameShortName(); + break; + } + } + std::vector info = ModInfo::getByModID(gameName, result["id"].toInt()); for (auto iter = info.begin(); iter != info.end(); ++iter) { (*iter)->setNewestVersion(result["version"].toString()); (*iter)->setNexusDescription(result["description"].toString()); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index d916d982..6b3fd528 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -48,7 +48,7 @@ using namespace MOShared; std::vector ModInfo::s_Collection; std::map ModInfo::s_ModsByName; -std::map > ModInfo::s_ModsByModID; +std::map, std::vector> ModInfo::s_ModsByModID; int ModInfo::s_NextID; QMutex ModInfo::s_Mutex(QMutex::Recursive); @@ -132,11 +132,11 @@ ModInfo::Ptr ModInfo::getByIndex(unsigned int index) } -std::vector ModInfo::getByModID(int modID) +std::vector ModInfo::getByModID(QString game, int modID) { QMutexLocker locker(&s_Mutex); - auto iter = s_ModsByModID.find(modID); + auto iter = s_ModsByModID.find(std::pair(game, modID)); if (iter == s_ModsByModID.end()) { return std::vector(); } @@ -161,11 +161,11 @@ bool ModInfo::removeMod(unsigned int index) ModInfo::Ptr modInfo = s_Collection[index]; s_ModsByName.erase(s_ModsByName.find(modInfo->name())); - auto iter = s_ModsByModID.find(modInfo->getNexusID()); + auto iter = s_ModsByModID.find(std::pair(modInfo->getGameName(), modInfo->getNexusID())); if (iter != s_ModsByModID.end()) { std::vector indices = iter->second; indices.erase(std::remove(indices.begin(), indices.end(), index), indices.end()); - s_ModsByModID[modInfo->getNexusID()] = indices; + s_ModsByModID[std::pair(modInfo->getGameName(), modInfo->getNexusID())] = indices; } // physically remove the mod directory @@ -255,9 +255,10 @@ void ModInfo::updateIndices() for (unsigned int i = 0; i < s_Collection.size(); ++i) { QString modName = s_Collection[i]->internalName(); + QString game = s_Collection[i]->getGameName(); int modID = s_Collection[i]->getNexusID(); s_ModsByName[modName] = i; - s_ModsByModID[modID].push_back(i); + s_ModsByModID[std::pair(game, modID)].push_back(i); } } @@ -289,6 +290,7 @@ int ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiv IPluginGame const *game = qApp->property("managed_game").value(); modIDs.push_back(game->nexusModOrganizerID()); checkChunkForUpdate(pluginContainer, modIDs, receiver, game->gameShortName()); + modIDs.clear(); std::multimap> organizedGames; for (auto mod : s_Collection) { diff --git a/src/modinfo.h b/src/modinfo.h index 19be2ca2..7bb2bdad 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -148,7 +148,7 @@ public: * @todo in its current form, this function is broken! There may be multiple mods with the same nexus id, * this function will return only one of them **/ - static std::vector getByModID(int modID); + static std::vector getByModID(QString game, int modID); /** * @brief remove a mod by index @@ -638,7 +638,7 @@ protected: private: static QMutex s_Mutex; - static std::map > s_ModsByModID; + static std::map, std::vector > s_ModsByModID; static int s_NextID; bool m_Valid; diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 69c28c5c..4739021a 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -919,13 +919,14 @@ void OrganizerCore::installDownload(int index) { try { QString fileName = m_DownloadManager.getFilePath(index); + QString gameName = m_DownloadManager.getGameName(index); int modID = m_DownloadManager.getModID(index); int fileID = m_DownloadManager.getFileInfo(index)->fileID; GuessedValue modName; // see if there already are mods with the specified mod id if (modID != 0) { - std::vector modInfo = ModInfo::getByModID(modID); + std::vector modInfo = ModInfo::getByModID(gameName, modID); for (auto iter = modInfo.begin(); iter != modInfo.end(); ++iter) { std::vector flags = (*iter)->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) -- cgit v1.3.1 From 6588a81b7f52e94c4fca4a7378ca13307d51b58e Mon Sep 17 00:00:00 2001 From: Silarn Date: Wed, 2 May 2018 13:48:31 -0500 Subject: Only check for the mod organizer endorsement if the ID is set --- src/modinfo.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/modinfo.cpp') diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 6b3fd528..e505bacc 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -288,9 +288,11 @@ int ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiv //I ought to store this, it's used elsewhere IPluginGame const *game = qApp->property("managed_game").value(); - modIDs.push_back(game->nexusModOrganizerID()); - checkChunkForUpdate(pluginContainer, modIDs, receiver, game->gameShortName()); - modIDs.clear(); + if (game->nexusModOrganizerID()) { + modIDs.push_back(game->nexusModOrganizerID()); + checkChunkForUpdate(pluginContainer, modIDs, receiver, game->gameShortName()); + modIDs.clear(); + } std::multimap> organizedGames; for (auto mod : s_Collection) { -- cgit v1.3.1 From 9872c1e462d100221ca38aeb1f8ab35eda7fc8c2 Mon Sep 17 00:00:00 2001 From: Silarn Date: Thu, 3 May 2018 16:17:40 -0500 Subject: Allow for primary game sources and marking mods as converted/working --- src/mainwindow.cpp | 12 ++++++++++++ src/mainwindow.h | 1 + src/modinfo.cpp | 2 +- src/modinfo.h | 5 +++++ src/modinforegular.cpp | 22 +++++++++++++++++----- src/modinforegular.h | 7 +++++++ src/modlist.cpp | 2 +- 7 files changed, 44 insertions(+), 7 deletions(-) (limited to 'src/modinfo.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a95b7b70..d3ea2b08 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2599,6 +2599,14 @@ void MainWindow::ignoreMissingData_clicked() emit modListDataChanged(m_OrganizerCore.modList()->index(m_ContextRow, 0), m_OrganizerCore.modList()->index(m_ContextRow, m_OrganizerCore.modList()->columnCount() - 1)); } +void MainWindow::markConverted_clicked() +{ + ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); + info->markConverted(true); + connect(this, SIGNAL(modListDataChanged(QModelIndex, QModelIndex)), m_OrganizerCore.modList(), SIGNAL(dataChanged(QModelIndex, QModelIndex))); + emit modListDataChanged(m_OrganizerCore.modList()->index(m_ContextRow, 0), m_OrganizerCore.modList()->index(m_ContextRow, m_OrganizerCore.modList()->columnCount() - 1)); +} + void MainWindow::visitOnNexus_clicked() { @@ -3463,6 +3471,10 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Ignore missing data"), this, SLOT(ignoreMissingData_clicked())); } + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_ALTERNATE_GAME) != flags.end()) { + menu->addAction(tr("Mark as converted/working"), this, SLOT(markConverted_clicked())); + } + if (info->getNexusID() > 0) { menu->addAction(tr("Visit on Nexus"), this, SLOT(visitOnNexus_clicked())); } else if ((info->getURL() != "")) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 7f38d766..7af6d712 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -409,6 +409,7 @@ private slots: void dontendorse_clicked(); void unendorse_clicked(); void ignoreMissingData_clicked(); + void markConverted_clicked(); void visitOnNexus_clicked(); void visitWebPage_clicked(); void openExplorer_clicked(); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index e505bacc..bd4c1254 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -414,4 +414,4 @@ void ModInfo::testValid() while (dirIter.hasNext()) { dirIter.next(); } -} +} \ No newline at end of file diff --git a/src/modinfo.h b/src/modinfo.h index 7bb2bdad..001a78dc 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -568,6 +568,11 @@ public: */ void testValid(); + /** + * @brief updates the mod to flag it as converted in order to ignore the alternate game warning + */ + virtual void markConverted(bool converted) {} + /** * @brief reads meta information from disk */ diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 49fc3aa2..c19294f1 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -30,6 +30,7 @@ ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, const IPluginGa , m_Repository() , m_GameName(game->gameShortName()) , m_IsAlternate(false) + , m_Converted(false) , m_MetaInfoChanged(false) , m_EndorsedState(ENDORSED_UNKNOWN) , m_NexusBridge(pluginContainer) @@ -39,7 +40,8 @@ ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, const IPluginGa // read out the meta-file for information readMeta(); if (m_GameName.compare(game->gameShortName(), Qt::CaseInsensitive) != 0) - m_IsAlternate = true; + if (!game->primarySources().contains(m_GameName, Qt::CaseInsensitive)) + m_IsAlternate = true; connect(&m_NexusBridge, SIGNAL(descriptionAvailable(QString,int,QVariant,QVariant)) , this, SLOT(nxmDescriptionAvailable(QString,int,QVariant,QVariant))); @@ -82,9 +84,10 @@ void ModInfoRegular::readMeta() m_IgnoredVersion = metaFile.value("ignoredVersion", "").toString(); m_InstallationFile = metaFile.value("installationFile", "").toString(); m_NexusDescription = metaFile.value("nexusDescription", "").toString(); - m_Repository = metaFile.value("repository", "Nexus").toString(); - m_URL = metaFile.value("url", "").toString(); - m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate); + m_Repository = metaFile.value("repository", "Nexus").toString(); + m_Converted = metaFile.value("converted", false).toBool(); + m_URL = metaFile.value("url", "").toString(); + m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate); if (metaFile.contains("endorsed")) { if (metaFile.value("endorsed").canConvert()) { switch (metaFile.value("endorsed").toInt()) { @@ -146,6 +149,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("nexusDescription", m_NexusDescription); metaFile.setValue("url", m_URL); metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); + metaFile.setValue("converted", m_Converted); if (m_EndorsedState != ENDORSED_UNKNOWN) { metaFile.setValue("endorsed", m_EndorsedState); } @@ -403,6 +407,14 @@ void ModInfoRegular::endorse(bool doEndorse) } } +void ModInfoRegular::markConverted(bool converted) +{ + m_Converted = converted; + m_MetaInfoChanged = true; + saveMeta(); + emit modDetailsUpdated(true); +} + QString ModInfoRegular::absolutePath() const { @@ -435,7 +447,7 @@ std::vector ModInfoRegular::getFlags() const if (m_PluginSelected) { result.push_back(ModInfo::FLAG_PLUGIN_SELECTED); } - if (m_IsAlternate) { + if (m_IsAlternate && !m_Converted) { result.push_back(ModInfo::FLAG_ALTERNATE_GAME); } return result; diff --git a/src/modinforegular.h b/src/modinforegular.h index c47f10c8..3abaded4 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -27,6 +27,7 @@ public: virtual bool isEmpty() const; bool isAlternate() { return m_IsAlternate; } + bool isConverted() { return m_Converted; } /** * @brief test if there is a newer version of the mod @@ -182,6 +183,11 @@ public: */ virtual void endorse(bool doEndorse); + /** + * @brief updates the mod to flag it as converted in order to ignore the alternate game warning + */ + virtual void markConverted(bool converted) override; + /** * @brief getter for the mod name * @@ -351,6 +357,7 @@ private: bool m_MetaInfoChanged; bool m_IsAlternate; + bool m_Converted; MOBase::VersionInfo m_NewestVersion; MOBase::VersionInfo m_IgnoredVersion; diff --git a/src/modlist.cpp b/src/modlist.cpp index aad88d1f..2d58081d 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -763,7 +763,7 @@ IModList::ModStates ModList::state(unsigned int modIndex) const } if (modInfo->isRegular()) { QSharedPointer modInfoRegular = modInfo.staticCast(); - if (modInfoRegular->isAlternate()) + if (modInfoRegular->isAlternate() && !modInfoRegular->isConverted()) result |= IModList::STATE_ALTERNATE; } if (modInfo->canBeEnabled()) { -- cgit v1.3.1