diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/modlistsortproxy.cpp | 21 | ||||
| -rw-r--r-- | src/modlistsortproxy.h | 1 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index 4045d743..435967c9 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -103,6 +103,18 @@ void ModListSortProxy::disableAllVisible() invalidate();
}
+unsigned long ModListSortProxy::flagsId(const std::vector<ModInfo::EFlag> &flags) const
+{
+ unsigned long result = 0;
+ for (ModInfo::EFlag flag : flags) {
+ if ((flag != ModInfo::FLAG_FOREIGN)
+ && (flag != ModInfo::FLAG_OVERWRITE)) {
+ result += 1 << (int)flag;
+ }
+ }
+ return result;
+}
+
bool ModListSortProxy::lessThan(const QModelIndex &left,
const QModelIndex &right) const
{
@@ -135,8 +147,13 @@ bool ModListSortProxy::lessThan(const QModelIndex &left, switch (left.column()) {
case ModList::COL_FLAGS: {
- if (leftMod->getFlags().size() != rightMod->getFlags().size())
- lt = leftMod->getFlags().size() < rightMod->getFlags().size();
+ std::vector<ModInfo::EFlag> leftFlags = leftMod->getFlags();
+ std::vector<ModInfo::EFlag> rightFlags = rightMod->getFlags();
+ if (leftFlags.size() != rightFlags.size()) {
+ lt = leftFlags.size() < rightFlags.size();
+ } else {
+ lt = flagsId(leftFlags) < flagsId(rightFlags);
+ }
} break;
case ModList::COL_CONTENT: {
std::vector<ModInfo::EContent> lContent = leftMod->getContents();
diff --git a/src/modlistsortproxy.h b/src/modlistsortproxy.h index ce7e5eb5..b3c01fea 100644 --- a/src/modlistsortproxy.h +++ b/src/modlistsortproxy.h @@ -109,6 +109,7 @@ protected: private:
+ unsigned long flagsId(const std::vector<ModInfo::EFlag> &flags) const;
bool hasConflictFlag(const std::vector<ModInfo::EFlag> &flags) const;
void updateFilterActive();
bool filterMatchesModAnd(ModInfo::Ptr info, bool enabled) const;
|
