Implement icon picker, bring back raster icons.
This commit is contained in:
@ -52,6 +52,7 @@ lists/InstanceList.h
|
||||
lists/InstVersionList.h
|
||||
lists/MinecraftVersionList.h
|
||||
lists/LwjglVersionList.h
|
||||
IconListModel.h
|
||||
|
||||
# Tasks
|
||||
tasks/Task.h
|
||||
@ -87,6 +88,7 @@ lists/InstanceList.cpp
|
||||
lists/InstVersionList.cpp
|
||||
lists/MinecraftVersionList.cpp
|
||||
lists/LwjglVersionList.cpp
|
||||
IconListModel.cpp
|
||||
|
||||
# Tasks
|
||||
tasks/Task.cpp
|
||||
|
163
backend/IconListModel.cpp
Normal file
163
backend/IconListModel.cpp
Normal file
@ -0,0 +1,163 @@
|
||||
#include "IconListModel.h"
|
||||
#include <pathutils.h>
|
||||
#include <QMap>
|
||||
#include <QEventLoop>
|
||||
#include <QDir>
|
||||
|
||||
#define MAX_SIZE 1024
|
||||
IconList* IconList::m_Instance = 0;
|
||||
QMutex IconList::mutex;
|
||||
|
||||
struct entry
|
||||
{
|
||||
QString key;
|
||||
QString name;
|
||||
QIcon icon;
|
||||
bool is_builtin;
|
||||
};
|
||||
|
||||
class Private : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QMap<QString, int> index;
|
||||
QVector<entry> icons;
|
||||
Private()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
IconList::IconList() : QAbstractListModel(), d(new Private())
|
||||
{
|
||||
QDir instance_icons(":/icons/instances/");
|
||||
auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name);
|
||||
for(auto file_info: file_info_list)
|
||||
{
|
||||
QString key = file_info.baseName();
|
||||
addIcon(key, key, file_info.absoluteFilePath(), true);
|
||||
}
|
||||
|
||||
// FIXME: get from settings
|
||||
ensurePathExists("icons/");
|
||||
QDir user_icons("icons/");
|
||||
file_info_list = user_icons.entryInfoList(QDir::Files, QDir::Name);
|
||||
for(auto file_info: file_info_list)
|
||||
{
|
||||
QString filename = file_info.absoluteFilePath();
|
||||
QString key = file_info.baseName();
|
||||
addIcon(key, key, filename);
|
||||
}
|
||||
}
|
||||
|
||||
IconList::~IconList()
|
||||
{
|
||||
delete d;
|
||||
d = nullptr;
|
||||
}
|
||||
|
||||
QVariant IconList::data ( const QModelIndex& index, int role ) const
|
||||
{
|
||||
if(!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
int row = index.row();
|
||||
|
||||
if(row < 0 || row >= d->icons.size())
|
||||
return QVariant();
|
||||
|
||||
switch(role)
|
||||
{
|
||||
case Qt::DecorationRole:
|
||||
return d->icons[row].icon;
|
||||
case Qt::DisplayRole:
|
||||
return d->icons[row].name;
|
||||
case Qt::UserRole:
|
||||
return d->icons[row].key;
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
int IconList::rowCount ( const QModelIndex& parent ) const
|
||||
{
|
||||
return d->icons.size();
|
||||
}
|
||||
|
||||
bool IconList::addIcon ( QString key, QString name, QString path, bool is_builtin )
|
||||
{
|
||||
auto iter = d->index.find(key);
|
||||
if(iter != d->index.end())
|
||||
{
|
||||
if(d->icons[*iter].is_builtin) return false;
|
||||
|
||||
QIcon icon(path);
|
||||
if(icon.isNull()) return false;
|
||||
|
||||
// replace the icon
|
||||
d->icons[*iter] = {key, name, icon, is_builtin};
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
QIcon icon(path);
|
||||
if(icon.isNull()) return false;
|
||||
|
||||
// add a new icon
|
||||
d->icons.push_back({key, name, icon, is_builtin});
|
||||
d->index[key] = d->icons.size() - 1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QIcon IconList::getIcon ( QString key )
|
||||
{
|
||||
int icon_index = getIconIndex(key);
|
||||
|
||||
if(icon_index != -1)
|
||||
return d->icons[icon_index].icon;
|
||||
|
||||
// Fallback for icons that don't exist.
|
||||
icon_index = getIconIndex("infinity");
|
||||
|
||||
if(icon_index != -1)
|
||||
return d->icons[icon_index].icon;
|
||||
return QIcon();
|
||||
}
|
||||
|
||||
int IconList::getIconIndex ( QString key )
|
||||
{
|
||||
if(key == "default")
|
||||
key = "infinity";
|
||||
|
||||
auto iter = d->index.find(key);
|
||||
if(iter != d->index.end())
|
||||
return *iter;
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void IconList::drop()
|
||||
{
|
||||
mutex.lock();
|
||||
delete m_Instance;
|
||||
m_Instance = 0;
|
||||
mutex.unlock();
|
||||
}
|
||||
|
||||
IconList* IconList::instance()
|
||||
{
|
||||
if ( !m_Instance )
|
||||
{
|
||||
mutex.lock();
|
||||
if ( !m_Instance )
|
||||
m_Instance = new IconList;
|
||||
mutex.unlock();
|
||||
}
|
||||
return m_Instance;
|
||||
}
|
||||
|
||||
#include "IconListModel.moc"
|
33
backend/IconListModel.h
Normal file
33
backend/IconListModel.h
Normal file
@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
|
||||
#include <QMutex>
|
||||
#include <QAbstractListModel>
|
||||
#include <QtGui/QIcon>
|
||||
|
||||
class Private;
|
||||
|
||||
class IconList : public QAbstractListModel
|
||||
{
|
||||
public:
|
||||
static IconList* instance();
|
||||
static void drop();
|
||||
QIcon getIcon ( QString key );
|
||||
int getIconIndex ( QString key );
|
||||
|
||||
virtual QVariant data ( const QModelIndex& index, int role = Qt::DisplayRole ) const;
|
||||
virtual int rowCount ( const QModelIndex& parent = QModelIndex() ) const;
|
||||
|
||||
bool addIcon(QString key, QString name, QString path, bool is_builtin = false);
|
||||
|
||||
|
||||
private:
|
||||
virtual ~IconList();
|
||||
IconList();
|
||||
// hide copy constructor
|
||||
IconList ( const IconList & ) = delete;
|
||||
// hide assign op
|
||||
IconList& operator= ( const IconList & ) = delete;
|
||||
static IconList* m_Instance;
|
||||
static QMutex mutex;
|
||||
Private* d;
|
||||
};
|
Reference in New Issue
Block a user