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/overwriteinfodialog.cpp | 48 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) (limited to 'src/overwriteinfodialog.cpp') diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index 366671e7..11e6fc32 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -18,7 +18,6 @@ along with Mod Organizer. If not, see . */ #include "overwriteinfodialog.h" -#include "organizercore.h" #include "report.h" #include "ui_overwriteinfodialog.h" #include "utility.h" @@ -29,15 +28,17 @@ along with Mod Organizer. If not, see . using namespace MOBase; -OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget* parent) - : QDialog(parent), ui(new Ui::OverwriteInfoDialog), m_FileSystemModel(nullptr), - m_DeleteAction(nullptr), m_RenameAction(nullptr), m_OpenAction(nullptr) +OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, OrganizerCore& organizer, + QWidget* parent) + : QDialog(parent), m_Organizer(organizer), ui(new Ui::OverwriteInfoDialog), + m_FileSystemModel(nullptr), m_DeleteAction(nullptr), m_RenameAction(nullptr), + m_OpenAction(nullptr) { ui->setupUi(this); this->setWindowModality(Qt::NonModal); - m_FileSystemModel = new OverwriteFileSystemModel(this); + m_FileSystemModel = new OverwriteFileSystemModel(this, organizer); m_FileSystemModel->setReadOnly(false); setModInfo(modInfo); ui->filesView->setModel(m_FileSystemModel); @@ -137,10 +138,19 @@ void OverwriteInfoDialog::delete_activated() QItemSelectionModel* selection = ui->filesView->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() >= 1) { + auto root = m_FileSystemModel->rootDirectory(); if (selection->selectedRows().count() == 0) { return; } else if (selection->selectedRows().count() == 1) { + for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) { + if (root.absoluteFilePath(modDir).compare( + m_FileSystemModel->filePath(selection->selectedRows().at(0)), + Qt::CaseInsensitive) == 0) { + return; + } + } + QString fileName = m_FileSystemModel->fileName(selection->selectedRows().at(0)); if (QMessageBox::question( this, tr("Confirm"), @@ -158,6 +168,12 @@ void OverwriteInfoDialog::delete_activated() } foreach (QModelIndex index, selection->selectedRows()) { + for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) { + if (root.absoluteFilePath(modDir).compare(m_FileSystemModel->filePath(index), + Qt::CaseInsensitive) == 0) { + return; + } + } deleteFile(index); } } @@ -166,9 +182,17 @@ void OverwriteInfoDialog::delete_activated() void OverwriteInfoDialog::deleteTriggered() { + auto root = m_FileSystemModel->rootDirectory(); if (m_FileSelection.count() == 0) { return; } else if (m_FileSelection.count() == 1) { + for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) { + if (root.absoluteFilePath(modDir).compare( + m_FileSystemModel->filePath(m_FileSelection.at(0)), + Qt::CaseInsensitive) == 0) { + return; + } + } QString fileName = m_FileSystemModel->fileName(m_FileSelection.at(0)); if (QMessageBox::question( this, tr("Confirm"), @@ -185,18 +209,30 @@ void OverwriteInfoDialog::deleteTriggered() } foreach (QModelIndex index, m_FileSelection) { + for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) { + if (root.absoluteFilePath(modDir).compare(m_FileSystemModel->filePath(index), + Qt::CaseInsensitive) == 0) { + return; + } + } deleteFile(index); } } void OverwriteInfoDialog::renameTriggered() { + auto root = m_FileSystemModel->rootDirectory(); QModelIndex selection = m_FileSelection.at(0); QModelIndex index = selection.sibling(selection.row(), 0); if (!index.isValid() || m_FileSystemModel->isReadOnly()) { return; } - + for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) { + if (root.absoluteFilePath(modDir).compare(m_FileSystemModel->filePath(selection), + Qt::CaseInsensitive) == 0) { + return; + } + } ui->filesView->edit(index); } -- cgit v1.3.1