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') 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