From b708bcc097122e5b4f12b520d7f9880cd3cc28aa Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Sun, 3 Jan 2021 12:24:27 +0100 Subject: Show conflict icons from children when separator is collapsed. --- src/modconflicticondelegate.cpp | 38 ++++++++++++++++++++++++++++++-------- src/modconflicticondelegate.h | 16 +++++++++------- 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 #include 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 ModConflictIconDelegate::getIconsForFlags( QList 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 ModConflictIconDelegate::getIconsForFlags( QList 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 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 getIconsForFlags( - std::vector 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 getIconsForFlags(std::vector flags, bool compact); + static QString getFlagIcon(ModInfo::EConflictFlag flag); + QList 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; -- cgit v1.3.1