summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2013-03-18 23:35:54 +0100
committerPetr Mrázek <peterix@gmail.com>2013-03-18 23:35:54 +0100
commit7e222c3e8f4d1c007edafc31e75e7712813dd64b (patch)
tree3f97831babf5296c7bcd61713a2ecdee6d3d83f0
parent65faabeed48584c461ca21d784c3f1d46f67f832 (diff)
downloadMultiMC-7e222c3e8f4d1c007edafc31e75e7712813dd64b.tar
MultiMC-7e222c3e8f4d1c007edafc31e75e7712813dd64b.tar.gz
MultiMC-7e222c3e8f4d1c007edafc31e75e7712813dd64b.tar.lz
MultiMC-7e222c3e8f4d1c007edafc31e75e7712813dd64b.tar.xz
MultiMC-7e222c3e8f4d1c007edafc31e75e7712813dd64b.zip
Loading instance groups and exposing them to the model
-rw-r--r--gui/instancemodel.cpp2
-rw-r--r--libmultimc/include/instance.h7
-rw-r--r--libmultimc/src/instancelist.cpp109
3 files changed, 116 insertions, 2 deletions
diff --git a/gui/instancemodel.cpp b/gui/instancemodel.cpp
index 49909940..0051602b 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 c41e6718..9334dff8 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 83a72afb..a835fcfe 100644
--- a/libmultimc/src/instancelist.cpp
+++ b/libmultimc/src/instancelist.cpp
@@ -19,12 +19,17 @@
#include <QFile>
#include <QDirIterator>
#include <QThread>
+#include <QTextStream>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
#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<QString, QString> 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<Instance> 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);