diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-01-03 12:24:27 +0100 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-01-03 12:24:27 +0100 |
| commit | b708bcc097122e5b4f12b520d7f9880cd3cc28aa (patch) | |
| tree | 46cf3c4ea863ceaef7cf6564d619c7357b0b3ff7 | |
| parent | 3d176cf01e402897c7ab880170dbe0d0b11292c4 (diff) | |
Show conflict icons from children when separator is collapsed.
| -rw-r--r-- | src/modconflicticondelegate.cpp | 38 | ||||
| -rw-r--r-- | 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 <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; |
