From 1ac3f4d8e8ee7461f047d34e196df40499e89557 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Wed, 6 Jan 2021 19:43:21 +0100 Subject: Display children contents in collapsed separator. --- src/modflagicondelegate.cpp | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) (limited to 'src/modflagicondelegate.cpp') diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp index 3ac1085e..c709f30d 100644 --- a/src/modflagicondelegate.cpp +++ b/src/modflagicondelegate.cpp @@ -5,21 +5,11 @@ using namespace MOBase; -ModFlagIconDelegate::ModFlagIconDelegate(QObject *parent, int logicalIndex, int compactSize) - : IconDelegate(parent) - , m_LogicalIndex(logicalIndex) - , m_CompactSize(compactSize) - , m_Compact(false) +ModFlagIconDelegate::ModFlagIconDelegate(QTreeView* view, int column, int compactSize) + : IconDelegate(view, column, compactSize) { } -void ModFlagIconDelegate::columnResized(int logicalIndex, int, int newSize) -{ - if (logicalIndex == m_LogicalIndex) { - m_Compact = newSize < m_CompactSize; - } -} - QList ModFlagIconDelegate::getIconsForFlags( std::vector flags, bool compact) { @@ -44,7 +34,7 @@ QList ModFlagIconDelegate::getIcons(const QModelIndex &index) const if (modid.isValid()) { ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt()); - return getIconsForFlags(info->getFlags(), m_Compact); + return getIconsForFlags(info->getFlags(), compact()); } return {}; -- cgit v1.3.1 From 183440d6949578c2c626022d42ee412919a19552 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Thu, 7 Jan 2021 19:47:13 +0100 Subject: Display mod flags on collapsed separators. --- src/modflagicondelegate.cpp | 10 ++++++---- src/modflagicondelegate.h | 7 ++++++- src/modlistview.cpp | 44 +++++++++++++++++++++++++++++++++++--------- src/modlistview.h | 6 ++++++ 4 files changed, 53 insertions(+), 14 deletions(-) (limited to 'src/modflagicondelegate.cpp') diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp index c709f30d..30a3c376 100644 --- a/src/modflagicondelegate.cpp +++ b/src/modflagicondelegate.cpp @@ -1,12 +1,13 @@ #include "modflagicondelegate.h" #include "modlist.h" +#include "modlistview.h" #include #include using namespace MOBase; -ModFlagIconDelegate::ModFlagIconDelegate(QTreeView* view, int column, int compactSize) - : IconDelegate(view, column, compactSize) +ModFlagIconDelegate::ModFlagIconDelegate(ModListView* view, int column, int compactSize) + : IconDelegate(view, column, compactSize), m_view(view) { } @@ -33,8 +34,9 @@ QList ModFlagIconDelegate::getIcons(const QModelIndex &index) const QVariant modid = index.data(ModList::IndexRole); if (modid.isValid()) { - ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt()); - return getIconsForFlags(info->getFlags(), compact()); + bool compact; + auto flags = m_view->modFlags(index, &compact); + return getIconsForFlags(flags, compact || this->compact()); } return {}; diff --git a/src/modflagicondelegate.h b/src/modflagicondelegate.h index 63ab8978..24dd4a0e 100644 --- a/src/modflagicondelegate.h +++ b/src/modflagicondelegate.h @@ -6,12 +6,14 @@ #include "icondelegate.h" #include "modinfo.h" +class ModListView; + class ModFlagIconDelegate : public IconDelegate { Q_OBJECT; public: - explicit ModFlagIconDelegate(QTreeView* view, int column = -1, int compactSize = 120); + explicit ModFlagIconDelegate(ModListView* view, int column = -1, int compactSize = 120); QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; protected: @@ -25,6 +27,9 @@ protected: // ModFlagIconDelegate() : ModFlagIconDelegate(nullptr) { } +private: + ModListView* m_view; + }; #endif // MODFLAGICONDELEGATE_H diff --git a/src/modlistview.cpp b/src/modlistview.cpp index 63999ce9..7c67c599 100644 --- a/src/modlistview.cpp +++ b/src/modlistview.cpp @@ -217,10 +217,8 @@ std::optional ModListView::nextMod(unsigned int modIndex) const ModInfo::Ptr mod = ModInfo::getByIndex(modIndex); - // skip overwrite and backups and separators - if (mod->hasFlag(ModInfo::FLAG_OVERWRITE) || - mod->hasFlag(ModInfo::FLAG_BACKUP) || - mod->hasFlag(ModInfo::FLAG_SEPARATOR)) { + // skip overwrite, backups and separators + if (mod->isOverwrite() || mod->isBackup() || mod->isSeparator()) { continue; } @@ -246,12 +244,9 @@ std::optional ModListView::prevMod(unsigned int modIndex) const modIndex = index.data(ModList::IndexRole).toInt(); - // skip overwrite and backups and separators + // skip overwrite, backups and separators ModInfo::Ptr mod = ModInfo::getByIndex(modIndex); - - if (mod->hasFlag(ModInfo::FLAG_OVERWRITE) || - mod->hasFlag(ModInfo::FLAG_BACKUP) || - mod->hasFlag(ModInfo::FLAG_SEPARATOR)) { + if (mod->isOverwrite() || mod->isBackup() || mod->isSeparator()) { continue; } @@ -1080,6 +1075,37 @@ QColor ModListView::markerColor(const QModelIndex& index) const return QColor(); } +std::vector ModListView::modFlags(const QModelIndex& index, bool* forceCompact) const +{ + ModInfo::Ptr info = ModInfo::getByIndex(index.data(ModList::IndexRole).toInt()); + + auto flags = info->getFlags(); + bool compact = false; + if (info->isSeparator() + && hasCollapsibleSeparators() + && m_core->settings().interface().collapsibleSeparatorsConflicts() + && !isExpanded(index.sibling(index.row(), 0))) { + + // combine the child conflicts + std::set eFlags(flags.begin(), flags.end()); + for (int i = 0; i < model()->rowCount(index); ++i) { + auto cIndex = model()->index(i, index.column(), index).data(ModList::IndexRole).toInt(); + auto cFlags = ModInfo::getByIndex(cIndex)->getFlags(); + eFlags.insert(cFlags.begin(), cFlags.end()); + } + flags = { eFlags.begin(), eFlags.end() }; + + // force compact because there can be a lots of flags here + compact = true; + } + + if (forceCompact) { + *forceCompact = true; + } + + return flags; +} + std::vector ModListView::conflictFlags(const QModelIndex& index, bool* forceCompact) const { ModInfo::Ptr info = ModInfo::getByIndex(index.data(ModList::IndexRole).toInt()); diff --git a/src/modlistview.h b/src/modlistview.h index 48e003bd..af4e83c0 100644 --- a/src/modlistview.h +++ b/src/modlistview.h @@ -173,6 +173,7 @@ protected slots: private: friend class ModConflictIconDelegate; + friend class ModFlagIconDelegate; friend class ModContentIconDelegate; friend class ModListStyledItemDelegated; friend class ModListViewMarkingScrollBar; @@ -195,6 +196,11 @@ private: // QColor markerColor(const QModelIndex& index) const; + // retrieve the mod flags for the given index + // + std::vector modFlags( + const QModelIndex& index, bool* forceCompact = nullptr) const; + // retrieve the conflicts flags for the given index // std::vector conflictFlags( -- cgit v1.3.1