From a1f256a7451223546e6dcda3f8e427a38e01273a Mon Sep 17 00:00:00 2001 From: arthomnix Date: Sun, 5 Feb 2023 12:03:00 +0000 Subject: [PATCH] GH-4699 Add global datapacks support to Modrinth exporter --- launcher/ModrinthInstanceExportTask.cpp | 13 ++++ launcher/ModrinthInstanceExportTask.h | 1 + launcher/ui/dialogs/ModrinthExportDialog.cpp | 24 +++++++- launcher/ui/dialogs/ModrinthExportDialog.h | 1 + launcher/ui/dialogs/ModrinthExportDialog.ui | 64 ++++++++++++++++++-- 5 files changed, 98 insertions(+), 5 deletions(-) diff --git a/launcher/ModrinthInstanceExportTask.cpp b/launcher/ModrinthInstanceExportTask.cpp index 50841d28..b0d46b37 100644 --- a/launcher/ModrinthInstanceExportTask.cpp +++ b/launcher/ModrinthInstanceExportTask.cpp @@ -56,6 +56,19 @@ void ModrinthInstanceExportTask::executeTask() } } + if (!m_settings.datapacksPath.isEmpty()) { + QDir datapacksDir(m_instance->gameRoot() + "/" + m_settings.datapacksPath); + datapacksDir.setFilter(QDir::Files); + datapacksDir.setNameFilters(QStringList() << "*.zip"); + + if (datapacksDir.exists()) { + QDirIterator datapacksIterator(datapacksDir); + while (datapacksIterator.hasNext()) { + filesToResolve << datapacksIterator.next(); + } + } + } + m_netJob = new NetJob(tr("Modrinth pack export"), APPLICATION->network()); for (const QString &filePath: filesToResolve) { diff --git a/launcher/ModrinthInstanceExportTask.h b/launcher/ModrinthInstanceExportTask.h index fbcdb0f5..d5e103c2 100644 --- a/launcher/ModrinthInstanceExportTask.h +++ b/launcher/ModrinthInstanceExportTask.h @@ -21,6 +21,7 @@ struct ModrinthExportSettings { bool includeModConfigs; bool includeResourcePacks; bool includeShaderPacks; + QString datapacksPath; QString gameVersion; QString forgeVersion; diff --git a/launcher/ui/dialogs/ModrinthExportDialog.cpp b/launcher/ui/dialogs/ModrinthExportDialog.cpp index decde9ec..ac01616e 100644 --- a/launcher/ui/dialogs/ModrinthExportDialog.cpp +++ b/launcher/ui/dialogs/ModrinthExportDialog.cpp @@ -32,7 +32,11 @@ void ModrinthExportDialog::updateDialogState() ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok)->setEnabled( !ui->name->text().isEmpty() && !ui->version->text().isEmpty() - && !ui->file->text().isEmpty() + && ui->file->text().endsWith(".mrpack") + && ( + !ui->includeDatapacks->isChecked() + || (!ui->datapacksPath->text().isEmpty() && QDir(m_instance->gameRoot() + "/" + ui->datapacksPath->text()).exists()) + ) ); } @@ -40,6 +44,7 @@ void ModrinthExportDialog::on_fileBrowseButton_clicked() { QFileDialog dialog(this, tr("Select modpack file"), QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); dialog.setDefaultSuffix("mrpack"); + dialog.setNameFilter("Modrinth modpacks (*.mrpack)"); dialog.setAcceptMode(QFileDialog::AcceptSave); dialog.setFileMode(QFileDialog::AnyFile); dialog.selectFile(ui->name->text() + ".mrpack"); @@ -51,6 +56,19 @@ void ModrinthExportDialog::on_fileBrowseButton_clicked() updateDialogState(); } +void ModrinthExportDialog::on_datapackPathBrowse_clicked() +{ + QFileDialog dialog(this, tr("Select global datapacks folder"), m_instance->gameRoot()); + dialog.setAcceptMode(QFileDialog::AcceptOpen); + dialog.setFileMode(QFileDialog::DirectoryOnly); + + if (dialog.exec()) { + ui->datapacksPath->setText(QDir(m_instance->gameRoot()).relativeFilePath(dialog.selectedFiles().at(0))); + } + + updateDialogState(); +} + void ModrinthExportDialog::accept() { ModrinthExportSettings settings; @@ -64,6 +82,10 @@ void ModrinthExportDialog::accept() settings.includeResourcePacks = ui->includeResourcePacks->isChecked(); settings.includeShaderPacks = ui->includeShaderPacks->isChecked(); + if (ui->includeDatapacks->isChecked()) { + settings.datapacksPath = ui->datapacksPath->text(); + } + MinecraftInstancePtr minecraftInstance = std::dynamic_pointer_cast(m_instance); minecraftInstance->getPackProfile()->reload(Net::Mode::Offline); diff --git a/launcher/ui/dialogs/ModrinthExportDialog.h b/launcher/ui/dialogs/ModrinthExportDialog.h index 3ebc9436..08a244c9 100644 --- a/launcher/ui/dialogs/ModrinthExportDialog.h +++ b/launcher/ui/dialogs/ModrinthExportDialog.h @@ -28,6 +28,7 @@ public: private slots: void on_fileBrowseButton_clicked(); + void on_datapackPathBrowse_clicked(); void accept() override; void updateDialogState(); diff --git a/launcher/ui/dialogs/ModrinthExportDialog.ui b/launcher/ui/dialogs/ModrinthExportDialog.ui index 7aa18bfc..c386f881 100644 --- a/launcher/ui/dialogs/ModrinthExportDialog.ui +++ b/launcher/ui/dialogs/ModrinthExportDialog.ui @@ -6,7 +6,7 @@ 0 0 - 679 + 835 559 @@ -24,7 +24,7 @@ 10 10 - 661 + 821 541 @@ -58,7 +58,7 @@ 10 30 - 641 + 801 151 @@ -111,7 +111,7 @@ 9 29 - 641 + 801 221 @@ -174,6 +174,30 @@ + + + + + + Use this if your modpack contains a mod which adds global datapacks. + + + Include global datapacks folder: + + + + + + + + + + Browse... + + + + + @@ -270,6 +294,38 @@ + + datapacksPath + textChanged(QString) + ModrinthExportDialog + updateDialogState() + + + 532 + 472 + + + 417 + 279 + + + + + includeDatapacks + stateChanged(int) + ModrinthExportDialog + updateDialogState() + + + 183 + 472 + + + 417 + 279 + + + updateDialogState()