summaryrefslogtreecommitdiff
path: root/src/modinfowithconflictinfo.cpp
diff options
context:
space:
mode:
authorSilarn <jrim@rimpo.org>2018-08-02 11:54:48 -0500
committerLostDragonist <lost.dragonist@gmail.com>2018-12-12 20:16:07 -0600
commitf9f70b224e25c2d5bff017fd08d32521d39d5b08 (patch)
treeb49cd0f84795ffd4b061948a4dab8c1953b29088 /src/modinfowithconflictinfo.cpp
parent01e1232cf85f09efde780537bbbca40fd6f0c097 (diff)
Add loose file/archive conflict icons
Diffstat (limited to 'src/modinfowithconflictinfo.cpp')
-rw-r--r--src/modinfowithconflictinfo.cpp86
1 files changed, 62 insertions, 24 deletions
diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp
index 67006261..68b5b265 100644
--- a/src/modinfowithconflictinfo.cpp
+++ b/src/modinfowithconflictinfo.cpp
@@ -7,7 +7,7 @@ using namespace MOBase;
using namespace MOShared;
ModInfoWithConflictInfo::ModInfoWithConflictInfo(PluginContainer *pluginContainer, DirectoryEntry **directoryStructure)
- : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure) {}
+ : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false) {}
void ModInfoWithConflictInfo::clearCaches()
{
@@ -32,6 +32,18 @@ std::vector<ModInfo::EFlag> ModInfoWithConflictInfo::getFlags() const
} break;
default: { /* NOP */ }
}
+ switch (isLooseArchiveConflicted()) {
+ case CONFLICT_MIXED: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_MIXED);
+ } break;
+ case CONFLICT_OVERWRITE: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
+ } break;
+ case CONFLICT_OVERWRITTEN: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
+ } break;
+ default: { /* NOP */ }
+ }
switch (isArchiveConflicted()) {
case CONFLICT_MIXED: {
result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED);
@@ -54,6 +66,8 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_OverwrittenList.clear();
m_ArchiveOverwriteList.clear();
m_ArchiveOverwrittenList.clear();
+ m_ArchiveLooseOverwriteList.clear();
+ m_ArchiveLooseOverwrittenList.clear();
bool providesAnything = false;
@@ -66,6 +80,7 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_CurrentConflictState = CONFLICT_NONE;
m_ArchiveConflictState = CONFLICT_NONE;
+ m_ArchiveConflictLooseState = CONFLICT_NONE;
if ((*m_DirectoryStructure)->originExists(name)) {
FilesOrigin &origin = (*m_DirectoryStructure)->getOriginByName(name);
@@ -77,18 +92,7 @@ void ModInfoWithConflictInfo::doConflictCheck() const
// no alternatives -> no conflict
providesAnything = true;
} else {
- if (file->getOrigin() != origin.getID()) {
- FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(file->getOrigin());
- unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
- if (file->getArchive().first.size() == 0)
- m_OverwrittenList.insert(altIndex);
- else
- m_ArchiveOverwrittenList.insert(altIndex);
- } else {
- providesAnything = true;
- }
-
- // for all non-providing alternative origins
+ // Get the archive data for the current mod
bool found = file->getOrigin() == origin.getID();
std::pair<std::wstring, int> archiveData;
if (found)
@@ -101,6 +105,23 @@ void ModInfoWithConflictInfo::doConflictCheck() const
}
}
}
+
+ // If this is not the origin then determine the correct overwrite
+ if (file->getOrigin() != origin.getID()) {
+ FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(file->getOrigin());
+ unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
+ if (file->getArchive().first.size() == 0)
+ if (archiveData.first.size() == 0)
+ m_OverwrittenList.insert(altIndex);
+ else
+ m_ArchiveLooseOverwrittenList.insert(altIndex);
+ else
+ m_ArchiveOverwrittenList.insert(altIndex);
+ } else {
+ providesAnything = true;
+ }
+
+ // Sort out the alternatives
for (auto altInfo : alternatives) {
if ((altInfo.first != dataID) && (altInfo.first != origin.getID())) {
FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(altInfo.first);
@@ -113,11 +134,11 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_OverwrittenList.insert(altIndex);
}
} else {
- m_ArchiveOverwrittenList.insert(altIndex);
+ m_ArchiveLooseOverwrittenList.insert(altIndex);
}
} else {
if (archiveData.first.size() == 0) {
- m_ArchiveOverwrittenList.insert(altIndex);
+ m_ArchiveLooseOverwriteList.insert(altIndex);
} else {
if (archiveData.second > altInfo.second.second) {
m_ArchiveOverwriteList.insert(altIndex);
@@ -141,14 +162,21 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_CurrentConflictState = CONFLICT_OVERWRITE;
else if (!m_OverwrittenList.empty())
m_CurrentConflictState = CONFLICT_OVERWRITTEN;
- }
- if (!m_ArchiveOverwriteList.empty() && !m_ArchiveOverwrittenList.empty())
+ if (!m_ArchiveOverwriteList.empty() && !m_ArchiveOverwrittenList.empty())
m_ArchiveConflictState = CONFLICT_MIXED;
- else if (!m_ArchiveOverwriteList.empty())
+ else if (!m_ArchiveOverwriteList.empty())
m_ArchiveConflictState = CONFLICT_OVERWRITE;
- else if (!m_ArchiveOverwrittenList.empty())
+ else if (!m_ArchiveOverwrittenList.empty())
m_ArchiveConflictState = CONFLICT_OVERWRITTEN;
+
+ if (!m_ArchiveLooseOverwrittenList.empty() && !m_ArchiveLooseOverwriteList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_MIXED;
+ else if (!m_ArchiveLooseOverwrittenList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_OVERWRITTEN;
+ else if (!m_ArchiveLooseOverwriteList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_OVERWRITE;
+ }
}
}
@@ -165,12 +193,22 @@ ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isConflicted() c
ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isArchiveConflicted() const
{
- QTime now = QTime::currentTime();
- if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
- doConflictCheck();
- }
+ QTime now = QTime::currentTime();
+ if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
+ doConflictCheck();
+ }
+
+ return m_ArchiveConflictState;
+}
+
+ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isLooseArchiveConflicted() const
+{
+ QTime now = QTime::currentTime();
+ if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
+ doConflictCheck();
+ }
- return m_ArchiveConflictState;
+ return m_ArchiveConflictLooseState;
}