From 4b1680f2428f33dc8ecbf3f4f4b964b0a02e7e06 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 14 Feb 2013 22:40:00 -0600 Subject: Started reworking the instance system. --- data/appsettings.h | 7 +- data/inst/instance.cpp | 21 +++ data/inst/instance.h | 320 +++++++++++++++++++++++++++++++++++++++ data/inst/instancelist.cpp | 23 +++ data/inst/instancelist.h | 39 +++++ data/instancebase.cpp | 109 ------------- data/instancebase.h | 58 ------- data/instancemodel.h | 6 +- data/siglist_imp.h | 156 ------------------- data/siglist_impl.h | 156 +++++++++++++++++++ data/stdinstance.cpp | 22 --- data/stdinstance.h | 28 ---- data/version/instversion.cpp | 32 ++++ data/version/instversion.h | 51 +++++++ data/version/instversionlist.cpp | 21 +++ data/version/instversionlist.h | 43 ++++++ 16 files changed, 711 insertions(+), 381 deletions(-) create mode 100644 data/inst/instance.cpp create mode 100644 data/inst/instance.h create mode 100644 data/inst/instancelist.cpp create mode 100644 data/inst/instancelist.h delete mode 100644 data/instancebase.cpp delete mode 100644 data/instancebase.h delete mode 100644 data/siglist_imp.h create mode 100644 data/siglist_impl.h delete mode 100644 data/stdinstance.cpp delete mode 100644 data/stdinstance.h create mode 100644 data/version/instversion.cpp create mode 100644 data/version/instversion.h create mode 100644 data/version/instversionlist.cpp create mode 100644 data/version/instversionlist.h (limited to 'data') diff --git a/data/appsettings.h b/data/appsettings.h index a9068bfd..8a786db0 100644 --- a/data/appsettings.h +++ b/data/appsettings.h @@ -39,8 +39,6 @@ #define DEFINE_SETTING(name, valType, defVal) \ DEFINE_SETTING_ADVANCED(name, STR_VAL(name), valType, defVal) -#define DEFINE_OVERRIDE_SETTING(overrideName) \ - class SettingsBase : public QObject { @@ -91,7 +89,6 @@ public: DEFINE_SETTING(PreLaunchCommand, QString, "") DEFINE_SETTING(PostExitCommand, QString, "") -protected: virtual QVariant getValue(const QString& name, QVariant defVal = QVariant()) const = 0; virtual void setValue(const QString& name, QVariant val) = 0; }; @@ -104,10 +101,10 @@ public: QSettings& getConfig() { return config; } -protected: virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const; virtual void setValue(const QString& name, QVariant val); - + +protected: QSettings config; }; diff --git a/data/inst/instance.cpp b/data/inst/instance.cpp new file mode 100644 index 00000000..5cde2233 --- /dev/null +++ b/data/inst/instance.cpp @@ -0,0 +1,21 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "instance.h" + +Instance::Instance(QObject *parent) : + SettingsBase(parent) +{ +} diff --git a/data/inst/instance.h b/data/inst/instance.h new file mode 100644 index 00000000..6b1991b6 --- /dev/null +++ b/data/inst/instance.h @@ -0,0 +1,320 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCE_H +#define INSTANCE_H + +#include +#include + +#include "data/appsettings.h" +#include "data/inifile.h" + +#define DEFINE_OVERRIDDEN_SETTING_ADVANCED(funcName, cfgEntryName, typeName) \ + typeName get ## funcName() const { return getField(cfgEntryName, settings->get ## funcName()).value(); } + +#define DEFINE_OVERRIDDEN_SETTING(funcName, typeName) \ + DEFINE_OVERRIDDEN_SETTING_ADVANCED(funcName, STR_VAL(funcName), typeName) + +class InstanceList; + +/*! + * \brief Base class for instances. + * This class implements many functions that are common between instances and + * provides a standard interface for all instances. + * + * To create a new instance type, create a new class inheriting from this class + * and implement the pure virtual functions. + */ +class Instance : public SettingsBase +{ + Q_OBJECT +public: + explicit Instance(QObject *parent = 0); + + // Please, for the sake of my (and everyone else's) sanity, at least keep this shit + // *somewhat* organized. Also, documentation is semi-important here. Please don't + // leave undocumented stuff behind. + + + //////// STUFF //////// + + /*! + * \brief Get the instance's ID. + * This is a unique identifier string that is, by default, set to the + * instance's folder name. It's not always the instance's folder name, + * however, as any class deriving from Instance can override the id() + * method and change how the ID is determined. The instance's ID + * should always remain constant. Undefined behavior results if an + * already loaded instance's ID changes. + * + * \return The instance's ID. + */ + virtual QString id(); + + /*! + * \brief Gets the path to the instance's root directory. + * \return The path to the instance's root directory. + */ + virtual QString rootDir(); + + /*! + * \brief Gets the instance list that this instance is a part of. + * Returns NULL if this instance is not in a list + * (the parent is not an InstanceList). + * \return A pointer to the InstanceList containing this instance. + */ + virtual InstanceList *instList(); + + + /*! + * \brief Gets this instance's group. + * This function is used by the instance grouping system and should + * not be touched by classes deriving from Instance. + * \return The instance's group name. + * \sa setGroup() + */ + QString group() const { return m_group; } + + /*! + * \brief Sets the instance's group. + * \param group The instance's new group name. + * \sa group() + */ + void setGroup(const QString &group) { m_group = group; emit groupChanged(this, group); } + + + //////// FIELDS AND SETTINGS //////// + // Fields are options stored in the instance's config file that are specific + // to instances (not a part of SettingsBase). Settings are things overridden + // from SettingsBase. + + + ////// Fields ////// + + //// General Info //// + + /*! + * \brief Gets this instance's name. + * This is the name that will be displayed to the user. + * \return The instance's name. + * \sa setName + */ + virtual QString name() { return getField("name", "Unnamed Instance").value(); } + + /*! + * \brief Sets the instance's name + * \param val The instance's new name. + */ + virtual void setName(QString val) { setField("name", val); } + + /*! + * \brief Gets the instance's icon key. + * \return The instance's icon key. + * \sa setIconKey() + */ + virtual QString iconKey() const { return getField("iconKey", "default").value(); } + + /*! + * \brief Sets the instance's icon key. + * \param val The new icon key. + */ + virtual void setIconKey(QString val) { setField("iconKey", val); } + + + /*! + * \brief Gets the instance's notes. + * \return The instances notes. + */ + virtual QString notes() const { return getField("notes", "").value(); } + + /*! + * \brief Sets the instance's notes. + * \param val The instance's new notes. + */ + virtual void setNotes(QString val) { setField("notes", val); } + + + /*! + * \brief Checks if the instance's minecraft.jar needs to be rebuilt. + * If this is true, the instance's mods will be reinstalled to its + * minecraft.jar file. This value is automatically set to true when + * the jar mod list changes. + * \return Whether or not the instance's jar file should be rebuilt. + */ + virtual bool shouldRebuild() const { return getField("NeedsRebuild", false).value(); } + + /*! + * \brief Sets whether or not the instance's minecraft.jar needs to be rebuilt. + * \param val Whether the instance's minecraft needs to be rebuilt or not. + */ + virtual void setShouldRebuild(bool val) { setField("NeedsRebuild", val); } + + + //// Version Stuff //// + + /*! + * \brief Sets the instance's current version. + * This value represents the instance's current version. If this value + * is different from intendedVersion(), the instance should be updated. + * This value is updated by the updateCurrentVersion() function. + * \return A string representing the instance's current version. + */ + virtual QString currentVersion() { return getField("JarVersion", "Unknown").value(); } + + /*! + * \brief Sets the instance's current version. + * This is used to keep track of the instance's current version. Don't + * mess with this unless you know what you're doing. + * \param val The new value. + */ + virtual void setCurrentVersion(QString val) { setField("JarVersion", val); } + + + /*! + * \brief Gets the version of LWJGL that this instance should use. + * If no LWJGL version is specified in the instance's config file, + * defaults to "Mojang" + * \return The instance's LWJGL version. + */ + virtual QString lwjglVersion() { return getField("LwjglVersion", "Mojang").value(); } + + /*! + * \brief Sets the version of LWJGL that this instance should use. + * \param val The LWJGL version to use + */ + virtual void setLWJGLVersion(QString val) { setField("LwjglVersion", val); } + + + /*! + * \brief Gets the version that this instance should try to update to. + * If this value differs from currentVersion(), the instance will + * download the intended version when it launches. + * \return The instance's intended version. + */ + virtual QString intendedVersion() { return getField("IntendedJarVersion", currentVersion()).value(); } + + /*! + * \brief Sets the version that this instance should try to update to. + * \param val The instance's new intended version. + */ + virtual void setIntendedVersion(QString val) { setField("IntendedJarVersion", val); } + + + + //// Timestamps //// + + /*! + * \brief Gets the time that the instance was last launched. + * Measured in milliseconds since epoch. QDateTime::currentMSecsSinceEpoch() + * \return The time that the instance was last launched. + */ + virtual qint64 lastLaunch() { return getField("lastLaunchTime", 0).value(); } + + /*! + * \brief Sets the time that the instance was last launched. + * \param val The time to set. Defaults to QDateTime::currentMSecsSinceEpoch() + */ + virtual void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch()) + { setField("lastLaunchTime", val); } + + + ////// Settings ////// + + //// Java Settings //// + DEFINE_OVERRIDDEN_SETTING_ADVANCED(JavaPath, JPATHKEY, QString) + DEFINE_OVERRIDDEN_SETTING(JvmArgs, QString) + + //// Custom Commands //// + DEFINE_OVERRIDDEN_SETTING(PreLaunchCommand, QString) + DEFINE_OVERRIDDEN_SETTING(PostExitCommand, QString) + + //// Memory //// + DEFINE_OVERRIDDEN_SETTING(MinMemAlloc, int) + DEFINE_OVERRIDDEN_SETTING(MaxMemAlloc, int) + + //// Auto login //// + DEFINE_OVERRIDDEN_SETTING(AutoLogin, bool) + + // This little guy here is to keep Qt Creator from being a dumbass and + // auto-indenting the lines below the macros. Seriously, it's really annoying. + ; + + + //////// OTHER FUNCTIONS //////// + + //// Version System //// + + /*! + * \brief Checks whether or not the currentVersion of the instance needs to be updated. + * If this returns true, updateCurrentVersion is called. In the + * standard instance, this is determined by checking a timestamp + * stored in the instance config file against the last modified time of Minecraft.jar. + * \return True if updateCurrentVersion() should be called. + */ + virtual bool shouldUpdateCurrentVersion() = 0; + + /*! + * \brief Updates the current version. + * This function should first set the current version timestamp + * (setCurrentVersionTimestamp()) to the current time. Next, if + * keepCurrent is false, this function should check what the + * instance's current version is and call setCurrentVersion() to + * update it. This function will automatically be called when the + * instance is loaded if shouldUpdateCurrentVersion returns true. + * \param keepCurrent If true, only the version timestamp will be updated. + */ + virtual void updateCurrentVersion(bool keepCurrent = false) = 0; + +signals: + /*! + * \brief Signal emitted when the instance's group changes. + * \param inst Pointer to the instance whose group changed. + * \param newGroup The instance's new group. + */ + void groupChanged(Instance *inst, QString newGroup); + +protected: + /*! + * \brief Gets the value of the given field in the instance's config file. + * If the value isn't in the config file, defVal is returned instead. + * \param name The name of the field in the config file. + * \param defVal The default value. + * \return The value of the given field or defVal if the field doesn't exist. + * \sa setField() + */ + virtual QVariant getField(const QString &name, QVariant defVal = QVariant()) const; + + /*! + * \brief Sets the value of the given field in the config file. + * \param name The name of the field in the config file. + * \param val The value to set the field to. + * \sa getField() + */ + virtual void setField(const QString &name, QVariant val); + + // Overrides for SettingBase stuff. + virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const + { return settings->getValue(name, defVal); } + virtual void setValue(const QString &name, QVariant val) + { setField(name, val); } + + INIFile config; + +private: + QString m_group; +}; + +#endif // INSTANCE_H diff --git a/data/inst/instancelist.cpp b/data/inst/instancelist.cpp new file mode 100644 index 00000000..62367ed6 --- /dev/null +++ b/data/inst/instancelist.cpp @@ -0,0 +1,23 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "instancelist.h" + +#include "data/siglist_impl.h" + +InstanceList::InstanceList(QObject *parent) : + QObject(parent) +{ +} diff --git a/data/inst/instancelist.h b/data/inst/instancelist.h new file mode 100644 index 00000000..72dec5f0 --- /dev/null +++ b/data/inst/instancelist.h @@ -0,0 +1,39 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCELIST_H +#define INSTANCELIST_H + +#include + +#include + +#include "data/siglist.h" + +class Instance; + +class InstanceList : public QObject, SigList> +{ + Q_OBJECT +public: + explicit InstanceList(QObject *parent = 0); + +signals: + +public slots: + +}; + +#endif // INSTANCELIST_H diff --git a/data/instancebase.cpp b/data/instancebase.cpp deleted file mode 100644 index a5ef35a2..00000000 --- a/data/instancebase.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instancebase.h" - -#include -#include - -#include "../util/pathutils.h" - -InstanceBase::InstanceBase(QString dir, QObject *parent) : - QObject(parent), - rootDir(dir) -{ - QFileInfo cfgFile(PathCombine(rootDir, "instance.cfg")); - - if (cfgFile.exists()) - { - if(!config.loadFile(cfgFile.absoluteFilePath())) - { - QString debugmsg("Can't load instance config file for instance "); - debugmsg+= getInstID(); - qDebug(debugmsg.toLocal8Bit()); - } - } - else - { - QString debugmsg("Can't find instance config file for instance "); - debugmsg+= getInstID(); - debugmsg += " : "; - debugmsg += - debugmsg+=" ... is this an instance even?"; - qDebug(debugmsg.toLocal8Bit()); - } - currentGroup = nullptr; -} - -QString InstanceBase::getRootDir() const -{ - return rootDir; -} - - -///////////// Config Values ///////////// - -// Name -QString InstanceBase::getInstName() const -{ - return config.get("name", "Unnamed").toString(); -} - -void InstanceBase::setInstName(QString name) -{ - config.set("name", name); -} - -QString InstanceBase::getInstID() const -{ - return QDir(rootDir).dirName(); -} - -InstanceModelItem* InstanceBase::getParent() const -{ - return currentGroup; -} - -QVariant InstanceBase::data ( int role ) const -{ - switch(role) - { - case Qt::DisplayRole: - return getInstName(); - default: - return QVariant(); - } -} -int InstanceBase::getRow() const -{ - return currentGroup->getIndexOf((InstanceBase*)this); -} - -InstanceModelItem* InstanceBase::getChild ( int index ) const -{ - return nullptr; -} -InstanceModel* InstanceBase::getModel() const -{ - return currentGroup->getModel(); -} -IMI_type InstanceBase::getModelItemType() const -{ - return IMI_Instance; -} -int InstanceBase::numChildren() const -{ - return 0; -} diff --git a/data/instancebase.h b/data/instancebase.h deleted file mode 100644 index fa043c5f..00000000 --- a/data/instancebase.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTANCEBASE_H -#define INSTANCEBASE_H - -#include -#include - -#include "../data/inifile.h" -#include "instancemodel.h" - -class InstanceBase : public QObject, public InstanceModelItem -{ - friend class InstanceGroup; - Q_OBJECT -public: - explicit InstanceBase(QString rootDir, QObject *parent = 0); - - QString getRootDir() const; - - QString getInstName() const; - void setInstName(QString name); - - QString getInstID() const; - - virtual IMI_type getModelItemType() const; - virtual InstanceModelItem* getParent() const; - virtual int numChildren() const; - virtual InstanceModelItem* getChild ( int index ) const; - virtual InstanceModel* getModel() const; - virtual QVariant data ( int column ) const; - virtual int getRow() const; - -private: - void setGroup ( InstanceGroup* group ) - { - currentGroup = group; - }; - - QString rootDir; - INIFile config; - InstanceGroup * currentGroup; -}; - -#endif // INSTANCEBASE_H diff --git a/data/instancemodel.h b/data/instancemodel.h index 4bd34831..9678fef0 100644 --- a/data/instancemodel.h +++ b/data/instancemodel.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef INSTANCELIST_H -#define INSTANCELIST_H +#ifndef INSTANCEMODEL_H +#define INSTANCEMODEL_H #include #include @@ -134,4 +134,4 @@ private: InstanceGroup * implicitGroup; }; -#endif // INSTANCELIST_H +#endif // INSTANCEMODEL_H diff --git a/data/siglist_imp.h b/data/siglist_imp.h deleted file mode 100644 index 16ddd9b0..00000000 --- a/data/siglist_imp.h +++ /dev/null @@ -1,156 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "siglist.h" - -template -void SigList::append(const T &value) -{ - QList::append(value); - onItemAdded(value, length() - 1); -} - -template -void SigList::prepend(const T &value) -{ - QList::prepend(value); - onItemAdded(value, 0); -} - -template -void SigList::append(const QList &other) -{ - int index = length(); - QList::append(other); - onItemsAdded(other, index); -} - -template -void SigList::clear() -{ - QList::clear(); - onInvalidated(); -} - -template -void SigList::erase(QList::iterator pos) -{ - T value = *pos; - int index = indexOf(*pos); - QList::erase(pos); - onItemRemoved(value, index); -} - -template -void SigList::erase(QList::iterator first, QList::iterator last) -{ - QList removedValues; - int firstIndex = indexOf(*first); - - for (QList::iterator iter = first; iter < last; iter++) - { - removedValues << *iter; - QList::erase(iter); - } - - onItemsRemoved(removedValues, firstIndex); -} - -template -void SigList::insert(int i, const T &t) -{ - QList::insert(i, t); - onItemAdded(t, i); -} - -template -void SigList::insert(QList::iterator before, const T &t) -{ - QList::insert(before, t); - onItemAdded(t, indexOf(t)); -} - -template -void SigList::move(int from, int to) -{ - const T &item = at(from); - QList::move(from, to); - onItemMoved(item, from, to); -} - -template -int SigList::removeAll(const T &t) -{ - int retVal = QList::removeAll(t); - onInvalidated(); - return retVal; -} - -template -bool SigList::removeOne(const T &t) -{ - int index = indexOf(t); - if (QList::removeOne(t)) - { - onItemRemoved(t, index); - return true; - } - return false; -} - -template -void SigList::swap(QList &other) -{ - QList::swap(other); - onInvalidated(); -} - -template -void SigList::swap(int i, int j) -{ - const T &item1 = at(i); - const T &item2 = at(j); - QList::swap(i, j); - onItemMoved(item1, i, j); - onItemMoved(item2, j, i); -} - -template -T SigList::takeAt(int i) -{ - T val = QList::takeAt(i); - onItemRemoved(val, i); - return val; -} - -template -T SigList::takeFirst() -{ - return takeAt(0); -} - -template -T SigList::takeLast() -{ - return takeAt(length() - 1); -} - -template -QList &SigList::operator =(const QList &other) -{ - QList::operator =(other); - onInvalidated(); - return *this; -} diff --git a/data/siglist_impl.h b/data/siglist_impl.h new file mode 100644 index 00000000..16ddd9b0 --- /dev/null +++ b/data/siglist_impl.h @@ -0,0 +1,156 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "siglist.h" + +template +void SigList::append(const T &value) +{ + QList::append(value); + onItemAdded(value, length() - 1); +} + +template +void SigList::prepend(const T &value) +{ + QList::prepend(value); + onItemAdded(value, 0); +} + +template +void SigList::append(const QList &other) +{ + int index = length(); + QList::append(other); + onItemsAdded(other, index); +} + +template +void SigList::clear() +{ + QList::clear(); + onInvalidated(); +} + +template +void SigList::erase(QList::iterator pos) +{ + T value = *pos; + int index = indexOf(*pos); + QList::erase(pos); + onItemRemoved(value, index); +} + +template +void SigList::erase(QList::iterator first, QList::iterator last) +{ + QList removedValues; + int firstIndex = indexOf(*first); + + for (QList::iterator iter = first; iter < last; iter++) + { + removedValues << *iter; + QList::erase(iter); + } + + onItemsRemoved(removedValues, firstIndex); +} + +template +void SigList::insert(int i, const T &t) +{ + QList::insert(i, t); + onItemAdded(t, i); +} + +template +void SigList::insert(QList::iterator before, const T &t) +{ + QList::insert(before, t); + onItemAdded(t, indexOf(t)); +} + +template +void SigList::move(int from, int to) +{ + const T &item = at(from); + QList::move(from, to); + onItemMoved(item, from, to); +} + +template +int SigList::removeAll(const T &t) +{ + int retVal = QList::removeAll(t); + onInvalidated(); + return retVal; +} + +template +bool SigList::removeOne(const T &t) +{ + int index = indexOf(t); + if (QList::removeOne(t)) + { + onItemRemoved(t, index); + return true; + } + return false; +} + +template +void SigList::swap(QList &other) +{ + QList::swap(other); + onInvalidated(); +} + +template +void SigList::swap(int i, int j) +{ + const T &item1 = at(i); + const T &item2 = at(j); + QList::swap(i, j); + onItemMoved(item1, i, j); + onItemMoved(item2, j, i); +} + +template +T SigList::takeAt(int i) +{ + T val = QList::takeAt(i); + onItemRemoved(val, i); + return val; +} + +template +T SigList::takeFirst() +{ + return takeAt(0); +} + +template +T SigList::takeLast() +{ + return takeAt(length() - 1); +} + +template +QList &SigList::operator =(const QList &other) +{ + QList::operator =(other); + onInvalidated(); + return *this; +} diff --git a/data/stdinstance.cpp b/data/stdinstance.cpp deleted file mode 100644 index 4618f5ca..00000000 --- a/data/stdinstance.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "stdinstance.h" - -StdInstance::StdInstance(QString rootDir, QObject* parent) : - InstanceBase(rootDir, parent) -{ - -} diff --git a/data/stdinstance.h b/data/stdinstance.h deleted file mode 100644 index 79b87601..00000000 --- a/data/stdinstance.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef STDINSTANCE_H -#define STDINSTANCE_H - -#include "instancebase.h" - -// Standard client instance. -class StdInstance : public InstanceBase -{ -public: - explicit StdInstance(QString rootDir, QObject *parent = 0); -}; - -#endif // STDINSTANCE_H diff --git a/data/version/instversion.cpp b/data/version/instversion.cpp new file mode 100644 index 00000000..1493153a --- /dev/null +++ b/data/version/instversion.cpp @@ -0,0 +1,32 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "instversion.h" +#include "instversionlist.h" + +InstVersion::InstVersion(InstVersionList *parent) : + QObject(parent) +{ + +} + +InstVersionList *InstVersion::versionList() const +{ + // Parent should *always* be an InstVersionList + if (!parent() || !parent()->inherits("InstVersionList")) + return NULL; + else + return (InstVersionList *)parent(); +} diff --git a/data/version/instversion.h b/data/version/instversion.h new file mode 100644 index 00000000..361563fd --- /dev/null +++ b/data/version/instversion.h @@ -0,0 +1,51 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTVERSION_H +#define INSTVERSION_H + +#include + +class InstVersionList; + +class InstVersion : public QObject +{ + Q_OBJECT +public: + // Constructs a new InstVersion with the given parent. The parent *must* + // be the InstVersionList that contains this InstVersion. The InstVersion + // should be added to the list immediately after being created as any calls + // to id() will likely fail unless the InstVersion is in a list. + explicit InstVersion(InstVersionList *parent = 0); + + // Returns this InstVersion's ID. This is usually just the InstVersion's index + // within its InstVersionList, but not always. + // If this InstVersion is not in an InstVersionList, returns -1. + virtual int id() const = 0; + + // Returns this InstVersion's name. This is displayed to the user in the GUI + // and is usually just the version number ("1.4.7"), for example. + virtual QString name() const = 0; + + // Returns this InstVersion's name. This is usually displayed to the user + // in the GUI and specifies what kind of version this is. For example: it + // could be "Snapshot", "Latest Version", "MCNostalgia", etc. + virtual QString type() const = 0; + + // Returns the version list that this InstVersion is a part of. + virtual InstVersionList *versionList() const; +}; + +#endif // INSTVERSION_H diff --git a/data/version/instversionlist.cpp b/data/version/instversionlist.cpp new file mode 100644 index 00000000..ab57f94c --- /dev/null +++ b/data/version/instversionlist.cpp @@ -0,0 +1,21 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "instversionlist.h" + +InstVersionList::InstVersionList() : + QObject(NULL) +{ +} diff --git a/data/version/instversionlist.h b/data/version/instversionlist.h new file mode 100644 index 00000000..f79bc1b0 --- /dev/null +++ b/data/version/instversionlist.h @@ -0,0 +1,43 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTVERSIONLIST_H +#define INSTVERSIONLIST_H + +#include + +class InstVersion; + +// Class that each instance type's version list derives from. Version lists are +// the lists that keep track of the available game versions for that instance. +// This list will not be loaded on startup. It will be loaded when the list's +// load function is called. +class InstVersionList : public QObject +{ + Q_OBJECT +public: + explicit InstVersionList(); + + // Reloads the version list. + virtual void loadVersionList() = 0; + + // Gets the version at the given index. + virtual const InstVersion *at(int i) const = 0; + + // Returns the number of versions in the list. + virtual int count() const = 0; +}; + +#endif // INSTVERSIONLIST_H -- cgit From 15c7efffa1af8c7b4fba710c30c53b6126bfa9db Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 18 Feb 2013 14:50:11 -0600 Subject: Added InstanceLoader and InstanceType headers. --- data/inst/instance.cpp | 2 +- data/inst/instance.h | 4 +- data/inst/instanceloader.cpp | 21 ++++++++++ data/inst/instanceloader.h | 94 ++++++++++++++++++++++++++++++++++++++++++++ data/inst/instancetype.cpp | 21 ++++++++++ data/inst/instancetype.h | 81 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 data/inst/instanceloader.cpp create mode 100644 data/inst/instanceloader.h create mode 100644 data/inst/instancetype.cpp create mode 100644 data/inst/instancetype.h (limited to 'data') diff --git a/data/inst/instance.cpp b/data/inst/instance.cpp index 5cde2233..d2240bc5 100644 --- a/data/inst/instance.cpp +++ b/data/inst/instance.cpp @@ -15,7 +15,7 @@ #include "instance.h" -Instance::Instance(QObject *parent) : +Instance::Instance(const QString &rootDir, QObject *parent) : SettingsBase(parent) { } diff --git a/data/inst/instance.h b/data/inst/instance.h index 6b1991b6..1b282b03 100644 --- a/data/inst/instance.h +++ b/data/inst/instance.h @@ -42,7 +42,7 @@ class Instance : public SettingsBase { Q_OBJECT public: - explicit Instance(QObject *parent = 0); + explicit Instance(const QString &rootDir, QObject *parent = 0); // Please, for the sake of my (and everyone else's) sanity, at least keep this shit // *somewhat* organized. Also, documentation is semi-important here. Please don't @@ -315,6 +315,8 @@ protected: private: QString m_group; + + QString m_rootDir; }; #endif // INSTANCE_H diff --git a/data/inst/instanceloader.cpp b/data/inst/instanceloader.cpp new file mode 100644 index 00000000..59fed951 --- /dev/null +++ b/data/inst/instanceloader.cpp @@ -0,0 +1,21 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "instanceloader.h" + +InstanceLoader::InstanceLoader(QObject *parent) : + QObject(parent) +{ +} diff --git a/data/inst/instanceloader.h b/data/inst/instanceloader.h new file mode 100644 index 00000000..943a9b2c --- /dev/null +++ b/data/inst/instanceloader.h @@ -0,0 +1,94 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCELOADER_H +#define INSTANCELOADER_H + +#include + +class InstanceType; +class Instance; + +/*! + * \brief The InstanceLoader is a singleton that manages all of the instance types and handles loading and creating instances. + * Instance types are registered with the instance loader through its registerInstType() function. + * Creating instances is done through the InstanceLoader's createInstance() function. This function takes + */ +class InstanceLoader : public QObject +{ + Q_OBJECT +public: + static InstanceLoader instLoader; + + /*! + * \brief Error codes returned by functions in the InstanceLoader and InstanceType classes. + * NoError indicates that no error occurred. + * OtherError indicates that an unspecified error occurred. + * TypeIDExists is returned by registerInstanceType() if the ID of the type being registered already exists. + * + * TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered. + * InstExists is returned by createInstance() if the given instance directory is already an instance. + * NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance. + */ + enum InstTypeError + { + NoError = 0, + OtherError, + + TypeIDExists, + + TypeNotRegistered, + InstExists, + NotAnInstance + }; + + /*! + * \brief Registers the given InstanceType with the instance loader. + * This causes the instance loader to take ownership of the given + * instance type (meaning the instance type's parent will be set to + * the instance loader). + * \param type The InstanceType to register. + * \return An InstTypeError error code. + * TypeIDExists if the given type's is already registered to another instance type. + */ + InstTypeError registerInstanceType(InstanceType *type); + + /*! + * \brief Creates an instance with the given type and stores it in inst. + * \param inst Pointer to store the created instance in. + * \param type The type of instance to create. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * TypeNotRegistered if the given type is not registered with the InstanceLoader. + * InstExists if the given instance directory is already an instance. + */ + InstTypeError createInstance(Instance *inst, const InstanceType *type, const QString &instDir); + + /*! + * \brief Loads an instance from the given directory. + * \param inst Pointer to store the loaded instance in. + * \param type The type of instance to load. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * TypeNotRegistered if the given type is not registered with the InstanceLoader. + * NotAnInstance if the given instance directory isn't a valid instance. + */ + InstTypeError loadInstance(Instance *inst, const InstanceType *type, const QString &instDir); + +private: + explicit InstanceLoader(QObject *parent = 0); +}; + +#endif // INSTANCELOADER_H diff --git a/data/inst/instancetype.cpp b/data/inst/instancetype.cpp new file mode 100644 index 00000000..4f27542d --- /dev/null +++ b/data/inst/instancetype.cpp @@ -0,0 +1,21 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "instancetype.h" + +InstanceType::InstanceType(QObject *parent) : + QObject(parent) +{ +} diff --git a/data/inst/instancetype.h b/data/inst/instancetype.h new file mode 100644 index 00000000..1f187310 --- /dev/null +++ b/data/inst/instancetype.h @@ -0,0 +1,81 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCETYPE_H +#define INSTANCETYPE_H + +#include + +#include "instanceloader.h" + +/*! + * \brief The InstanceType class is a base class for all instance types. + * It handles loading and creating instances of a certain type. There should be + * one of these for each type of instance and they should be registered with the + * InstanceLoader. + * To create an instance, the InstanceLoader calls the type's createInstance() + * function. Loading is done through the loadInstance() function. + */ +class InstanceType : public QObject +{ + Q_OBJECT +public: + explicit InstanceType(QObject *parent = 0); + + /*! + * \brief Gets the ID for this instance type. + * By default this is the name of the Instance class that this type + * creates, but this can be changed by overriding this function. + * The type ID should be unique as it is used to identify the type + * of instances when they are loaded. + * Changing this value at runtime results in undefined behavior. + * \return This instance type's ID string. + */ + virtual QString typeID() const = 0; + + /*! + * \brief Gets the name of this instance type as it is displayed to the user. + * \return The instance type's display name. + */ + virtual QString displayName() const = 0; + + /*! + * \brief Gets a longer, more detailed description of this instance type. + * \return The instance type's description. + */ + virtual QString description() const = 0; + + /*! + * \brief Creates an instance and stores it in inst. + * \param inst Pointer to store the created instance in. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * TypeNotRegistered if the given type is not registered with the InstanceLoader. + * InstExists if the given instance directory is already an instance. + */ + virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) = 0; + + /*! + * \brief Loads an instance from the given directory. + * \param inst Pointer to store the loaded instance in. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * TypeNotRegistered if the given type is not registered with the InstanceLoader. + * NotAnInstance if the given instance directory isn't a valid instance. + */ + virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) = 0; +}; + +#endif // INSTANCETYPE_H -- cgit From d3c4db8f3444c8531cb5a02ce3c95d5673ffb1a5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 18 Feb 2013 15:39:01 -0600 Subject: Implemented instance loader. --- data/inst/instanceloader.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++ data/inst/instanceloader.h | 25 +++++++++++++++++- data/inst/instancetype.h | 8 ++++-- 3 files changed, 90 insertions(+), 3 deletions(-) (limited to 'data') diff --git a/data/inst/instanceloader.cpp b/data/inst/instanceloader.cpp index 59fed951..bc43c061 100644 --- a/data/inst/instanceloader.cpp +++ b/data/inst/instanceloader.cpp @@ -15,7 +15,67 @@ #include "instanceloader.h" +#include "instancetype.h" + InstanceLoader::InstanceLoader(QObject *parent) : QObject(parent) { } + + +InstanceLoader::InstTypeError InstanceLoader::registerInstanceType(InstanceType *type) +{ + // Check to see if the type ID exists. + if (m_typeMap.contains(type->typeID())) + return TypeIDExists; + + // Set the parent to this. + type->setParent(this); + + // Add it to the map. + m_typeMap.insert(type->typeID(), type); + return NoError; +} + +InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *inst, + const InstanceType *type, + const QString &instDir) +{ + // Check if the type is registered. + if (!type || findType(type->typeID()) != type) + return TypeNotRegistered; + + // Create the instance. + return type->createInstance(inst, instDir); +} + +InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, + const InstanceType *type, + const QString &instDir) +{ + // Check if the type is registered. + if (!type || findType(type->typeID()) != type) + return TypeNotRegistered; + + return type->loadInstance(inst, instDir); +} + +const InstanceType *InstanceLoader::findType(const QString &id) +{ + if (!m_typeMap.contains(id)) + return NULL; + else + return m_typeMap[id]; +} + +InstTypeList InstanceLoader::typeList() +{ + InstTypeList typeList; + + for (auto iter = m_typeMap.begin(); iter != m_typeMap.end(); iter++) + { + typeList.append(*iter); + } + + return typeList; +} diff --git a/data/inst/instanceloader.h b/data/inst/instanceloader.h index 943a9b2c..1a8a598f 100644 --- a/data/inst/instanceloader.h +++ b/data/inst/instanceloader.h @@ -17,10 +17,14 @@ #define INSTANCELOADER_H #include +#include +#include class InstanceType; class Instance; +typedef QList InstTypeList; + /*! * \brief The InstanceLoader is a singleton that manages all of the instance types and handles loading and creating instances. * Instance types are registered with the instance loader through its registerInstType() function. @@ -41,6 +45,7 @@ public: * TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered. * InstExists is returned by createInstance() if the given instance directory is already an instance. * NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance. + * WrongInstType is returned by loadInstance() if the given instance directory's type doesn't match the given type. */ enum InstTypeError { @@ -51,7 +56,8 @@ public: TypeNotRegistered, InstExists, - NotAnInstance + NotAnInstance, + WrongInstType }; /*! @@ -84,11 +90,28 @@ public: * \return An InstTypeError error code. * TypeNotRegistered if the given type is not registered with the InstanceLoader. * NotAnInstance if the given instance directory isn't a valid instance. + * WrongInstType if the given instance directory's type isn't the same as the given type. */ InstTypeError loadInstance(Instance *inst, const InstanceType *type, const QString &instDir); + /*! + * \brief Finds an instance type with the given ID. + * If one cannot be found, returns NULL. + * \param id The ID of the type to find. + * \return The type with the given ID. NULL if none were found. + */ + const InstanceType *findType(const QString &id); + + /*! + * \brief Gets a list of the registered instance types. + * \return A list of instance types. + */ + InstTypeList typeList(); + private: explicit InstanceLoader(QObject *parent = 0); + + QMap m_typeMap; }; #endif // INSTANCELOADER_H diff --git a/data/inst/instancetype.h b/data/inst/instancetype.h index 1f187310..ec3f5b87 100644 --- a/data/inst/instancetype.h +++ b/data/inst/instancetype.h @@ -34,6 +34,8 @@ class InstanceType : public QObject public: explicit InstanceType(QObject *parent = 0); + friend class InstanceLoader; + /*! * \brief Gets the ID for this instance type. * By default this is the name of the Instance class that this type @@ -57,6 +59,7 @@ public: */ virtual QString description() const = 0; +protected: /*! * \brief Creates an instance and stores it in inst. * \param inst Pointer to store the created instance in. @@ -65,7 +68,7 @@ public: * TypeNotRegistered if the given type is not registered with the InstanceLoader. * InstExists if the given instance directory is already an instance. */ - virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) = 0; + virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) const = 0; /*! * \brief Loads an instance from the given directory. @@ -74,8 +77,9 @@ public: * \return An InstTypeError error code. * TypeNotRegistered if the given type is not registered with the InstanceLoader. * NotAnInstance if the given instance directory isn't a valid instance. + * WrongInstType if the given instance directory's type isn't an instance of this type. */ - virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) = 0; + virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) const = 0; }; #endif // INSTANCETYPE_H -- cgit From 80cd8b33aa12933392bd2293a5e91ae696dbe6be Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 18 Feb 2013 16:58:53 -0600 Subject: Implemented Instance --- data/inst/instance.cpp | 34 ++++++++++++++++++++++++++++++++++ data/inst/instanceloader.cpp | 5 +++-- data/inst/instanceloader.h | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) (limited to 'data') diff --git a/data/inst/instance.cpp b/data/inst/instance.cpp index d2240bc5..8561ed9f 100644 --- a/data/inst/instance.cpp +++ b/data/inst/instance.cpp @@ -15,7 +15,41 @@ #include "instance.h" +#include + +#include "util/pathutils.h" + Instance::Instance(const QString &rootDir, QObject *parent) : SettingsBase(parent) { + m_rootDir = rootDir; + config.loadFile(PathCombine(rootDir, "instance.cfg")); +} + +QString Instance::id() +{ + return QFileInfo(rootDir()).baseName(); +} + +QString Instance::rootDir() +{ + return m_rootDir; +} + +InstanceList *Instance::instList() +{ + if (parent()->inherits("InstanceList")) + return (InstanceList *)parent(); + else + return NULL; +} + +QVariant Instance::getField(const QString &name, QVariant defVal) const +{ + return config.get(name, defVal); +} + +void Instance::setField(const QString &name, QVariant val) +{ + config.set(name, val); } diff --git a/data/inst/instanceloader.cpp b/data/inst/instanceloader.cpp index bc43c061..1a53bfa7 100644 --- a/data/inst/instanceloader.cpp +++ b/data/inst/instanceloader.cpp @@ -17,9 +17,10 @@ #include "instancetype.h" -InstanceLoader::InstanceLoader(QObject *parent) : - QObject(parent) +InstanceLoader::InstanceLoader() : + QObject(NULL) { + } diff --git a/data/inst/instanceloader.h b/data/inst/instanceloader.h index 1a8a598f..b7092edc 100644 --- a/data/inst/instanceloader.h +++ b/data/inst/instanceloader.h @@ -109,7 +109,7 @@ public: InstTypeList typeList(); private: - explicit InstanceLoader(QObject *parent = 0); + InstanceLoader(); QMap m_typeMap; }; -- cgit From 6e5017e48b633e20bbba61ac2e7cd58e693aec4e Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 19 Feb 2013 12:15:22 -0600 Subject: Implemented loadList() stuff. --- data/inst/instance.h | 27 --- data/inst/instancelist.cpp | 59 +++++- data/inst/instancelist.h | 26 ++- data/inst/instanceloader.cpp | 24 +++ data/inst/instanceloader.h | 54 +++-- data/instancemodel.cpp | 457 ------------------------------------------- data/instancemodel.h | 137 ------------- 7 files changed, 138 insertions(+), 646 deletions(-) delete mode 100644 data/instancemodel.cpp delete mode 100644 data/instancemodel.h (limited to 'data') diff --git a/data/inst/instance.h b/data/inst/instance.h index 1b282b03..56e9d0b8 100644 --- a/data/inst/instance.h +++ b/data/inst/instance.h @@ -79,23 +79,6 @@ public: virtual InstanceList *instList(); - /*! - * \brief Gets this instance's group. - * This function is used by the instance grouping system and should - * not be touched by classes deriving from Instance. - * \return The instance's group name. - * \sa setGroup() - */ - QString group() const { return m_group; } - - /*! - * \brief Sets the instance's group. - * \param group The instance's new group name. - * \sa group() - */ - void setGroup(const QString &group) { m_group = group; emit groupChanged(this, group); } - - //////// FIELDS AND SETTINGS //////// // Fields are options stored in the instance's config file that are specific // to instances (not a part of SettingsBase). Settings are things overridden @@ -278,14 +261,6 @@ public: */ virtual void updateCurrentVersion(bool keepCurrent = false) = 0; -signals: - /*! - * \brief Signal emitted when the instance's group changes. - * \param inst Pointer to the instance whose group changed. - * \param newGroup The instance's new group. - */ - void groupChanged(Instance *inst, QString newGroup); - protected: /*! * \brief Gets the value of the given field in the instance's config file. @@ -314,8 +289,6 @@ protected: INIFile config; private: - QString m_group; - QString m_rootDir; }; diff --git a/data/inst/instancelist.cpp b/data/inst/instancelist.cpp index 62367ed6..cbb89f05 100644 --- a/data/inst/instancelist.cpp +++ b/data/inst/instancelist.cpp @@ -17,7 +17,62 @@ #include "data/siglist_impl.h" -InstanceList::InstanceList(QObject *parent) : - QObject(parent) +#include +#include +#include + +#include "instance.h" +#include "instanceloader.h" + +#include "util/pathutils.h" + + +InstanceList::InstanceList(const QString &instDir, QObject *parent) : + QObject(parent), m_instDir(instDir) +{ + +} + +InstanceList::InstListError InstanceList::loadList() { + QDir dir(m_instDir); + QDirIterator iter(dir); + + while (iter.hasNext()) + { + QString subDir = iter.next(); + if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) + { + QSharedPointer inst; + InstanceLoader::InstTypeError error = InstanceLoader::loader. + loadInstance(inst.data(), subDir); + + if (inst.data() && error == InstanceLoader::NoError) + { + qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); + inst->setParent(this); + append(QSharedPointer(inst)); + } + else if (error != InstanceLoader::NotAnInstance) + { + QString errorMsg = QString("Failed to load instance %1: "). + arg(QFileInfo(subDir).baseName()).toUtf8(); + + switch (error) + { + case InstanceLoader::TypeNotRegistered: + errorMsg += "Instance type not found."; + break; + } + qDebug(errorMsg.toUtf8()); + } + else if (!inst.data()) + { + qDebug(QString("Error loading instance %1. Instance loader returned null."). + arg(QFileInfo(subDir).baseName()).toUtf8()); + } + } + } + + return NoError; } diff --git a/data/inst/instancelist.h b/data/inst/instancelist.h index 72dec5f0..c43c4cc0 100644 --- a/data/inst/instancelist.h +++ b/data/inst/instancelist.h @@ -24,16 +24,34 @@ class Instance; -class InstanceList : public QObject, SigList> +class InstanceList : public QObject, public SigList> { Q_OBJECT public: - explicit InstanceList(QObject *parent = 0); + explicit InstanceList(const QString &instDir, QObject *parent = 0); -signals: + /*! + * \brief Error codes returned by functions in the InstanceList class. + * NoError Indicates that no error occurred. + * UnknownError indicates that an unspecified error occurred. + */ + enum InstListError + { + NoError = 0, + UnknownError + }; -public slots: + QString instDir() const { return m_instDir; } + /*! + * \brief Loads the instance list. + */ + InstListError loadList(); + + DEFINE_SIGLIST_SIGNALS(QSharedPointer); + SETUP_SIGLIST_SIGNALS(QSharedPointer); +protected: + QString m_instDir; }; #endif // INSTANCELIST_H diff --git a/data/inst/instanceloader.cpp b/data/inst/instanceloader.cpp index 1a53bfa7..e80a0e9e 100644 --- a/data/inst/instanceloader.cpp +++ b/data/inst/instanceloader.cpp @@ -15,8 +15,16 @@ #include "instanceloader.h" +#include + #include "instancetype.h" +#include "data/inifile.h" + +#include "util/pathutils.h" + +InstanceLoader InstanceLoader::loader; + InstanceLoader::InstanceLoader() : QObject(NULL) { @@ -61,6 +69,22 @@ InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, return type->loadInstance(inst, instDir); } +InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, + const QString &instDir) +{ + QFileInfo instConfig(PathCombine(instDir, "instance.cfg")); + + if (!instConfig.exists()) + return NotAnInstance; + + INIFile ini; + ini.loadFile(instConfig.path()); + QString typeName = ini.get("type", "StdInstance").toString(); + const InstanceType *type = findType(typeName); + + return loadInstance(inst, type, instDir); +} + const InstanceType *InstanceLoader::findType(const QString &id) { if (!m_typeMap.contains(id)) diff --git a/data/inst/instanceloader.h b/data/inst/instanceloader.h index b7092edc..60c4e998 100644 --- a/data/inst/instanceloader.h +++ b/data/inst/instanceloader.h @@ -34,18 +34,18 @@ class InstanceLoader : public QObject { Q_OBJECT public: - static InstanceLoader instLoader; + static InstanceLoader loader; /*! * \brief Error codes returned by functions in the InstanceLoader and InstanceType classes. - * NoError indicates that no error occurred. - * OtherError indicates that an unspecified error occurred. - * TypeIDExists is returned by registerInstanceType() if the ID of the type being registered already exists. - * - * TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered. - * InstExists is returned by createInstance() if the given instance directory is already an instance. - * NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance. - * WrongInstType is returned by loadInstance() if the given instance directory's type doesn't match the given type. + * + * - NoError indicates that no error occurred. + * - OtherError indicates that an unspecified error occurred. + * - TypeIDExists is returned by registerInstanceType() if the ID of the type being registered already exists. + * - TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered. + * - InstExists is returned by createInstance() if the given instance directory is already an instance. + * - NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance. + * - WrongInstType is returned by loadInstance() if the given instance directory's type doesn't match the given type. */ enum InstTypeError { @@ -62,41 +62,56 @@ public: /*! * \brief Registers the given InstanceType with the instance loader. - * This causes the instance loader to take ownership of the given - * instance type (meaning the instance type's parent will be set to - * the instance loader). + * This causes the instance loader to take ownership of the given + * instance type (meaning the instance type's parent will be set to + * the instance loader). + * * \param type The InstanceType to register. * \return An InstTypeError error code. - * TypeIDExists if the given type's is already registered to another instance type. + * - TypeIDExists if the given type's is already registered to another instance type. */ InstTypeError registerInstanceType(InstanceType *type); /*! * \brief Creates an instance with the given type and stores it in inst. + * * \param inst Pointer to store the created instance in. * \param type The type of instance to create. * \param instDir The instance's directory. * \return An InstTypeError error code. - * TypeNotRegistered if the given type is not registered with the InstanceLoader. - * InstExists if the given instance directory is already an instance. + * - TypeNotRegistered if the given type is not registered with the InstanceLoader. + * - InstExists if the given instance directory is already an instance. */ InstTypeError createInstance(Instance *inst, const InstanceType *type, const QString &instDir); /*! * \brief Loads an instance from the given directory. + * * \param inst Pointer to store the loaded instance in. * \param type The type of instance to load. * \param instDir The instance's directory. * \return An InstTypeError error code. - * TypeNotRegistered if the given type is not registered with the InstanceLoader. - * NotAnInstance if the given instance directory isn't a valid instance. - * WrongInstType if the given instance directory's type isn't the same as the given type. + * - TypeNotRegistered if the given type is not registered with the InstanceLoader. + * - NotAnInstance if the given instance directory isn't a valid instance. + * - WrongInstType if the given instance directory's typ