From 3a8ea3cccee06397e90305e1e39a305f8b7c3cb3 Mon Sep 17 00:00:00 2001 From: Jeremy Rimpo Date: Fri, 23 May 2025 14:08:01 -0500 Subject: Oblivion Remastered Meta PR (#2241) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Allow for mod directory maps - Set main data files based on game - Mapped mod directories to VFS - Update overwrite setup * Skip if mod contains no 'data' dir * More mod directory compatibility fixes * Workaround for Obl:Rem save location - SLocalSavePath does nothing yet MO2 wants to use it to override the default save location - This only applies to BGS games anyway, we should move this logic * First pass for overwrite mod directory support * More overwrite move / delete restrictions * Fix issue with moving directories that are not required * Formatting pass * More modDataDirectory updates * Formatting --------- Co-authored-by: Mikaƫl Capelle --- src/modlistviewactions.cpp | 63 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 9 deletions(-) (limited to 'src/modlistviewactions.cpp') diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp index a38e876b..efe48c31 100644 --- a/src/modlistviewactions.cpp +++ b/src/modlistviewactions.cpp @@ -548,7 +548,7 @@ void ModListViewActions::displayModInformation(ModInfo::Ptr modInfo, QDialog* dialog = m_parent->findChild("__overwriteDialog"); try { if (dialog == nullptr) { - dialog = new OverwriteInfoDialog(modInfo, m_parent); + dialog = new OverwriteInfoDialog(modInfo, m_core, m_parent); dialog->setObjectName("__overwriteDialog"); } else { qobject_cast(dialog)->setModInfo(modInfo); @@ -599,10 +599,12 @@ void ModListViewActions::displayModInformation(ModInfo::Ptr modInfo, FilesOrigin& origin = m_core.directoryStructure()->getOriginByName(ToWString(modInfo->name())); origin.enable(false); - + QString path = modInfo->absolutePath(); + QString modDataDir = m_core.managedGame()->modDataDirectory(); + path = modDataDir.isEmpty() ? path : path + "/" + modDataDir; m_core.directoryRefresher()->addModToStructure( m_core.directoryStructure(), modInfo->name(), - m_core.currentProfile()->getModPriority(modIndex), modInfo->absolutePath(), + m_core.currentProfile()->getModPriority(modIndex), path, modInfo->stealFiles(), modInfo->archives()); DirectoryRefresher::cleanStructure(m_core.directoryStructure()); m_core.directoryStructure()->getFileRegister()->sortOrigins(); @@ -1299,9 +1301,42 @@ void ModListViewActions::restoreBackup(const QModelIndex& index) const void ModListViewActions::moveOverwriteContentsTo(const QString& absolutePath) const { ModInfo::Ptr overwriteInfo = ModInfo::getOverwrite(); - bool successful = - shellMove((QDir::toNativeSeparators(overwriteInfo->absolutePath()) + "\\*"), - (QDir::toNativeSeparators(absolutePath)), false, m_parent); + bool successful = false; + if (m_core.managedGame()->getModMappings().count() > 1 || + m_core.managedGame()->getModMappings().keys().first() != "") { + QDirIterator iter(overwriteInfo->absolutePath(), + QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot); + while (iter.hasNext()) { + auto entry = iter.nextFileInfo(); + if (entry.isDir() && m_core.managedGame()->getModMappings().keys().contains( + entry.fileName(), Qt::CaseInsensitive)) { + successful = + shellCopy((QDir::toNativeSeparators(entry.absolutePath())), + (QDir::toNativeSeparators(absolutePath)), false, m_parent); + QDirIterator subDirIter(entry.absoluteFilePath(), + QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot); + while (subDirIter.hasNext()) { + auto subDirEntry = subDirIter.nextFileInfo(); + if (subDirEntry.isDir()) { + QDir(subDirEntry.absoluteFilePath()).removeRecursively(); + } else { + QFile(subDirEntry.absoluteFilePath()).remove(); + } + } + } else { + successful = + shellMove((QDir::toNativeSeparators(iter.filePath())), + (QDir::toNativeSeparators(absolutePath)), false, m_parent); + } + if (!successful) + break; + } + + } else { + successful = + shellMove((QDir::toNativeSeparators(overwriteInfo->absolutePath()) + "\\*"), + (QDir::toNativeSeparators(absolutePath)), false, m_parent); + } if (successful) { MessageDialog::showMessage(tr("Move successful."), m_parent); @@ -1396,9 +1431,19 @@ void ModListViewActions::clearOverwrite() const tr("About to recursively delete:\n") + overwriteDir.absolutePath(), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { QStringList delList; - for (auto f : - overwriteDir.entryList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot)) - delList.push_back(overwriteDir.absoluteFilePath(f)); + for (auto f : overwriteDir.entryInfoList(QDir::AllDirs | QDir::Files | + QDir::NoDotAndDotDot)) { + if (f.isDir() && m_core.managedGame()->getModMappings().keys().contains( + f.fileName(), Qt::CaseInsensitive)) { + for (auto sf : + QDir(f.absoluteFilePath()) + .entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot)) { + delList.push_back(sf.absoluteFilePath()); + } + } else { + delList.push_back(f.absoluteFilePath()); + } + } if (shellDelete(delList, true)) { emit overwriteCleared(); m_core.refresh(); -- cgit v1.3.1