Loading instance groups and exposing them to the model
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user