From b84dfddd1b24e82dccb5a20d9c30570d26846e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 16 Mar 2013 03:01:51 +0100 Subject: [PATCH 1/6] Use the actual selection for instance launch. --- gui/mainwindow.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index e691c8c40..676ec45e9 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -198,10 +198,18 @@ void MainWindow::on_instanceView_customContextMenuRequested ( const QPoint &pos void MainWindow::on_actionLaunchInstance_triggered() { - QModelIndex index = view->currentIndex(); - if(index.isValid()) + QAbstractItemView * iv = view; + auto smodel = iv->selectionModel(); + QModelIndex mindex; + if(smodel->hasSelection()) { - Instance * inst = (Instance *) index.data(InstanceModel::InstancePointerRole).value(); + auto rows = smodel->selectedRows(); + mindex = rows.at(0); + } + + if(mindex.isValid()) + { + Instance * inst = (Instance *) mindex.data(InstanceModel::InstancePointerRole).value(); doLogin(inst->id()); } } From 65faabeed48584c461ca21d784c3f1d46f67f832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 18 Mar 2013 23:00:46 +0100 Subject: [PATCH 2/6] Connect instance list to model. --- gui/instancemodel.cpp | 27 +++++++++++++++++++- gui/instancemodel.h | 6 +++++ gui/mainwindow.cpp | 6 ++--- libmultimc/include/instancelist.h | 41 +++++++++++++++++++++++++------ libmultimc/src/instancelist.cpp | 40 ++++++++++++++++++++++++++---- libutil/CMakeLists.txt | 3 --- main.cpp | 19 +------------- 7 files changed, 105 insertions(+), 37 deletions(-) diff --git a/gui/instancemodel.cpp b/gui/instancemodel.cpp index 73d0dbc12..499099401 100644 --- a/gui/instancemodel.cpp +++ b/gui/instancemodel.cpp @@ -6,8 +6,33 @@ InstanceModel::InstanceModel ( const InstanceList& instances, QObject *parent ) : QAbstractListModel ( parent ), m_instances ( &instances ) { cachedIcon = QIcon(":/icons/multimc/scalable/apps/multimc.svg"); + currentInstancesNumber = m_instances->count(); + connect(m_instances,SIGNAL(instanceAdded(int)),this,SLOT(onInstanceAdded(int))); + connect(m_instances,SIGNAL(instanceChanged(int)),this,SLOT(onInstanceChanged(int))); + connect(m_instances,SIGNAL(invalidated()),this,SLOT(onInvalidated())); } +void InstanceModel::onInstanceAdded ( int index ) +{ + beginInsertRows(QModelIndex(), index, index); + currentInstancesNumber ++; + endInsertRows(); +} + +// TODO: this doesn't trigger yet +void InstanceModel::onInstanceChanged ( int index ) +{ + +} + +void InstanceModel::onInvalidated() +{ + beginResetModel(); + currentInstancesNumber = m_instances->count(); + endResetModel(); +} + + int InstanceModel::rowCount ( const QModelIndex& parent ) const { Q_UNUSED ( parent ); @@ -17,7 +42,7 @@ int InstanceModel::rowCount ( const QModelIndex& parent ) const QModelIndex InstanceModel::index ( int row, int column, const QModelIndex& parent ) const { Q_UNUSED ( parent ); - if ( row < 0 || row >= m_instances->count() ) + if ( row < 0 || row >= currentInstancesNumber ) return QModelIndex(); return createIndex ( row, column, ( void* ) m_instances->at ( row ).data() ); } diff --git a/gui/instancemodel.h b/gui/instancemodel.h index 995c51ec7..de43b7b80 100644 --- a/gui/instancemodel.h +++ b/gui/instancemodel.h @@ -22,9 +22,15 @@ public: QVariant data ( const QModelIndex& index, int role ) const; Qt::ItemFlags flags ( const QModelIndex& index ) const; +public slots: + void onInstanceAdded(int index); + void onInstanceChanged(int index); + void onInvalidated(); + private: const InstanceList* m_instances; QIcon cachedIcon; + int currentInstancesNumber; }; class InstanceProxyModel : public KCategorizedSortFilterProxyModel diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 676ec45e9..b799bdcfc 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -64,8 +64,6 @@ MainWindow::MainWindow ( QWidget *parent ) : { ui->setupUi ( this ); // Create the widget - instList.loadList(); - view = new KCategorizedView ( ui->centralWidget ); drawer = new KCategoryDrawer ( view ); @@ -100,7 +98,9 @@ MainWindow::MainWindow ( QWidget *parent ) : view->setModel ( proxymodel ); connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(instanceActivated(const QModelIndex &))); - + + // Load the instances. + instList.loadList(); } MainWindow::~MainWindow() diff --git a/libmultimc/include/instancelist.h b/libmultimc/include/instancelist.h index d4e7556a5..3eef8bdc3 100644 --- a/libmultimc/include/instancelist.h +++ b/libmultimc/include/instancelist.h @@ -17,16 +17,14 @@ #define INSTANCELIST_H #include - #include -#include "siglist.h" - +#include "instance.h" #include "libmmc_config.h" class Instance; -class LIBMULTIMC_EXPORT InstanceList : public QObject, public SigList< QSharedPointer > +class LIBMULTIMC_EXPORT InstanceList : public QObject { Q_OBJECT public: @@ -46,14 +44,43 @@ public: QString instDir() const { return m_instDir; } /*! - * \brief Loads the instance list. + * \brief Loads the instance list. Triggers notifications. */ InstListError loadList(); - DEFINE_SIGLIST_SIGNALS(QSharedPointer); - SETUP_SIGLIST_SIGNALS(QSharedPointer); + /*! + * \brief Get the instance at index + */ + InstancePtr at(int i) const + { + return m_instances.at(i); + }; + + /*! + * \brief Get the count of loaded instances + */ + int count() const + { + return m_instances.count(); + }; + + /// Clear all instances. Triggers notifications. + void clear(); + + /// Add an instance. Triggers notifications, returns the new index + int add(InstancePtr t); + + /// Get an instance by ID + InstancePtr getInstanceById (QString id); + +signals: + void instanceAdded(int index); + void instanceChanged(int index); + void invalidated(); + protected: QString m_instDir; + QList< InstancePtr > m_instances; }; #endif // INSTANCELIST_H diff --git a/libmultimc/src/instancelist.cpp b/libmultimc/src/instancelist.cpp index 78650634a..83a72afb4 100644 --- a/libmultimc/src/instancelist.cpp +++ b/libmultimc/src/instancelist.cpp @@ -15,11 +15,10 @@ #include "include/instancelist.h" -#include "siglist_impl.h" - #include #include #include +#include #include "include/instance.h" #include "include/instanceloader.h" @@ -37,7 +36,7 @@ InstanceList::InstListError InstanceList::loadList() { QDir dir(m_instDir); QDirIterator iter(dir); - + m_instances.clear(); while (iter.hasNext()) { QString subDir = iter.next(); @@ -78,10 +77,41 @@ InstanceList::InstListError InstanceList::loadList() qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); inst->setParent(this); - append(QSharedPointer(inst)); + m_instances.append(inst); } } } - + emit invalidated(); return NoError; } + +/// Clear all instances. Triggers notifications. +void InstanceList::clear() +{ + m_instances.clear(); + emit invalidated(); +}; + +/// Add an instance. Triggers notifications, returns the new index +int InstanceList::add(InstancePtr t) +{ + m_instances.append(t); + emit instanceAdded(count() - 1); + return count() - 1; +} + +InstancePtr InstanceList::getInstanceById(QString instId) +{ + QListIterator iter(m_instances); + InstancePtr inst; + while(iter.hasNext()) + { + inst = iter.next(); + if (inst->id() == instId) + break; + } + if (inst->id() != instId) + return InstancePtr(); + else + return iter.peekPrevious(); +} \ No newline at end of file diff --git a/libutil/CMakeLists.txt b/libutil/CMakeLists.txt index 5b2c38374..11b214267 100644 --- a/libutil/CMakeLists.txt +++ b/libutil/CMakeLists.txt @@ -31,9 +31,6 @@ include/pathutils.h include/osutils.h include/userutils.h include/cmdutils.h - -include/siglist.h -include/siglist_impl.h ) SET(LIBUTIL_SOURCES diff --git a/main.cpp b/main.cpp index cf193ff00..7c82d6d86 100644 --- a/main.cpp +++ b/main.cpp @@ -57,23 +57,6 @@ public: this->instId = instId; } -private: - InstancePtr findInstance(QString instId) - { - QListIterator iter(instances); - InstancePtr inst; - while(iter.hasNext()) - { - inst = iter.next(); - if (inst->id() == instId) - break; - } - if (inst->id() != instId) - return InstancePtr(); - else - return iter.peekPrevious(); - } - private slots: void onTerminated() { @@ -117,7 +100,7 @@ public: instances.loadList(); std::cout << "Launching Instance '" << qPrintable(instId) << "'" << std::endl; - instance = findInstance(instId); + instance = instances.getInstanceById(instId); if (instance.isNull()) { std::cout << "Could not find instance requested. note that you have to specify the ID, not the NAME" << std::endl; From 7e222c3e8f4d1c007edafc31e75e7712813dd64b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 18 Mar 2013 23:35:54 +0100 Subject: [PATCH 3/6] Loading instance groups and exposing them to the model --- gui/instancemodel.cpp | 2 +- libmultimc/include/instance.h | 7 ++ libmultimc/src/instancelist.cpp | 109 +++++++++++++++++++++++++++++++- 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/gui/instancemodel.cpp b/gui/instancemodel.cpp index 499099401..0051602b2 100644 --- a/gui/instancemodel.cpp +++ b/gui/instancemodel.cpp @@ -78,7 +78,7 @@ QVariant InstanceModel::data ( const QModelIndex& index, int role ) const case KCategorizedSortFilterProxyModel::CategorySortRole: case KCategorizedSortFilterProxyModel::CategoryDisplayRole: { - return "IT'S A GROUP"; + return pdata->group(); } default: break; diff --git a/libmultimc/include/instance.h b/libmultimc/include/instance.h index c41e6718c..9334dff80 100644 --- a/libmultimc/include/instance.h +++ b/libmultimc/include/instance.h @@ -65,6 +65,9 @@ class LIBMULTIMC_EXPORT Instance : public QObject //! The instance's notes. Q_PROPERTY(QString notes READ notes WRITE setNotes) + //! The instance's group. + Q_PROPERTY(QString group READ group WRITE setGroup) + /*! * Whether or not the instance's minecraft.jar needs to be rebuilt. * If this is true, when the instance launches, its jar mods will be @@ -181,6 +184,9 @@ public: virtual QString notes() const { return settings().get("notes").toString(); } virtual void setNotes(QString val) { settings().set("notes", val); } + virtual QString group() const { return m_group; } + virtual void setGroup(QString val) { m_group = val; } + virtual bool shouldRebuild() const { return settings().get("NeedsRebuild").toBool(); } virtual void setShouldRebuild(bool val) { settings().set("NeedsRebuild", val); } @@ -279,6 +285,7 @@ public: private: QString m_rootDir; + QString m_group; SettingsObject *m_settings; }; diff --git a/libmultimc/src/instancelist.cpp b/libmultimc/src/instancelist.cpp index 83a72afb4..a835fcfef 100644 --- a/libmultimc/src/instancelist.cpp +++ b/libmultimc/src/instancelist.cpp @@ -19,12 +19,17 @@ #include #include #include +#include +#include +#include +#include #include "include/instance.h" #include "include/instanceloader.h" #include "pathutils.h" +const static int GROUP_FILE_FORMAT_VERSION = 1; InstanceList::InstanceList(const QString &instDir, QObject *parent) : QObject(parent), m_instDir("instances") @@ -36,6 +41,104 @@ InstanceList::InstListError InstanceList::loadList() { QDir dir(m_instDir); QDirIterator iter(dir); + + QString groupFileName = m_instDir + "/instgroups.json"; + // temporary map from instance ID to group name + QMap groupMap; + + // HACK: this is really an if. breaks after one iteration. + while (QFileInfo(groupFileName).exists()) + { + QFile groupFile(groupFileName); + + if (!groupFile.open(QIODevice::ReadOnly)) + { + // An error occurred. Ignore it. + qDebug("Failed to read instance group file."); + break; + } + + QTextStream in(&groupFile); + QString jsonStr = in.readAll(); + groupFile.close(); + + QJsonParseError error; + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); + + if (error.error != QJsonParseError::NoError) + { + qWarning(QString("Failed to parse instance group file: %1 at offset %2"). + arg(error.errorString(), QString::number(error.offset)).toUtf8()); + break; + } + + if (!jsonDoc.isObject()) + { + qWarning("Invalid group file. Root entry should be an object."); + break; + } + + QJsonObject rootObj = jsonDoc.object(); + + // Make sure the format version matches. + if (rootObj.value("formatVersion").toVariant().toInt() == GROUP_FILE_FORMAT_VERSION) + { + // Get the group list. + if (!rootObj.value("groups").isObject()) + { + qWarning("Invalid group list JSON: 'groups' should be an object."); + break; + } + + // Iterate through the list. + QJsonObject groupList = rootObj.value("groups").toObject(); + + for (QJsonObject::iterator iter = groupList.begin(); + iter != groupList.end(); iter++) + { + QString groupName = iter.key(); + + // If not an object, complain and skip to the next one. + if (!iter.value().isObject()) + { + qWarning(QString("Group '%1' in the group list should " + "be an object.").arg(groupName).toUtf8()); + continue; + } + + QJsonObject groupObj = iter.value().toObject(); + /* + // Create the group object. + InstanceGroup *group = new InstanceGroup(groupName, this); + groups.push_back(group); + + // If 'hidden' isn't a bool value, just assume it's false. + if (groupObj.value("hidden").isBool() && groupObj.value("hidden").toBool()) + { + group->setHidden(groupObj.value("hidden").toBool()); + } + */ + + if (!groupObj.value("instances").isArray()) + { + qWarning(QString("Group '%1' in the group list is invalid. " + "It should contain an array " + "called 'instances'.").arg(groupName).toUtf8()); + continue; + } + + // Iterate through the list of instances in the group. + QJsonArray instancesArray = groupObj.value("instances").toArray(); + + for (QJsonArray::iterator iter2 = instancesArray.begin(); + iter2 != instancesArray.end(); iter2++) + { + groupMap[(*iter2).toString()] = groupName; + } + } + } + break; + } m_instances.clear(); while (iter.hasNext()) { @@ -74,7 +177,11 @@ InstanceList::InstListError InstanceList::loadList() else { QSharedPointer inst(instPtr); - + auto iter = groupMap.find(inst->id()); + if(iter != groupMap.end()) + { + inst->setGroup((*iter)); + } qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); inst->setParent(this); m_instances.append(inst); From d67d58e662159d53ee5fde37a6f60903f6350731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 19 Mar 2013 03:20:49 +0100 Subject: [PATCH 4/6] Added background cat. Proof of concept :3 --- gui/instancedelegate.cpp | 12 +++++++++--- gui/mainwindow.cpp | 17 ++++++++++++++++- multimc.qrc | 3 +++ resources/catbgrnd2.png | Bin 0 -> 78285 bytes 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 resources/catbgrnd2.png diff --git a/gui/instancedelegate.cpp b/gui/instancedelegate.cpp index dac2dacb6..86b7d3995 100644 --- a/gui/instancedelegate.cpp +++ b/gui/instancedelegate.cpp @@ -33,9 +33,15 @@ ListViewDelegate::ListViewDelegate ( QObject* parent ) : QStyledItemDelegate ( p void drawSelectionRect(QPainter *painter, const QStyleOptionViewItemV4 &option, const QRect &rect) { - if (!(option.state & QStyle::State_Selected)) - return; - painter->fillRect ( rect, option.palette.brush ( QPalette::Highlight ) ); + if ((option.state & QStyle::State_Selected)) + painter->fillRect ( rect, option.palette.brush ( QPalette::Highlight ) ); + else + { + QColor backgroundColor = option.palette.color(QPalette::Background); + backgroundColor.setAlpha(160); + painter->fillRect ( rect, QBrush(backgroundColor) ); + } + } void drawFocusRect(QPainter *painter, const QStyleOptionViewItemV4 &option, const QRect &rect) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index b799bdcfc..a96d80a7e 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -66,7 +66,22 @@ MainWindow::MainWindow ( QWidget *parent ) : // Create the widget view = new KCategorizedView ( ui->centralWidget ); drawer = new KCategoryDrawer ( view ); - + /* + QPalette pal = view->palette(); + pal.setBrush(QPalette::Base, QBrush(QPixmap(QString::fromUtf8(":/backgrounds/kitteh")))); + view->setPalette(pal); + */ + view->setStyleSheet( + "QListView\ + {\ + background-image: url(:/backgrounds/kitteh);\ + background-attachment: fixed;\ + background-clip: padding;\ + background-position: top right;\ + background-repeat: none;\ + background-color:palette(base);\ + }"); + view->setSelectionMode ( QAbstractItemView::SingleSelection ); //view->setSpacing( KDialog::spacingHint() ); view->setCategoryDrawer ( drawer ); diff --git a/multimc.qrc b/multimc.qrc index cfcc98294..acd9efd26 100644 --- a/multimc.qrc +++ b/multimc.qrc @@ -34,4 +34,7 @@ resources/icons/multimc.svg resources/XdgIcon.theme + + resources/catbgrnd2.png + diff --git a/resources/catbgrnd2.png b/resources/catbgrnd2.png new file mode 100644 index 0000000000000000000000000000000000000000..2b949e0b14ae60295376f76b5b3e5b08ca326d28 GIT binary patch literal 78285 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

-ZmxCu)6La; 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 literal 0 HcmV?d00001 From 7d7e4034f48b578c87a4651075c2b73dc236181b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 19 Mar 2013 06:24:34 +0100 Subject: [PATCH 5/6] Property change propagation, changing instance groups, icon preview --- gui/instancemodel.cpp | 13 +++++++----- gui/instancemodel.h | 1 - gui/mainwindow.cpp | 33 ++++++++++++++++++++++++++++--- gui/mainwindow.h | 7 ++++++- libmultimc/include/instance.h | 29 +++++++++++++++++++++++---- libmultimc/include/instancelist.h | 3 +++ libmultimc/src/instancelist.cpp | 13 ++++++++++++ 7 files changed, 85 insertions(+), 14 deletions(-) diff --git a/gui/instancemodel.cpp b/gui/instancemodel.cpp index 0051602b2..3c96c8f05 100644 --- a/gui/instancemodel.cpp +++ b/gui/instancemodel.cpp @@ -5,7 +5,6 @@ InstanceModel::InstanceModel ( const InstanceList& instances, QObject *parent ) : QAbstractListModel ( parent ), m_instances ( &instances ) { - cachedIcon = QIcon(":/icons/multimc/scalable/apps/multimc.svg"); currentInstancesNumber = m_instances->count(); connect(m_instances,SIGNAL(instanceAdded(int)),this,SLOT(onInstanceAdded(int))); connect(m_instances,SIGNAL(instanceChanged(int)),this,SLOT(onInstanceChanged(int))); @@ -19,10 +18,10 @@ void InstanceModel::onInstanceAdded ( int index ) endInsertRows(); } -// TODO: this doesn't trigger yet void InstanceModel::onInstanceChanged ( int index ) { - + QModelIndex mx = InstanceModel::index(index); + dataChanged(mx,mx); } void InstanceModel::onInvalidated() @@ -71,8 +70,12 @@ QVariant InstanceModel::data ( const QModelIndex& index, int role ) const } case Qt::DecorationRole: { - // FIXME: replace with an icon cache - return cachedIcon; + // FIXME: replace with an icon cache/renderer + QString path = ":/icons/instances/"; + path += pdata->iconKey(); + QIcon icon(path); + return icon; + //else return QIcon(":/icons/multimc/scalable/apps/multimc.svg"); } // for now. case KCategorizedSortFilterProxyModel::CategorySortRole: diff --git a/gui/instancemodel.h b/gui/instancemodel.h index de43b7b80..208ee68ef 100644 --- a/gui/instancemodel.h +++ b/gui/instancemodel.h @@ -29,7 +29,6 @@ public slots: private: const InstanceList* m_instances; - QIcon cachedIcon; int currentInstancesNumber; }; diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index a96d80a7e..78f587130 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -116,6 +116,11 @@ MainWindow::MainWindow ( QWidget *parent ) : // Load the instances. instList.loadList(); + // just a test + /* + instList.at(0)->setGroup("TEST GROUP"); + instList.at(0)->setName("TEST ITEM"); + */ } MainWindow::~MainWindow() @@ -140,6 +145,18 @@ void MainWindow::on_actionAddInstance_triggered() newInstDlg->exec(); } +void MainWindow::on_actionChangeInstGroup_triggered() +{ + Instance* inst = selectedInstance(); + if(inst) + { + QString name ( inst->group() ); + name = QInputDialog::getText ( this, tr ( "Group name" ), tr ( "Enter a new group name." ), QLineEdit::Normal, name ); + inst->setGroup(name); + } +} + + void MainWindow::on_actionViewInstanceFolder_triggered() { openInDefaultProgram ( globalSettings->get ( "InstanceDir" ).toString() ); @@ -210,8 +227,7 @@ void MainWindow::on_instanceView_customContextMenuRequested ( const QPoint &pos instContextMenu->exec ( view->mapToGlobal ( pos ) ); } - -void MainWindow::on_actionLaunchInstance_triggered() +Instance* MainWindow::selectedInstance() { QAbstractItemView * iv = view; auto smodel = iv->selectionModel(); @@ -224,7 +240,18 @@ void MainWindow::on_actionLaunchInstance_triggered() if(mindex.isValid()) { - Instance * inst = (Instance *) mindex.data(InstanceModel::InstancePointerRole).value(); + return (Instance *) mindex.data(InstanceModel::InstancePointerRole).value(); + } + else + return nullptr; +} + + +void MainWindow::on_actionLaunchInstance_triggered() +{ + Instance* inst = selectedInstance(); + if(inst) + { doLogin(inst->id()); } } diff --git a/gui/mainwindow.h b/gui/mainwindow.h index c2dedf74f..5d9906399 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -44,14 +44,19 @@ public: // Browser Dialog void openWebPage(QUrl url); + +private: + Instance *selectedInstance(); private slots: void on_actionAbout_triggered(); void on_actionAddInstance_triggered(); - void on_actionViewInstanceFolder_triggered(); + void on_actionChangeInstGroup_triggered(); + void on_actionViewInstanceFolder_triggered(); + void on_actionRefresh_triggered(); void on_actionViewCentralModsFolder_triggered(); diff --git a/libmultimc/include/instance.h b/libmultimc/include/instance.h index 9334dff80..258a0dabe 100644 --- a/libmultimc/include/instance.h +++ b/libmultimc/include/instance.h @@ -176,16 +176,28 @@ public: //// General Info //// virtual QString name() { return settings().get("name").toString(); } - virtual void setName(QString val) { settings().set("name", val); } + virtual void setName(QString val) + { + settings().set("name", val); + emit propertiesChanged(this); + } virtual QString iconKey() const { return settings().get("iconKey").toString(); } - virtual void setIconKey(QString val) { settings().set("iconKey", val); } + virtual void setIconKey(QString val) + { + settings().set("iconKey", val); + emit propertiesChanged(this); + } virtual QString notes() const { return settings().get("notes").toString(); } virtual void setNotes(QString val) { settings().set("notes", val); } virtual QString group() const { return m_group; } - virtual void setGroup(QString val) { m_group = val; } + virtual void setGroup(QString val) + { + m_group = val; + emit propertiesChanged(this); + } virtual bool shouldRebuild() const { return settings().get("NeedsRebuild").toBool(); } virtual void setShouldRebuild(bool val) { settings().set("NeedsRebuild", val); } @@ -208,7 +220,10 @@ public: virtual qint64 lastLaunch() { return settings().get("lastLaunchTime").value(); } virtual void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch()) - { settings().set("lastLaunchTime", val); } + { + settings().set("lastLaunchTime", val); + emit propertiesChanged(this); + } ////// Directories ////// @@ -283,6 +298,12 @@ public: */ virtual SettingsObject &settings() const; +signals: + /*! + * \brief Signal emitted when properties relevant to the instance view change + */ + void propertiesChanged(Instance * inst); + private: QString m_rootDir; QString m_group; diff --git a/libmultimc/include/instancelist.h b/libmultimc/include/instancelist.h index 3eef8bdc3..a0d8788a8 100644 --- a/libmultimc/include/instancelist.h +++ b/libmultimc/include/instancelist.h @@ -78,6 +78,9 @@ signals: void instanceChanged(int index); void invalidated(); +private slots: + void propertiesChanged(Instance * inst); + protected: QString m_instDir; QList< InstancePtr > m_instances; diff --git a/libmultimc/src/instancelist.cpp b/libmultimc/src/instancelist.cpp index a835fcfef..f9c525d03 100644 --- a/libmultimc/src/instancelist.cpp +++ b/libmultimc/src/instancelist.cpp @@ -185,6 +185,7 @@ InstanceList::InstListError InstanceList::loadList() qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); inst->setParent(this); m_instances.append(inst); + connect(instPtr, SIGNAL(propertiesChanged(Instance*)),this, SLOT(propertiesChanged(Instance*))); } } } @@ -221,4 +222,16 @@ InstancePtr InstanceList::getInstanceById(QString instId) return InstancePtr(); else return iter.peekPrevious(); +} + +void InstanceList::propertiesChanged(Instance * inst) +{ + for(int i = 0; i < m_instances.count(); i++) + { + if(inst == m_instances[i].data()) + { + emit instanceChanged(i); + break; + } + } } \ No newline at end of file From e4806ab08d0293d395c1718ab16d28ba2ae9d0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 20 Mar 2013 07:59:35 +0100 Subject: [PATCH 6/6] Add SVG icon rendering/cache --- CMakeLists.txt | 5 +- gui/iconcache.cpp | 127 +++++++++++++++++++++++++ gui/iconcache.h | 43 +++++++++ gui/instancemodel.cpp | 7 +- gui/mainwindow.cpp | 1 + resources/icons/instances/skeleton.svg | 40 ++------ 6 files changed, 187 insertions(+), 36 deletions(-) create mode 100644 gui/iconcache.cpp create mode 100644 gui/iconcache.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cf6e1aab1..fad09575d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ ENDIF() # First, include header overrides include_directories(hacks) - ######## 3rd Party Libs ######## # Find the required Qt parts @@ -155,7 +154,7 @@ MESSAGE(STATUS "Job URL: ${MultiMC_JOB_URL}") ######## Configure header ######## configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/include/config.h") - +include_directories(${PROJECT_BINARY_DIR}/include) ################################ FILES ################################ @@ -172,6 +171,7 @@ gui/aboutdialog.h gui/consolewindow.h gui/instancemodel.h gui/instancedelegate.h +gui/iconcache.h multimc_pragma.h @@ -200,6 +200,7 @@ gui/aboutdialog.cpp gui/consolewindow.cpp gui/instancemodel.cpp gui/instancedelegate.cpp +gui/iconcache.cpp java/javautils.cpp java/annotations.cpp diff --git a/gui/iconcache.cpp b/gui/iconcache.cpp new file mode 100644 index 000000000..520a7839a --- /dev/null +++ b/gui/iconcache.cpp @@ -0,0 +1,127 @@ +#include "iconcache.h" +#include +#include +#include +#include +#include + +IconCache* IconCache::m_Instance = 0; +QMutex IconCache::mutex; +#define MAX_SIZE 1024 + +class Private : public QWebView +{ + Q_OBJECT + +public: + QString name; + QSize size; + QMap icons; + +public: + Private() + { + connect(this, SIGNAL(loadFinished(bool)), this, SLOT(svgLoaded(bool))); + setFixedSize(MAX_SIZE, MAX_SIZE); + + QPalette pal = palette(); + pal.setColor(QPalette::Base, Qt::transparent); + setPalette(pal); + setAttribute(Qt::WA_OpaquePaintEvent, false); + size = QSize(128,128); + } + void renderSVGIcon(QString name); + +signals: + void svgRendered(); + +private slots: + void svgLoaded(bool ok); +}; + +void Private::svgLoaded(bool ok) +{ + if (!ok) + { + emit svgRendered(); + return; + } + // check for SVG root tag + QString root = page()->currentFrame()->documentElement().tagName(); + if (root.compare("svg", Qt::CaseInsensitive) != 0) + { + emit svgRendered(); + return; + } + + // get the size of the svg image, check if it's valid + auto elem = page()->currentFrame()->documentElement(); + double width = elem.attribute("width").toDouble(); + double height = elem.attribute("height").toDouble(); + if (width == 0.0 || height == 0.0 || width == MAX_SIZE || height == MAX_SIZE) + { + emit svgRendered(); + return; + } + + // create the target surface + QSize t = size.isValid() ? size : QSize(width, height); + QImage img(t, QImage::Format_ARGB32_Premultiplied); + img.fill(Qt::transparent); + + // prepare the painter, scale to required size + QPainter p(&img); + if(size.isValid()) + { + p.scale(size.width() / width, size.height() / height); + } + + // the best quality + p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::TextAntialiasing); + p.setRenderHint(QPainter::SmoothPixmapTransform); + + page()->mainFrame()->render(&p,QWebFrame::ContentsLayer); + p.end(); + + icons[name] = QIcon(QPixmap::fromImage(img)); + emit svgRendered(); +} + +void Private::renderSVGIcon ( QString name ) +{ + // use event loop to wait for signal + QEventLoop loop; + this->name = name; + QString prefix = "qrc:/icons/instances/"; + QObject::connect(this, SIGNAL(svgRendered()), &loop, SLOT(quit())); + load(QUrl(prefix + name)); + loop.exec(); +} + +IconCache::IconCache():d(new Private()) +{ +} + +QIcon IconCache::getIcon ( QString name ) +{ + if(name == "default") + name = "infinity"; + { + auto iter = d->icons.find(name); + if(iter != d->icons.end()) + return *iter; + } + d->renderSVGIcon(name); + auto iter = d->icons.find(name); + if(iter != d->icons.end()) + return *iter; + + // Fallback for icons that don't exist. + QString path = ":/icons/instances/infinity"; + //path += name; + d->icons[name] = QIcon(path); + return d->icons[name]; +} + +#include "iconcache.moc" \ No newline at end of file diff --git a/gui/iconcache.h b/gui/iconcache.h new file mode 100644 index 000000000..5c5e4142a --- /dev/null +++ b/gui/iconcache.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +class Private; + +class IconCache +{ +public: + static IconCache* instance() + { + if (!m_Instance) + { + mutex.lock(); + if (!m_Instance) + m_Instance = new IconCache; + mutex.unlock(); + } + return m_Instance; + } + + static void drop() + { + mutex.lock(); + delete m_Instance; + m_Instance = 0; + mutex.unlock(); + } + + QIcon getIcon(QString name); + +private: + IconCache(); + // hide copy constructor + IconCache(const IconCache &); + // hide assign op + IconCache& operator=(const IconCache &); + static IconCache* m_Instance; + static QMutex mutex; + Private* d; +}; + \ No newline at end of file diff --git a/gui/instancemodel.cpp b/gui/instancemodel.cpp index 3c96c8f05..8db985e87 100644 --- a/gui/instancemodel.cpp +++ b/gui/instancemodel.cpp @@ -1,6 +1,7 @@ #include "instancemodel.h" #include #include +#include "iconcache.h" InstanceModel::InstanceModel ( const InstanceList& instances, QObject *parent ) : QAbstractListModel ( parent ), m_instances ( &instances ) @@ -70,11 +71,15 @@ QVariant InstanceModel::data ( const QModelIndex& index, int role ) const } case Qt::DecorationRole: { + IconCache * ic = IconCache::instance(); // FIXME: replace with an icon cache/renderer + /* QString path = ":/icons/instances/"; path += pdata->iconKey(); QIcon icon(path); - return icon; + */ + QString key = pdata->iconKey(); + return ic->getIcon(key); //else return QIcon(":/icons/multimc/scalable/apps/multimc.svg"); } // for now. diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 78f587130..5a915e8cb 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -71,6 +71,7 @@ MainWindow::MainWindow ( QWidget *parent ) : pal.setBrush(QPalette::Base, QBrush(QPixmap(QString::fromUtf8(":/backgrounds/kitteh")))); view->setPalette(pal); */ + view->setStyleSheet( "QListView\ {\ diff --git a/resources/icons/instances/skeleton.svg b/resources/icons/instances/skeleton.svg index b2da5a469..5d55f2724 100644 --- a/resources/icons/instances/skeleton.svg +++ b/resources/icons/instances/skeleton.svg @@ -13,26 +13,13 @@ height="32" id="svg2" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.4 r9939" sodipodi:docname="skeleton.svg" inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/skeleton128.png" inkscape:export-xdpi="360" inkscape:export-ydpi="360"> - - - - - - image/svg+xml - + @@ -612,7 +586,7 @@ x="7.9999995" y="1036.3622" />