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::CategorySortRole:
 | 
				
			||||||
	case KCategorizedSortFilterProxyModel::CategoryDisplayRole:
 | 
						case KCategorizedSortFilterProxyModel::CategoryDisplayRole:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return "IT'S A GROUP";
 | 
							return pdata->group();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,6 +65,9 @@ class LIBMULTIMC_EXPORT Instance : public QObject
 | 
				
			|||||||
	//! The instance's notes.
 | 
						//! The instance's notes.
 | 
				
			||||||
	Q_PROPERTY(QString notes READ notes WRITE setNotes)
 | 
						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.
 | 
						 * 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 
 | 
						 * 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 QString notes() const { return settings().get("notes").toString(); }
 | 
				
			||||||
	virtual void setNotes(QString val) { settings().set("notes", val); }
 | 
						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 bool shouldRebuild() const { return settings().get("NeedsRebuild").toBool(); }
 | 
				
			||||||
	virtual void setShouldRebuild(bool val) { settings().set("NeedsRebuild", val); }
 | 
						virtual void setShouldRebuild(bool val) { settings().set("NeedsRebuild", val); }
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@@ -279,6 +285,7 @@ public:
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	QString m_rootDir;
 | 
						QString m_rootDir;
 | 
				
			||||||
 | 
						QString m_group;
 | 
				
			||||||
	SettingsObject *m_settings;
 | 
						SettingsObject *m_settings;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,12 +19,17 @@
 | 
				
			|||||||
#include <QFile>
 | 
					#include <QFile>
 | 
				
			||||||
#include <QDirIterator>
 | 
					#include <QDirIterator>
 | 
				
			||||||
#include <QThread>
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					#include <QTextStream>
 | 
				
			||||||
 | 
					#include <QJsonDocument>
 | 
				
			||||||
 | 
					#include <QJsonObject>
 | 
				
			||||||
 | 
					#include <QJsonArray>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "include/instance.h"
 | 
					#include "include/instance.h"
 | 
				
			||||||
#include "include/instanceloader.h"
 | 
					#include "include/instanceloader.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "pathutils.h"
 | 
					#include "pathutils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const static int GROUP_FILE_FORMAT_VERSION = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
InstanceList::InstanceList(const QString &instDir, QObject *parent) :
 | 
					InstanceList::InstanceList(const QString &instDir, QObject *parent) :
 | 
				
			||||||
	QObject(parent), m_instDir("instances")
 | 
						QObject(parent), m_instDir("instances")
 | 
				
			||||||
@@ -36,6 +41,104 @@ InstanceList::InstListError InstanceList::loadList()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	QDir dir(m_instDir);
 | 
						QDir dir(m_instDir);
 | 
				
			||||||
	QDirIterator iter(dir);
 | 
						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();
 | 
						m_instances.clear();
 | 
				
			||||||
	while (iter.hasNext())
 | 
						while (iter.hasNext())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -74,7 +177,11 @@ InstanceList::InstListError InstanceList::loadList()
 | 
				
			|||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				QSharedPointer<Instance> inst(instPtr);
 | 
									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());
 | 
									qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8());
 | 
				
			||||||
				inst->setParent(this);
 | 
									inst->setParent(this);
 | 
				
			||||||
				m_instances.append(inst);
 | 
									m_instances.append(inst);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user