diff options
-rw-r--r-- | gui/groupview/InstanceDelegate.cpp | 85 | ||||
-rw-r--r-- | gui/groupview/InstanceDelegate.h | 6 | ||||
-rw-r--r-- | logic/BaseInstance.cpp | 9 | ||||
-rw-r--r-- | logic/BaseInstance.h | 8 | ||||
-rw-r--r-- | logic/BaseInstance_p.h | 7 | ||||
-rw-r--r-- | logic/LegacyFTBInstance.cpp | 2 | ||||
-rw-r--r-- | logic/LegacyInstance.cpp | 4 | ||||
-rw-r--r-- | logic/NostalgiaInstance.cpp | 2 | ||||
-rw-r--r-- | logic/OneSixFTBInstance.cpp | 2 | ||||
-rw-r--r-- | logic/OneSixInstance.cpp | 8 | ||||
-rw-r--r-- | resources/instances/broken.png | bin | 0 -> 1139 bytes | |||
-rw-r--r-- | resources/instances/instances.qrc | 11 | ||||
-rw-r--r-- | resources/instances/kitten.png | bin | 0 -> 1605 bytes |
13 files changed, 119 insertions, 25 deletions
diff --git a/gui/groupview/InstanceDelegate.cpp b/gui/groupview/InstanceDelegate.cpp index 8a273758..7ca4d7b4 100644 --- a/gui/groupview/InstanceDelegate.cpp +++ b/gui/groupview/InstanceDelegate.cpp @@ -18,9 +18,13 @@ #include <QTextOption> #include <QTextLayout> #include <QApplication> -#include <QtCore/qmath.h> +#include <QtMath> #include "GroupView.h" +#include "logic/BaseInstance.h" +#include "logic/lists/InstanceList.h" + +QCache<QString, QPixmap> ListViewDelegate::m_pixmapCache; // Origin: Qt static void viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height, @@ -45,8 +49,6 @@ static void viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &he textLayout.endLayout(); } -#define QFIXED_MAX (INT_MAX / 256) - ListViewDelegate::ListViewDelegate(QObject *parent) : QStyledItemDelegate(parent) { } @@ -108,6 +110,64 @@ void drawProgressOverlay(QPainter *painter, const QStyleOptionViewItemV4 &option painter->restore(); } +void drawBadges(QPainter *painter, const QStyleOptionViewItemV4 &option, BaseInstance *instance) +{ + QList<QString> pixmaps; + for (auto flag : instance->flags()) + { + switch (flag) + { + case BaseInstance::VersionBrokenFlag: + pixmaps.append("broken"); + break; + } + } + + // begin easter eggs + if (instance->name().contains("btw", Qt::CaseInsensitive) || + instance->name().contains("better then wolves", Qt::CaseInsensitive) || + instance->name().contains("better than wolves", Qt::CaseInsensitive)) + { + pixmaps.append("herobrine"); + } + if (instance->name().contains("direwolf", Qt::CaseInsensitive)) + { + pixmaps.append("enderman"); + } + if (instance->name().contains("kitten", Qt::CaseInsensitive)) + { + pixmaps.append("kitten"); + } + if (instance->name().contains("derp", Qt::CaseInsensitive)) + { + pixmaps.append("derp"); + } + // end easter eggs + + static const int itemSide = 24; + static const int spacing = 1; + const int itemsPerRow = qMax(1, qFloor(double(option.rect.width() + spacing) / double(itemSide + spacing))); + const int rows = qCeil((double)pixmaps.size() / (double)itemsPerRow); + QListIterator<QString> it(pixmaps); + painter->translate(option.rect.topLeft()); + for (int y = 0; y < rows; ++y) + { + for (int x = 0; x < itemsPerRow; ++x) + { + if (!it.hasNext()) + { + return; + } + const QPixmap pixmap = ListViewDelegate::requestPixmap(it.next()).scaled( + itemSide, itemSide, Qt::KeepAspectRatio, Qt::FastTransformation); + painter->drawPixmap(option.rect.width() - x * itemSide + qMax(x - 1, 0) * spacing - itemSide, + y * itemSide + qMax(y - 1, 0) * spacing, itemSide, itemSide, + pixmap); + } + } + painter->translate(-option.rect.topLeft()); +} + static QSize viewItemTextSize(const QStyleOptionViewItemV4 *option) { QStyle *style = option->widget ? option->widget->style() : QApplication::style(); @@ -257,8 +317,14 @@ void ListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti line.draw(painter, position); } - drawProgressOverlay(painter, opt, - index.data(GroupViewRoles::ProgressValueRole).toInt(), + auto instance = (BaseInstance*)index.data(InstanceList::InstancePointerRole) + .value<void *>(); + if (instance) + { + drawBadges(painter, opt, instance); + } + + drawProgressOverlay(painter, opt, index.data(GroupViewRoles::ProgressValueRole).toInt(), index.data(GroupViewRoles::ProgressMaximumRole).toInt()); painter->restore(); @@ -284,3 +350,12 @@ QSize ListViewDelegate::sizeHint(const QStyleOptionViewItem &option, QSize sz(100, height); return sz; } + +QPixmap ListViewDelegate::requestPixmap(const QString &key) +{ + if (!m_pixmapCache.contains(key)) + { + m_pixmapCache.insert(key, new QPixmap(":/icons/badges/" + key + ".png")); + } + return *m_pixmapCache.object(key); +} diff --git a/gui/groupview/InstanceDelegate.h b/gui/groupview/InstanceDelegate.h index de2f429b..9ab44864 100644 --- a/gui/groupview/InstanceDelegate.h +++ b/gui/groupview/InstanceDelegate.h @@ -16,14 +16,20 @@ #pragma once #include <QStyledItemDelegate> +#include <QCache> class ListViewDelegate : public QStyledItemDelegate { public: explicit ListViewDelegate(QObject *parent = 0); + static QPixmap requestPixmap(const QString &key); + protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + +private: + static QCache<QString, QPixmap> m_pixmapCache; }; diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index c565ab59..c7b29548 100644 --- a/logic/BaseInstance.cpp +++ b/logic/BaseInstance.cpp @@ -37,7 +37,6 @@ BaseInstance::BaseInstance(BaseInstancePrivate *d_in, const QString &rootDir, I_D(BaseInstance); d->m_settings = settings_obj; d->m_rootDir = rootDir; - d->m_flags = 0; settings().registerSetting("name", "Unnamed Instance"); settings().registerSetting("iconKey", "default"); @@ -147,13 +146,13 @@ SettingsObject &BaseInstance::settings() const return *d->m_settings; } -BaseInstance::InstanceFlags BaseInstance::flags() const +QSet<BaseInstance::InstanceFlag> BaseInstance::flags() const { I_D(const BaseInstance); - return InstanceFlags(d->m_flags); + return QSet<InstanceFlag>(d->m_flags); } -void BaseInstance::setFlags(const BaseInstance::InstanceFlags flags) +void BaseInstance::setFlags(const QSet<InstanceFlag> &flags) { I_D(BaseInstance); if (flags != d->m_flags) @@ -166,7 +165,7 @@ void BaseInstance::setFlags(const BaseInstance::InstanceFlags flags) bool BaseInstance::canLaunch() const { - return !(flags() & VersionBrokenFlag); + return !flags().contains(VersionBrokenFlag); } bool BaseInstance::reload() diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h index 195fd339..d38ae409 100644 --- a/logic/BaseInstance.h +++ b/logic/BaseInstance.h @@ -17,6 +17,7 @@ #include <QObject> #include <QDateTime> +#include <QSet> #include <settingsobject.h> @@ -184,9 +185,8 @@ public: NoFlags = 0x00, VersionBrokenFlag = 0x01 }; - Q_DECLARE_FLAGS(InstanceFlags, InstanceFlag) - InstanceFlags flags() const; - void setFlags(const BaseInstance::InstanceFlags flags); + QSet<InstanceFlag> flags() const; + void setFlags(const QSet<InstanceFlag> &flags); bool canLaunch() const; @@ -218,4 +218,4 @@ protected: // pointer for lazy people typedef std::shared_ptr<BaseInstance> InstancePtr; -Q_DECLARE_OPERATORS_FOR_FLAGS(BaseInstance::InstanceFlags) +Q_DECLARE_METATYPE(BaseInstance::InstanceFlag) diff --git a/logic/BaseInstance_p.h b/logic/BaseInstance_p.h index 73eebec7..8cf3b27d 100644 --- a/logic/BaseInstance_p.h +++ b/logic/BaseInstance_p.h @@ -14,10 +14,13 @@ */ #pragma once + #include <QString> +#include <QSet> + #include <settingsobject.h> -class BaseInstance; +#include "BaseInstance.h" #define I_D(Class) Class##Private *const d = (Class##Private * const)inst_d.get() @@ -26,5 +29,5 @@ struct BaseInstancePrivate QString m_rootDir; QString m_group; SettingsObject *m_settings; - int m_flags; + QSet<BaseInstance::InstanceFlag> m_flags; }; diff --git a/logic/LegacyFTBInstance.cpp b/logic/LegacyFTBInstance.cpp index 23cb259d..3c3356c9 100644 --- a/logic/LegacyFTBInstance.cpp +++ b/logic/LegacyFTBInstance.cpp @@ -7,7 +7,7 @@ LegacyFTBInstance::LegacyFTBInstance(const QString &rootDir, SettingsObject *set QString LegacyFTBInstance::getStatusbarDescription() { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return "Legacy FTB: " + intendedVersionId() + " (broken)"; } diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp index 3b9181e0..4f2dfd9b 100644 --- a/logic/LegacyInstance.cpp +++ b/logic/LegacyInstance.cpp @@ -268,7 +268,7 @@ QString LegacyInstance::defaultCustomBaseJar() const bool LegacyInstance::menuActionEnabled(QString action_name) const { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return false; } @@ -281,7 +281,7 @@ bool LegacyInstance::menuActionEnabled(QString action_name) const QString LegacyInstance::getStatusbarDescription() { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return "Legacy : " + intendedVersionId() + " (broken)"; } diff --git a/logic/NostalgiaInstance.cpp b/logic/NostalgiaInstance.cpp index 96ce4cc7..52820725 100644 --- a/logic/NostalgiaInstance.cpp +++ b/logic/NostalgiaInstance.cpp @@ -23,7 +23,7 @@ NostalgiaInstance::NostalgiaInstance(const QString &rootDir, SettingsObject *set QString NostalgiaInstance::getStatusbarDescription() { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return "Nostalgia : " + intendedVersionId() + " (broken)"; } diff --git a/logic/OneSixFTBInstance.cpp b/logic/OneSixFTBInstance.cpp index 8f70ed08..172830bb 100644 --- a/logic/OneSixFTBInstance.cpp +++ b/logic/OneSixFTBInstance.cpp @@ -119,7 +119,7 @@ bool OneSixFTBInstance::providesVersionFile() const QString OneSixFTBInstance::getStatusbarDescription() { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return "OneSix FTB: " + intendedVersionId() + " (broken)"; } diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index ed7ad993..ccc25845 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -333,14 +333,14 @@ void OneSixInstance::reloadVersion() { d->version->reload(false, externalPatches()); d->vanillaVersion->reload(true, externalPatches()); - setFlags(flags() & ~VersionBrokenFlag); + d->m_flags.remove(VersionBrokenFlag); emit versionReloaded(); } catch(MMCError & error) { d->version->clear(); d->vanillaVersion->clear(); - setFlags(flags() | VersionBrokenFlag); + d->m_flags.insert(VersionBrokenFlag); //TODO: rethrow to show some error message(s)? emit versionReloaded(); throw; @@ -379,7 +379,7 @@ QString OneSixInstance::defaultCustomBaseJar() const bool OneSixInstance::menuActionEnabled(QString action_name) const { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return false; } @@ -397,7 +397,7 @@ QString OneSixInstance::getStatusbarDescription() { descr += " (custom)"; } - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { descr += " (broken)"; } diff --git a/resources/instances/broken.png b/resources/instances/broken.png Binary files differnew file mode 100644 index 00000000..7a80a76e --- /dev/null +++ b/resources/instances/broken.png diff --git a/resources/instances/instances.qrc b/resources/instances/instances.qrc index ec3cdf21..5124b846 100644 --- a/resources/instances/instances.qrc +++ b/resources/instances/instances.qrc @@ -32,4 +32,15 @@ <file alias="squarecreeper">squarecreeper128.png</file> <file alias="steve">steve128.png</file> </qresource> + <qresource prefix="/icons/badges"> + <!-- Source: see above --> + <file>enderman.png</file> + <file>herobrine.png</file> + <file>derp.png</file> + + <!-- Source: http://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Brown-icon.html --> + <file>kitten.png</file> + <!-- Source: http://www.iconarchive.com/show/crystal-clear-icons-by-everaldo/Filesystem-file-broken-icon.html --> + <file>broken.png</file> + </qresource> </RCC> diff --git a/resources/instances/kitten.png b/resources/instances/kitten.png Binary files differnew file mode 100644 index 00000000..d17661ce --- /dev/null +++ b/resources/instances/kitten.png |