summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gui/groupview/InstanceDelegate.cpp85
-rw-r--r--gui/groupview/InstanceDelegate.h6
-rw-r--r--logic/BaseInstance.cpp9
-rw-r--r--logic/BaseInstance.h8
-rw-r--r--logic/BaseInstance_p.h7
-rw-r--r--logic/LegacyFTBInstance.cpp2
-rw-r--r--logic/LegacyInstance.cpp4
-rw-r--r--logic/NostalgiaInstance.cpp2
-rw-r--r--logic/OneSixFTBInstance.cpp2
-rw-r--r--logic/OneSixInstance.cpp8
-rw-r--r--resources/instances/broken.pngbin0 -> 1139 bytes
-rw-r--r--resources/instances/instances.qrc11
-rw-r--r--resources/instances/kitten.pngbin0 -> 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
new file mode 100644
index 00000000..7a80a76e
--- /dev/null
+++ b/resources/instances/broken.png
Binary files differ
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
new file mode 100644
index 00000000..d17661ce
--- /dev/null
+++ b/resources/instances/kitten.png
Binary files differ