aboutsummaryrefslogtreecommitdiff
path: root/libs/bsapacker/src/HideLooseAssetService.cpp
blob: 8342e567b7c8cca39fb5d82f52aaa495e4577259 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "HideLooseAssetService.h"

#include <QDir>
#include <QDirIterator>
#include <QString>
#include <QtConcurrent/QtConcurrentMap>

#include "SettingsService.h"

namespace BsaPacker
{
	QString HideLooseAssetService::s_HiddenExt(".mohidden");

	HideLooseAssetService::HideLooseAssetService(const ISettingsService* settingsService)
		: m_SettingsService(settingsService)
	{
	}

	bool HideLooseAssetService::HideLooseAssets(const QDir& modDirectory) const
	{
		if (!this->m_SettingsService->GetPluginSetting(SettingsService::SETTING_HIDE_LOOSE_ASSETS).toBool()) {
			return false;
		}

		// Only hide loose files that were not excluded when creating the archive (blacklisted), so might still be needed by the mod
		QStringList blacklistExtensions = this->m_SettingsService->GetPluginSetting(SettingsService::SETTING_BLACKLISTED_FILES).toString().split(';');
		for (auto& ext : blacklistExtensions) {
			ext.prepend("*");
		}

		const QString& absModDir = modDirectory.absolutePath();
		for (const QString& subDir : modDirectory.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
			// Hide subdirectories
			const QString& absPath = absModDir + '/' + subDir;
			QDir originalDir(absPath);
			if (originalDir.dirName().endsWith(s_HiddenExt) || originalDir.isEmpty()) {
				continue;
			}
			if (!originalDir.rename(originalDir.absolutePath(), originalDir.absolutePath() + s_HiddenExt)) {
				qWarning() << "Failed to hide " << originalDir.absolutePath();
				continue;
			}

			// Restore files with blacklisted extension to their original directories
			QDir hiddenDir(originalDir.absolutePath() + s_HiddenExt);
			QDirIterator iterator(hiddenDir.absolutePath(), blacklistExtensions, QDir::Files, QDirIterator::Subdirectories);
			while (iterator.hasNext()) {
				QString hiddenFilePath = iterator.next();
				QString originalFilePath = originalDir.absoluteFilePath(hiddenDir.relativeFilePath(hiddenFilePath));
				originalDir.mkpath(originalFilePath.left(originalFilePath.lastIndexOf("/")));
				if (!originalDir.rename(hiddenFilePath, originalFilePath)) {
					qWarning() << "Failed to unhide " << hiddenFilePath;
				}
			}
		}
		return true;

		/*
		const std::function<void(const QString&)> hideFolder = [&](const QString& subDir)
		{
			const QString& absPath = absModDir + '/' + subDir;
			QDir dir(absPath);
			if (!dir.dirName().endsWith(".mohidden"))
				dir.rename(absPath, absPath + ".mohidden");
		};
		*/
		//QtConcurrent::blockingMap(modDirectory.entryList(QDir::Dirs | QDir::NoDotAndDotDot), hideFolder);
	}
}