From 73fc9c79cff979e9023df0b1a77848c67b590681 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Mon, 10 Mar 2014 17:38:27 +0100 Subject: [PATCH] Instance badges. Some easter eggs and one for broken so far. --- gui/groupview/InstanceDelegate.cpp | 85 +++++++++++++++++++++++++++-- gui/groupview/InstanceDelegate.h | 6 ++ logic/BaseInstance.cpp | 9 ++- logic/BaseInstance.h | 8 +-- logic/BaseInstance_p.h | 7 ++- logic/LegacyFTBInstance.cpp | 2 +- logic/LegacyInstance.cpp | 4 +- logic/NostalgiaInstance.cpp | 2 +- logic/OneSixFTBInstance.cpp | 2 +- logic/OneSixInstance.cpp | 8 +-- resources/instances/broken.png | Bin 0 -> 1589 bytes resources/instances/instances.qrc | 7 +++ resources/instances/kitten.png | Bin 0 -> 9107 bytes 13 files changed, 115 insertions(+), 25 deletions(-) create mode 100644 resources/instances/broken.png create mode 100644 resources/instances/kitten.png diff --git a/gui/groupview/InstanceDelegate.cpp b/gui/groupview/InstanceDelegate.cpp index 8a2737587..7ca4d7b4e 100644 --- a/gui/groupview/InstanceDelegate.cpp +++ b/gui/groupview/InstanceDelegate.cpp @@ -18,9 +18,13 @@ #include #include #include -#include +#include #include "GroupView.h" +#include "logic/BaseInstance.h" +#include "logic/lists/InstanceList.h" + +QCache 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 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 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(); + 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 de2f429bb..9ab44864a 100644 --- a/gui/groupview/InstanceDelegate.h +++ b/gui/groupview/InstanceDelegate.h @@ -16,14 +16,20 @@ #pragma once #include +#include 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 m_pixmapCache; }; diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index d78f1ea01..24af20cf2 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::flags() const { I_D(const BaseInstance); - return InstanceFlags(d->m_flags); + return QSet(d->m_flags); } -void BaseInstance::setFlags(const BaseInstance::InstanceFlags flags) +void BaseInstance::setFlags(const QSet &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); } QString BaseInstance::baseJar() const diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h index 27f939bcf..443b0eaa6 100644 --- a/logic/BaseInstance.h +++ b/logic/BaseInstance.h @@ -17,6 +17,7 @@ #include #include +#include #include @@ -184,9 +185,8 @@ public: NoFlags = 0x00, VersionBrokenFlag = 0x01 }; - Q_DECLARE_FLAGS(InstanceFlags, InstanceFlag) - InstanceFlags flags() const; - void setFlags(const BaseInstance::InstanceFlags flags); + QSet flags() const; + void setFlags(const QSet &flags); bool canLaunch() const; @@ -216,4 +216,4 @@ protected: // pointer for lazy people typedef std::shared_ptr 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 73eebec73..8cf3b27d0 100644 --- a/logic/BaseInstance_p.h +++ b/logic/BaseInstance_p.h @@ -14,10 +14,13 @@ */ #pragma once + #include +#include + #include -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 m_flags; }; diff --git a/logic/LegacyFTBInstance.cpp b/logic/LegacyFTBInstance.cpp index 23cb259d4..3c3356c98 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 3b9181e0f..4f2dfd9be 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 96ce4cc72..52820725d 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 91efce8e1..07b123b6d 100644 --- a/logic/OneSixFTBInstance.cpp +++ b/logic/OneSixFTBInstance.cpp @@ -182,7 +182,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 10411c560..148fbc09e 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -327,12 +327,12 @@ bool OneSixInstance::reloadVersion(QWidget *widgetParent) } if (ret) { - setFlags(flags() & ~VersionBrokenFlag); + d->m_flags.remove(VersionBrokenFlag); emit versionReloaded(); } else { - setFlags(flags() | VersionBrokenFlag); + d->m_flags.insert(VersionBrokenFlag); } return ret; } @@ -369,7 +369,7 @@ QString OneSixInstance::defaultCustomBaseJar() const bool OneSixInstance::menuActionEnabled(QString action_name) const { - if (flags() & VersionBrokenFlag) + if (flags().contains(VersionBrokenFlag)) { return false; } @@ -387,7 +387,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 new file mode 100644 index 0000000000000000000000000000000000000000..9be55691366ae61b828b814489bb7ec91f21ba9c GIT binary patch literal 1589 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFlT0lM3hAM`dB6B=jtVb)aX^@7BGN-jeSKyVsdtB zi9%9pdS;%j()-=}l@u~lY?Z=IeGPmIoKrJ0J*tXQgRA^PlB=?lEmM^2?G$V(tSWK~ za#KqZ6)JLb@`|l0Y?Z*~TICg6frRyy6u?SKvTcwn`Gtf;oFf&jv zGt@IQHZeCh*HJJsFf`CNFw!?P(ls=E?jkSNl+@n@mS3-4yi0i)elN7&Mz%WP7O*;Q$}(iev3c~p?<<`tJD<|U`X^kyRTn&8!I*=;&nOY-((2;9_CwWa?zB1l5>=6z>t7C}RJ8_jZ>ofr-scDh1+>%F@-VmPhcP+^}4UC+U21Lc}SyNAeRo zR<;hYr@^Tt?|{>3$DB_6?ELQ(ZbTQzUv^D7ju|b(I~<;fIAidjy&O_%sO4S5s#&pf9-Bdy)$--1)svU*A7C(xm#%3@4{T*JS<2 z$#w<1|IRQ{zE!bhKmT+qt8=_Us$44j4HZ|Mkj_2)zl8PH^i7cozmBmzF_M&uJ}SXB zF{Nv!owML)`=>(fJ4zg?qb{#;|5+1#+QpRfik%T_yVt=_sV=8f`3hfNDKmNf@!-LS pPw(Ah_;dWx(@%*ooS1%_k9Busquarecreeper128.png steve128.png + + enderman.png + herobrine.png + kitten.png + broken.png + derp.png + diff --git a/resources/instances/kitten.png b/resources/instances/kitten.png new file mode 100644 index 0000000000000000000000000000000000000000..f9999b06138f1b8aa946ba4d23e32a287492962e GIT binary patch literal 9107 zcmZ?wbhEHbG-5DfIKuz}|9`GZ36lB$|Nr`#-q((0iiwG(s>x?L>7GdpH8nN;+?{*t zOqIzV@Bb4gs;H>k>}YT_R4jGW_p;Evd%orGquU@OaAU>)+sa8xKZ|p6r-l4h)|c4= z@iAI{MLflUNm)Wd4ZVp;b=e(FExzpS9gGtjScNzk7cJuGYp7>r;+Z<#aOSGji%J$V zaxC1kZOdlH)ob$9>^WCuZ`rYZ@y?@*iaR*h=CgAiI-8P zXWDq<_&#I?C;Khno%C=?r$-%$2<9tyQ?2+;n?K9KDNh_ssF)k_Vmm>R(tMWTh-jZ!Z21$ z;l<6Xo5O@1&Mq>TbL<3rS+vLeYu`Gz$#WN*l+TpPws;<)$jkWcKteI|tEsZhA6-w( zPxR2>xTo(D@#0~-LYqcXi{fai8BH~#sb;jSp-?`sG5 z>?d|WdiMMS+Owb2Fh%sUh(i4C{26~ve%g|)aG2@MJ<*j5Pd6Ox7SN8{GNVv(zuFfU z$q0u{OB$1uz5h?LIr%QRX96RSiA2CA#?ygD-h3N8UmtUsp(M@mbfwR;3$t~L1C}gx zICv~jc+sOhH@3_;FX`=SdRHspW*8S&)h-sc$=TuSLnr^UIlWHzc1ZGlmCER6YbWf` zU%2OO*7K~1nswjAq?^Op#f&?I?`y0nIlk!lq>evV8J|v(I9;dy+rvrU*Rph`X|qVu zg>!p$E3fF#3v~9KmRfd5=N@C@@mE)hEehM_R`ZH+2rB&8H#fBWn5k@VB~#q&jWGv* zyb@rL`<4H3@4RLcb-pQi^Nr5MtEpRL@m5^j9;wo}A}vtDuUvKc@w@YiB`<9{{C|z{ zZqvE1K1*(t%QE5NNND&Xctc9Ok)vsfq|mRmYWGEX!!jPWN~En=$c3#xk0mYMJ>LQ! ziu&B0D<&p(>rB=Ei4%2ob#Hbwlsf7=8Y+5O=n@=+0u3|~n-)#sqfCy;FRe|`Mwxmc zX;BC|%7l~_1q3ignFQ!N%5-XhLlYnKrt0t|Y->A&^plp9F6Q8^;x*6eIWaL_cmku? ze+z>b366$Sbz(Oe|72ULF_o|ARL#ub<(vA9buI-hNNBt`mp@-lHHt@rXW^m_FVz)3 zuUJ@BwHM9t+NyPVrrg3Z*38KZF3XsH>fL&=RPL-(-IZ;jY0uXj*RFeZX=;(UgqU#y z^ZknI?;f*UJJ`S1ay^|QalB0Yy3TUHOGb)eeIB4OrPNbS2Jr`-BHSmLmf5LGuw&e)6<*Wft7TKHt literal 0 HcmV?d00001