summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modconflicticondelegate.cpp38
-rw-r--r--src/modconflicticondelegate.h16
2 files changed, 39 insertions, 15 deletions
diff --git a/src/modconflicticondelegate.cpp b/src/modconflicticondelegate.cpp
index a5e80d53..4cdea658 100644
--- a/src/modconflicticondelegate.cpp
+++ b/src/modconflicticondelegate.cpp
@@ -1,12 +1,14 @@
#include "modconflicticondelegate.h"
#include "modlist.h"
+#include "modlistview.h"
#include <log.h>
#include <QList>
using namespace MOBase;
-ModConflictIconDelegate::ModConflictIconDelegate(QObject *parent, int logicalIndex, int compactSize)
- : IconDelegate(parent)
+ModConflictIconDelegate::ModConflictIconDelegate(ModListView* view, int logicalIndex, int compactSize)
+ : IconDelegate(view)
+ , m_View(view)
, m_LogicalIndex(logicalIndex)
, m_CompactSize(compactSize)
, m_Compact(false)
@@ -26,7 +28,7 @@ QList<QString> ModConflictIconDelegate::getIconsForFlags(
QList<QString> result;
// Don't do flags for overwrite
- if (std::find(flags.begin(), flags.end(),ModInfo::FLAG_OVERWRITE_CONFLICT) != flags.end())
+ if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE_CONFLICT) != flags.end())
return result;
// insert conflict icons to provide nicer alignment
@@ -85,14 +87,34 @@ QList<QString> ModConflictIconDelegate::getIconsForFlags(
QList<QString> ModConflictIconDelegate::getIcons(const QModelIndex &index) const
{
- QVariant modid = index.data(ModList::IndexRole);
+ QVariant modIndex = index.data(ModList::IndexRole);
- if (modid.isValid()) {
- ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt());
- return getIconsForFlags(info->getConflictFlags(), m_Compact);
+ if (!modIndex.isValid()) {
+ return {};
}
- return {};
+ ModInfo::Ptr info = ModInfo::getByIndex(modIndex.toInt());
+
+ auto flags = info->getConflictFlags();
+ bool compact = m_Compact;
+ if (info->isSeparator()
+ && m_View->hasCollapsibleSeparators()
+ && !m_View->isExpanded(index.sibling(index.row(), 0))) {
+ MOBase::log::debug("Recurse for sep {}: {} {} {}", info->name(), info->isSeparator(), m_View->hasCollapsibleSeparators(), m_View->isExpanded(index));
+ // combine the child conflicts
+ std::set<ModInfo::EConflictFlag> eFlags(flags.begin(), flags.end());
+ for (int i = 0; i < m_View->model()->rowCount(index); ++i) {
+ auto cIndex = m_View->model()->index(i, index.column(), index).data(ModList::IndexRole).toInt();
+ auto cFlags = ModInfo::getByIndex(cIndex)->getConflictFlags();
+ eFlags.insert(cFlags.begin(), cFlags.end());
+ }
+ flags = { eFlags.begin(), eFlags.end() };
+
+ // force compact because there can be a lots of flags here
+ compact = true;
+ }
+
+ return getIconsForFlags(flags, compact);
}
QString ModConflictIconDelegate::getFlagIcon(ModInfo::EConflictFlag flag)
diff --git a/src/modconflicticondelegate.h b/src/modconflicticondelegate.h
index 7ab1bd11..a44ce89b 100644
--- a/src/modconflicticondelegate.h
+++ b/src/modconflicticondelegate.h
@@ -5,23 +5,24 @@
#include "icondelegate.h"
+class ModListView;
+
class ModConflictIconDelegate : public IconDelegate
{
Q_OBJECT;
public:
- explicit ModConflictIconDelegate(QObject *parent = 0, int logicalIndex = -1, int compactSize = 80);
- QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
-
- static QList<QString> getIconsForFlags(
- std::vector<ModInfo::EConflictFlag> flags, bool compact);
-
- static QString getFlagIcon(ModInfo::EConflictFlag flag);
+ explicit ModConflictIconDelegate(ModListView* parent = nullptr, int logicalIndex = -1, int compactSize = 80);
+ QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex &index) const override;
public slots:
void columnResized(int logicalIndex, int oldSize, int newSize);
protected:
+
+ static QList<QString> getIconsForFlags(std::vector<ModInfo::EConflictFlag> flags, bool compact);
+ static QString getFlagIcon(ModInfo::EConflictFlag flag);
+
QList<QString> getIcons(const QModelIndex &index) const override;
size_t getNumIcons(const QModelIndex &index) const override;
@@ -42,6 +43,7 @@ private:
ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN
};
+ ModListView* m_View;
int m_LogicalIndex;
int m_CompactSize;
bool m_Compact;