Version filtering and general related code sanitization.

Version list dialog has alternating row background set.
Nostalgia versions, based on OneSix.
This commit is contained in:
Petr Mrázek
2013-08-11 18:58:24 +02:00
parent e5dc113bfc
commit 7e78a422e8
24 changed files with 254 additions and 431 deletions

View File

@@ -21,20 +21,20 @@ InstVersionList::InstVersionList(QObject *parent) :
{
}
const InstVersion *InstVersionList::findVersion(const QString &descriptor)
InstVersionPtr InstVersionList::findVersion( const QString& descriptor )
{
for (int i = 0; i < count(); i++)
{
if (at(i)->descriptor() == descriptor)
if (at(i)->descriptor == descriptor)
return at(i);
}
return NULL;
return InstVersionPtr();
}
const InstVersion *InstVersionList::getLatestStable() const
InstVersionPtr InstVersionList::getLatestStable() const
{
if (count() <= 0)
return NULL;
return InstVersionPtr();
else
return at(0);
}
@@ -48,7 +48,7 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const
return QVariant();
const InstVersion *version = at(index.row());
InstVersionPtr version = at(index.row());
switch (role)
{
@@ -56,23 +56,23 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const
switch (index.column())
{
case NameColumn:
return version->name();
return version->name;
case TypeColumn:
return version->typeName();
return version->typeString();
case TimeColumn:
return version->timestamp();
return version->timestamp;
default:
return QVariant();
}
case Qt::ToolTipRole:
return version->descriptor();
return version->descriptor;
case VersionPointerRole:
return qVariantFromValue((void *) version);
return qVariantFromValue(version);
default:
return QVariant();

View File

@@ -18,10 +18,11 @@
#include <QObject>
#include <QVariant>
#include <QAbstractListModel>
#include <QSharedPointer>
#include "libmmc_config.h"
#include "InstanceVersion.h"
class InstVersion;
class Task;
/*!
@@ -71,7 +72,7 @@ public:
virtual bool isLoaded() = 0;
//! Gets the version at the given index.
virtual const InstVersion *at(int i) const = 0;
virtual const InstVersionPtr at(int i) const = 0;
//! Returns the number of versions in the list.
virtual int count() const = 0;
@@ -90,14 +91,14 @@ public:
* \return A const pointer to the version with the given descriptor. NULL if
* one doesn't exist.
*/
virtual const InstVersion *findVersion(const QString &descriptor);
virtual InstVersionPtr findVersion(const QString &descriptor);
/*!
* \brief Gets the latest stable version of this instance type.
* This is the version that will be selected by default.
* By default, this is simply the first version in the list.
*/
virtual const InstVersion *getLatestStable() const;
virtual InstVersionPtr getLatestStable() const;
/*!
* Sorts the version list.
@@ -117,5 +118,5 @@ protected slots:
* then copies the versions and sets their parents correctly.
* \param versions List of versions whose parents should be set.
*/
virtual void updateListData(QList<InstVersion *> versions) = 0;
virtual void updateListData(QList<InstVersionPtr > versions) = 0;
};

View File

@@ -52,7 +52,7 @@ bool MinecraftVersionList::isLoaded()
return m_loaded;
}
const InstVersion *MinecraftVersionList::at(int i) const
const InstVersionPtr MinecraftVersionList::at(int i) const
{
return m_vlist.at(i);
}
@@ -62,28 +62,11 @@ int MinecraftVersionList::count() const
return m_vlist.count();
}
void MinecraftVersionList::printToStdOut() const
bool cmpVersions(InstVersionPtr first, InstVersionPtr second)
{
qDebug() << "---------------- Version List ----------------";
for (int i = 0; i < m_vlist.count(); i++)
{
MinecraftVersion *version = qobject_cast<MinecraftVersion *>(m_vlist.at(i));
if (!version)
continue;
qDebug() << "Version " << version->name();
qDebug() << "\tDownload: " << version->downloadURL();
qDebug() << "\tTimestamp: " << version->timestamp();
qDebug() << "\tType: " << version->typeName();
qDebug() << "----------------------------------------------";
}
}
bool cmpVersions(const InstVersion *first, const InstVersion *second)
{
return !first->isLessThan(*second);
const InstVersion & left = *first;
const InstVersion & right = *second;
return left > right;
}
void MinecraftVersionList::sort()
@@ -93,16 +76,17 @@ void MinecraftVersionList::sort()
endResetModel();
}
InstVersion *MinecraftVersionList::getLatestStable() const
InstVersionPtr MinecraftVersionList::getLatestStable() const
{
for (int i = 0; i < m_vlist.length(); i++)
{
if (((MinecraftVersion *)m_vlist.at(i))->versionType() == MinecraftVersion::CurrentStable)
auto ver = m_vlist.at(i).dynamicCast<MinecraftVersion>();
if (ver->is_latest && !ver->is_snapshot)
{
return m_vlist.at(i);
}
}
return NULL;
return InstVersionPtr();
}
MinecraftVersionList &MinecraftVersionList::getMainList()
@@ -110,32 +94,12 @@ MinecraftVersionList &MinecraftVersionList::getMainList()
return mcVList;
}
void MinecraftVersionList::updateListData(QList<InstVersion *> versions)
void MinecraftVersionList::updateListData(QList<InstVersionPtr > versions)
{
// First, we populate a temporary list with the copies of the versions.
QList<InstVersion *> tempList;
for (int i = 0; i < versions.length(); i++)
{
InstVersion *version = versions[i]->copyVersion(this);
Q_ASSERT(version != NULL);
tempList.append(version);
}
// Now we swap the temporary list into the actual version list.
// This applies our changes to the version list immediately and still gives us
// access to the old version list so that we can delete the objects in it and
// free their memory. By doing this, we cause the version list to update as
// quickly as possible.
beginResetModel();
m_vlist.swap(tempList);
m_vlist = versions;
m_loaded = true;
endResetModel();
// We called swap, so all the data that was in the version list previously is now in
// tempList (and vice-versa). Now we just free the memory.
while (!tempList.isEmpty())
delete tempList.takeFirst();
// NOW SORT!!
sort();
}
@@ -160,6 +124,25 @@ MCVListLoadTask::MCVListLoadTask(MinecraftVersionList *vlist)
m_list = vlist;
m_currentStable = NULL;
vlistReply = nullptr;
legacyWhitelist.insert("1.5.2");
legacyWhitelist.insert("1.5.1");
legacyWhitelist.insert("1.5");
legacyWhitelist.insert("1.4.7");
legacyWhitelist.insert("1.4.6");
legacyWhitelist.insert("1.4.5");
legacyWhitelist.insert("1.4.4");
legacyWhitelist.insert("1.4.2");
legacyWhitelist.insert("1.3.2");
legacyWhitelist.insert("1.3.1");
legacyWhitelist.insert("1.2.5");
legacyWhitelist.insert("1.2.4");
legacyWhitelist.insert("1.2.3");
legacyWhitelist.insert("1.2.2");
legacyWhitelist.insert("1.2.1");
legacyWhitelist.insert("1.1");
legacyWhitelist.insert("1.0.1");
legacyWhitelist.insert("1.0.0");
// TODO: consider adding betas here too (whatever the legacy launcher supports)
}
MCVListLoadTask::~MCVListLoadTask()
@@ -232,8 +215,12 @@ void MCVListLoadTask::list_downloaded()
}
QJsonArray versions = root.value("versions").toArray();
QList<InstVersionPtr > tempList;
for (int i = 0; i < versions.count(); i++)
{
bool is_snapshot = false;
bool is_latest = false;
// Load the version info.
if(!versions[i].isObject())
{
@@ -257,50 +244,53 @@ void MCVListLoadTask::list_downloaded()
//FIXME: log this somewhere
continue;
}
// Parse the type.
MinecraftVersion::VersionType versionType;
// OneSix or Legacy. use filter to determine type
if (versionTypeStr == "release")
{
// Check if this version is the current stable version.
if (versionID == latestReleaseID)
versionType = MinecraftVersion::CurrentStable;
else
versionType = MinecraftVersion::Stable;
versionType = legacyWhitelist.contains(versionID)?MinecraftVersion::Legacy:MinecraftVersion::OneSix;
is_latest = (versionID == latestReleaseID);
is_snapshot = false;
}
else if(versionTypeStr == "snapshot")
else if(versionTypeStr == "snapshot") // It's a snapshot... yay
{
versionType = MinecraftVersion::Snapshot;
versionType = legacyWhitelist.contains(versionID)?MinecraftVersion::Legacy:MinecraftVersion::OneSix;
is_latest = (versionID == latestSnapshotID);
is_snapshot = true;
}
else if(versionTypeStr == "old_beta" || versionTypeStr == "old_alpha")
else if(versionTypeStr == "old_alpha")
{
versionType = MinecraftVersion::Nostalgia;
is_latest = false;
is_snapshot = false;
}
else if(versionTypeStr == "old_beta")
{
versionType = MinecraftVersion::Legacy;
is_latest = false;
is_snapshot = false;
}
else
{
//FIXME: log this somewhere
continue;
}
//FIXME: detect if snapshots are old or not
// Get the download URL.
QString dlUrl = QString(MCVLIST_URLBASE) + versionID + "/";
// Now, we construct the version object and add it to the list.
MinecraftVersion *mcVersion = new MinecraftVersion(versionID, versionID, versionTime.toMSecsSinceEpoch(),dlUrl, "");
mcVersion->setVersionType(versionType);
QSharedPointer<MinecraftVersion> mcVersion(new MinecraftVersion());
mcVersion->name = mcVersion->descriptor = versionID;
mcVersion->timestamp = versionTime.toMSecsSinceEpoch();
mcVersion->download_url = dlUrl;
mcVersion->is_latest = is_latest;
mcVersion->is_snapshot = is_snapshot;
mcVersion->type = versionType;
tempList.append(mcVersion);
}
m_list->updateListData(tempList);
// Once that's finished, we can delete the versions in our temp list.
while (!tempList.isEmpty())
delete tempList.takeFirst();
#ifdef PRINT_VERSIONS
m_list->printToStdOut();
#endif
emitSucceeded();
return;
}

View File

@@ -17,6 +17,8 @@
#include <QObject>
#include <QList>
#include <QSet>
#include <QSharedPointer>
#include "InstVersionList.h"
#include "tasks/Task.h"
@@ -36,12 +38,11 @@ public:
virtual Task *getLoadTask();
virtual bool isLoaded();
virtual const InstVersion *at(int i) const;
virtual const InstVersionPtr at(int i) const;
virtual int count() const;
virtual void printToStdOut() const;
virtual void sort();
virtual InstVersion *getLatestStable() const;
virtual InstVersionPtr getLatestStable() const;
/*!
* Gets the main version list instance.
@@ -50,12 +51,12 @@ public:
protected:
QList<InstVersion *>m_vlist;
QList<InstVersionPtr > m_vlist;
bool m_loaded;
protected slots:
virtual void updateListData(QList<InstVersion *> versions);
virtual void updateListData(QList<InstVersionPtr > versions);
};
class MCVListLoadTask : public Task
@@ -76,10 +77,8 @@ protected:
bool loadFromVList();
QNetworkReply *vlistReply;
MinecraftVersionList *m_list;
QList<InstVersion *> tempList; //! < List of loaded versions
MinecraftVersion *m_currentStable;
QSet<QString> legacyWhitelist;
};