summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/logic/CMakeLists.txt10
-rw-r--r--api/logic/minecraft/MinecraftInstance.cpp34
-rw-r--r--api/logic/minecraft/MinecraftInstance.h22
-rw-r--r--api/logic/minecraft/ModsModel.cpp374
-rw-r--r--api/logic/minecraft/ModsModel.h123
-rw-r--r--api/logic/minecraft/SimpleModList.cpp (renamed from api/logic/minecraft/ModList.cpp)36
-rw-r--r--api/logic/minecraft/SimpleModList.h (renamed from api/logic/minecraft/ModList.h)4
-rw-r--r--api/logic/minecraft/SimpleModList_test.cpp (renamed from api/logic/minecraft/ModList_test.cpp)12
-rw-r--r--api/logic/minecraft/legacy/LegacyInstance.cpp2
-rw-r--r--api/logic/minecraft/legacy/LegacyInstance.h2
-rw-r--r--application/InstancePageProvider.h2
-rw-r--r--application/pages/instance/ModFolderPage.cpp6
-rw-r--r--application/pages/instance/ModFolderPage.h8
-rw-r--r--application/pages/instance/NewModFolderPage.cpp4
-rw-r--r--application/pages/instance/NewModFolderPage.h6
15 files changed, 582 insertions, 63 deletions
diff --git a/api/logic/CMakeLists.txt b/api/logic/CMakeLists.txt
index a320ab8b..769f112e 100644
--- a/api/logic/CMakeLists.txt
+++ b/api/logic/CMakeLists.txt
@@ -278,8 +278,10 @@ set(MINECRAFT_SOURCES
minecraft/VersionFilterData.cpp
minecraft/Mod.h
minecraft/Mod.cpp
- minecraft/ModList.h
- minecraft/ModList.cpp
+ minecraft/ModsModel.h
+ minecraft/ModsModel.cpp
+ minecraft/SimpleModList.h
+ minecraft/SimpleModList.cpp
minecraft/World.h
minecraft/World.cpp
minecraft/WorldList.h
@@ -315,8 +317,8 @@ add_unit_test(Library
)
# FIXME: shares data with FileSystem test
-add_unit_test(ModList
- SOURCES minecraft/ModList_test.cpp
+add_unit_test(SimpleModList
+ SOURCES minecraft/SimpleModList_test.cpp
DATA testdata
LIBS MultiMC_logic
)
diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp
index 0fffc99f..e9f67b31 100644
--- a/api/logic/minecraft/MinecraftInstance.cpp
+++ b/api/logic/minecraft/MinecraftInstance.cpp
@@ -25,7 +25,8 @@
#include "meta/Index.h"
#include "meta/VersionList.h"
-#include "ModList.h"
+#include "SimpleModList.h"
+#include "ModsModel.h"
#include "WorldList.h"
#include "icons/IIconList.h"
@@ -178,6 +179,11 @@ QString MinecraftInstance::loaderModsDir() const
return FS::PathCombine(minecraftRoot(), "mods");
}
+QString MinecraftInstance::modsCacheLocation() const
+{
+ return FS::PathCombine(instanceRoot(), "mods.cache");
+}
+
QString MinecraftInstance::coreModsDir() const
{
return FS::PathCombine(minecraftRoot(), "coremods");
@@ -884,41 +890,51 @@ JavaVersion MinecraftInstance::getJavaVersion() const
return JavaVersion(settings()->get("JavaVersion").toString());
}
-std::shared_ptr<ModList> MinecraftInstance::loaderModList() const
+std::shared_ptr<SimpleModList> MinecraftInstance::loaderModList() const
{
if (!m_loader_mod_list)
{
- m_loader_mod_list.reset(new ModList(loaderModsDir()));
+ m_loader_mod_list.reset(new SimpleModList(loaderModsDir()));
}
m_loader_mod_list->update();
return m_loader_mod_list;
}
-std::shared_ptr<ModList> MinecraftInstance::coreModList() const
+std::shared_ptr<ModsModel> MinecraftInstance::modsModel() const
+{
+ if (!m_mods_model)
+ {
+ m_mods_model.reset(new ModsModel(loaderModsDir(), coreModsDir(), modsCacheLocation()));
+ }
+ m_mods_model->update();
+ return m_mods_model;
+}
+
+std::shared_ptr<SimpleModList> MinecraftInstance::coreModList() const
{
if (!m_core_mod_list)
{
- m_core_mod_list.reset(new ModList(coreModsDir()));
+ m_core_mod_list.reset(new SimpleModList(coreModsDir()));
}
m_core_mod_list->update();
return m_core_mod_list;
}
-std::shared_ptr<ModList> MinecraftInstance::resourcePackList() const
+std::shared_ptr<SimpleModList> MinecraftInstance::resourcePackList() const
{
if (!m_resource_pack_list)
{
- m_resource_pack_list.reset(new ModList(resourcePacksDir()));
+ m_resource_pack_list.reset(new SimpleModList(resourcePacksDir()));
}
m_resource_pack_list->update();
return m_resource_pack_list;
}
-std::shared_ptr<ModList> MinecraftInstance::texturePackList() const
+std::shared_ptr<SimpleModList> MinecraftInstance::texturePackList() const
{
if (!m_texture_pack_list)
{
- m_texture_pack_list.reset(new ModList(texturePacksDir()));
+ m_texture_pack_list.reset(new SimpleModList(texturePacksDir()));
}
m_texture_pack_list->update();
return m_texture_pack_list;
diff --git a/api/logic/minecraft/MinecraftInstance.h b/api/logic/minecraft/MinecraftInstance.h
index 3be15b1c..f1499ef6 100644
--- a/api/logic/minecraft/MinecraftInstance.h
+++ b/api/logic/minecraft/MinecraftInstance.h
@@ -6,7 +6,8 @@
#include <QDir>
#include "multimc_logic_export.h"
-class ModList;
+class ModsModel;
+class SimpleModList;
class WorldList;
class LaunchStep;
class ComponentList;
@@ -41,6 +42,7 @@ public:
QString texturePacksDir() const;
QString loaderModsDir() const;
QString coreModsDir() const;
+ QString modsCacheLocation() const;
QString libDir() const;
QString worldDir() const;
QDir jarmodsPath() const;
@@ -57,10 +59,11 @@ public:
std::shared_ptr<ComponentList> getComponentList() const;
////// Mod Lists //////
- std::shared_ptr<ModList> loaderModList() const;
- std::shared_ptr<ModList> coreModList() const;
- std::shared_ptr<ModList> resourcePackList() const;
- std::shared_ptr<ModList> texturePackList() const;
+ std::shared_ptr<ModsModel> modsModel() const;
+ std::shared_ptr<SimpleModList> loaderModList() const;
+ std::shared_ptr<SimpleModList> coreModList() const;
+ std::shared_ptr<SimpleModList> resourcePackList() const;
+ std::shared_ptr<SimpleModList> texturePackList() const;
std::shared_ptr<WorldList> worldList() const;
@@ -114,10 +117,11 @@ private:
protected: // data
std::shared_ptr<ComponentList> m_components;
- mutable std::shared_ptr<ModList> m_loader_mod_list;
- mutable std::shared_ptr<ModList> m_core_mod_list;
- mutable std::shared_ptr<ModList> m_resource_pack_list;
- mutable std::shared_ptr<ModList> m_texture_pack_list;
+ mutable std::shared_ptr<ModsModel> m_mods_model;
+ mutable std::shared_ptr<SimpleModList> m_loader_mod_list;
+ mutable std::shared_ptr<SimpleModList> m_core_mod_list;
+ mutable std::shared_ptr<SimpleModList> m_resource_pack_list;
+ mutable std::shared_ptr<SimpleModList> m_texture_pack_list;
mutable std::shared_ptr<WorldList> m_world_list;
};
diff --git a/api/logic/minecraft/ModsModel.cpp b/api/logic/minecraft/ModsModel.cpp
new file mode 100644
index 00000000..ff99ad4a
--- /dev/null
+++ b/api/logic/minecraft/ModsModel.cpp
@@ -0,0 +1,374 @@
+/* Copyright 2013-2018 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 "ModsModel.h"
+#include <FileSystem.h>
+#include <QMimeData>
+#include <QUrl>
+#include <QUuid>
+#include <QString>
+#include <QFileSystemWatcher>
+#include <QDebug>
+
+ModsModel::ModsModel(const QString &mainDir, const QString &coreDir, const QString &cacheLocation)
+ :QAbstractListModel(), m_mainDir(mainDir), m_coreDir(coreDir)
+{
+ FS::ensureFolderPathExists(m_mainDir.absolutePath());
+ m_mainDir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs |
+ QDir::NoSymLinks);
+ m_mainDir.setSorting(QDir::Name | QDir::IgnoreCase | QDir::LocaleAware);
+ m_watcher = new QFileSystemWatcher(this);
+ connect(m_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(directoryChanged(QString)));
+}
+
+void ModsModel::startWatching()
+{
+ if(is_watching)
+ return;
+
+ update();
+
+ is_watching = m_watcher->addPath(m_mainDir.absolutePath());
+ if (is_watching)
+ {
+ qDebug() << "Started watching " << m_mainDir.absolutePath();
+ }
+ else
+ {
+ qDebug() << "Failed to start watching " << m_mainDir.absolutePath();
+ }
+}
+
+void ModsModel::stopWatching()
+{
+ if(!is_watching)
+ return;
+
+ is_watching = !m_watcher->removePath(m_mainDir.absolutePath());
+ if (!is_watching)
+ {
+ qDebug() << "Stopped watching " << m_mainDir.absolutePath();
+ }
+ else
+ {
+ qDebug() << "Failed to stop watching " << m_mainDir.absolutePath();
+ }
+}
+
+bool ModsModel::update()
+{
+ if (!isValid())
+ return false;
+
+ QList<Mod> orderedMods;
+ QList<Mod> newMods;
+ m_mainDir.refresh();
+ auto folderContents = m_mainDir.entryInfoList();
+ bool orderOrStateChanged = false;
+
+ // if there are any untracked files...
+ if (folderContents.size())
+ {
+ // the order surely changed!
+ for (auto entry : folderContents)
+ {
+ newMods.append(Mod(entry));
+ }
+ orderedMods.append(newMods);
+ orderOrStateChanged = true;
+ }
+ // otherwise, if we were already tracking some mods
+ else if (mods.size())
+ {
+ // if the number doesn't match, order changed.
+ if (mods.size() != orderedMods.size())
+ orderOrStateChanged = true;
+ // if it does match, compare the mods themselves
+ else
+ for (int i = 0; i < mods.size(); i++)
+ {
+ if (!mods[i].strongCompare(orderedMods[i]))
+ {
+ orderOrStateChanged = true;
+ break;
+ }
+ }
+ }
+ beginResetModel();
+ mods.swap(orderedMods);
+ endResetModel();
+ if (orderOrStateChanged)
+ {
+ emit changed();
+ }
+ return true;
+}
+
+void ModsModel::directoryChanged(QString path)
+{
+ update();
+}
+
+bool ModsModel::isValid()
+{
+ return m_mainDir.exists() && m_mainDir.isReadable();
+}
+
+bool ModsModel::installMod(const QString &filename)
+{
+ // NOTE: fix for GH-1178: remove trailing slash to avoid issues with using the empty result of QFileInfo::fileName
+ QFileInfo fileinfo(FS::NormalizePath(filename));
+
+ qDebug() << "installing: " << fileinfo.absoluteFilePath();
+
+ if (!fileinfo.exists() || !fileinfo.isReadable())
+ {
+ return false;
+ }
+ Mod m(fileinfo);
+ if (!m.valid())
+ return false;
+
+ auto type = m.type();
+ if (type == Mod::MOD_UNKNOWN)
+ return false;
+ if (type == Mod::MOD_SINGLEFILE || type == Mod::MOD_ZIPFILE || type == Mod::MOD_LITEMOD)
+ {
+ QString newpath = FS::PathCombine(m_mainDir.path(), fileinfo.fileName());
+ if (!QFile::copy(fileinfo.filePath(), newpath))
+ return false;
+ FS::updateTimestamp(newpath);
+ m.repath(newpath);
+ update();
+ return true;
+ }
+ else if (type == Mod::MOD_FOLDER)
+ {
+ QString from = fileinfo.filePath();
+ QString to = FS::PathCombine(m_mainDir.path(), fileinfo.fileName());
+ if (!FS::copy(from, to)())
+ return false;
+ m.repath(to);
+ update();
+ return true;
+ }
+ return false;
+}
+
+bool ModsModel::enableMods(const QModelIndexList& indexes, bool enable)
+{
+ if(indexes.isEmpty())
+ return true;
+
+ for (auto i: indexes)
+ {
+ Mod &m = mods[i.row()];
+ m.enable(enable);
+ emit dataChanged(i, i);
+ }
+ emit changed();
+ return true;
+}
+
+bool ModsModel::deleteMods(const QModelIndexList& indexes)
+{
+ if(indexes.isEmpty())
+ return true;
+
+ for (auto i: indexes)
+ {
+ Mod &m = mods[i.row()];
+ m.destroy();
+ }
+ emit changed();
+ return true;
+}
+
+int ModsModel::columnCount(const QModelIndex &parent) const
+{
+ return NUM_COLUMNS;
+}
+
+QVariant ModsModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ int row = index.row();
+ int column = index.column();
+
+ if (row < 0 || row >= mods.size())
+ return QVariant();
+
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ switch (column)
+ {
+ case NameColumn:
+ return mods[row].name();
+ case VersionColumn:
+ return mods[row].version();
+ case DateColumn:
+ return mods[row].dateTimeChanged();
+ case LocationColumn:
+ return "Unknown";
+
+ default:
+ return QVariant();
+ }
+
+ case Qt::ToolTipRole:
+ return mods[row].mmc_id();
+
+ case Qt::CheckStateRole:
+ switch (column)
+ {
+ case ActiveColumn:
+ return mods[row].enabled() ? Qt::Checked : Qt::Unchecked;
+ default:
+ return QVariant();
+ }
+ default:
+ return QVariant();
+ }
+}
+
+bool ModsModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (index.row() < 0 || index.row() >= rowCount(index) || !index.isValid())
+ {
+ return false;
+ }
+
+ if (role == Qt::CheckStateRole)
+ {
+ auto &mod = mods[index.row()];
+ if (mod.enable(!mod.enabled()))
+ {
+ emit dataChanged(index, index);
+ return true;
+ }
+ }
+ return false;
+}
+
+QVariant ModsModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ switch (section)
+ {
+ case ActiveColumn:
+ return QString();
+ case NameColumn:
+ return tr("Name");
+ case VersionColumn:
+ return tr("Version");
+ case DateColumn:
+ return tr("Last changed");
+ case LocationColumn:
+ return tr("Location");
+ default:
+ return QVariant();
+ }
+
+ case Qt::ToolTipRole:
+ switch (section)
+ {
+ case ActiveColumn:
+ return tr("Is the mod enabled?");
+ case NameColumn:
+ return tr("The name of the mod.");
+ case VersionColumn:
+ return tr("The version of the mod.");
+ case DateColumn:
+ return tr("The date and time this mod was last changed (or added).");
+ case LocationColumn:
+ return tr("Where the mod is located (inside or outside the instance).");
+ default:
+ return QVariant();
+ }
+ default:
+ return QVariant();
+ }
+ return QVariant();
+}
+
+Qt::ItemFlags ModsModel::flags(const QModelIndex &index) const
+{
+ Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index);
+ if (index.isValid())
+ return Qt::ItemIsUserCheckable | Qt::ItemIsDropEnabled |
+ defaultFlags;
+ else
+ return Qt::ItemIsDropEnabled | defaultFlags;
+}
+
+Qt::DropActions ModsModel::supportedDropActions() const
+{
+ // copy from outside, move from within and other mod lists
+ return Qt::CopyAction | Qt::MoveAction;
+}
+
+QStringList ModsModel::mimeTypes() const
+{
+ QStringList types;
+ types << "text/uri-list";
+ return types;
+}
+
+bool ModsModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int, int, const QModelIndex&)
+{
+ if (action == Qt::IgnoreAction)
+ {
+ return true;
+ }
+
+ // check if the action is supported
+ if (!data || !(action & supportedDropActions()))
+ {
+ return false;
+ }
+
+ // files dropped from outside?
+ if (data->hasUrls())
+ {
+ bool was_watching = is_watching;
+ if (was_watching)
+ {
+ stopWatching();
+ }
+ auto urls = data->urls();
+ for (auto url : urls)
+ {
+ // only local files may be dropped...
+ if (!url.isLocalFile())
+ {
+ continue;
+ }
+ // TODO: implement not only copy, but also move
+ // FIXME: handle errors here
+ installMod(url.toLocalFile());
+ }
+ if (was_watching)
+ {
+ startWatching();
+ }
+ return true;
+ }
+ return false;
+}
diff --git a/api/logic/minecraft/ModsModel.h b/api/logic/minecraft/ModsModel.h
new file mode 100644
index 00000000..3c8f66fd
--- /dev/null
+++ b/api/logic/minecraft/ModsModel.h
@@ -0,0 +1,123 @@
+/* Copyright 2013-2018 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.
+ */
+
+#pragma once
+
+#include <QList>
+#include <QString>
+#include <QDir>
+#include <QAbstractListModel>
+
+#include "minecraft/Mod.h"
+
+#include "multimc_logic_export.h"
+
+class LegacyInstance;
+class BaseInstance;
+class QFileSystemWatcher;
+
+/**
+ * A legacy mod list.
+ * Backed by a folder.
+ */
+class MULTIMC_LOGIC_EXPORT ModsModel : public QAbstractListModel
+{
+ Q_OBJECT
+public:
+ enum Columns
+ {
+ ActiveColumn = 0,
+ NameColumn,
+ DateColumn,
+ VersionColumn,
+ LocationColumn,
+ NUM_COLUMNS
+ };
+ ModsModel(const QString &mainDir, const QString &coreDir, const QString &cacheFile);
+
+ virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+ virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+ Qt::DropActions supportedDropActions() const override;
+
+ /// flags, mostly to support drag&drop
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
+ QStringList mimeTypes() const override;
+ bool dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent) override;
+
+ virtual int rowCount(const QModelIndex &) const override
+ {
+ return size();
+ }
+ ;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ virtual int columnCount(const QModelIndex &parent) const override;
+
+ size_t size() const
+ {
+ return mods.size();
+ }
+ ;
+ bool empty() const
+ {
+ return size() == 0;
+ }
+ Mod &operator[](size_t index)
+ {
+ return mods[index];
+ }
+
+ /// Reloads the mod list and returns true if the list changed.
+ virtual bool update();
+
+ /**
+ * Adds the given mod to the list at the given index - if the list supports custom ordering
+ */
+ bool installMod(const QString& filename);
+
+ /// Deletes all the selected mods
+ virtual bool deleteMods(const QModelIndexList &indexes);
+
+ /// Enable or disable listed mods
+ virtual bool enableMods(const QModelIndexList &indexes, bool enable = true);
+
+ void startWatching();
+ void stopWatching();
+
+ virtual bool isValid();
+
+ QDir dir()
+ {
+ return m_mainDir;
+ }
+
+ const QList<Mod> & allMods()
+ {
+ return mods;
+ }
+
+private
+slots:
+ void directoryChanged(QString path);
+
+signals:
+ void changed();
+
+protected:
+ QFileSystemWatcher *m_watcher;
+ bool is_watching = false;
+ QDir m_mainDir;
+ QDir m_coreDir;
+ QList<Mod> mods;
+};
diff --git a/api/logic/minecraft/ModList.cpp b/api/logic/minecraft/SimpleModList.cpp
index 6ccf20e2..ca923226 100644
--- a/api/logic/minecraft/ModList.cpp
+++ b/api/logic/minecraft/SimpleModList.cpp
@@ -13,7 +13,7 @@
* limitations under the License.
*/
-#include "ModList.h"
+#include "SimpleModList.h"
#include <FileSystem.h>
#include <QMimeData>
#include <QUrl>
@@ -22,7 +22,7 @@
#include <QFileSystemWatcher>
#include <QDebug>
-ModList::ModList(const QString &dir) : QAbstractListModel(), m_dir(dir)
+SimpleModList::SimpleModList(const QString &dir) : QAbstractListModel(), m_dir(dir)
{
FS::ensureFolderPathExists(m_dir.absolutePath());
m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs |
@@ -32,7 +32,7 @@ ModList::ModList(const QString &dir) : QAbstractListModel(), m_dir(dir)
connect(m_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(directoryChanged(QString)));
}
-void ModList::startWatching()
+void SimpleModList::startWatching()
{
if(is_watching)
return;
@@ -50,7 +50,7 @@ void ModList::startWatching()
}
}
-void ModList::stopWatching()
+void SimpleModList::stopWatching()
{
if(!is_watching)
return;
@@ -66,7 +66,7 @@ void ModList::stopWatching()
}
}
-bool ModList::update()
+bool SimpleModList::update()
{
if (!isValid())
return false;
@@ -115,17 +115,17 @@ bool ModList::update()
return true;
}
-void ModList::directoryChanged(QString path)
+void SimpleModList::directoryChanged(QString path)
{
update();
}
-bool ModList::isValid()
+bool SimpleModList::isValid()
{
return m_dir.exists() && m_dir.isReadable();
}
-bool ModList::installMod(const QString &filename)
+bool SimpleModList::installMod(const QString &filename)
{
// NOTE: fix for GH-1178: remove trailing slash to avoid issues with using the empty result of QFileInfo::fileName
QFileInfo fileinfo(FS::NormalizePath(filename));
@@ -166,7 +166,7 @@ bool ModList::installMod(const QString &filename)
return false;
}
-bool ModList::enableMods(const QModelIndexList& indexes, bool enable)
+bool SimpleModList::enableMods(const QModelIndexList& indexes, bool enable)
{
if(indexes.isEmpty())
return true;
@@ -181,7 +181,7 @@ bool ModList::enableMods(const QModelIndexList& indexes, bool enable)
return true;
}
-bool ModList::deleteMods(const QModelIndexList& indexes)
+bool SimpleModList::deleteMods(const QModelIndexList& indexes)
{
if(indexes.isEmpty())
return true;
@@ -195,12 +195,12 @@ bool ModList::deleteMods(const QModelIndexList& indexes)
return true;
}
-int ModList::columnCount(const QModelIndex &parent) const
+int SimpleModList::columnCount(const QModelIndex &parent) const
{
return NUM_COLUMNS;
}
-QVariant ModList::data(const QModelIndex &index, int role) const
+QVariant SimpleModList::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
@@ -243,7 +243,7 @@ QVariant ModList::data(const QModelIndex &index, int role) const
}
}
-bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
+bool SimpleModList::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.row() < 0 || index.row() >= rowCount(index) || !index.isValid())
{
@@ -262,7 +262,7 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
return false;
}
-QVariant ModList::headerData(int section, Qt::Orientation orientation, int role) const
+QVariant SimpleModList::headerData(int section, Qt::Orientation orientation, int role) const
{
switch (role)
{
@@ -301,7 +301,7 @@ QVariant ModList::headerData(int section, Qt::Orientation orientation, int role)
return QVariant();
}
-Qt::ItemFlags ModList::flags(const QModelIndex &index) const
+Qt::ItemFlags SimpleModList::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index);
if (index.isValid())
@@ -311,20 +311,20 @@ Qt::ItemFlags ModList::flags(const QModelIndex &index) const
return Qt::ItemIsDropEnabled | defaultFlags;
}
-Qt::DropActions ModList::supportedDropActions() const
+Qt::DropActions SimpleModList::supportedDropActions() const
{
// copy from outside, move from within and other mod lists
return Qt::CopyAction | Qt::MoveAction;
}
-QStringList ModList::mimeTypes() const
+QStringList SimpleModList::mimeTypes() const
{
QStringList types;
types << "text/uri-list";
return types;
}
-bool ModList::dropMimeData(const QMimeData* data, Qt::DropAction action, int, int, const QModelIndex&)
+bool SimpleModList::dropMimeData(const QMimeData* data, Qt::DropAction action, int, int, const QModelIndex&)
{
if (action == Qt::IgnoreAction)
{
diff --git a/api/logic/minecraft/ModList.h b/api/logic/minecraft/SimpleModList.h
index 72f50edb..3257edbe 100644
--- a/api/logic/minecraft/ModList.h
+++ b/api/logic/minecraft/SimpleModList.h
@@ -32,7 +32,7 @@ class QFileSystemWatcher;
* A legacy mod list.
* Backed by a folder.
*/
-class MULTIMC_LOGIC_EXPORT ModList : public QAbstractListModel
+class MULTIMC_LOGIC_EXPORT SimpleModList : public QAbstractListModel
{
Q_OBJECT
public:
@@ -44,7 +44,7 @@ public:
VersionColumn,
NUM_COLUMNS
};
- ModList(const QString &dir);
+ SimpleModList(const QString &dir);
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
diff --git a/api/logic/minecraft/ModList_test.cpp b/api/logic/minecraft/SimpleModList_test.cpp
index 155c238a..28ce8471 100644
--- a/api/logic/minecraft/ModList_test.cpp
+++ b/api/logic/minecraft/SimpleModList_test.cpp
@@ -4,9 +4,9 @@
#include "TestUtil.h"
#include "FileSystem.h"
-#include "minecraft/ModList.h"
+#include "minecraft/SimpleModList.h"
-class ModListTest : public QObject
+class SimpleModListTest : public QObject
{
Q_OBJECT
@@ -32,7 +32,7 @@ slots:
{
QString folder = source;
QTemporaryDir tempDir;
- ModList m(tempDir.path());
+ SimpleModList m(tempDir.path());
m.installMod(folder);
verify(tempDir.path());
}
@@ -41,13 +41,13 @@ slots:
{
QString folder = source + '/';
QTemporaryDir tempDir;
- ModList m(tempDir.path());
+ SimpleModList m(tempDir.path());
m.installMod(folder);
verify(tempDir.path());
}
}
};
-QTEST_GUILESS_MAIN(ModListTest)
+QTEST_GUILESS_MAIN(SimpleModListTest)
-#include "ModList_test.moc"
+#include "SimpleModList_test.moc"
diff --git a/api/logic/minecraft/legacy/LegacyInstance.cpp b/api/logic/minecraft/legacy/LegacyInstance.cpp
index 6e6d9ae6..1282eb4d 100644
--- a/api/logic/minecraft/legacy/LegacyInstance.cpp
+++ b/api/logic/minecraft/legacy/LegacyInstance.cpp
@@ -21,7 +21,7 @@
#include "LegacyInstance.h"
#include "minecraft/legacy/LegacyModList.h"
-#include "minecraft/ModList.h"
+#include "minecraft/SimpleModList.h"
#include "minecraft/WorldList.h"
#include <MMCZip.h>
#include <FileSystem.h>
diff --git a/api/logic/minecraft/legacy/LegacyInstance.h b/api/logic/minecraft/legacy/LegacyInstance.h
index 7ab89509..1b4798f6 100644
--- a/api/logic/minecraft/legacy/LegacyInstance.h
+++ b/api/logic/minecraft/legacy/LegacyInstance.h
@@ -20,7 +20,7 @@
#include "multimc_logic_export.h"
-class ModList;
+class SimpleModList;
class LegacyModList;
class WorldList;
class Task;
diff --git a/application/InstancePageProvider.h b/application/InstancePageProvider.h
index 08e9fe95..ab0f9a72 100644
--- a/application/InstancePageProvider.h
+++ b/application/InstancePageProvider.h
@@ -40,7 +40,7 @@ public:
auto modsPage = new ModFolderPage(onesix.get(), onesix->loaderModList(), "mods", "loadermods", tr("Loader mods"), "Loader-mods");
modsPage->setFilter("%1 (*.zip *.jar *.litemod)");
values.append(modsPage);
- auto modsPage2 = new NewModFolderPage(onesix.get(), onesix->loaderModList(), "newmods", "newloadermods", tr("New loader mods"), "New-loader-mods");
+ auto modsPage2 = new NewModFolderPage(onesix.get(), onesix->modsModel(), "newmods", "newloadermods", tr("New loader mods"), "New-loader-mods");
modsPage2->setFilter("%1 (*.zip *.jar *.litemod)");
values.append(modsPage2);
values.append(new CoreModFolderPage(onesix.get(), onesix->coreModList(), "coremods", "coremods", tr("Core mods"), "Core-mods"));
diff --git a/application/pages/instance/ModFolderPage.cpp b/application/pages/instance/ModFolderPage.cpp
index 90155df3..0309383d 100644
--- a/application/pages/instance/ModFolderPage.cpp
+++ b/application/pages/instance/ModFolderPage.cpp
@@ -25,13 +25,13 @@
#include "dialogs/CustomMessageBox.h"
#include "dialogs/ModEditDialogCommon.h"
#include <GuiUtil.h>
-#include "minecraft/ModList.h"
+#include "minecraft/SimpleModList.h"
#include "minecraft/Mod.h"
#include "minecraft/VersionFilterData.h"
#include "minecraft/ComponentList.h"
#include <DesktopServices.h>
-ModFolderPage::ModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ModFolderPage::ModFolderPage(BaseInstance *inst, std::shared_ptr<SimpleModList> mods, QString id,
QString iconName, QString displayName, QString helpPage,
QWidget *parent)
: QWidget(parent), ui(new Ui::ModFolderPage)
@@ -76,7 +76,7 @@ void ModFolderPage::on_filterTextChanged(const QString& newContents)
}
-CoreModFolderPage::CoreModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods,
+CoreModFolderPage::CoreModFolderPage(BaseInstance *inst, std::shared_ptr<SimpleModList> mods,
QString id, QString iconName, QString displayName,
QString helpPage, QWidget *parent)
: ModFolderPage(inst, mods, id, iconName, displayName, helpPage, parent)
diff --git a/application/pages/instance/ModFolderPage.h b/application/pages/instance/ModFolderPage.h
index 15e728cb..0242f1c9 100644
--- a/application/pages/instance/ModFolderPage.h
+++ b/application/pages/instance/ModFolderPage.h
@@ -21,7 +21,7 @@
#include "pages/BasePage.h"
#include <MultiMC.h>
-class ModList;
+class SimpleModList;
namespace Ui
{
class ModFolderPage;
@@ -32,7 +32,7 @@ class ModFolderPage : public QWidget, public BasePage
Q_OBJECT
public:
- explicit ModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ explicit ModFolderPage(BaseInstance *inst, std::shared_ptr<SimpleModList> mods, QString id,
QString iconName, QString displayName, QString helpPage = "",
QWidget *parent = 0);
virtual ~ModFolderPage();
@@ -71,7 +71,7 @@ protected:
protected:
Ui::ModFolderPage *ui;
- std::shared_ptr<ModList> m_mods;
+ std::shared_ptr<SimpleModList> m_mods;
QSortFilterProxyModel *m_filterModel;
QString m_iconName;
QString m_id;
@@ -98,7 +98,7 @@ slots:
class CoreModFolderPage : public ModFolderPage
{
public:
- explicit CoreModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ explicit CoreModFolderPage(BaseInstance *inst, std::shared_ptr<SimpleModList> mods, QString id,
QString iconName, QString displayName, QString helpPage = "",
QWidget *parent = 0);
virtual ~CoreModFolderPage()
diff --git a/application/pages/instance/NewModFolderPage.cpp b/application/pages/instance/NewModFolderPage.cpp
index dc00fefa..35972fba 100644
--- a/application/pages/instance/NewModFolderPage.cpp
+++ b/application/pages/instance/NewModFolderPage.cpp
@@ -25,13 +25,13 @@
#include "dialogs/CustomMessageBox.h"
#include "dialogs/ModEditDialogCommon.h"
#include <GuiUtil.h>
-#include "minecraft/ModList.h"
+#include "minecraft/ModsModel.h"
#include "minecraft/Mod.h"
#include "minecraft/VersionFilterData.h"
#include "minecraft/ComponentList.h"
#include <DesktopServices.h>
-NewModFolderPage::NewModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+NewModFolderPage::NewModFolderPage(BaseInstance *inst, std::shared_ptr<ModsModel> mods, QString id,
QString iconName, QString displayName, QString helpPage,
QWidget *parent)
: QWidget(parent), ui(new Ui::NewModFolderPage)
diff --git a/application/pages/instance/NewModFolderPage.h b/application/pages/instance/NewModFolderPage.h
index 2c81a233..2a8136aa 100644
--- a/application/pages/instance/NewModFolderPage.h
+++ b/application/pages/instance/NewModFolderPage.h
@@ -21,7 +21,7 @@
#include "pages/BasePage.h"
#include <MultiMC.h>
-class ModList;
+class SimpleModList;
namespace Ui
{
class NewModFolderPage;
@@ -32,7 +32,7 @@ class NewModFolderPage : public QWidget, public BasePage
Q_OBJECT
public:
- explicit NewModFolderPage(BaseInstance *inst, std::shared_ptr<ModList> mods, QString id,
+ explicit NewModFolderPage(BaseInstance *inst, std::shared_ptr<ModsModel> mods, QString id,
QString iconName, QString displayName, QString helpPage = "",
QWidget *parent = 0);
virtual ~NewModFolderPage();
@@ -71,7 +71,7 @@ protected:
protected:
Ui::NewModFolderPage *ui;
- std::shared_ptr<ModList> m_mods;
+ std::shared_ptr<ModsModel> m_mods;
QSortFilterProxyModel *m_filterModel;
QString m_iconName;
QString m_id;