diff options
| author | Jeremy Rimpo <jeremy.rimpo@servermonkey.com> | 2025-05-23 14:08:01 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-23 14:08:01 -0500 |
| commit | 3a8ea3cccee06397e90305e1e39a305f8b7c3cb3 (patch) | |
| tree | 6c16bf9825bf3f1613a8536d4702f24667fc4c80 /src/modlistviewactions.cpp | |
| parent | 5d766e94a7a3b3fa861d57d3ad6ae619d98dd5d8 (diff) | |
Oblivion Remastered Meta PR (#2241)
* 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 <capelle.mikael@gmail.com>
Diffstat (limited to 'src/modlistviewactions.cpp')
| -rw-r--r-- | src/modlistviewactions.cpp | 63 |
1 files changed, 54 insertions, 9 deletions
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<QDialog*>("__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<OverwriteInfoDialog*>(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(); |
