Skip to content

Commit b96087b

Browse files
committed
First pass for overwrite mod directory support
1 parent c723c11 commit b96087b

4 files changed

Lines changed: 109 additions & 15 deletions

File tree

src/modinfooverwrite.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <QApplication>
77
#include <QDirIterator>
8+
#include "organizercore.h"
89

910
ModInfoOverwrite::ModInfoOverwrite(OrganizerCore& core) : ModInfoWithConflictInfo(core)
1011
{}
@@ -14,10 +15,24 @@ bool ModInfoOverwrite::isEmpty() const
1415
QDirIterator iter(absolutePath(), QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
1516
if (!iter.hasNext())
1617
return true;
17-
iter.next();
18-
if ((iter.fileName() == "meta.ini") && !iter.hasNext())
19-
return true;
20-
return false;
18+
while (iter.hasNext()) {
19+
iter.next();
20+
if (iter.fileInfo().isDir() &&
21+
!m_Core.managedGame()->getModMappings().keys().contains(iter.fileName(),
22+
Qt::CaseInsensitive))
23+
return false;
24+
if (iter.fileInfo().isDir() &&
25+
m_Core.managedGame()->getModMappings().keys().contains(iter.fileName(),
26+
Qt::CaseInsensitive)) {
27+
if (QDir(iter.filePath()).count() > 2) {
28+
return false;
29+
}
30+
}
31+
if (iter.fileInfo().isFile() && iter.fileName() != "meta.ini")
32+
return false;
33+
}
34+
35+
return true;
2136
}
2237

2338
QString ModInfoOverwrite::absolutePath() const

src/modlistviewactions.cpp

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ void ModListViewActions::displayModInformation(ModInfo::Ptr modInfo,
548548
QDialog* dialog = m_parent->findChild<QDialog*>("__overwriteDialog");
549549
try {
550550
if (dialog == nullptr) {
551-
dialog = new OverwriteInfoDialog(modInfo, m_parent);
551+
dialog = new OverwriteInfoDialog(modInfo, m_core, m_parent);
552552
dialog->setObjectName("__overwriteDialog");
553553
} else {
554554
qobject_cast<OverwriteInfoDialog*>(dialog)->setModInfo(modInfo);
@@ -1299,9 +1299,40 @@ void ModListViewActions::restoreBackup(const QModelIndex& index) const
12991299
void ModListViewActions::moveOverwriteContentsTo(const QString& absolutePath) const
13001300
{
13011301
ModInfo::Ptr overwriteInfo = ModInfo::getOverwrite();
1302-
bool successful =
1303-
shellMove((QDir::toNativeSeparators(overwriteInfo->absolutePath()) + "\\*"),
1304-
(QDir::toNativeSeparators(absolutePath)), false, m_parent);
1302+
bool successful = false;
1303+
if (m_core.managedGame()->getModMappings().count() > 1 ||
1304+
m_core.managedGame()->getModMappings().keys().first() != "") {
1305+
QDirIterator iter(overwriteInfo->absolutePath(),
1306+
QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
1307+
while (iter.hasNext()) {
1308+
auto entry = iter.nextFileInfo();
1309+
if (entry.isDir() && m_core.managedGame()->getModMappings().keys().contains(
1310+
entry.fileName(), Qt::CaseInsensitive)) {
1311+
successful = shellCopy((QDir::toNativeSeparators(entry.absolutePath())),
1312+
(QDir::toNativeSeparators(absolutePath)), false, m_parent);
1313+
QDirIterator subDirIter(entry.absoluteFilePath(),
1314+
QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
1315+
while (subDirIter.hasNext()) {
1316+
auto subDirEntry = subDirIter.nextFileInfo();
1317+
if (subDirEntry.isDir()) {
1318+
QDir(subDirEntry.absoluteFilePath()).removeRecursively();
1319+
} else {
1320+
QFile(subDirEntry.absoluteFilePath()).remove();
1321+
}
1322+
}
1323+
} else {
1324+
successful = shellMove((QDir::toNativeSeparators(iter.filePath())),
1325+
(QDir::toNativeSeparators(absolutePath)), false, m_parent);
1326+
}
1327+
if (!successful)
1328+
break;
1329+
}
1330+
1331+
} else {
1332+
successful =
1333+
shellMove((QDir::toNativeSeparators(overwriteInfo->absolutePath()) + "\\*"),
1334+
(QDir::toNativeSeparators(absolutePath)), false, m_parent);
1335+
}
13051336

13061337
if (successful) {
13071338
MessageDialog::showMessage(tr("Move successful."), m_parent);
@@ -1397,8 +1428,18 @@ void ModListViewActions::clearOverwrite() const
13971428
QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
13981429
QStringList delList;
13991430
for (auto f :
1400-
overwriteDir.entryList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot))
1401-
delList.push_back(overwriteDir.absoluteFilePath(f));
1431+
overwriteDir.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot)) {
1432+
if (f.isDir() && m_core.managedGame()->getModMappings().keys().contains(
1433+
f.fileName(), Qt::CaseInsensitive)) {
1434+
for (auto sf :
1435+
QDir(f.absoluteFilePath())
1436+
.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot)) {
1437+
delList.push_back(sf.absoluteFilePath());
1438+
}
1439+
} else {
1440+
delList.push_back(f.absoluteFilePath());
1441+
}
1442+
}
14021443
if (shellDelete(delList, true)) {
14031444
emit overwriteCleared();
14041445
m_core.refresh();

src/overwriteinfodialog.cpp

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
2929

3030
using namespace MOBase;
3131

32-
OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget* parent)
33-
: QDialog(parent), ui(new Ui::OverwriteInfoDialog), m_FileSystemModel(nullptr),
34-
m_DeleteAction(nullptr), m_RenameAction(nullptr), m_OpenAction(nullptr)
32+
OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, OrganizerCore &organizer,
33+
QWidget* parent)
34+
: QDialog(parent), m_Organizer(organizer), ui(new Ui::OverwriteInfoDialog),
35+
m_FileSystemModel(nullptr), m_DeleteAction(nullptr), m_RenameAction(nullptr),
36+
m_OpenAction(nullptr)
3537
{
3638
ui->setupUi(this);
3739

@@ -137,10 +139,17 @@ void OverwriteInfoDialog::delete_activated()
137139
QItemSelectionModel* selection = ui->filesView->selectionModel();
138140

139141
if (selection->hasSelection() && selection->selectedRows().count() >= 1) {
142+
auto root = m_FileSystemModel->rootDirectory();
140143

141144
if (selection->selectedRows().count() == 0) {
142145
return;
143146
} else if (selection->selectedRows().count() == 1) {
147+
for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) {
148+
if (root.absoluteFilePath(modDir).compare(m_FileSystemModel->filePath(selection->selectedRows().at(0)), Qt::CaseInsensitive) == 0) {
149+
return;
150+
}
151+
}
152+
144153
QString fileName = m_FileSystemModel->fileName(selection->selectedRows().at(0));
145154
if (QMessageBox::question(
146155
this, tr("Confirm"),
@@ -158,6 +167,13 @@ void OverwriteInfoDialog::delete_activated()
158167
}
159168

160169
foreach (QModelIndex index, selection->selectedRows()) {
170+
for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) {
171+
if (root.absoluteFilePath(modDir).compare(
172+
m_FileSystemModel->filePath(index),
173+
Qt::CaseInsensitive) == 0) {
174+
return;
175+
}
176+
}
161177
deleteFile(index);
162178
}
163179
}
@@ -166,9 +182,17 @@ void OverwriteInfoDialog::delete_activated()
166182

167183
void OverwriteInfoDialog::deleteTriggered()
168184
{
185+
auto root = m_FileSystemModel->rootDirectory();
169186
if (m_FileSelection.count() == 0) {
170187
return;
171188
} else if (m_FileSelection.count() == 1) {
189+
for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) {
190+
if (root.absoluteFilePath(modDir).compare(
191+
m_FileSystemModel->filePath(m_FileSelection.at(0)),
192+
Qt::CaseInsensitive) == 0) {
193+
return;
194+
}
195+
}
172196
QString fileName = m_FileSystemModel->fileName(m_FileSelection.at(0));
173197
if (QMessageBox::question(
174198
this, tr("Confirm"),
@@ -185,18 +209,31 @@ void OverwriteInfoDialog::deleteTriggered()
185209
}
186210

187211
foreach (QModelIndex index, m_FileSelection) {
212+
for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) {
213+
if (root.absoluteFilePath(modDir).compare(
214+
m_FileSystemModel->filePath(index),
215+
Qt::CaseInsensitive) == 0) {
216+
return;
217+
}
218+
}
188219
deleteFile(index);
189220
}
190221
}
191222

192223
void OverwriteInfoDialog::renameTriggered()
193224
{
225+
auto root = m_FileSystemModel->rootDirectory();
194226
QModelIndex selection = m_FileSelection.at(0);
195227
QModelIndex index = selection.sibling(selection.row(), 0);
196228
if (!index.isValid() || m_FileSystemModel->isReadOnly()) {
197229
return;
198230
}
199-
231+
for (auto modDir : m_Organizer.managedGame()->getModMappings().keys()) {
232+
if (root.absoluteFilePath(modDir).compare(m_FileSystemModel->filePath(selection),
233+
Qt::CaseInsensitive) == 0) {
234+
return;
235+
}
236+
}
200237
ui->filesView->edit(index);
201238
}
202239

src/overwriteinfodialog.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class OverwriteInfoDialog : public QDialog
7979
Q_OBJECT
8080

8181
public:
82-
explicit OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget* parent = 0);
82+
explicit OverwriteInfoDialog(ModInfo::Ptr modInfo, OrganizerCore &organizer, QWidget* parent = 0);
8383
~OverwriteInfoDialog();
8484

8585
ModInfo::Ptr modInfo() const { return m_ModInfo; }
@@ -122,6 +122,7 @@ private slots:
122122
QAction* m_NewFolderAction;
123123

124124
ModInfo::Ptr m_ModInfo;
125+
OrganizerCore &m_Organizer;
125126
};
126127

127128
#endif // OVERWRITEINFODIALOG_H

0 commit comments

Comments
 (0)