summaryrefslogtreecommitdiff
path: root/src/modinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modinfo.cpp')
-rw-r--r--src/modinfo.cpp69
1 files changed, 33 insertions, 36 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)
{
}