summaryrefslogtreecommitdiffstats
path: root/libmultimc
diff options
context:
space:
mode:
authorAndrew <forkk@forkk.net>2013-05-03 20:14:38 -0500
committerAndrew <forkk@forkk.net>2013-05-03 20:14:38 -0500
commit857a4e4dbed88b647619c213d731dc460d034820 (patch)
treeddff2ab3d6af3fb049b1931cd8b27cbedd7b6ee3 /libmultimc
parent055198303c7bf15f456687838c37650871596946 (diff)
downloadMultiMC-857a4e4dbed88b647619c213d731dc460d034820.tar
MultiMC-857a4e4dbed88b647619c213d731dc460d034820.tar.gz
MultiMC-857a4e4dbed88b647619c213d731dc460d034820.tar.lz
MultiMC-857a4e4dbed88b647619c213d731dc460d034820.tar.xz
MultiMC-857a4e4dbed88b647619c213d731dc460d034820.zip
Implemented version list sorting.
Resolves MMC-8: https://jira.forkk.net/browse/MMC-8
Diffstat (limited to 'libmultimc')
-rw-r--r--libmultimc/include/instversion.h24
-rw-r--r--libmultimc/include/instversionlist.h5
-rw-r--r--libmultimc/include/minecraftversionlist.h2
-rw-r--r--libmultimc/src/instversion.cpp10
-rw-r--r--libmultimc/src/instversionlist.cpp9
-rw-r--r--libmultimc/src/minecraftversionlist.cpp39
6 files changed, 88 insertions, 1 deletions
diff --git a/libmultimc/include/instversion.h b/libmultimc/include/instversion.h
index e91e68ba..009bd412 100644
--- a/libmultimc/include/instversion.h
+++ b/libmultimc/include/instversion.h
@@ -104,6 +104,30 @@ public:
*/
virtual InstVersion *copyVersion(InstVersionList *newParent) const = 0;
+ /*!
+ * Checks if this version is less (older) than the given version.
+ * \param other The version to compare this one to.
+ * \return True if this version is older than the given version.
+ */
+ virtual bool isLessThan(const InstVersion &other) const;
+
+ /*!
+ * Checks if this version is greater (newer) than the given version.
+ * \param other The version to compare this one to.
+ * \return True if this version is newer than the given version.
+ */
+ virtual bool isGreaterThan(const InstVersion &other) const;
+
+ /*!
+ * \sa shouldSortBefore()
+ */
+ virtual bool operator<(const InstVersion &rhs) { return isLessThan(rhs); }
+
+ /*!
+ * \sa shouldSortAfter()
+ */
+ virtual bool operator>(const InstVersion &rhs) { return isGreaterThan(rhs); }
+
protected:
QString m_descriptor;
QString m_name;
diff --git a/libmultimc/include/instversionlist.h b/libmultimc/include/instversionlist.h
index 1aabc5cf..e28bd96f 100644
--- a/libmultimc/include/instversionlist.h
+++ b/libmultimc/include/instversionlist.h
@@ -88,6 +88,11 @@ public:
*/
virtual const InstVersion *getLatestStable();
+ /*!
+ * Sorts the version list.
+ */
+ virtual void sort() = 0;
+
protected slots:
/*!
* Updates this list with the given list of versions.
diff --git a/libmultimc/include/minecraftversionlist.h b/libmultimc/include/minecraftversionlist.h
index 18eb4ea6..0a9b9a67 100644
--- a/libmultimc/include/minecraftversionlist.h
+++ b/libmultimc/include/minecraftversionlist.h
@@ -45,12 +45,14 @@ public:
virtual const InstVersion *at(int i) const;
virtual int count() const;
virtual void printToStdOut() const;
+ virtual void sort();
/*!
* Gets the main version list instance.
*/
static MinecraftVersionList &getMainList();
+
protected:
QList<InstVersion *>m_vlist;
diff --git a/libmultimc/src/instversion.cpp b/libmultimc/src/instversion.cpp
index d3d078a9..ebd76c7a 100644
--- a/libmultimc/src/instversion.cpp
+++ b/libmultimc/src/instversion.cpp
@@ -41,6 +41,16 @@ InstVersionList *InstVersion::versionList() const
return (InstVersionList *)parent();
}
+bool InstVersion::isLessThan(const InstVersion &other) const
+{
+ return timestamp() < other.timestamp();
+}
+
+bool InstVersion::isGreaterThan(const InstVersion &other) const
+{
+ return timestamp() > other.timestamp();
+}
+
bool InstVersion::isMeta() const
{
return false;
diff --git a/libmultimc/src/instversionlist.cpp b/libmultimc/src/instversionlist.cpp
index 85734e48..7d1bfdb7 100644
--- a/libmultimc/src/instversionlist.cpp
+++ b/libmultimc/src/instversionlist.cpp
@@ -48,6 +48,9 @@ enum VListColumns
// Second column - Type
TypeColumn,
+ // Third column - Timestamp
+ TimeColumn,
+
// Column count
ColCount
};
@@ -74,6 +77,9 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const
case TypeColumn:
return version->typeName();
+ case TimeColumn:
+ return version->timestamp();
+
default:
return QVariant();
}
@@ -101,6 +107,9 @@ QVariant InstVersionList::headerData(int section, Qt::Orientation orientation, i
case TypeColumn:
return "Type";
+
+ case TimeColumn:
+ return "Time";
default:
return QVariant();
diff --git a/libmultimc/src/minecraftversionlist.cpp b/libmultimc/src/minecraftversionlist.cpp
index ce02a769..abbae991 100644
--- a/libmultimc/src/minecraftversionlist.cpp
+++ b/libmultimc/src/minecraftversionlist.cpp
@@ -25,6 +25,8 @@
#include <QJsonValue>
#include <QJsonParseError>
+#include <QtAlgorithms>
+
#include <QtNetwork>
#define MCVLIST_URLBASE "http://s3.amazonaws.com/Minecraft.Download/versions/"
@@ -78,6 +80,18 @@ void MinecraftVersionList::printToStdOut() const
}
}
+bool cmpVersions(const InstVersion *first, const InstVersion *second)
+{
+ return !first->isLessThan(*second);
+}
+
+void MinecraftVersionList::sort()
+{
+ beginResetModel();
+ qSort(m_vlist.begin(), m_vlist.end(), cmpVersions);
+ endResetModel();
+}
+
MinecraftVersionList &MinecraftVersionList::getMainList()
{
return mcVList;
@@ -108,6 +122,9 @@ void MinecraftVersionList::updateListData(QList<InstVersion *> versions)
// tempList (and vice-versa). Now we just free the memory.
while (!tempList.isEmpty())
delete tempList.takeFirst();
+
+ // NOW SORT!!
+ sort();
}
inline QDomElement getDomElementByTagName(QDomElement parent, QString tagname)
@@ -125,6 +142,22 @@ inline QDateTime timeFromS3Time(QString str)
return QDateTime::fromString(str, fmt);
}
+inline QDateTime timeFromMCVListTime(QString str)
+{
+ int operatorPos = str.indexOf("+", str.indexOf("T"));
+ if (operatorPos == -1)
+ operatorPos = str.indexOf("-", str.indexOf("T"));
+ if (operatorPos)
+ operatorPos = str.length();
+
+ const QString fmt("yyyy-MM-dd'T'HH:mm:ss'+02:00'");
+
+ // It's a dark templar!
+ QDateTime dt = QDateTime::fromString(str.left(operatorPos), fmt);
+ return dt;
+
+}
+
inline void waitForNetRequest(QNetworkReply *netReply)
{
QEventLoop loop;
@@ -234,7 +267,11 @@ bool MCVListLoadTask::loadFromVList()
// Now, process that info and add the version to the list.
// Parse the timestamp.
- QDateTime versionTime = timeFromS3Time(versionTimeStr);
+ QDateTime versionTime = timeFromMCVListTime(versionTimeStr);
+
+ Q_ASSERT_X(versionTime.isValid(), "loadFromVList",
+ QString("in versions array, index %1's timestamp failed to parse").
+ arg(i).toUtf8());
// Parse the type.
MinecraftVersion::VersionType versionType;