aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--launcher/minecraft/mod/Mod.cpp33
-rw-r--r--launcher/minecraft/mod/Mod.h73
-rw-r--r--launcher/minecraft/mod/ModFolderLoadTask.cpp29
-rw-r--r--launcher/minecraft/mod/ModFolderLoadTask.h4
-rw-r--r--launcher/minecraft/mod/ModFolderModel.cpp9
5 files changed, 89 insertions, 59 deletions
diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp
index b6bff29b..59f4d83b 100644
--- a/launcher/minecraft/mod/Mod.cpp
+++ b/launcher/minecraft/mod/Mod.cpp
@@ -33,6 +33,30 @@ Mod::Mod(const QFileInfo &file)
m_changedDateTime = file.lastModified();
}
+Mod::Mod(const QDir& mods_dir, const Packwiz::Mod& metadata)
+ : m_file(mods_dir.absoluteFilePath(metadata.filename))
+ // It is weird, but name is not reliable for comparing with the JAR files name
+ // FIXME: Maybe use hash when implemented?
+ , m_mmc_id(metadata.filename)
+ , m_name(metadata.name)
+{
+ if(m_file.isDir()){
+ m_type = MOD_FOLDER;
+ }
+ else{
+ if (metadata.filename.endsWith(".zip") || metadata.filename.endsWith(".jar"))
+ m_type = MOD_ZIPFILE;
+ else if (metadata.filename.endsWith(".litemod"))
+ m_type = MOD_LITEMOD;
+ else
+ m_type = MOD_SINGLEFILE;
+ }
+
+ m_from_metadata = true;
+ m_enabled = true;
+ m_changedDateTime = m_file.lastModified();
+}
+
void Mod::repath(const QFileInfo &file)
{
m_file = file;
@@ -101,13 +125,18 @@ bool Mod::enable(bool value)
if (!foo.rename(path))
return false;
}
- repath(QFileInfo(path));
+ if(!fromMetadata())
+ repath(QFileInfo(path));
+
m_enabled = value;
return true;
}
-bool Mod::destroy()
+bool Mod::destroy(QDir& index_dir)
{
+ // Delete metadata
+ Packwiz::deleteModIndex(index_dir, m_name);
+
m_type = MOD_UNKNOWN;
return FS::deletePath(m_file.filePath());
}
diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h
index 921faeb1..c9fd5813 100644
--- a/launcher/minecraft/mod/Mod.h
+++ b/launcher/minecraft/mod/Mod.h
@@ -14,14 +14,14 @@
*/
#pragma once
-#include <QFileInfo>
+
#include <QDateTime>
+#include <QFileInfo>
#include <QList>
#include <memory>
#include "ModDetails.h"
-
-
+#include "modplatform/packwiz/Packwiz.h"
class Mod
{
@@ -32,65 +32,41 @@ public:
MOD_ZIPFILE, //!< The mod is a zip file containing the mod's class files.
MOD_SINGLEFILE, //!< The mod is a single file (not a zip file).
MOD_FOLDER, //!< The mod is in a folder on the filesystem.
- MOD_LITEMOD, //!< The mod is a litemod
+ MOD_LITEMOD, //!< The mod is a litemod
};
Mod() = default;
Mod(const QFileInfo &file);
+ explicit Mod(const QDir& mods_dir, const Packwiz::Mod& metadata);
- QFileInfo filename() const
- {
- return m_file;
- }
- QString mmc_id() const
- {
- return m_mmc_id;
- }
- ModType type() const
- {
- return m_type;
- }
- bool valid()
- {
- return m_type != MOD_UNKNOWN;
- }
-
- QDateTime dateTimeChanged() const
- {
- return m_changedDateTime;
- }
-
- bool enabled() const
- {
- return m_enabled;
- }
+ QFileInfo filename() const { return m_file; }
+ QDateTime dateTimeChanged() const { return m_changedDateTime; }
+ QString mmc_id() const { return m_mmc_id; }
+ ModType type() const { return m_type; }
+ bool fromMetadata() const { return m_from_metadata; }
+ bool enabled() const { return m_enabled; }
- const ModDetails &details() const;
+ bool valid() const { return m_type != MOD_UNKNOWN; }
- QString name() const;
- QString version() const;
- QString homeurl() const;
+ const ModDetails& details() const;
+ QString name() const;
+ QString version() const;
+ QString homeurl() const;
QString description() const;
QStringList authors() const;
bool enable(bool value);
// delete all the files of this mod
- bool destroy();
+ bool destroy(QDir& index_dir);
// change the mod's filesystem path (used by mod lists for *MAGIC* purposes)
void repath(const QFileInfo &file);
- bool shouldResolve() {
- return !m_resolving && !m_resolved;
- }
- bool isResolving() {
- return m_resolving;
- }
- int resolutionTicket()
- {
- return m_resolutionTicket;
- }
+ bool shouldResolve() const { return !m_resolving && !m_resolved; }
+ bool isResolving() const { return m_resolving; }
+ int resolutionTicket() const { return m_resolutionTicket; }
+
void setResolving(bool resolving, int resolutionTicket) {
m_resolving = resolving;
m_resolutionTicket = resolutionTicket;
@@ -104,12 +80,15 @@ public:
protected:
QFileInfo m_file;
QDateTime m_changedDateTime;
+
QString m_mmc_id;
QString m_name;
+ ModType m_type = MOD_UNKNOWN;
+ bool m_from_metadata = false;
+ std::shared_ptr<ModDetails> m_localDetails;
+
bool m_enabled = true;
bool m_resolving = false;
bool m_resolved = false;
int m_resolutionTicket = 0;
- ModType m_type = MOD_UNKNOWN;
- std::shared_ptr<ModDetails> m_localDetails;
};
diff --git a/launcher/minecraft/mod/ModFolderLoadTask.cpp b/launcher/minecraft/mod/ModFolderLoadTask.cpp
index 88349877..fd4d6008 100644
--- a/launcher/minecraft/mod/ModFolderLoadTask.cpp
+++ b/launcher/minecraft/mod/ModFolderLoadTask.cpp
@@ -1,18 +1,35 @@
#include "ModFolderLoadTask.h"
#include <QDebug>
-ModFolderLoadTask::ModFolderLoadTask(QDir dir) :
- m_dir(dir), m_result(new Result())
+#include "modplatform/packwiz/Packwiz.h"
+
+ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir) :
+ m_mods_dir(mods_dir), m_index_dir(index_dir), m_result(new Result())
{
}
void ModFolderLoadTask::run()
{
- m_dir.refresh();
- for (auto entry : m_dir.entryInfoList())
+ // Read metadata first
+ m_index_dir.refresh();
+ for(auto entry : m_index_dir.entryList()){
+ // QDir::Filter::NoDotAndDotDot seems to exclude all files for some reason...
+ if(entry == "." || entry == "..")
+ continue;
+
+ entry.chop(5); // Remove .toml at the end
+ Mod mod(m_mods_dir, Packwiz::getIndexForMod(m_index_dir, entry));
+ m_result->mods[mod.mmc_id()] = mod;
+ }
+
+ // Read JAR files that don't have metadata
+ m_mods_dir.refresh();
+ for (auto entry : m_mods_dir.entryInfoList())
{
- Mod m(entry);
- m_result->mods[m.mmc_id()] = m;
+ Mod mod(entry);
+ if(!m_result->mods.contains(mod.mmc_id()))
+ m_result->mods[mod.mmc_id()] = mod;
}
+
emit succeeded();
}
diff --git a/launcher/minecraft/mod/ModFolderLoadTask.h b/launcher/minecraft/mod/ModFolderLoadTask.h
index 8d720e65..c869f083 100644
--- a/launcher/minecraft/mod/ModFolderLoadTask.h
+++ b/launcher/minecraft/mod/ModFolderLoadTask.h
@@ -19,11 +19,11 @@ public:
}
public:
- ModFolderLoadTask(QDir dir);
+ ModFolderLoadTask(QDir& mods_dir, QDir& index_dir);
void run();
signals:
void succeeded();
private:
- QDir m_dir;
+ QDir& m_mods_dir, m_index_dir;
ResultPtr m_result;
};
diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp
index f0c53c39..615cfc0c 100644
--- a/launcher/minecraft/mod/ModFolderModel.cpp
+++ b/launcher/minecraft/mod/ModFolderModel.cpp
@@ -79,10 +79,14 @@ bool ModFolderModel::update()
return true;
}
- auto task = new ModFolderLoadTask(m_dir);
+ auto index_dir = indexDir();
+ auto task = new ModFolderLoadTask(dir(), index_dir);
+
m_update = task->result();
+
QThreadPool *threadPool = QThreadPool::globalInstance();
connect(task, &ModFolderLoadTask::succeeded, this, &ModFolderModel::finishUpdate);
+
threadPool->start(task);
return true;
}
@@ -334,7 +338,8 @@ bool ModFolderModel::deleteMods(const QModelIndexList& indexes)
for (auto i: indexes)
{
Mod &m = mods[i.row()];
- m.destroy();
+ auto index_dir = indexDir();
+ m.destroy(index_dir);
}
return true;
}