From f9d94a45eebd5fb7b14d4bcc6ad77cb96ecdd771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 10 Nov 2016 02:54:53 +0100 Subject: [PATCH] NOISSUE allow using icon themes for instances and instance badges --- api/gui/icons/IconList.cpp | 47 +++++++++-- api/gui/icons/IconList.h | 3 +- api/gui/icons/MMCIcon.cpp | 21 ++++- api/gui/icons/MMCIcon.h | 5 +- application/CMakeLists.txt | 1 - application/MultiMC.cpp | 8 +- application/groupview/InstanceDelegate.cpp | 76 ++++++------------ application/groupview/InstanceDelegate.h | 5 -- application/main.cpp | 1 - application/resources/instances/broken.png | Bin 1139 -> 0 bytes application/resources/instances/derp.png | Bin 5225 -> 0 bytes application/resources/instances/instances.qrc | 51 ------------ application/resources/instances/kitten.png | Bin 1605 -> 0 bytes .../resources/instances/status-bad.png | Bin 1102 -> 0 bytes .../resources/instances/status-running.png | Bin 1059 -> 0 bytes .../resources/instances/updateavailable.png | Bin 2480 -> 0 bytes .../128x128/instances/chicken.png} | Bin .../128x128/instances/creeper.png} | Bin .../128x128/instances/enderpearl.png} | Bin .../128x128/instances/ftb_glow.png} | Bin .../128x128/instances/ftb_logo.png} | Bin .../128x128/instances/gear.png} | Bin .../128x128/instances/herobrine.png} | Bin .../128x128/instances/infinity.png} | Bin .../128x128/instances/magitech.png} | Bin .../128x128/instances/meat.png} | Bin .../128x128/instances/netherstar.png} | Bin .../128x128/instances/skeleton.png} | Bin .../128x128/instances/squarecreeper.png} | Bin .../128x128/instances/steve.png} | Bin .../{ => multimc/32x32}/instances/brick.png | Bin .../{ => multimc/32x32}/instances/chicken.png | Bin .../{ => multimc/32x32}/instances/creeper.png | Bin .../{ => multimc/32x32}/instances/diamond.png | Bin .../{ => multimc/32x32}/instances/dirt.png | Bin .../32x32}/instances/enderpearl.png | Bin .../32x32}/instances/ftb_glow.png | Bin .../32x32}/instances/ftb_logo.png | Bin .../{ => multimc/32x32}/instances/gear.png | Bin .../{ => multimc/32x32}/instances/gold.png | Bin .../{ => multimc/32x32}/instances/grass.png | Bin .../32x32}/instances/herobrine.png | Bin .../32x32}/instances/infinity.png | Bin .../{ => multimc/32x32}/instances/iron.png | Bin .../32x32}/instances/magitech.png | Bin .../{ => multimc/32x32}/instances/meat.png | Bin .../32x32}/instances/netherstar.png | Bin .../{ => multimc/32x32}/instances/planks.png | Bin .../32x32}/instances/skeleton.png | Bin .../32x32}/instances/squarecreeper.png | Bin .../{ => multimc/32x32}/instances/steve.png | Bin .../{ => multimc/32x32}/instances/stone.png | Bin .../{ => multimc/32x32}/instances/tnt.png | Bin .../50x50}/instances/enderman.png | Bin application/resources/multimc/index.theme | 22 +++-- application/resources/multimc/multimc.qrc | 56 ++++++++++++- 56 files changed, 165 insertions(+), 131 deletions(-) delete mode 100644 application/resources/instances/broken.png delete mode 100644 application/resources/instances/derp.png delete mode 100644 application/resources/instances/instances.qrc delete mode 100644 application/resources/instances/kitten.png delete mode 100644 application/resources/instances/status-bad.png delete mode 100644 application/resources/instances/status-running.png delete mode 100644 application/resources/instances/updateavailable.png rename application/resources/{instances/chicken128.png => multimc/128x128/instances/chicken.png} (100%) rename application/resources/{instances/creeper128.png => multimc/128x128/instances/creeper.png} (100%) rename application/resources/{instances/enderpearl128.png => multimc/128x128/instances/enderpearl.png} (100%) rename application/resources/{instances/ftb_glow128.png => multimc/128x128/instances/ftb_glow.png} (100%) rename application/resources/{instances/ftb_logo128.png => multimc/128x128/instances/ftb_logo.png} (100%) rename application/resources/{instances/gear128.png => multimc/128x128/instances/gear.png} (100%) rename application/resources/{instances/herobrine128.png => multimc/128x128/instances/herobrine.png} (100%) rename application/resources/{instances/infinity128.png => multimc/128x128/instances/infinity.png} (100%) rename application/resources/{instances/magitech128.png => multimc/128x128/instances/magitech.png} (100%) rename application/resources/{instances/meat128.png => multimc/128x128/instances/meat.png} (100%) rename application/resources/{instances/netherstar128.png => multimc/128x128/instances/netherstar.png} (100%) rename application/resources/{instances/skeleton128.png => multimc/128x128/instances/skeleton.png} (100%) rename application/resources/{instances/squarecreeper128.png => multimc/128x128/instances/squarecreeper.png} (100%) rename application/resources/{instances/steve128.png => multimc/128x128/instances/steve.png} (100%) rename application/resources/{ => multimc/32x32}/instances/brick.png (100%) rename application/resources/{ => multimc/32x32}/instances/chicken.png (100%) rename application/resources/{ => multimc/32x32}/instances/creeper.png (100%) rename application/resources/{ => multimc/32x32}/instances/diamond.png (100%) rename application/resources/{ => multimc/32x32}/instances/dirt.png (100%) rename application/resources/{ => multimc/32x32}/instances/enderpearl.png (100%) rename application/resources/{ => multimc/32x32}/instances/ftb_glow.png (100%) rename application/resources/{ => multimc/32x32}/instances/ftb_logo.png (100%) rename application/resources/{ => multimc/32x32}/instances/gear.png (100%) rename application/resources/{ => multimc/32x32}/instances/gold.png (100%) rename application/resources/{ => multimc/32x32}/instances/grass.png (100%) rename application/resources/{ => multimc/32x32}/instances/herobrine.png (100%) rename application/resources/{ => multimc/32x32}/instances/infinity.png (100%) rename application/resources/{ => multimc/32x32}/instances/iron.png (100%) rename application/resources/{ => multimc/32x32}/instances/magitech.png (100%) rename application/resources/{ => multimc/32x32}/instances/meat.png (100%) rename application/resources/{ => multimc/32x32}/instances/netherstar.png (100%) rename application/resources/{ => multimc/32x32}/instances/planks.png (100%) rename application/resources/{ => multimc/32x32}/instances/skeleton.png (100%) rename application/resources/{ => multimc/32x32}/instances/squarecreeper.png (100%) rename application/resources/{ => multimc/32x32}/instances/steve.png (100%) rename application/resources/{ => multimc/32x32}/instances/stone.png (100%) rename application/resources/{ => multimc/32x32}/instances/tnt.png (100%) rename application/resources/{ => multimc/50x50}/instances/enderman.png (100%) diff --git a/api/gui/icons/IconList.cpp b/api/gui/icons/IconList.cpp index bdcada323..100a69c3e 100644 --- a/api/gui/icons/IconList.cpp +++ b/api/gui/icons/IconList.cpp @@ -25,15 +25,23 @@ #define MAX_SIZE 1024 -IconList::IconList(QString builtinPath, QString path, QObject *parent) : QAbstractListModel(parent) +IconList::IconList(const QStringList &builtinPaths, QString path, QObject *parent) : QAbstractListModel(parent) { + QSet builtinNames; + // add builtin icons - QDir instance_icons(builtinPath); - auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name); - for (auto file_info : file_info_list) + for(auto & builtinPath: builtinPaths) { - QString key = file_info.baseName(); - addIcon(key, key, file_info.absoluteFilePath(), IconType::Builtin); + QDir instance_icons(builtinPath); + auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name); + for (auto file_info : file_info_list) + { + builtinNames.insert(file_info.baseName()); + } + } + for(auto & builtinName : builtinNames) + { + addThemeIcon(builtinName); } m_watcher.reset(new QFileSystemWatcher()); @@ -292,6 +300,33 @@ bool IconList::deleteIcon(const QString &key) return false; } +bool IconList::addThemeIcon(const QString& key) +{ + auto iter = name_index.find(key); + if (iter != name_index.end()) + { + auto &oldOne = icons[*iter]; + oldOne.replace(Builtin, key); + dataChanged(index(*iter), index(*iter)); + return true; + } + else + { + // add a new icon + beginInsertRows(QModelIndex(), icons.size(), icons.size()); + { + MMCIcon mmc_icon; + mmc_icon.m_name = key; + mmc_icon.m_key = key; + mmc_icon.replace(Builtin, key); + icons.push_back(mmc_icon); + name_index[key] = icons.size() - 1; + } + endInsertRows(); + return true; + } +} + bool IconList::addIcon(const QString &key, const QString &name, const QString &path, const IconType type) { // replace the icon even? is the input valid? diff --git a/api/gui/icons/IconList.h b/api/gui/icons/IconList.h index 7b07797fe..f6b2ed0a6 100644 --- a/api/gui/icons/IconList.h +++ b/api/gui/icons/IconList.h @@ -34,7 +34,7 @@ class MULTIMC_GUI_EXPORT IconList : public QAbstractListModel, public IIconList { Q_OBJECT public: - explicit IconList(QString builtinPath, QString path, QObject *parent = 0); + explicit IconList(const QStringList &builtinPaths, QString path, QObject *parent = 0); virtual ~IconList() {}; QIcon getIcon(const QString &key) const; @@ -44,6 +44,7 @@ public: virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override; + bool addThemeIcon(const QString &key); bool addIcon(const QString &key, const QString &name, const QString &path, const IconType type) override; void saveIcon(const QString &key, const QString &path, const char * format) const override; bool deleteIcon(const QString &key) override; diff --git a/api/gui/icons/MMCIcon.cpp b/api/gui/icons/MMCIcon.cpp index f71281d0b..11ad93e2c 100644 --- a/api/gui/icons/MMCIcon.cpp +++ b/api/gui/icons/MMCIcon.cpp @@ -15,6 +15,7 @@ #include "MMCIcon.h" #include +#include IconType operator--(IconType &t, int) { @@ -58,7 +59,11 @@ QIcon MMCIcon::icon() const { if (m_current_type == IconType::ToBeDeleted) return QIcon(); - return m_images[m_current_type].icon; + auto & icon = m_images[m_current_type].icon; + if(!icon.isNull()) + return icon; + // FIXME: inject this. + return XdgIcon::fromTheme(m_images[m_current_type].key); } void MMCIcon::remove(IconType rm_type) @@ -78,12 +83,22 @@ void MMCIcon::remove(IconType rm_type) void MMCIcon::replace(IconType new_type, QIcon icon, QString path) { - QFileInfo foo(path); if (new_type > m_current_type || m_current_type == IconType::ToBeDeleted) { m_current_type = new_type; } m_images[new_type].icon = icon; - m_images[new_type].changed = foo.lastModified(); m_images[new_type].filename = path; + m_images[new_type].key = QString(); +} + +void MMCIcon::replace(IconType new_type, const QString& key) +{ + if (new_type > m_current_type || m_current_type == IconType::ToBeDeleted) + { + m_current_type = new_type; + } + m_images[new_type].icon = QIcon(); + m_images[new_type].filename = QString(); + m_images[new_type].key = key; } diff --git a/api/gui/icons/MMCIcon.h b/api/gui/icons/MMCIcon.h index 4bc7ecdc1..23231945e 100644 --- a/api/gui/icons/MMCIcon.h +++ b/api/gui/icons/MMCIcon.h @@ -24,11 +24,11 @@ struct MULTIMC_GUI_EXPORT MMCImage { QIcon icon; + QString key; QString filename; - QDateTime changed; bool present() const { - return !icon.isNull(); + return !icon.isNull() && !key.isEmpty(); } }; @@ -45,4 +45,5 @@ struct MULTIMC_GUI_EXPORT MMCIcon QIcon icon() const; void remove(IconType rm_type); void replace(IconType new_type, QIcon icon, QString path = QString()); + void replace(IconType new_type, const QString &key); }; diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index f89de0cbd..64879e27e 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -304,7 +304,6 @@ set(MULTIMC_QRCS resources/pe_blue/pe_blue.qrc resources/OSX/OSX.qrc resources/iOS/iOS.qrc - resources/instances/instances.qrc resources/versions/versions.qrc resources/certs/certs.qrc ) diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 2cc934f1e..c102e1984 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -411,7 +411,13 @@ void MultiMC::initTranslations() void MultiMC::initIcons() { auto setting = MMC->settings()->getSetting("IconsDir"); - m_icons.reset(new IconList(QString(":/icons/instances/"), setting->get().toString())); + QStringList instFolders = + { + ":/icons/multimc/32x32/instances/", + ":/icons/multimc/50x50/instances/", + ":/icons/multimc/128x128/instances/" + }; + m_icons.reset(new IconList(instFolders, setting->get().toString())); connect(setting.get(), &Setting::SettingChanged,[&](const Setting &, QVariant value) { m_icons->directoryChanged(value.toString()); diff --git a/application/groupview/InstanceDelegate.cpp b/application/groupview/InstanceDelegate.cpp index b88f9a8a5..532b9d5bb 100644 --- a/application/groupview/InstanceDelegate.cpp +++ b/application/groupview/InstanceDelegate.cpp @@ -23,8 +23,7 @@ #include "GroupView.h" #include "BaseInstance.h" #include "InstanceList.h" - -QCache ListViewDelegate::m_pixmapCache; +#include // Origin: Qt static void viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height, @@ -110,47 +109,22 @@ void drawProgressOverlay(QPainter *painter, const QStyleOptionViewItemV4 &option painter->restore(); } -void drawBadges(QPainter *painter, const QStyleOptionViewItemV4 &option, BaseInstance *instance) +void drawBadges(QPainter *painter, const QStyleOptionViewItemV4 &option, BaseInstance *instance, QIcon::Mode mode, QIcon::State state) { QList pixmaps; if (instance->isRunning()) { pixmaps.append("status-running"); } - else if (instance->hasCrashed()) + else if (instance->hasCrashed() || instance->hasVersionBroken()) { pixmaps.append("status-bad"); } - if (instance->hasVersionBroken()) - { - pixmaps.append("broken"); - } if (instance->hasUpdateAvailable()) { - pixmaps.append("updateavailable"); + pixmaps.append("checkupdate"); } - // 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))); @@ -165,11 +139,18 @@ void drawBadges(QPainter *painter, const QStyleOptionViewItemV4 &option, BaseIns { return; } - const QPixmap pixmap = ListViewDelegate::requestBadgePixmap(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); + // FIXME: inject this. + auto icon = XdgIcon::fromTheme(it.next()); + // opt.icon.paint(painter, iconbox, Qt::AlignCenter, mode, state); + const QPixmap pixmap; + // itemSide + QRect badgeRect( + option.rect.width() - x * itemSide + qMax(x - 1, 0) * spacing - itemSide, + y * itemSide + qMax(y - 1, 0) * spacing, + itemSide, + itemSide + ); + icon.paint(painter, badgeRect, Qt::AlignCenter, mode, state); } } painter->translate(-option.rect.topLeft()); @@ -274,15 +255,16 @@ void ListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti */ } + // icon mode and state, also used for badges + QIcon::Mode mode = QIcon::Normal; + if (!(opt.state & QStyle::State_Enabled)) + mode = QIcon::Disabled; + else if (opt.state & QStyle::State_Selected) + mode = QIcon::Selected; + QIcon::State state = opt.state & QStyle::State_Open ? QIcon::On : QIcon::Off; + // draw the icon { - QIcon::Mode mode = QIcon::Normal; - if (!(opt.state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (opt.state & QStyle::State_Selected) - mode = QIcon::Selected; - QIcon::State state = opt.state & QStyle::State_Open ? QIcon::On : QIcon::Off; - iconbox.setHeight(iconSize); opt.icon.paint(painter, iconbox, Qt::AlignCenter, mode, state); } @@ -329,7 +311,7 @@ void ListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti .value(); if (instance) { - drawBadges(painter, opt, instance); + drawBadges(painter, opt, instance, mode, state); } drawProgressOverlay(painter, opt, index.data(GroupViewRoles::ProgressValueRole).toInt(), @@ -359,11 +341,3 @@ QSize ListViewDelegate::sizeHint(const QStyleOptionViewItem &option, return sz; } -QPixmap ListViewDelegate::requestBadgePixmap(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/application/groupview/InstanceDelegate.h b/application/groupview/InstanceDelegate.h index 2b5439cb1..f62df99e6 100644 --- a/application/groupview/InstanceDelegate.h +++ b/application/groupview/InstanceDelegate.h @@ -23,13 +23,8 @@ class ListViewDelegate : public QStyledItemDelegate public: explicit ListViewDelegate(QObject *parent = 0); - static QPixmap requestBadgePixmap(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/application/main.cpp b/application/main.cpp index 5b557170b..61771f6e5 100644 --- a/application/main.cpp +++ b/application/main.cpp @@ -13,7 +13,6 @@ int main(int argc, char *argv[]) { case MultiMC::Initialized: { - Q_INIT_RESOURCE(instances); Q_INIT_RESOURCE(multimc); Q_INIT_RESOURCE(backgrounds); Q_INIT_RESOURCE(versions); diff --git a/application/resources/instances/broken.png b/application/resources/instances/broken.png deleted file mode 100644 index 7a80a76e53c3fd4e6a407e18c569f6cef05b25b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 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 diff --git a/application/resources/instances/instances.qrc b/application/resources/instances/instances.qrc deleted file mode 100644 index 1f90762a0..000000000 --- a/application/resources/instances/instances.qrc +++ /dev/null @@ -1,51 +0,0 @@ - - - - - brick.png - diamond.png - dirt.png - gold.png - grass.png - stone.png - tnt.png - iron.png - planks.png - - - derp.png - enderman.png - - - chicken128.png - creeper128.png - enderpearl128.png - ftb_glow128.png - ftb_logo128.png - gear128.png - herobrine128.png - infinity128.png - magitech128.png - meat128.png - netherstar128.png - skeleton128.png - squarecreeper128.png - steve128.png - - - - enderman.png - herobrine.png - derp.png - status-running.png - status-bad.png - - - updateavailable.png - - - kitten.png - - broken.png - - diff --git a/application/resources/instances/kitten.png b/application/resources/instances/kitten.png deleted file mode 100644 index d17661ce5775bfe1493b7ed23d8632174ff431cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1605 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�wzId}V9x`v^@l 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 scalable/discord.svg - + + 32x32/instances/chicken.png + 128x128/instances/chicken.png + + 32x32/instances/creeper.png + 128x128/instances/creeper.png + + 32x32/instances/enderpearl.png + 128x128/instances/enderpearl.png + + 32x32/instances/ftb_glow.png + 128x128/instances/ftb_glow.png + + 32x32/instances/ftb_logo.png + 128x128/instances/ftb_logo.png + + 32x32/instances/gear.png + 128x128/instances/gear.png + + 32x32/instances/herobrine.png + 128x128/instances/herobrine.png + + 32x32/instances/infinity.png + 128x128/instances/infinity.png + + 32x32/instances/magitech.png + 128x128/instances/magitech.png + + 32x32/instances/meat.png + 128x128/instances/meat.png + + 32x32/instances/netherstar.png + 128x128/instances/netherstar.png + + 32x32/instances/skeleton.png + 128x128/instances/skeleton.png + + 32x32/instances/squarecreeper.png + 128x128/instances/squarecreeper.png + + 32x32/instances/steve.png + 128x128/instances/steve.png + + 32x32/instances/brick.png + 32x32/instances/diamond.png + 32x32/instances/dirt.png + 32x32/instances/gold.png + 32x32/instances/grass.png + 32x32/instances/iron.png + 32x32/instances/planks.png + 32x32/instances/stone.png + 32x32/instances/tnt.png + + 50x50/instances/enderman.png +