From e597823337c858f2985c615ee5147f47567991ee Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 23 Jan 2014 00:05:46 +0100 Subject: - boss integration - plugin list can now also display multiple flags for a file (like the mod list) - changed some compiler&linker settings to produce smaller binaries --- src/modflagicondelegate.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/modflagicondelegate.cpp (limited to 'src/modflagicondelegate.cpp') diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp new file mode 100644 index 00000000..db69eb52 --- /dev/null +++ b/src/modflagicondelegate.cpp @@ -0,0 +1,50 @@ +#include "modflagicondelegate.h" +#include + + +ModFlagIconDelegate::ModFlagIconDelegate(QObject *parent) + : IconDelegate(parent) +{ +} + +QList ModFlagIconDelegate::getIcons(const QModelIndex &index) const +{ + QList result; + QVariant modid = index.data(Qt::UserRole + 1); + if (modid.isValid()) { + ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt()); + std::vector flags = info->getFlags(); + + for (auto iter = flags.begin(); iter != flags.end(); ++iter) { + result.append(getFlagIcon(*iter)); + } + } + return result; +} + +QIcon ModFlagIconDelegate::getFlagIcon(ModInfo::EFlag flag) const +{ + switch (flag) { + case ModInfo::FLAG_BACKUP: return QIcon(":/MO/gui/emblem_backup"); + case ModInfo::FLAG_INVALID: return QIcon(":/MO/gui/emblem_problem"); + case ModInfo::FLAG_NOTENDORSED: return QIcon(":/MO/gui/emblem_notendorsed"); + case ModInfo::FLAG_NOTES: return QIcon(":/MO/gui/emblem_notes"); + case ModInfo::FLAG_CONFLICT_OVERWRITE: return QIcon(":/MO/gui/emblem_conflict_overwrite"); + case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return QIcon(":/MO/gui/emblem_conflict_overwritten"); + case ModInfo::FLAG_CONFLICT_MIXED: return QIcon(":/MO/gui/emblem_conflict_mixed"); + case ModInfo::FLAG_CONFLICT_REDUNDANT: return QIcon(":MO/gui/emblem_conflict_redundant"); + default: return QIcon(); + } +} + +size_t ModFlagIconDelegate::getNumIcons(const QModelIndex &index) const +{ + unsigned int modIdx = index.data(Qt::UserRole + 1).toInt(); + if (modIdx < ModInfo::getNumMods()) { + ModInfo::Ptr info = ModInfo::getByIndex(modIdx); + return info->getFlags().size(); + } else { + return 0; + } +} + -- cgit v1.3.1 From 00f4e1799fb34e070773f3ec170be2dd86ec9c0d Mon Sep 17 00:00:00 2001 From: Tannin Date: Sun, 23 Feb 2014 17:18:20 +0100 Subject: - slightly overworked display of icon delegates - updated installer --- src/icondelegate.cpp | 21 +++++++++++++++------ src/modflagicondelegate.cpp | 22 +++++++++++++++++++++- src/modflagicondelegate.h | 3 ++- src/modinfo.cpp | 12 ++++++------ 4 files changed, 44 insertions(+), 14 deletions(-) (limited to 'src/modflagicondelegate.cpp') diff --git a/src/icondelegate.cpp b/src/icondelegate.cpp index 048b09f9..a0993add 100644 --- a/src/icondelegate.cpp +++ b/src/icondelegate.cpp @@ -21,6 +21,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include IconDelegate::IconDelegate(QObject *parent) @@ -37,25 +38,33 @@ void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, int x = 4; painter->save(); + + int iconWidth = icons.size() > 0 ? ((option.rect.width() / icons.size()) - 4) : 16; + iconWidth = std::min(16, iconWidth); + painter->translate(option.rect.topLeft()); for (auto iter = icons.begin(); iter != icons.end(); ++iter) { - painter->drawPixmap(x, 2, 16, 16, iter->pixmap(QSize(16, 16))); - x += 20; + painter->drawPixmap(x, 2, iconWidth, iconWidth, iter->pixmap(QSize(iconWidth, iconWidth))); + x += iconWidth + 4; } painter->restore(); } -QSize IconDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex &modelIndex) const +QSize IconDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &modelIndex) const { int count = getNumIcons(modelIndex); unsigned int index = modelIndex.data(Qt::UserRole + 1).toInt(); + QSize result; if (index < ModInfo::getNumMods()) { - ModInfo::Ptr info = ModInfo::getByIndex(index); - return QSize(info->getFlags().size() * 20, 20); + result = QSize(count * 40, 20); } else { - return QSize(1, 20); + result = QSize(1, 20); + } + if (option.rect.width() > 0) { + result.setWidth(std::min(option.rect.width(), result.width())); } + return result; } diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp index db69eb52..914503a1 100644 --- a/src/modflagicondelegate.cpp +++ b/src/modflagicondelegate.cpp @@ -2,6 +2,11 @@ #include +ModInfo::EFlag ModFlagIconDelegate::m_ConflictFlags[4] = { ModInfo::FLAG_CONFLICT_MIXED + , ModInfo::FLAG_CONFLICT_OVERWRITE + , ModInfo::FLAG_CONFLICT_OVERWRITTEN + , ModInfo::FLAG_CONFLICT_REDUNDANT }; + ModFlagIconDelegate::ModFlagIconDelegate(QObject *parent) : IconDelegate(parent) { @@ -15,6 +20,16 @@ QList ModFlagIconDelegate::getIcons(const QModelIndex &index) const ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt()); std::vector flags = info->getFlags(); + { // insert conflict icon first to provide nicer alignment + auto iter = std::find_first_of(flags.begin(), flags.end(), m_ConflictFlags, m_ConflictFlags + 4); + if (iter != flags.end()) { + result.append(getFlagIcon(*iter)); + flags.erase(iter); + } else { + result.append(QIcon()); + } + } + for (auto iter = flags.begin(); iter != flags.end(); ++iter) { result.append(getFlagIcon(*iter)); } @@ -42,7 +57,12 @@ size_t ModFlagIconDelegate::getNumIcons(const QModelIndex &index) const unsigned int modIdx = index.data(Qt::UserRole + 1).toInt(); if (modIdx < ModInfo::getNumMods()) { ModInfo::Ptr info = ModInfo::getByIndex(modIdx); - return info->getFlags().size(); + std::vector flags = info->getFlags(); + int count = flags.size(); + if (std::find_first_of(flags.begin(), flags.end(), m_ConflictFlags, m_ConflictFlags + 4) == flags.end()) { + ++count; + } + return count; } else { return 0; } diff --git a/src/modflagicondelegate.h b/src/modflagicondelegate.h index 800e2741..b64ca08f 100644 --- a/src/modflagicondelegate.h +++ b/src/modflagicondelegate.h @@ -12,7 +12,8 @@ private: virtual size_t getNumIcons(const QModelIndex &index) const; QIcon getFlagIcon(ModInfo::EFlag flag) const; - +private: + static ModInfo::EFlag m_ConflictFlags[4]; }; #endif // MODFLAGICONDELEGATE_H diff --git a/src/modinfo.cpp b/src/modinfo.cpp index ed13deae..bd244852 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -637,12 +637,6 @@ void ModInfoRegular::ignoreUpdate(bool ignore) std::vector ModInfoRegular::getFlags() const { std::vector result; - if (!isValid()) { - result.push_back(ModInfo::FLAG_INVALID); - } - if ((m_NexusID != -1) && (endorsedState() == ENDORSED_FALSE)) { - result.push_back(ModInfo::FLAG_NOTENDORSED); - } switch (isConflicted()) { case CONFLICT_MIXED: { result.push_back(ModInfo::FLAG_CONFLICT_MIXED); @@ -658,6 +652,12 @@ std::vector ModInfoRegular::getFlags() const } break; default: { /* NOP */ } } + if ((m_NexusID != -1) && (endorsedState() == ENDORSED_FALSE)) { + result.push_back(ModInfo::FLAG_NOTENDORSED); + } + if (!isValid()) { + result.push_back(ModInfo::FLAG_INVALID); + } if (m_Notes.length() != 0) { result.push_back(ModInfo::FLAG_NOTES); } -- cgit v1.3.1