From 39f36ca27ac8c14e3c7894d5cc167a8c758e082e Mon Sep 17 00:00:00 2001 From: Al Date: Tue, 14 Jan 2020 19:14:06 +0100 Subject: Added ModInfo::FLAG_HIDDEN_FILES and check in modinfowithconflictinfo --- src/modinfo.h | 3 ++- src/modinfowithconflictinfo.cpp | 36 +++++++++++++++++++++++++++++++++++- src/modinfowithconflictinfo.h | 5 ++++- 3 files changed, 41 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/modinfo.h b/src/modinfo.h index 7c41e0a1..e6e4debc 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -79,6 +79,7 @@ public: FLAG_SEPARATOR, FLAG_OVERWRITE, FLAG_FOREIGN, + FLAG_HIDDEN_FILES, FLAG_NOTENDORSED, FLAG_NOTES, FLAG_PLUGIN_SELECTED, @@ -95,7 +96,7 @@ public: CONTENT_SOUND, CONTENT_SCRIPT, CONTENT_SKSE, - CONTENT_SKSEFILES, + CONTENT_SKSEFILES, CONTENT_SKYPROC, CONTENT_MCM, CONTENT_INI, diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp index f5a243ae..df5068ca 100644 --- a/src/modinfowithconflictinfo.cpp +++ b/src/modinfowithconflictinfo.cpp @@ -2,18 +2,29 @@ #include "directoryentry.h" #include "utility.h" +#include using namespace MOBase; using namespace MOShared; +namespace fs = std::filesystem; ModInfoWithConflictInfo::ModInfoWithConflictInfo(PluginContainer *pluginContainer, DirectoryEntry **directoryStructure) - : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false) {} + : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false), m_HasHiddenFiles(false) {} void ModInfoWithConflictInfo::clearCaches() { m_LastConflictCheck = QTime(); } +std::vector ModInfoWithConflictInfo::getFlags() const +{ + std::vector result = std::vector(); + if (hasHiddenFiles()) { + result.push_back(ModInfo::FLAG_HIDDEN_FILES); + } + return result; +} + std::vector ModInfoWithConflictInfo::getConflictFlags() const { std::vector result; @@ -71,6 +82,7 @@ void ModInfoWithConflictInfo::doConflictCheck() const m_ArchiveLooseOverwrittenList.clear(); bool providesAnything = false; + bool hasHiddenFiles = false; int dataID = 0; if ((*m_DirectoryStructure)->originExists(L"data")) { @@ -88,6 +100,15 @@ void ModInfoWithConflictInfo::doConflictCheck() const std::vector files = origin.getFiles(); // for all files in this origin for (FileEntry::Ptr file : files) { + + //Skip hiidden file check if already found one + if (!hasHiddenFiles) { + const fs::path nameAsPath(file->getName()); + if (nameAsPath.extension().wstring().compare(L".mohidden") == 0) { + hasHiddenFiles = true; + } + } + auto alternatives = file->getAlternatives(); if ((alternatives.size() == 0) || (alternatives.back().first == dataID)) { // no alternatives -> no conflict @@ -178,6 +199,8 @@ void ModInfoWithConflictInfo::doConflictCheck() const m_ArchiveConflictLooseState = CONFLICT_OVERWRITTEN; else if (!m_ArchiveLooseOverwriteList.empty()) m_ArchiveConflictLooseState = CONFLICT_OVERWRITE; + + m_HasHiddenFiles = hasHiddenFiles; } } } @@ -231,3 +254,14 @@ bool ModInfoWithConflictInfo::isRedundant() const return false; } } + + +bool ModInfoWithConflictInfo::hasHiddenFiles() const +{ + QTime now = QTime::currentTime(); + if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) { + doConflictCheck(); + } + + return m_HasHiddenFiles; +} diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h index 9869bc5a..460a7f49 100644 --- a/src/modinfowithconflictinfo.h +++ b/src/modinfowithconflictinfo.h @@ -13,7 +13,7 @@ public: ModInfoWithConflictInfo(PluginContainer *pluginContainer, MOShared::DirectoryEntry **directoryStructure); std::vector getConflictFlags() const; - virtual std::vector getFlags() const { return std::vector(); }; + virtual std::vector getFlags() const; /** * @brief clear all caches held for this mod @@ -67,6 +67,8 @@ private: */ bool isRedundant() const; + bool hasHiddenFiles() const; + private: MOShared::DirectoryEntry **m_DirectoryStructure; @@ -75,6 +77,7 @@ private: mutable EConflictType m_ArchiveConflictState; mutable EConflictType m_ArchiveConflictLooseState; mutable bool m_HasLooseOverwrite; + mutable bool m_HasHiddenFiles; mutable QTime m_LastConflictCheck; mutable std::set m_OverwriteList; // indices of mods overritten by this mod -- cgit v1.3.1