diff --git a/launcher/BaseInstance.cpp b/launcher/BaseInstance.cpp index dc2eb2da3..0080cc516 100644 --- a/launcher/BaseInstance.cpp +++ b/launcher/BaseInstance.cpp @@ -123,6 +123,7 @@ BaseInstance::BaseInstance(SettingsObject* globalSettings, std::unique_ptrregisterSetting("ManagedPackName", ""); m_settings->registerSetting("ManagedPackVersionID", ""); m_settings->registerSetting("ManagedPackVersionName", ""); + m_settings->registerSetting("ManagedPackURL", ""); m_settings->registerSetting("Profiler", ""); } diff --git a/launcher/ui/pages/instance/ManagedPackPage.cpp b/launcher/ui/pages/instance/ManagedPackPage.cpp index 230cf1bdf..155580c79 100644 --- a/launcher/ui/pages/instance/ManagedPackPage.cpp +++ b/launcher/ui/pages/instance/ManagedPackPage.cpp @@ -4,6 +4,7 @@ #include "ManagedPackPage.h" #include +#include #include #include #include "modplatform/ModIndex.h" @@ -123,6 +124,8 @@ ManagedPackPage::ManagedPackPage(BaseInstance* inst, InstanceWindow* instance_wi } QDesktopServices::openUrl(url); }); + + connect(ui->urlLine, &QLineEdit::textChanged, this, [this](QString text) { m_inst->settings()->set("ManagedPackURL", text); }); } ManagedPackPage::~ManagedPackPage() @@ -138,16 +141,20 @@ void ManagedPackPage::openedImpl() ui->packOrigin->hide(); ui->packOriginLabel->hide(); ui->versionsComboBox->hide(); - ui->updateButton->hide(); - ui->updateToVersionLabel->hide(); - ui->updateFromFileButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + ui->updateToVersionLabel->setText(tr("URL:")); + ui->updateButton->setText(tr("Update Pack")); + ui->updateButton->setDisabled(false); + ui->urlLine->setText(m_inst->settings()->get("ManagedPackURL").toString()); ui->packName->setText(m_inst->name()); ui->changelogTextBrowser->setText(tr("This is a local modpack.\n" - "This can be updated only using a file in %1 format\n") + "This can be updated either using a file in %1 format or an URL.\n" + "Do not use a different format than the one mentioned as it may break the instance.\n" + "Make sure you also trust the URL.\n") .arg(displayName())); return; } + ui->urlLine->hide(); ui->packName->setText(m_inst->getManagedPackName()); ui->packVersion->setText(m_inst->getManagedPackVersionName()); ui->packOrigin->setText(tr("Website: %2 | Pack ID: %3 | Version ID: %4") @@ -339,6 +346,11 @@ void ManagedPackPage::onUpdateTaskCompleted(bool did_succeed) const void ModrinthManagedPackPage::update() { + auto customURL = m_inst->settings()->get("ManagedPackURL").toString(); + if (m_inst->getManagedPackID().isEmpty() && !customURL.isEmpty()) { + updatePack(customURL); + return; + } auto index = ui->versionsComboBox->currentIndex(); if (m_pack.versions.length() == 0) { setFailState(); @@ -346,25 +358,7 @@ void ModrinthManagedPackPage::update() } auto version = m_pack.versions.at(index); - QMap extra_info; - // NOTE: Don't use 'm_pack.id' here, since we didn't completely parse all the metadata for the pack, including this field. - extra_info.insert("pack_id", m_inst->getManagedPackID()); - extra_info.insert("pack_version_id", version.fileId.toString()); - extra_info.insert("original_instance_id", m_inst->id()); - - auto extracted = new InstanceImportTask(version.downloadUrl, this, std::move(extra_info)); - - InstanceName inst_name(m_inst->getManagedPackName(), version.version); - inst_name.setName(m_inst->name().replace(m_inst->getManagedPackVersionName(), version.version)); - extracted->setName(inst_name); - - extracted->setGroup(APPLICATION->instances()->getInstanceGroup(m_inst->id())); - extracted->setIcon(m_inst->iconKey()); - extracted->setConfirmUpdate(false); - - // Run our task then handle the result - auto did_succeed = runUpdateTask(extracted); - onUpdateTaskCompleted(did_succeed); + updatePack(version.downloadUrl, version.fileId.toString(), version.version); } void ModrinthManagedPackPage::updateFromFile() @@ -372,21 +366,8 @@ void ModrinthManagedPackPage::updateFromFile() auto output = QFileDialog::getOpenFileUrl(this, tr("Choose update file"), QDir::homePath(), tr("Modrinth pack") + " (*.mrpack *.zip)"); if (output.isEmpty()) return; - QMap extra_info; - extra_info.insert("pack_id", m_inst->getManagedPackID()); - extra_info.insert("pack_version_id", QString()); - extra_info.insert("original_instance_id", m_inst->id()); - auto extracted = new InstanceImportTask(output, this, std::move(extra_info)); - - extracted->setName(m_inst->name()); - extracted->setGroup(APPLICATION->instances()->getInstanceGroup(m_inst->id())); - extracted->setIcon(m_inst->iconKey()); - extracted->setConfirmUpdate(false); - - // Run our task then handle the result - auto did_succeed = runUpdateTask(extracted); - onUpdateTaskCompleted(did_succeed); + updatePack(output); } // FLAME @@ -487,6 +468,11 @@ void FlameManagedPackPage::suggestVersion() void FlameManagedPackPage::update() { + auto customURL = m_inst->settings()->get("ManagedPackURL").toString(); + if (m_inst->getManagedPackID().isEmpty() && !customURL.isEmpty()) { + updatePack(customURL); + return; + } auto index = ui->versionsComboBox->currentIndex(); if (m_pack.versions.length() == 0) { setFailState(); @@ -494,20 +480,7 @@ void FlameManagedPackPage::update() } auto version = m_pack.versions.at(index); - QMap extra_info; - extra_info.insert("pack_id", m_inst->getManagedPackID()); - extra_info.insert("pack_version_id", version.fileId.toString()); - extra_info.insert("original_instance_id", m_inst->id()); - - auto extracted = new InstanceImportTask(version.downloadUrl, this, std::move(extra_info)); - - extracted->setName(m_inst->name()); - extracted->setGroup(APPLICATION->instances()->getInstanceGroup(m_inst->id())); - extracted->setIcon(m_inst->iconKey()); - extracted->setConfirmUpdate(false); - - auto did_succeed = runUpdateTask(extracted); - onUpdateTaskCompleted(did_succeed); + updatePack(version.downloadUrl, version.fileId.toString()); } void FlameManagedPackPage::updateFromFile() @@ -516,19 +489,33 @@ void FlameManagedPackPage::updateFromFile() if (output.isEmpty()) return; + updatePack(output); +} + +void ManagedPackPage::updatePack(const QUrl& url, QString versionID, QString versionName) +{ QMap extra_info; + // NOTE: Don't use 'm_pack.id' here, since we didn't completely parse all the metadata for the pack, including this field. extra_info.insert("pack_id", m_inst->getManagedPackID()); - extra_info.insert("pack_version_id", QString()); + extra_info.insert("pack_version_id", versionID); extra_info.insert("original_instance_id", m_inst->id()); - auto extracted = new InstanceImportTask(output, this, std::move(extra_info)); + auto extracted = new InstanceImportTask(url, this, std::move(extra_info)); - extracted->setName(m_inst->name()); + if (versionName.isEmpty()) { + extracted->setName(m_inst->name()); + } else { + InstanceName inst_name(m_inst->getManagedPackName(), versionName); + inst_name.setName(m_inst->name().replace(m_inst->getManagedPackVersionName(), versionName)); + extracted->setName(inst_name); + } extracted->setGroup(APPLICATION->instances()->getInstanceGroup(m_inst->id())); extracted->setIcon(m_inst->iconKey()); extracted->setConfirmUpdate(false); + // Run our task then handle the result auto did_succeed = runUpdateTask(extracted); onUpdateTaskCompleted(did_succeed); } + #include "ManagedPackPage.moc" diff --git a/launcher/ui/pages/instance/ManagedPackPage.h b/launcher/ui/pages/instance/ManagedPackPage.h index f319ed069..4b7332896 100644 --- a/launcher/ui/pages/instance/ManagedPackPage.h +++ b/launcher/ui/pages/instance/ManagedPackPage.h @@ -86,6 +86,8 @@ class ManagedPackPage : public QWidget, public BasePage { */ bool runUpdateTask(InstanceTask*); + void updatePack(const QUrl& url, QString versionID = {}, QString versionName = {}); + protected: InstanceWindow* m_instance_window = nullptr; diff --git a/launcher/ui/pages/instance/ManagedPackPage.ui b/launcher/ui/pages/instance/ManagedPackPage.ui index 62641bc82..5ed80400a 100644 --- a/launcher/ui/pages/instance/ManagedPackPage.ui +++ b/launcher/ui/pages/instance/ManagedPackPage.ui @@ -137,6 +137,9 @@ + + +