From 8d6c715672023577dca5a6528ff49081dede1052 Mon Sep 17 00:00:00 2001 From: Silarn Date: Wed, 11 Apr 2018 17:46:59 -0500 Subject: Initial archive conflict parsing Squashed commit: Basic archive conflict parsing - pass 1 Merge fixes for archive parsing Basic archive conflict parsing - pass 1 Merge fixes for archive parsing Should fix conflict detection for archive files --- src/directoryrefresher.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/directoryrefresher.cpp') diff --git a/src/directoryrefresher.cpp b/src/directoryrefresher.cpp index 272b0596..5c789049 100644 --- a/src/directoryrefresher.cpp +++ b/src/directoryrefresher.cpp @@ -27,6 +27,8 @@ along with Mod Organizer. If not, see . #include #include #include +#include +#include using namespace MOBase; @@ -83,13 +85,30 @@ void DirectoryRefresher::addModBSAToStructure(DirectoryEntry *directoryStructure int priority, const QString &directory, const QStringList &archives) { std::wstring directoryW = ToWString(QDir::toNativeSeparators(directory)); + QStringList loadOrder = QStringList(); for (const QString &archive : archives) { QFileInfo fileInfo(archive); if (m_EnabledArchives.find(fileInfo.fileName()) != m_EnabledArchives.end()) { + IPluginGame *game = qApp->property("managed_game").value(); + + GamePlugins *gamePlugins = game->feature(); + QStringList loadOrder = QStringList(); + gamePlugins->getLoadOrder(loadOrder); + + int order = -1; + + for (auto plugin : loadOrder) + { + QString name = plugin.left(plugin.size() - 4); + if (fileInfo.fileName().startsWith(name + " - ", Qt::CaseInsensitive) || fileInfo.fileName().startsWith(name + ".", Qt::CaseInsensitive)) { + order = loadOrder.indexOf(plugin); + } + } + try { - //directoryStructure->addFromBSA(ToWString(modName), directoryW, - // ToWString(QDir::toNativeSeparators(fileInfo.absoluteFilePath())), priority); + IPluginGame *game = qApp->property("managed_game").value(); + directoryStructure->addFromBSA(ToWString(modName), directoryW, ToWString(QDir::toNativeSeparators(fileInfo.absoluteFilePath())), priority, order); } catch (const std::exception &e) { throw MyException(tr("failed to parse bsa %1: %2").arg(archive, e.what())); } @@ -115,7 +134,7 @@ void DirectoryRefresher::addModFilesToStructure(DirectoryEntry *directoryStructu file->removeOrigin(0); } origin.addFile(file->getIndex()); - file->addOrigin(origin.getID(), file->getFileTime(), L""); + file->addOrigin(origin.getID(), file->getFileTime(), L"", -1); } else { qWarning("%s not found", qPrintable(fileInfo.fileName())); } @@ -162,6 +181,8 @@ void DirectoryRefresher::refresh() emit progress((i * 100) / static_cast(m_Mods.size()) + 1); } + m_DirectoryStructure->getFileRegister()->sortOrigins(); + emit progress(100); cleanStructure(m_DirectoryStructure); -- cgit v1.3.1