Skip to content

Commit 999b9a3

Browse files
committed
More overwrite move / delete restrictions
1 parent b96087b commit 999b9a3

3 files changed

Lines changed: 62 additions & 11 deletions

File tree

src/modlist.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,15 +1028,46 @@ bool ModList::dropLocalFiles(const ModListDropInfo& dropInfo, int row,
10281028
QList<QPair<QString, QString>> relativePathList;
10291029

10301030
for (auto localUrl : dropInfo.localUrls()) {
1031-
10321031
QFileInfo sourceInfo(localUrl.url.toLocalFile());
1033-
QString sourceFile = sourceInfo.canonicalFilePath();
1032+
if (localUrl.originName.compare("overwrite", Qt::CaseInsensitive) == 0) {
1033+
if (sourceInfo.isDir()) {
1034+
for (auto dir : m_Organizer->managedGame()->getModMappings().keys()) {
1035+
QDir overDir(m_Organizer->overwritePath());
1036+
if (sourceInfo.canonicalFilePath().compare(overDir.absoluteFilePath(dir),
1037+
Qt::CaseInsensitive) == 0) {
1038+
1039+
QDirIterator dirIter(overDir.absoluteFilePath(dir),
1040+
QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
1041+
while (dirIter.hasNext()) {
1042+
auto entry = dirIter.nextFileInfo();
1043+
QString sourceFile = entry.canonicalFilePath();
1044+
1045+
QFileInfo targetInfo(modDir.absoluteFilePath(overDir.relativeFilePath(entry.absoluteFilePath())));
1046+
sourceList << sourceFile;
1047+
targetList << targetInfo.absoluteFilePath();
1048+
relativePathList << QPair<QString, QString>(localUrl.relativePath,
1049+
localUrl.originName);
1050+
}
1051+
}
1052+
}
1053+
} else {
1054+
QString sourceFile = sourceInfo.canonicalFilePath();
10341055

1035-
QFileInfo targetInfo(modDir.absoluteFilePath(localUrl.relativePath));
1036-
sourceList << sourceFile;
1037-
targetList << targetInfo.absoluteFilePath();
1038-
relativePathList << QPair<QString, QString>(localUrl.relativePath,
1039-
localUrl.originName);
1056+
QFileInfo targetInfo(modDir.absoluteFilePath(localUrl.relativePath));
1057+
sourceList << sourceFile;
1058+
targetList << targetInfo.absoluteFilePath();
1059+
relativePathList << QPair<QString, QString>(localUrl.relativePath,
1060+
localUrl.originName);
1061+
}
1062+
} else {
1063+
QString sourceFile = sourceInfo.canonicalFilePath();
1064+
1065+
QFileInfo targetInfo(modDir.absoluteFilePath(localUrl.relativePath));
1066+
sourceList << sourceFile;
1067+
targetList << targetInfo.absoluteFilePath();
1068+
relativePathList << QPair<QString, QString>(localUrl.relativePath,
1069+
localUrl.originName);
1070+
}
10401071
}
10411072

10421073
if (sourceList.count()) {

src/overwriteinfodialog.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
1818
*/
1919

2020
#include "overwriteinfodialog.h"
21-
#include "organizercore.h"
2221
#include "report.h"
2322
#include "ui_overwriteinfodialog.h"
2423
#include "utility.h"
@@ -39,7 +38,7 @@ OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, OrganizerCore &or
3938

4039
this->setWindowModality(Qt::NonModal);
4140

42-
m_FileSystemModel = new OverwriteFileSystemModel(this);
41+
m_FileSystemModel = new OverwriteFileSystemModel(this, organizer);
4342
m_FileSystemModel->setReadOnly(false);
4443
setModInfo(modInfo);
4544
ui->filesView->setModel(m_FileSystemModel);

src/overwriteinfodialog.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
2121
#define OVERWRITEINFODIALOG_H
2222

2323
#include "modinfo.h"
24+
#include "modlistdropinfo.h"
25+
#include "organizercore.h"
2426
#include <QDialog>
2527
#include <QFileSystemModel>
2628

@@ -34,8 +36,8 @@ class OverwriteFileSystemModel : public QFileSystemModel
3436
Q_OBJECT;
3537

3638
public:
37-
OverwriteFileSystemModel(QObject* parent)
38-
: QFileSystemModel(parent), m_RegularColumnCount(0)
39+
OverwriteFileSystemModel(QObject* parent, OrganizerCore &organizer)
40+
: QFileSystemModel(parent), m_Organizer(organizer), m_RegularColumnCount(0)
3941
{}
4042

4143
virtual int columnCount(const QModelIndex& parent) const
@@ -70,8 +72,27 @@ class OverwriteFileSystemModel : public QFileSystemModel
7072
}
7173
}
7274

75+
virtual bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row,
76+
int column, const QModelIndex& parent)
77+
{
78+
ModListDropInfo dropInfo(data, m_Organizer);
79+
if (dropInfo.isLocalFileDrop()) {
80+
for (auto entry : dropInfo.localUrls()) {
81+
QFileInfo sourceInfo(entry.url.toLocalFile());
82+
if (sourceInfo.isDir() &&
83+
m_Organizer.managedGame()->getModMappings().keys().contains(
84+
entry.relativePath, Qt::CaseInsensitive)) {
85+
return false;
86+
}
87+
}
88+
}
89+
return QFileSystemModel::dropMimeData(data, action, row, column, parent);
90+
}
91+
7392
private:
7493
mutable int m_RegularColumnCount;
94+
95+
OrganizerCore &m_Organizer;
7596
};
7697

7798
class OverwriteInfoDialog : public QDialog

0 commit comments

Comments
 (0)