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/modinfobackup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modinfobackup.h') diff --git a/src/modinfobackup.h b/src/modinfobackup.h index adbac783..aa59dda4 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -32,7 +32,7 @@ public: private: - ModInfoBackup(const QDir &path, MOShared::DirectoryEntry **directoryStructure); + ModInfoBackup(PluginContainer *pluginContainer, QString gameName, const QDir &path, MOShared::DirectoryEntry **directoryStructure); }; -- cgit v1.3.1 From 7688175c68c2f1ce85951173c0aa3e186587aa1f Mon Sep 17 00:00:00 2001 From: Silarn Date: Tue, 17 Apr 2018 02:47:07 -0500 Subject: Add source game setter in mod info dialog --- src/modinfo.h | 23 ++++++++++++++-------- src/modinfobackup.h | 1 + src/modinfodialog.cpp | 25 ++++++++++++++++++++++++ src/modinfodialog.h | 1 + src/modinfodialog.ui | 52 +++++++++++++++++++++++++++++++++++++++----------- src/modinfoforeign.h | 1 + src/modinfooverwrite.h | 1 + src/modinforegular.cpp | 6 ++++++ src/modinforegular.h | 7 +++++++ 9 files changed, 98 insertions(+), 19 deletions(-) (limited to 'src/modinfobackup.h') diff --git a/src/modinfo.h b/src/modinfo.h index f321f068..07dccafd 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -265,7 +265,14 @@ public: * @brief change the notes (manually set information) for this mod * @param notes new notes */ - virtual void setNotes(const QString ¬es) = 0; + virtual void setNotes(const QString ¬es) = 0; + + /** + * @brief set/change the source game of this mod + * + * @param gameName the source game shortName + */ + virtual void setGameName(QString gameName) = 0; /** * @brief set/change the nexus mod id of this mod @@ -411,13 +418,13 @@ public: * * @return the nexus mod id. may be 0 if the mod id isn't known or doesn't exist **/ - virtual int getNexusID() const = 0; - - /** - * @brief getter for the source game repository - * - * @return the source game repository. should default to the active game. - **/ + virtual int getNexusID() const = 0; + + /** + * @brief getter for the source game repository + * + * @return the source game repository. should default to the active game. + **/ virtual QString getGameName() const = 0; /** diff --git a/src/modinfobackup.h b/src/modinfobackup.h index aa59dda4..0a59691b 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -14,6 +14,7 @@ public: virtual bool updateIgnored() const { return false; } virtual bool downgradeAvailable() const { return false; } virtual bool updateNXMInfo() { return false; } + virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void endorse(bool) {} virtual int getFixedPriority() const { return -1; } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 31ffe82d..e2da6a2c 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -92,6 +92,21 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->modIDEdit->setValidator(new QIntValidator(modIDEdit)); ui->modIDEdit->setText(QString("%1").arg(modInfo->getNexusID())); + ui->sourceGameEdit->addItem(organizerCore->managedGame()->gameName(), organizerCore->managedGame()->gameShortName()); + if (organizerCore->managedGame()->validShortNames().size() == 0) { + ui->sourceGameEdit->setDisabled(true); + } else { + for (auto game : pluginContainer->plugins()) { + for (QString gameName : organizerCore->managedGame()->validShortNames()) { + if (game->gameShortName().compare(gameName, Qt::CaseInsensitive) == 0) { + ui->sourceGameEdit->addItem(game->gameName(), game->gameShortName()); + break; + } + } + } + } + ui->sourceGameEdit->setCurrentIndex(ui->sourceGameEdit->findData(m_ModInfo->getGameName())); + ui->notesEdit->setText(modInfo->notes()); ui->descriptionView->setPage(new DescriptionPage); @@ -901,6 +916,16 @@ void ModInfoDialog::on_modIDEdit_editingFinished() } } +void ModInfoDialog::on_sourceGameEdit_currentIndexChanged(int) +{ + for (auto game : m_PluginContainer->plugins()) { + if (game->gameName() == ui->sourceGameEdit->currentText()) { + m_ModInfo->setGameName(game->gameShortName()); + return; + } + } +} + void ModInfoDialog::on_versionEdit_editingFinished() { VersionInfo version(ui->versionEdit->text()); diff --git a/src/modinfodialog.h b/src/modinfodialog.h index 9eb17be5..52db5654 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -179,6 +179,7 @@ private slots: void on_saveTXTButton_clicked(); void on_visitNexusLabel_linkActivated(const QString &link); void on_modIDEdit_editingFinished(); + void on_sourceGameEdit_currentIndexChanged(int); void on_versionEdit_editingFinished(); void on_iniFileView_textChanged(); void on_textFileView_textChanged(); diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 05415445..9e9ba77b 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -110,19 +110,19 @@ - + false - + - Ini Tweaks *This feature is non-functional* + Ini Tweaks *This feature is non-functional* - + false - + 228 @@ -238,8 +238,8 @@ 0 0 - 98 - 28 + 676 + 126 @@ -490,7 +490,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e - Qt::CustomContextMenu + Qt::CustomContextMenu Qt::ElideLeft @@ -502,7 +502,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e true - 2 + 2 365 @@ -613,6 +613,36 @@ p, li { white-space: pre-wrap; } + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + Source Game + + + + + + + Mod ID for this mod on Nexus. + + + @@ -819,9 +849,9 @@ p, li { white-space: pre-wrap; } - QQuickWidget + QWebEngineView QWidget -
QtQuickWidgets/QQuickWidget
+
QtWebEngineWidgets/QWebEngineView
diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index 23500df8..0d7b3847 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -19,6 +19,7 @@ public: virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } virtual void setNotes(const QString&) {} + virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} virtual void ignoreUpdate(bool) {} diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h index 360c7335..5681dc6f 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -21,6 +21,7 @@ public: virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } virtual void setNotes(const QString&) {} + virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} virtual void ignoreUpdate(bool) {} diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 69718705..a514e1bf 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -319,6 +319,12 @@ void ModInfoRegular::setNotes(const QString ¬es) m_MetaInfoChanged = true; } +void ModInfoRegular::setGameName(QString gameName) +{ + m_GameName = gameName; + m_MetaInfoChanged = true; +} + void ModInfoRegular::setNexusID(int modID) { m_NexusID = modID; diff --git a/src/modinforegular.h b/src/modinforegular.h index 7a6f4827..cf13872c 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -93,6 +93,13 @@ public: */ void setNotes(const QString ¬es); + /** + * @brief set/change the source game of this mod + * + * @param gameName the source game shortName + */ + void setGameName(QString gameName); + /** * @brief set/change the nexus mod id of this mod * -- 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/modinfobackup.h') 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