summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 19:07:50 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 19:07:50 +0100
commitd96dcf02b131808a25045afc23667ed6a26274a6 (patch)
tree01a42a3c59ed664d2ea9e1e830565d3e2260ca8b /src
parentc7abae79b3042cb5a9ab1174a9955d47e6e38fb8 (diff)
Refactoring of ModInfo to give access to the core. Remove ModInfo::remove() completely.
Diffstat (limited to 'src')
-rw-r--r--src/modinfo.cpp69
-rw-r--r--src/modinfo.h34
-rw-r--r--src/modinfobackup.cpp4
-rw-r--r--src/modinfobackup.h2
-rw-r--r--src/modinfoforeign.cpp13
-rw-r--r--src/modinfoforeign.h6
-rw-r--r--src/modinfooverwrite.cpp5
-rw-r--r--src/modinfooverwrite.h3
-rw-r--r--src/modinforegular.cpp23
-rw-r--r--src/modinforegular.h8
-rw-r--r--src/modinfoseparator.cpp4
-rw-r--r--src/modinfoseparator.h5
-rw-r--r--src/modinfowithconflictinfo.cpp26
-rw-r--r--src/modinfowithconflictinfo.h10
-rw-r--r--src/modlist.cpp11
-rw-r--r--src/organizercore.cpp15
16 files changed, 91 insertions, 147 deletions
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 6f3b530e..d5be538a 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -27,6 +27,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "categories.h"
#include "modinfodialog.h"
+#include "organizercore.h"
+#include "modlist.h"
#include "overwriteinfodialog.h"
#include "versioninfo.h"
#include "thread_utils.h"
@@ -37,6 +39,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <scriptextender.h>
#include <unmanagedmods.h>
#include <log.h>
+#include <report.h>
#include <QApplication>
#include <QDirIterator>
@@ -79,17 +82,17 @@ bool ModInfo::isRegularName(const QString& name)
}
-ModInfo::Ptr ModInfo::createFrom(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &dir, DirectoryEntry **directoryStructure)
+ModInfo::Ptr ModInfo::createFrom(const QDir &dir, OrganizerCore& core)
{
QMutexLocker locker(&s_Mutex);
ModInfo::Ptr result;
if (isBackupName(dir.dirName())) {
- result = ModInfo::Ptr(new ModInfoBackup(pluginContainer, game, dir, directoryStructure));
+ result = ModInfo::Ptr(new ModInfoBackup(dir, core));
} else if (isSeparatorName(dir.dirName())) {
- result = Ptr(new ModInfoSeparator(pluginContainer, game, dir, directoryStructure));
+ result = Ptr(new ModInfoSeparator(dir, core));
} else {
- result = ModInfo::Ptr(new ModInfoRegular(pluginContainer, game, dir, directoryStructure));
+ result = ModInfo::Ptr(new ModInfoRegular(dir, core));
}
result->m_Index = s_Collection.size();
s_Collection.push_back(result);
@@ -100,23 +103,18 @@ ModInfo::Ptr ModInfo::createFromPlugin(const QString &modName,
const QString &espName,
const QStringList &bsaNames,
ModInfo::EModType modType,
- const MOBase::IPluginGame* game,
- DirectoryEntry **directoryStructure,
- PluginContainer *pluginContainer) {
+ OrganizerCore& core) {
QMutexLocker locker(&s_Mutex);
- ModInfo::Ptr result = ModInfo::Ptr(
- new ModInfoForeign(modName, espName, bsaNames, modType, game, directoryStructure, pluginContainer));
+ ModInfo::Ptr result = ModInfo::Ptr(new ModInfoForeign(modName, espName, bsaNames, modType, core));
result->m_Index = s_Collection.size();
s_Collection.push_back(result);
return result;
}
-ModInfo::Ptr ModInfo::createFromOverwrite(
- PluginContainer *pluginContainer, const MOBase::IPluginGame* game,
- MOShared::DirectoryEntry **directoryStructure)
+ModInfo::Ptr ModInfo::createFromOverwrite(OrganizerCore& core)
{
QMutexLocker locker(&s_Mutex);
- ModInfo::Ptr overwrite = ModInfo::Ptr(new ModInfoOverwrite(pluginContainer, game, directoryStructure));
+ ModInfo::Ptr overwrite = ModInfo::Ptr(new ModInfoOverwrite(core));
overwrite->m_Index = s_Collection.size();
s_Collection.push_back(overwrite);
return overwrite;
@@ -179,10 +177,20 @@ bool ModInfo::removeMod(unsigned int index)
QMutexLocker locker(&s_Mutex);
if (index >= s_Collection.size()) {
- throw MyException(tr("remove: invalid mod index %1").arg(index));
+ throw Exception(tr("remove: invalid mod index %1").arg(index));
}
- // update the indices first
+
ModInfo::Ptr modInfo = s_Collection[index];
+
+ // remove the actual mod (this is the most likely to fail so we do this first)
+ if (modInfo->isRegular()) {
+ if (!shellDelete(QStringList(modInfo->absolutePath()), true)) {
+ reportError(tr("remove: failed to delete mod '%1' directory").arg(modInfo->name()));
+ return false;
+ }
+ }
+
+ // update the indices
s_ModsByName.erase(s_ModsByName.find(modInfo->name()));
auto iter = s_ModsByModID.find(std::pair<QString, int>(modInfo->gameName(), modInfo->nexusId()));
@@ -192,12 +200,6 @@ bool ModInfo::removeMod(unsigned int index)
s_ModsByModID[std::pair<QString, int>(modInfo->gameName(), modInfo->nexusId())] = indices;
}
- // physically remove the mod directory
- //TODO the return value is ignored because the indices were already removed here, so stopping
- // would cause data inconsistencies. Instead we go through with the removal but the mod will show up
- // again if the user refreshes
- modInfo->remove();
-
// finally, remove the mod from the collection
s_Collection.erase(s_Collection.begin() + index);
@@ -230,12 +232,9 @@ unsigned int ModInfo::findMod(const boost::function<bool (ModInfo::Ptr)> &filter
}
-void ModInfo::updateFromDisc(const QString &modDirectory,
- DirectoryEntry **directoryStructure,
- PluginContainer *pluginContainer,
- bool displayForeign,
- std::size_t refreshThreadCount,
- MOBase::IPluginGame const *game)
+void ModInfo::updateFromDisc(
+ const QString& modsDirectory, OrganizerCore& core,
+ bool displayForeign, std::size_t refreshThreadCount)
{
TimeThis tt("ModInfo::updateFromDisc()");
@@ -245,14 +244,15 @@ void ModInfo::updateFromDisc(const QString &modDirectory,
s_Overwrite = nullptr;
{ // list all directories in the mod directory and make a mod out of each
- QDir mods(QDir::fromNativeSeparators(modDirectory));
+ QDir mods(QDir::fromNativeSeparators(modsDirectory));
mods.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QDirIterator modIter(mods);
while (modIter.hasNext()) {
- createFrom(pluginContainer, game, QDir(modIter.next()), directoryStructure);
+ createFrom(QDir(modIter.next()), core);
}
}
+ auto* game = core.managedGame();
UnmanagedMods *unmanaged = game->feature<UnmanagedMods>();
if (unmanaged != nullptr) {
for (const QString &modName : unmanaged->mods(!displayForeign)) {
@@ -262,14 +262,11 @@ void ModInfo::updateFromDisc(const QString &modDirectory,
createFromPlugin(unmanaged->displayName(modName),
unmanaged->referenceFile(modName).absoluteFilePath(),
unmanaged->secondaryFiles(modName),
- modType,
- game,
- directoryStructure,
- pluginContainer);
+ modType, core);
}
}
- s_Overwrite = createFromOverwrite(pluginContainer, game, directoryStructure);
+ s_Overwrite = createFromOverwrite(core);
std::sort(s_Collection.begin(), s_Collection.end(), ModInfo::ByName);
@@ -296,8 +293,8 @@ void ModInfo::updateIndices()
}
-ModInfo::ModInfo(PluginContainer *pluginContainer)
- : m_PrimaryCategory(-1)
+ModInfo::ModInfo(OrganizerCore& core)
+ : m_PrimaryCategory(-1), m_Core(core)
{
}
diff --git a/src/modinfo.h b/src/modinfo.h
index f0c7bcb5..08ed94f8 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -23,6 +23,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "imodinterface.h"
#include "versioninfo.h"
+class OrganizerCore;
class PluginContainer;
class QDir;
class QDateTime;
@@ -107,12 +108,9 @@ public: // Static functions:
/**
* @brief Read the mod directory and Mod ModInfo objects for all subdirectories.
*/
- static void updateFromDisc(const QString &modDirectory,
- MOShared::DirectoryEntry **directoryStructure,
- PluginContainer *pluginContainer,
- bool displayForeign,
- std::size_t refreshThreadCount,
- MOBase::IPluginGame const *game);
+ static void updateFromDisc(
+ const QString &modDirectory, OrganizerCore& core,
+ bool displayForeign, std::size_t refreshThreadCount);
static void clear() { s_Collection.clear(); s_ModsByName.clear(); s_ModsByModID.clear(); }
@@ -467,14 +465,6 @@ public: // Mutable operations:
*/
virtual bool setName(const QString& name) = 0;
- /**
- * @brief Deletes the mod from the disc. This does not update the global ModInfo structure or
- * indices.
- *
- * @return true on success, false otherwise.
- */
- virtual bool remove() = 0;
-
public: // Methods after this do not come from IModInterface:
/**
@@ -945,7 +935,7 @@ protected:
/**
*
*/
- ModInfo(PluginContainer *pluginContainer);
+ ModInfo(OrganizerCore& core);
/**
* @brief Prefetch content for this mod.
@@ -959,6 +949,9 @@ protected:
protected:
+ // the mod list
+ OrganizerCore& m_Core;
+
// the index of the mod in s_Collection, only valid after updateIndices()
int m_Index;
@@ -978,9 +971,7 @@ protected:
*
* @return pointer to the info-structure of the newly created/added mod.
*/
- static ModInfo::Ptr createFrom(
- PluginContainer* pluginContainer, const MOBase::IPluginGame* game,
- const QDir& dir, MOShared::DirectoryEntry** directoryStructure);
+ static ModInfo::Ptr createFrom(const QDir& dir, OrganizerCore& core);
/**
* @brief Create a new "foreign-managed" mod from a tuple of plugin and archives.
@@ -992,12 +983,9 @@ protected:
*/
static ModInfo::Ptr createFromPlugin(
const QString& modName, const QString& espName, const QStringList& bsaNames,
- ModInfo::EModType modType, const MOBase::IPluginGame* game,
- MOShared::DirectoryEntry** directoryStructure, PluginContainer* pluginContainer);
+ ModInfo::EModType modType, OrganizerCore& core);
- static ModInfo::Ptr createFromOverwrite(PluginContainer* pluginContainer,
- const MOBase::IPluginGame* game,
- MOShared::DirectoryEntry** directoryStructure);
+ static ModInfo::Ptr createFromOverwrite(OrganizerCore& core);
// update the m_Index attribute of all mods and the various mapping
//
diff --git a/src/modinfobackup.cpp b/src/modinfobackup.cpp
index 6a34b86a..603e74f6 100644
--- a/src/modinfobackup.cpp
+++ b/src/modinfobackup.cpp
@@ -15,7 +15,7 @@ QString ModInfoBackup::getDescription() const
}
-ModInfoBackup::ModInfoBackup(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure)
- : ModInfoRegular(pluginContainer, game, path, directoryStructure)
+ModInfoBackup::ModInfoBackup(const QDir& path, OrganizerCore& core)
+ : ModInfoRegular(path, core)
{
}
diff --git a/src/modinfobackup.h b/src/modinfobackup.h
index bf5dc5e6..f25ee9cf 100644
--- a/src/modinfobackup.h
+++ b/src/modinfobackup.h
@@ -42,7 +42,7 @@ public:
private:
- ModInfoBackup(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure);
+ ModInfoBackup(const QDir& path, OrganizerCore& core);
};
diff --git a/src/modinfoforeign.cpp b/src/modinfoforeign.cpp
index 19413891..97d3f4e1 100644
--- a/src/modinfoforeign.cpp
+++ b/src/modinfoforeign.cpp
@@ -42,14 +42,11 @@ QString ModInfoForeign::getDescription() const
return tr("This pseudo mod represents content managed outside MO. It isn't modified by MO.");
}
-ModInfoForeign::ModInfoForeign(const QString &modName,
- const QString &referenceFile,
- const QStringList &archives,
- ModInfo::EModType modType,
- const MOBase::IPluginGame* gamePlugin,
- DirectoryEntry **directoryStructure,
- PluginContainer *pluginContainer)
- : ModInfoWithConflictInfo(pluginContainer, gamePlugin, directoryStructure),
+ModInfoForeign::ModInfoForeign(
+ const QString &modName, const QString &referenceFile,
+ const QStringList &archives, ModInfo::EModType modType,
+ OrganizerCore& core)
+ : ModInfoWithConflictInfo(core),
m_ReferenceFile(referenceFile), m_Archives(archives), m_ModType(modType)
{
m_CreationTime = QFileInfo(referenceFile).birthTime();
diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h
index 0a4ec42a..31fd13aa 100644
--- a/src/modinfoforeign.h
+++ b/src/modinfoforeign.h
@@ -32,7 +32,6 @@ public:
virtual void setIsEndorsed(bool) override {}
virtual void setNeverEndorse() override {}
virtual void setIsTracked(bool) override {}
- virtual bool remove() override { return false; }
virtual void endorse(bool) override {}
virtual void track(bool) override {}
virtual bool isEmpty() const override { return false; }
@@ -81,9 +80,8 @@ public:
protected:
ModInfoForeign(const QString &modName, const QString &referenceFile,
const QStringList &archives, ModInfo::EModType modType,
- const MOBase::IPluginGame *gamePlugin,
- MOShared::DirectoryEntry **directoryStructure, PluginContainer *pluginContainer);
-
+ OrganizerCore &core);
+
private:
QString m_Name;
diff --git a/src/modinfooverwrite.cpp b/src/modinfooverwrite.cpp
index 8aad6209..5ee7a0d9 100644
--- a/src/modinfooverwrite.cpp
+++ b/src/modinfooverwrite.cpp
@@ -6,8 +6,7 @@
#include <QApplication>
#include <QDirIterator>
-ModInfoOverwrite::ModInfoOverwrite(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, MOShared::DirectoryEntry **directoryStructure)
- : ModInfoWithConflictInfo(pluginContainer, game, directoryStructure)
+ModInfoOverwrite::ModInfoOverwrite(OrganizerCore& core) : ModInfoWithConflictInfo(core)
{
}
@@ -60,7 +59,7 @@ QString ModInfoOverwrite::getDescription() const
"modified (i.e. by the construction kit)");
}
-QStringList ModInfoOverwrite::archives(bool checkOnDisk)
+QStringList ModInfoOverwrite::archives(bool checkOnDisk)
{
QStringList result;
QDir dir(this->absolutePath());
diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h
index 7236d3bf..065a3ba2 100644
--- a/src/modinfooverwrite.h
+++ b/src/modinfooverwrite.h
@@ -34,7 +34,6 @@ public:
virtual void setIsEndorsed(bool) override {}
virtual void setNeverEndorse() override {}
virtual void setIsTracked(bool) override {}
- virtual bool remove() override { return false; }
virtual void endorse(bool) override {}
virtual void track(bool) override {}
virtual bool alwaysEnabled() const override { return true; }
@@ -78,7 +77,7 @@ public:
virtual std::map<QString, QVariant> clearPluginSettings(const QString& pluginName) override { return {}; }
private:
- ModInfoOverwrite(PluginContainer *pluginContainer, const MOBase::IPluginGame* game, MOShared::DirectoryEntry **directoryStructure);
+ ModInfoOverwrite(OrganizerCore& core);
};
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index 6363dd6e..94f2fc31 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -5,6 +5,9 @@
#include "report.h"
#include "moddatacontent.h"
#include "settings.h"
+#include "organizercore.h"
+#include "plugincontainer.h"
+#include <iplugingame.h>
#include <QApplication>
#include <QDirIterator>
@@ -24,25 +27,25 @@ namespace {
}
}
-ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, const IPluginGame *game, const QDir &path, DirectoryEntry **directoryStructure)
- : ModInfoWithConflictInfo(pluginContainer, game, directoryStructure)
+ModInfoRegular::ModInfoRegular(const QDir &path, OrganizerCore& core)
+ : ModInfoWithConflictInfo(core)
, m_Name(path.dirName())
, m_Path(path.absolutePath())
, m_Repository()
- , m_GameName(game->gameShortName())
+ , m_GameName(core.managedGame()->gameShortName())
, m_IsAlternate(false)
, m_Converted(false)
, m_Validated(false)
, m_MetaInfoChanged(false)
, m_EndorsedState(EndorsedState::ENDORSED_UNKNOWN)
, m_TrackedState(TrackedState::TRACKED_UNKNOWN)
- , m_NexusBridge(pluginContainer)
+ , m_NexusBridge(&core.pluginContainer())
{
m_CreationTime = QFileInfo(path.absolutePath()).birthTime();
// read out the meta-file for information
readMeta();
- if (m_GameName.compare(game->gameShortName(), Qt::CaseInsensitive) != 0)
- if (!game->primarySources().contains(m_GameName, Qt::CaseInsensitive))
+ if (m_GameName.compare(core.managedGame()->gameShortName(), Qt::CaseInsensitive) != 0)
+ if (!core.managedGame()->primarySources().contains(m_GameName, Qt::CaseInsensitive))
m_IsAlternate = true;
//populate m_Archives
@@ -588,12 +591,6 @@ QColor ModInfoRegular::color() const
return m_Color;
}
-bool ModInfoRegular::remove()
-{
- m_MetaInfoChanged = false;
- return shellDelete(QStringList(absolutePath()), true);
-}
-
void ModInfoRegular::endorse(bool doEndorse)
{
if (doEndorse != (m_EndorsedState == EndorsedState::ENDORSED_TRUE)) {
@@ -684,7 +681,7 @@ std::vector<ModInfo::EFlag> ModInfoRegular::getFlags() const
std::set<int> ModInfoRegular::doGetContents() const
{
- ModDataContent* contentFeature = m_GamePlugin->feature<ModDataContent>();
+ ModDataContent* contentFeature = m_Core.managedGame()->feature<ModDataContent>();
if (contentFeature) {
auto result = contentFeature->getContentsFor(fileTree());
diff --git a/src/modinforegular.h b/src/modinforegular.h
index f2e0b82d..08660993 100644
--- a/src/modinforegular.h
+++ b/src/modinforegular.h
@@ -187,12 +187,6 @@ public:
virtual void setIsTracked(bool tracked) override;
/**
- * @brief delete the mod from the disc. This does not update the global ModInfo structure or indices
- * @return true if the mod was successfully removed
- **/
- bool remove() override;
-
- /**
* @brief endorse or un-endorse the mod
* @param doEndorse if true, the mod is endorsed, if false, it's un-endorsed.
* @note if doEndorse doesn't differ from the current value, nothing happens.
@@ -424,7 +418,7 @@ protected:
virtual std::set<int> doGetContents() const override;
- ModInfoRegular(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure);
+ ModInfoRegular(const QDir& path, OrganizerCore& core);
private:
diff --git a/src/modinfoseparator.cpp b/src/modinfoseparator.cpp
index 58c8310a..02a67ecd 100644
--- a/src/modinfoseparator.cpp
+++ b/src/modinfoseparator.cpp
@@ -30,7 +30,7 @@ QString ModInfoSeparator::name() const
}
-ModInfoSeparator::ModInfoSeparator(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure)
- : ModInfoRegular(pluginContainer, game, path, directoryStructure)
+ModInfoSeparator::ModInfoSeparator(const QDir& path, OrganizerCore& core)
+ : ModInfoRegular(path, core)
{
}
diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h
index c7df7184..eaff7c42 100644
--- a/src/modinfoseparator.h
+++ b/src/modinfoseparator.h
@@ -54,10 +54,7 @@ protected:
private:
- ModInfoSeparator(
- PluginContainer* pluginContainer,
- const MOBase::IPluginGame* game, const QDir& path,
- MOShared::DirectoryEntry** directoryStructure);
+ ModInfoSeparator(const QDir& path, OrganizerCore& core);
};
#endif
diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp
index ad7eda3f..7a51a727 100644
--- a/src/modinfowithconflictinfo.cpp
+++ b/src/modinfowithconflictinfo.cpp
@@ -5,6 +5,7 @@
#include "shared/fileentry.h"
#include <filesystem>
+#include "organizercore.h"
#include "iplugingame.h"
#include "moddatachecker.h"
#include "qdirfiletree.h"
@@ -13,13 +14,12 @@ using namespace MOBase;
using namespace MOShared;
namespace fs = std::filesystem;
-ModInfoWithConflictInfo::ModInfoWithConflictInfo(
- PluginContainer *pluginContainer, const MOBase::IPluginGame* gamePlugin, DirectoryEntry **directoryStructure)
- : ModInfo(pluginContainer), m_GamePlugin(gamePlugin),
+ModInfoWithConflictInfo::ModInfoWithConflictInfo(OrganizerCore& core) :
+ ModInfo(core),
m_FileTree([this]() { return QDirFileTree::makeTree(absolutePath()); }),
m_Valid([this]() { return doIsValid(); }),
m_Contents([this]() { return doGetContents(); }),
- m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false), m_HasHiddenFiles(false) {}
+ m_HasLooseOverwrite(false), m_HasHiddenFiles(false) {}
void ModInfoWithConflictInfo::clearCaches()
{
@@ -95,8 +95,8 @@ void ModInfoWithConflictInfo::doConflictCheck() const
bool hasHiddenFiles = false;
int dataID = 0;
- if ((*m_DirectoryStructure)->originExists(L"data")) {
- dataID = (*m_DirectoryStructure)->getOriginByName(L"data").getID();
+ if (m_Core.directoryStructure()->originExists(L"data")) {
+ dataID = m_Core.directoryStructure()->getOriginByName(L"data").getID();
}
std::wstring name = ToWString(this->name());
@@ -106,8 +106,8 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_ArchiveConflictState = CONFLICT_NONE;
m_ArchiveConflictLooseState = CONFLICT_NONE;
- if ((*m_DirectoryStructure)->originExists(name)) {
- FilesOrigin &origin = (*m_DirectoryStructure)->getOriginByName(name);
+ if (m_Core.directoryStructure()->originExists(name)) {
+ FilesOrigin &origin = m_Core.directoryStructure()->getOriginByName(name);
std::vector<FileEntryPtr> files = origin.getFiles();
std::set<const DirectoryEntry*> checkedDirs;
@@ -164,7 +164,7 @@ void ModInfoWithConflictInfo::doConflictCheck() const
// If this is not the origin then determine the correct overwrite
if (file->getOrigin() != origin.getID()) {
- FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(file->getOrigin());
+ FilesOrigin &altOrigin = m_Core.directoryStructure()->getOriginByID(file->getOrigin());
unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
if (!file->isFromArchive()) {
if (!archiveData.isValid())
@@ -182,7 +182,7 @@ void ModInfoWithConflictInfo::doConflictCheck() const
// Sort out the alternatives
for (const auto& altInfo : alternatives) {
if ((altInfo.originID() != dataID) && (altInfo.originID() != origin.getID())) {
- FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(altInfo.originID());
+ FilesOrigin &altOrigin = m_Core.directoryStructure()->getOriginByID(altInfo.originID());
QString altOriginName = ToQString(altOrigin.getName());
unsigned int altIndex = ModInfo::getIndex(altOriginName);
if (!altInfo.isFromArchive()) {
@@ -276,8 +276,8 @@ ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isLooseArchiveCo
bool ModInfoWithConflictInfo::isRedundant() const
{
std::wstring name = ToWString(this->name());
- if ((*m_DirectoryStructure)->originExists(name)) {
- FilesOrigin &origin = (*m_DirectoryStructure)->getOriginByName(name);
+ if (m_Core.directoryStructure()->originExists(name)) {
+ FilesOrigin &origin = m_Core.directoryStructure()->getOriginByName(name);
std::vector<FileEntryPtr> files = origin.getFiles();
bool ignore = false;
for (auto iter = files.begin(); iter != files.end(); ++iter) {
@@ -315,7 +315,7 @@ void ModInfoWithConflictInfo::prefetch() {
}
bool ModInfoWithConflictInfo::doIsValid() const {
- auto mdc = m_GamePlugin->feature<ModDataChecker>();
+ auto mdc = m_Core.managedGame()->feature<ModDataChecker>();
if (mdc) {
auto qdirfiletree = fileTree();
diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h
index 0d11fcb1..889f1246 100644
--- a/src/modinfowithconflictinfo.h
+++ b/src/modinfowithconflictinfo.h
@@ -91,10 +91,7 @@ protected:
**/
virtual std::set<int> doGetContents() const { return {}; }
- ModInfoWithConflictInfo(
- PluginContainer* pluginContainer,
- const MOBase::IPluginGame* gamePlugin,
- MOShared::DirectoryEntry** directoryStructure);
+ ModInfoWithConflictInfo(OrganizerCore& core);
private:
@@ -142,17 +139,12 @@ protected:
*/
virtual void prefetch() override;
- // Current game plugin running in MO2:
- MOBase::IPluginGame const * const m_GamePlugin;
-
private:
MOBase::MemoizedLocked<std::shared_ptr<const MOBase::IFileTree>> m_FileTree;
MOBase::MemoizedLocked<bool> m_Valid;
MOBase::MemoizedLocked<std::set<int>> m_Contents;
- MOShared::DirectoryEntry **m_DirectoryStructure;
-
mutable EConflictType m_CurrentConflictState;
mutable EConflictType m_ArchiveConflictState;
mutable EConflictType m_ArchiveConflictLooseState;
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 6d53c4f5..a2e59b62 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -1009,16 +1009,7 @@ MOBase::IModInterface* ModList::getMod(const QString& name) const
bool ModList::removeMod(MOBase::IModInterface* mod)
{
- unsigned int index = ModInfo::getIndex(mod->name());
- bool result = false;
- if (index == UINT_MAX) {
- if (auto* p = dynamic_cast<ModInfo*>(mod)) {
- result = p->remove();
- }
- }
- else {
- result = ModInfo::removeMod(index);
- }
+ bool result = ModInfo::removeMod(ModInfo::getIndex(mod->name()));
if (result) {
notifyModRemoved(mod->name());
}
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index bf9308b8..d952bc4c 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -219,9 +219,9 @@ void OrganizerCore::updateExecutablesList()
void OrganizerCore::updateModInfoFromDisc() {
ModInfo::updateFromDisc(
- m_Settings.paths().mods(), &m_DirectoryStructure,
- m_PluginContainer, m_Settings.interface().displayForeign(),
- m_Settings.refreshThreadCount(), managedGame());
+ m_Settings.paths().mods(), *this,
+ m_Settings.interface().displayForeign(),
+ m_Settings.refreshThreadCount());
}
void OrganizerCore::setUserInterface(IUserInterface* ui)
@@ -692,8 +692,7 @@ MOBase::IModInterface *OrganizerCore::createMod(GuessedValue<QString> &name)
// shouldn't this use the existing mod in case of a merge? also, this does not refresh the indices
// in the ModInfo structure
- return ModInfo::createFrom(m_PluginContainer, m_GamePlugin, QDir(targetDirectory), &m_DirectoryStructure)
- .data();
+ return ModInfo::createFrom(QDir(targetDirectory), *this).data();
}
void OrganizerCore::modDataChanged(MOBase::IModInterface *)
@@ -1219,11 +1218,7 @@ void OrganizerCore::refresh(bool saveChanges)
m_CurrentProfile->writeModlistNow(true);
}
- ModInfo::updateFromDisc(
- m_Settings.paths().mods(), &m_DirectoryStructure,
- m_PluginContainer, m_Settings.interface().displayForeign(),
- m_Settings.refreshThreadCount(), managedGame());
-
+ updateModInfoFromDisc();
m_CurrentProfile->refreshModStatus();
m_ModList.notifyChange(-1);