feat+fix: allow forwarding extra info to InstanceImportTask
This allows us to pass to the creation instances their actual pack ID and version ID, that in Flame's case, are only available before starting to create an instance. Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
parent
7f5dea28bb
commit
968366c2ae
@ -55,11 +55,9 @@
|
|||||||
|
|
||||||
#include <quazip/quazipdir.h>
|
#include <quazip/quazipdir.h>
|
||||||
|
|
||||||
InstanceImportTask::InstanceImportTask(const QUrl sourceUrl, QWidget* parent)
|
InstanceImportTask::InstanceImportTask(const QUrl sourceUrl, QWidget* parent, QMap<QString, QString> extra_info)
|
||||||
{
|
: m_sourceUrl(sourceUrl), m_extra_info(std::move(extra_info)), m_parent(parent)
|
||||||
m_sourceUrl = sourceUrl;
|
{}
|
||||||
m_parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InstanceImportTask::abort()
|
bool InstanceImportTask::abort()
|
||||||
{
|
{
|
||||||
@ -259,7 +257,15 @@ void InstanceImportTask::extractAborted()
|
|||||||
|
|
||||||
void InstanceImportTask::processFlame()
|
void InstanceImportTask::processFlame()
|
||||||
{
|
{
|
||||||
auto* inst_creation_task = new FlameCreationTask(m_stagingPath, m_globalSettings, m_parent);
|
auto pack_id_it = m_extra_info.constFind("pack_id");
|
||||||
|
Q_ASSERT(pack_id_it != m_extra_info.constEnd());
|
||||||
|
auto pack_id = pack_id_it.value();
|
||||||
|
|
||||||
|
auto pack_version_id_it = m_extra_info.constFind("pack_version_id");
|
||||||
|
Q_ASSERT(pack_version_id_it != m_extra_info.constEnd());
|
||||||
|
auto pack_version_id = pack_version_id_it.value();
|
||||||
|
|
||||||
|
auto* inst_creation_task = new FlameCreationTask(m_stagingPath, m_globalSettings, m_parent, pack_id, pack_version_id);
|
||||||
|
|
||||||
inst_creation_task->setName(*this);
|
inst_creation_task->setName(*this);
|
||||||
inst_creation_task->setIcon(m_instIcon);
|
inst_creation_task->setIcon(m_instIcon);
|
||||||
@ -324,7 +330,16 @@ void InstanceImportTask::processMultiMC()
|
|||||||
|
|
||||||
void InstanceImportTask::processModrinth()
|
void InstanceImportTask::processModrinth()
|
||||||
{
|
{
|
||||||
auto* inst_creation_task = new ModrinthCreationTask(m_stagingPath, m_globalSettings, m_parent, m_sourceUrl.toString());
|
auto pack_id_it = m_extra_info.constFind("pack_id");
|
||||||
|
Q_ASSERT(pack_id_it != m_extra_info.constEnd());
|
||||||
|
auto pack_id = pack_id_it.value();
|
||||||
|
|
||||||
|
QString pack_version_id;
|
||||||
|
auto pack_version_id_it = m_extra_info.constFind("pack_version_id");
|
||||||
|
if (pack_version_id_it != m_extra_info.constEnd())
|
||||||
|
pack_version_id = pack_version_id_it.value();
|
||||||
|
|
||||||
|
auto* inst_creation_task = new ModrinthCreationTask(m_stagingPath, m_globalSettings, m_parent, pack_id, pack_version_id);
|
||||||
|
|
||||||
inst_creation_task->setName(*this);
|
inst_creation_task->setName(*this);
|
||||||
inst_creation_task->setIcon(m_instIcon);
|
inst_creation_task->setIcon(m_instIcon);
|
||||||
|
@ -56,7 +56,7 @@ class InstanceImportTask : public InstanceTask
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit InstanceImportTask(const QUrl sourceUrl, QWidget* parent = nullptr);
|
explicit InstanceImportTask(const QUrl sourceUrl, QWidget* parent = nullptr, QMap<QString, QString> extra_info = {});
|
||||||
|
|
||||||
bool abort() override;
|
bool abort() override;
|
||||||
const QVector<Flame::File> &getBlockedFiles() const
|
const QVector<Flame::File> &getBlockedFiles() const
|
||||||
@ -101,6 +101,10 @@ private: /* data */
|
|||||||
Modrinth,
|
Modrinth,
|
||||||
} m_modpackType = ModpackType::Unknown;
|
} m_modpackType = ModpackType::Unknown;
|
||||||
|
|
||||||
|
// Extra info we might need, that's available before, but can't be derived from
|
||||||
|
// the source URL / the resource it points to alone.
|
||||||
|
QMap<QString, QString> m_extra_info;
|
||||||
|
|
||||||
//FIXME: nuke
|
//FIXME: nuke
|
||||||
QWidget* m_parent;
|
QWidget* m_parent;
|
||||||
};
|
};
|
||||||
|
@ -355,7 +355,7 @@ bool FlameCreationTask::createInstance()
|
|||||||
FS::deletePath(jarmodsPath);
|
FS::deletePath(jarmodsPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance.setManagedPack("flame", {}, m_pack.name, {}, m_pack.version);
|
instance.setManagedPack("flame", m_managed_id, m_pack.name, m_managed_version_id, m_pack.version);
|
||||||
instance.setName(name());
|
instance.setName(name());
|
||||||
|
|
||||||
m_mod_id_resolver = new Flame::FileResolvingTask(APPLICATION->network(), m_pack);
|
m_mod_id_resolver = new Flame::FileResolvingTask(APPLICATION->network(), m_pack);
|
||||||
|
@ -51,8 +51,8 @@ class FlameCreationTask final : public InstanceCreationTask {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FlameCreationTask(const QString& staging_path, SettingsObjectPtr global_settings, QWidget* parent)
|
FlameCreationTask(const QString& staging_path, SettingsObjectPtr global_settings, QWidget* parent, QString id, QString version_id)
|
||||||
: InstanceCreationTask(), m_parent(parent)
|
: InstanceCreationTask(), m_parent(parent), m_managed_id(std::move(id)), m_managed_version_id(std::move(version_id))
|
||||||
{
|
{
|
||||||
setStagingPath(staging_path);
|
setStagingPath(staging_path);
|
||||||
setParentSettings(global_settings);
|
setParentSettings(global_settings);
|
||||||
@ -78,5 +78,7 @@ class FlameCreationTask final : public InstanceCreationTask {
|
|||||||
NetJob* m_process_update_file_info_job = nullptr;
|
NetJob* m_process_update_file_info_job = nullptr;
|
||||||
NetJob::Ptr m_files_job = nullptr;
|
NetJob::Ptr m_files_job = nullptr;
|
||||||
|
|
||||||
|
QString m_managed_id, m_managed_version_id;
|
||||||
|
|
||||||
std::optional<InstancePtr> m_instance;
|
std::optional<InstancePtr> m_instance;
|
||||||
};
|
};
|
||||||
|
@ -211,7 +211,7 @@ bool ModrinthCreationTask::createInstance()
|
|||||||
instance.setIconKey("modrinth");
|
instance.setIconKey("modrinth");
|
||||||
}
|
}
|
||||||
|
|
||||||
instance.setManagedPack("modrinth", getManagedPackID(), m_managed_name, m_managed_version_id, version());
|
instance.setManagedPack("modrinth", m_managed_id, m_managed_name, m_managed_version_id, version());
|
||||||
instance.setName(name());
|
instance.setName(name());
|
||||||
instance.saveNow();
|
instance.saveNow();
|
||||||
|
|
||||||
@ -284,7 +284,8 @@ bool ModrinthCreationTask::parseManifest(const QString& index_path, std::vector<
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (set_managed_info) {
|
if (set_managed_info) {
|
||||||
m_managed_version_id = Json::ensureString(obj, "versionId", {}, "Managed ID");
|
if (m_managed_version_id.isEmpty())
|
||||||
|
m_managed_version_id = Json::ensureString(obj, "versionId", {}, "Managed ID");
|
||||||
m_managed_name = Json::ensureString(obj, "name", {}, "Managed Name");
|
m_managed_name = Json::ensureString(obj, "name", {}, "Managed Name");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,13 +385,3 @@ bool ModrinthCreationTask::parseManifest(const QString& index_path, std::vector<
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ModrinthCreationTask::getManagedPackID() const
|
|
||||||
{
|
|
||||||
if (!m_source_url.isEmpty()) {
|
|
||||||
QRegularExpression regex(R"(data\/(.*)\/versions)");
|
|
||||||
return regex.match(m_source_url).captured(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
@ -14,8 +14,8 @@ class ModrinthCreationTask final : public InstanceCreationTask {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ModrinthCreationTask(QString staging_path, SettingsObjectPtr global_settings, QWidget* parent, QString source_url = {})
|
ModrinthCreationTask(QString staging_path, SettingsObjectPtr global_settings, QWidget* parent, QString id, QString version_id = {})
|
||||||
: InstanceCreationTask(), m_parent(parent), m_source_url(std::move(source_url))
|
: InstanceCreationTask(), m_parent(parent), m_managed_id(std::move(id)), m_managed_version_id(std::move(version_id))
|
||||||
{
|
{
|
||||||
setStagingPath(staging_path);
|
setStagingPath(staging_path);
|
||||||
setParentSettings(global_settings);
|
setParentSettings(global_settings);
|
||||||
@ -28,14 +28,12 @@ class ModrinthCreationTask final : public InstanceCreationTask {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool parseManifest(const QString&, std::vector<Modrinth::File>&, bool set_managed_info = true, bool show_optional_dialog = true);
|
bool parseManifest(const QString&, std::vector<Modrinth::File>&, bool set_managed_info = true, bool show_optional_dialog = true);
|
||||||
QString getManagedPackID() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWidget* m_parent = nullptr;
|
QWidget* m_parent = nullptr;
|
||||||
|
|
||||||
QString minecraftVersion, fabricVersion, quiltVersion, forgeVersion;
|
QString minecraftVersion, fabricVersion, quiltVersion, forgeVersion;
|
||||||
QString m_managed_id, m_managed_version_id, m_managed_name;
|
QString m_managed_id, m_managed_version_id, m_managed_name;
|
||||||
QString m_source_url;
|
|
||||||
|
|
||||||
std::vector<Modrinth::File> m_files;
|
std::vector<Modrinth::File> m_files;
|
||||||
NetJob::Ptr m_files_job;
|
NetJob::Ptr m_files_job;
|
||||||
|
@ -197,12 +197,18 @@ void FlamePage::suggestCurrent()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedVersion.isEmpty() || selectedVersion == "-1") {
|
if (m_selected_version_index == -1) {
|
||||||
dialog->setSuggestedPack();
|
dialog->setSuggestedPack();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dialog->setSuggestedPack(current.name, new InstanceImportTask(selectedVersion,this));
|
auto version = current.versions.at(m_selected_version_index);
|
||||||
|
|
||||||
|
QMap<QString, QString> extra_info;
|
||||||
|
extra_info.insert("pack_id", QString::number(current.addonId));
|
||||||
|
extra_info.insert("pack_version_id", QString::number(version.fileId));
|
||||||
|
|
||||||
|
dialog->setSuggestedPack(current.name, new InstanceImportTask(version.downloadUrl, this, extra_info));
|
||||||
QString editedLogoName;
|
QString editedLogoName;
|
||||||
editedLogoName = "curseforge_" + current.logoName.section(".", 0, 0);
|
editedLogoName = "curseforge_" + current.logoName.section(".", 0, 0);
|
||||||
listModel->getLogo(current.logoName, current.logoUrl,
|
listModel->getLogo(current.logoName, current.logoUrl,
|
||||||
@ -212,10 +218,13 @@ void FlamePage::suggestCurrent()
|
|||||||
void FlamePage::onVersionSelectionChanged(QString data)
|
void FlamePage::onVersionSelectionChanged(QString data)
|
||||||
{
|
{
|
||||||
if (data.isNull() || data.isEmpty()) {
|
if (data.isNull() || data.isEmpty()) {
|
||||||
selectedVersion = "";
|
m_selected_version_index = -1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
selectedVersion = ui->versionSelectionBox->currentData().toString();
|
|
||||||
|
m_selected_version_index = ui->versionSelectionBox->currentIndex();
|
||||||
|
Q_ASSERT(current.versions.at(m_selected_version_index).downloadUrl == ui->versionSelectionBox->currentData().toString());
|
||||||
|
|
||||||
suggestCurrent();
|
suggestCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,5 +99,5 @@ private:
|
|||||||
Flame::ListModel* listModel = nullptr;
|
Flame::ListModel* listModel = nullptr;
|
||||||
Flame::IndexedPack current;
|
Flame::IndexedPack current;
|
||||||
|
|
||||||
QString selectedVersion;
|
int m_selected_version_index = -1;
|
||||||
};
|
};
|
||||||
|
@ -300,7 +300,11 @@ void ModrinthPage::suggestCurrent()
|
|||||||
|
|
||||||
for (auto& ver : current.versions) {
|
for (auto& ver : current.versions) {
|
||||||
if (ver.id == selectedVersion) {
|
if (ver.id == selectedVersion) {
|
||||||
dialog->setSuggestedPack(current.name, ver.version, new InstanceImportTask(ver.download_url, this));
|
QMap<QString, QString> extra_info;
|
||||||
|
extra_info.insert("pack_id", current.id);
|
||||||
|
extra_info.insert("pack_version_id", ver.id);
|
||||||
|
|
||||||
|
dialog->setSuggestedPack(current.name, ver.version, new InstanceImportTask(ver.download_url, this, extra_info));
|
||||||
auto iconName = current.iconName;
|
auto iconName = current.iconName;
|
||||||
m_model->getLogo(iconName, current.iconUrl.toString(),
|
m_model->getLogo(iconName, current.iconUrl.toString(),
|
||||||
[this, iconName](QString logo) { dialog->setSuggestedIconFromFile(logo, iconName); });
|
[this, iconName](QString logo) { dialog->setSuggestedIconFromFile(logo, iconName); });
|
||||||
|
Loading…
Reference in New Issue
Block a user