summaryrefslogtreecommitdiff
path: root/src/modlistviewactions.cpp
diff options
context:
space:
mode:
authorJeremy Rimpo <jeremy.rimpo@servermonkey.com>2025-05-23 14:08:01 -0500
committerGitHub <noreply@github.com>2025-05-23 14:08:01 -0500
commit3a8ea3cccee06397e90305e1e39a305f8b7c3cb3 (patch)
tree6c16bf9825bf3f1613a8536d4702f24667fc4c80 /src/modlistviewactions.cpp
parent5d766e94a7a3b3fa861d57d3ad6ae619d98dd5d8 (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.cpp63
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();