summaryrefslogtreecommitdiff
path: root/src/modinfo.cpp
diff options
context:
space:
mode:
authorMikaƫl Capelle <capelle.mikael@gmail.com>2021-01-10 10:25:37 +0100
committerGitHub <noreply@github.com>2021-01-10 10:25:37 +0100
commit80e44a9e3ade61695b4807a3a900d2866138ecac (patch)
tree1ef9904664d8d34dba6692bbf5325aea8c199d08 /src/modinfo.cpp
parenteaec140f7c823012c09536175d8917dddcacdb7c (diff)
parent4a0ce804ea486744e5f6140a0ce4538d99e21ce3 (diff)
Merge pull request #1338 from Holt59/collapsible-separators
Collapsible separators (and refactoring).
Diffstat (limited to 'src/modinfo.cpp')
-rw-r--r--src/modinfo.cpp78
1 files changed, 41 insertions, 37 deletions
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 16fcf93a..c76cb4ad 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>
@@ -47,6 +50,7 @@ using namespace MOShared;
std::vector<ModInfo::Ptr> ModInfo::s_Collection;
+ModInfo::Ptr ModInfo::s_Overwrite;
std::map<QString, unsigned int> ModInfo::s_ModsByName;
std::map<std::pair<QString, int>, std::vector<unsigned int>> ModInfo::s_ModsByModID;
int ModInfo::s_NextID;
@@ -78,18 +82,19 @@ 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);
return result;
}
@@ -98,23 +103,21 @@ 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;
}
-void ModInfo::createFromOverwrite(PluginContainer *pluginContainer,
- const MOBase::IPluginGame* game,
- MOShared::DirectoryEntry **directoryStructure)
+ModInfo::Ptr ModInfo::createFromOverwrite(OrganizerCore& core)
{
QMutexLocker locker(&s_Mutex);
-
- s_Collection.push_back(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;
}
unsigned int ModInfo::getNumMods()
@@ -174,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()));
@@ -187,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);
@@ -225,28 +232,27 @@ 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()");
QMutexLocker lock(&s_Mutex);
s_Collection.clear();
s_NextID = 0;
+ 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)) {
@@ -256,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);
}
}
- createFromOverwrite(pluginContainer, game, directoryStructure);
+ s_Overwrite = createFromOverwrite(core);
std::sort(s_Collection.begin(), s_Collection.end(), ModInfo::ByName);
@@ -283,14 +286,15 @@ void ModInfo::updateIndices()
QString modName = s_Collection[i]->internalName();
QString game = s_Collection[i]->gameName();
int modID = s_Collection[i]->nexusId();
+ s_Collection[i]->m_Index = i;
s_ModsByName[modName] = i;
s_ModsByModID[std::pair<QString, int>(game, modID)].push_back(i);
}
}
-ModInfo::ModInfo(PluginContainer *pluginContainer)
- : m_PrimaryCategory(-1)
+ModInfo::ModInfo(OrganizerCore& core)
+ : m_PrimaryCategory(-1), m_Core(core)
{
}