summaryrefslogtreecommitdiffstats
path: root/logic/VersionFinal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/VersionFinal.cpp')
-rw-r--r--logic/VersionFinal.cpp153
1 files changed, 142 insertions, 11 deletions
diff --git a/logic/VersionFinal.cpp b/logic/VersionFinal.cpp
index a057ecdd..2901fcf9 100644
--- a/logic/VersionFinal.cpp
+++ b/logic/VersionFinal.cpp
@@ -17,8 +17,20 @@
#include <QDebug>
#include <QFile>
+#include <QDir>
#include "OneSixVersionBuilder.h"
+#include "OneSixInstance.h"
+
+template <typename A, typename B> QMap<A, B> invert(const QMap<B, A> &in)
+{
+ QMap<A, B> out;
+ for (auto it = in.begin(); it != in.end(); ++it)
+ {
+ out.insert(it.value(), it.key());
+ }
+ return out;
+}
VersionFinal::VersionFinal(OneSixInstance *instance, QObject *parent)
: QAbstractListModel(parent), m_instance(instance)
@@ -31,12 +43,12 @@ bool VersionFinal::reload(const bool onlyVanilla, const QStringList &external)
//FIXME: source of epic failure.
beginResetModel();
OneSixVersionBuilder::build(this, m_instance, onlyVanilla, external);
+ reapply(true);
endResetModel();
}
void VersionFinal::clear()
{
- beginResetModel();
id.clear();
time.clear();
releaseTime.clear();
@@ -48,8 +60,6 @@ void VersionFinal::clear()
mainClass.clear();
libraries.clear();
tweakers.clear();
- versionFiles.clear();
- endResetModel();
}
bool VersionFinal::canRemove(const int index) const
@@ -60,6 +70,14 @@ bool VersionFinal::canRemove(const int index) const
}
return false;
}
+bool VersionFinal::remove(const int index)
+{
+ if (canRemove(index))
+ {
+ return QFile::remove(versionFiles.at(index)->filename);
+ }
+ return false;
+}
QString VersionFinal::versionFileId(const int index) const
{
@@ -69,14 +87,16 @@ QString VersionFinal::versionFileId(const int index) const
}
return versionFiles.at(index)->fileId;
}
-
-bool VersionFinal::remove(const int index)
+VersionFilePtr VersionFinal::versionFile(const QString &id)
{
- if (canRemove(index))
+ for (auto file : versionFiles)
{
- return QFile::remove(versionFiles.at(index)->filename);
+ if (file->fileId == id)
+ {
+ return file;
+ }
}
- return false;
+ return 0;
}
QList<std::shared_ptr<OneSixLibrary> > VersionFinal::getActiveNormalLibs()
@@ -91,7 +111,6 @@ QList<std::shared_ptr<OneSixLibrary> > VersionFinal::getActiveNormalLibs()
}
return output;
}
-
QList<std::shared_ptr<OneSixLibrary> > VersionFinal::getActiveNativeLibs()
{
QList<std::shared_ptr<OneSixLibrary> > output;
@@ -144,7 +163,6 @@ QVariant VersionFinal::data(const QModelIndex &index, int role) const
}
return QVariant();
}
-
QVariant VersionFinal::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Horizontal)
@@ -164,7 +182,6 @@ QVariant VersionFinal::headerData(int section, Qt::Orientation orientation, int
}
return QVariant();
}
-
Qt::ItemFlags VersionFinal::flags(const QModelIndex &index) const
{
if (!index.isValid())
@@ -181,3 +198,117 @@ int VersionFinal::columnCount(const QModelIndex &parent) const
{
return 2;
}
+
+bool VersionFinal::isCustom()
+{
+ return QDir(m_instance->instanceRoot()).exists("custom.json");
+}
+bool VersionFinal::revertToBase()
+{
+ return QDir(m_instance->instanceRoot()).remove("custom.json");
+}
+
+QMap<QString, int> VersionFinal::getExistingOrder() const
+{
+
+ QMap<QString, int> order;
+ // default
+ {
+ for (auto file : versionFiles)
+ {
+ order.insert(file->fileId, file->order);
+ }
+ }
+ // overriden
+ {
+ QMap<QString, int> overridenOrder = OneSixVersionBuilder::readOverrideOrders(m_instance);
+ for (auto id : order.keys())
+ {
+ if (overridenOrder.contains(id))
+ {
+ order[id] = overridenOrder[id];
+ }
+ }
+ }
+ return order;
+}
+
+void VersionFinal::move(const int index, const MoveDirection direction)
+{
+ int theirIndex;
+ if (direction == MoveUp)
+ {
+ theirIndex = index - 1;
+ }
+ else
+ {
+ theirIndex = index + 1;
+ }
+ if (theirIndex < 0 || theirIndex >= versionFiles.size())
+ {
+ return;
+ }
+ const QString ourId = versionFileId(index);
+ const QString theirId = versionFileId(theirIndex);
+ if (ourId.isNull() || ourId.startsWith("org.multimc.") ||
+ theirId.isNull() || theirId.startsWith("org.multimc."))
+ {
+ return;
+ }
+
+ VersionFilePtr we = versionFiles[index];
+ VersionFilePtr them = versionFiles[theirIndex];
+ if (!we || !them)
+ {
+ return;
+ }
+ beginMoveRows(QModelIndex(), index, index, QModelIndex(), theirIndex);
+ versionFiles.replace(theirIndex, we);
+ versionFiles.replace(index, them);
+ endMoveRows();
+
+ auto order = getExistingOrder();
+ order[ourId] = theirIndex;
+ order[theirId] = index;
+
+ if (!OneSixVersionBuilder::writeOverrideOrders(order, m_instance))
+ {
+ throw MMCError(tr("Couldn't save the new order"));
+ }
+ else
+ {
+ reapply();
+ }
+}
+void VersionFinal::resetOrder()
+{
+ QDir(m_instance->instanceRoot()).remove("order.json");
+ reapply();
+}
+
+void VersionFinal::reapply(const bool alreadyReseting)
+{
+ if (!alreadyReseting)
+ {
+ beginResetModel();
+ }
+
+ clear();
+
+ auto existingOrders = getExistingOrder();
+ QList<int> orders = existingOrders.values();
+ std::sort(orders.begin(), orders.end());
+ QList<VersionFilePtr> newVersionFiles;
+ for (auto order : orders)
+ {
+ auto file = versionFile(existingOrders.key(order));
+ newVersionFiles.append(file);
+ file->applyTo(this);
+ }
+ versionFiles.swap(newVersionFiles);
+
+ if (!alreadyReseting)
+ {
+ endResetModel();
+ }
+}