update local pack by url

Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
Trial97 2025-12-12 12:35:28 +02:00
parent 2e8256e322
commit 0b81260cab
No known key found for this signature in database
GPG key ID: 55EF5DA53DB36318
4 changed files with 47 additions and 54 deletions

View file

@ -123,6 +123,7 @@ BaseInstance::BaseInstance(SettingsObject* globalSettings, std::unique_ptr<Setti
m_settings->registerSetting("ManagedPackName", ""); m_settings->registerSetting("ManagedPackName", "");
m_settings->registerSetting("ManagedPackVersionID", ""); m_settings->registerSetting("ManagedPackVersionID", "");
m_settings->registerSetting("ManagedPackVersionName", ""); m_settings->registerSetting("ManagedPackVersionName", "");
m_settings->registerSetting("ManagedPackURL", "");
m_settings->registerSetting("Profiler", ""); m_settings->registerSetting("Profiler", "");
} }

View file

@ -4,6 +4,7 @@
#include "ManagedPackPage.h" #include "ManagedPackPage.h"
#include <QDesktopServices> #include <QDesktopServices>
#include <QLineEdit>
#include <QUrl> #include <QUrl>
#include <QUrlQuery> #include <QUrlQuery>
#include "modplatform/ModIndex.h" #include "modplatform/ModIndex.h"
@ -123,6 +124,8 @@ ManagedPackPage::ManagedPackPage(BaseInstance* inst, InstanceWindow* instance_wi
} }
QDesktopServices::openUrl(url); QDesktopServices::openUrl(url);
}); });
connect(ui->urlLine, &QLineEdit::textChanged, this, [this](QString text) { m_inst->settings()->set("ManagedPackURL", text); });
} }
ManagedPackPage::~ManagedPackPage() ManagedPackPage::~ManagedPackPage()
@ -138,16 +141,20 @@ void ManagedPackPage::openedImpl()
ui->packOrigin->hide(); ui->packOrigin->hide();
ui->packOriginLabel->hide(); ui->packOriginLabel->hide();
ui->versionsComboBox->hide(); ui->versionsComboBox->hide();
ui->updateButton->hide(); ui->updateToVersionLabel->setText(tr("URL:"));
ui->updateToVersionLabel->hide(); ui->updateButton->setText(tr("Update Pack"));
ui->updateFromFileButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); ui->updateButton->setDisabled(false);
ui->urlLine->setText(m_inst->settings()->get("ManagedPackURL").toString());
ui->packName->setText(m_inst->name()); ui->packName->setText(m_inst->name());
ui->changelogTextBrowser->setText(tr("This is a local modpack.\n" 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())); .arg(displayName()));
return; return;
} }
ui->urlLine->hide();
ui->packName->setText(m_inst->getManagedPackName()); ui->packName->setText(m_inst->getManagedPackName());
ui->packVersion->setText(m_inst->getManagedPackVersionName()); ui->packVersion->setText(m_inst->getManagedPackVersionName());
ui->packOrigin->setText(tr("Website: <a href=%1>%2</a> | Pack ID: %3 | Version ID: %4") ui->packOrigin->setText(tr("Website: <a href=%1>%2</a> | Pack ID: %3 | Version ID: %4")
@ -339,6 +346,11 @@ void ManagedPackPage::onUpdateTaskCompleted(bool did_succeed) const
void ModrinthManagedPackPage::update() 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(); auto index = ui->versionsComboBox->currentIndex();
if (m_pack.versions.length() == 0) { if (m_pack.versions.length() == 0) {
setFailState(); setFailState();
@ -346,25 +358,7 @@ void ModrinthManagedPackPage::update()
} }
auto version = m_pack.versions.at(index); auto version = m_pack.versions.at(index);
QMap<QString, QString> extra_info; updatePack(version.downloadUrl, version.fileId.toString(), version.version);
// 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);
} }
void ModrinthManagedPackPage::updateFromFile() 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)"); auto output = QFileDialog::getOpenFileUrl(this, tr("Choose update file"), QDir::homePath(), tr("Modrinth pack") + " (*.mrpack *.zip)");
if (output.isEmpty()) if (output.isEmpty())
return; return;
QMap<QString, QString> 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)); updatePack(output);
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);
} }
// FLAME // FLAME
@ -487,6 +468,11 @@ void FlameManagedPackPage::suggestVersion()
void FlameManagedPackPage::update() 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(); auto index = ui->versionsComboBox->currentIndex();
if (m_pack.versions.length() == 0) { if (m_pack.versions.length() == 0) {
setFailState(); setFailState();
@ -494,20 +480,7 @@ void FlameManagedPackPage::update()
} }
auto version = m_pack.versions.at(index); auto version = m_pack.versions.at(index);
QMap<QString, QString> extra_info; updatePack(version.downloadUrl, version.fileId.toString());
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);
} }
void FlameManagedPackPage::updateFromFile() void FlameManagedPackPage::updateFromFile()
@ -516,19 +489,33 @@ void FlameManagedPackPage::updateFromFile()
if (output.isEmpty()) if (output.isEmpty())
return; return;
updatePack(output);
}
void ManagedPackPage::updatePack(const QUrl& url, QString versionID, QString versionName)
{
QMap<QString, QString> extra_info; QMap<QString, QString> 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_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()); 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->setGroup(APPLICATION->instances()->getInstanceGroup(m_inst->id()));
extracted->setIcon(m_inst->iconKey()); extracted->setIcon(m_inst->iconKey());
extracted->setConfirmUpdate(false); extracted->setConfirmUpdate(false);
// Run our task then handle the result
auto did_succeed = runUpdateTask(extracted); auto did_succeed = runUpdateTask(extracted);
onUpdateTaskCompleted(did_succeed); onUpdateTaskCompleted(did_succeed);
} }
#include "ManagedPackPage.moc" #include "ManagedPackPage.moc"

View file

@ -86,6 +86,8 @@ class ManagedPackPage : public QWidget, public BasePage {
*/ */
bool runUpdateTask(InstanceTask*); bool runUpdateTask(InstanceTask*);
void updatePack(const QUrl& url, QString versionID = {}, QString versionName = {});
protected: protected:
InstanceWindow* m_instance_window = nullptr; InstanceWindow* m_instance_window = nullptr;

View file

@ -137,6 +137,9 @@
<item> <item>
<widget class="QComboBox" name="versionsComboBox"/> <widget class="QComboBox" name="versionsComboBox"/>
</item> </item>
<item>
<widget class="QLineEdit" name="urlLine"/>
</item>
<item> <item>
<widget class="QPushButton" name="updateButton"> <widget class="QPushButton" name="updateButton">
<property name="enabled"> <property name="enabled">