diff options
16 files changed, 186 insertions, 141 deletions
diff --git a/api/logic/modplatform/flame/FileResolvingTask.cpp b/api/logic/modplatform/flame/FileResolvingTask.cpp index 24cafcdd..295574f0 100644 --- a/api/logic/modplatform/flame/FileResolvingTask.cpp +++ b/api/logic/modplatform/flame/FileResolvingTask.cpp @@ -1,7 +1,9 @@ #include "FileResolvingTask.h" #include "Json.h" -const char * metabase = "https://cursemeta.dries007.net"; +namespace { + const char * metabase = "https://cursemeta.dries007.net"; +} Flame::FileResolvingTask::FileResolvingTask(Flame::Manifest& toProcess) : m_toProcess(toProcess) @@ -34,70 +36,14 @@ void Flame::FileResolvingTask::netJobFinished() int index = 0; for(auto & bytes: results) { + auto & out = m_toProcess.files[index]; try { - auto doc = Json::requireDocument(bytes); - auto obj = Json::requireObject(doc); - auto & out = m_toProcess.files[index]; - // result code signifies true failure. - if(obj.contains("code")) - { - qCritical() << "Resolving of" << out.projectId << out.fileId << "failed because of a negative result:"; - qCritical() << bytes; - failed = true; - continue; - } - out.fileName = Json::requireString(obj, "FileNameOnDisk"); - QString rawUrl = Json::requireString(obj, "DownloadURL"); - out.url = QUrl(rawUrl, QUrl::TolerantMode); - if(!out.url.isValid()) - { - throw JSONValidationError(QString("Invalid URL: %1").arg(rawUrl)); - } - // This is a piece of a Flame project JSON pulled out into the file metadata (here) for convenience - // It is also optional - QJsonObject projObj = Json::ensureObject(obj, "_Project", {}); - if(!projObj.isEmpty()) - { - QString strType = Json::ensureString(projObj, "PackageType", "mod").toLower(); - if(strType == "singlefile") - { - out.type = File::Type::SingleFile; - } - else if(strType == "ctoc") - { - out.type = File::Type::Ctoc; - } - else if(strType == "cmod2") - { - out.type = File::Type::Cmod2; - } - else if(strType == "mod") - { - out.type = File::Type::Mod; - } - else if(strType == "folder") - { - out.type = File::Type::Folder; - } - else if(strType == "modpack") - { - out.type = File::Type::Modpack; - } - else - { - qCritical() << "Resolving of" << out.projectId << out.fileId << "failed because of unknown file type:" << strType; - out.type = File::Type::Unknown; - failed = true; - continue; - } - out.targetFolder = Json::ensureString(projObj, "Path", "mods"); - } - out.resolved = true; + failed &= (!out.parseFromBytes(bytes)); } catch (const JSONValidationError &e) { - auto & out = m_toProcess.files[index]; + qCritical() << "Resolving of" << out.projectId << out.fileId << "failed because of a parsing error:"; qCritical() << e.cause(); qCritical() << "JSON:"; diff --git a/api/logic/modplatform/flame/PackManifest.cpp b/api/logic/modplatform/flame/PackManifest.cpp index 0f57c9bc..1db0a161 100644 --- a/api/logic/modplatform/flame/PackManifest.cpp +++ b/api/logic/modplatform/flame/PackManifest.cpp @@ -64,3 +64,63 @@ void Flame::loadManifest(Flame::Manifest & m, const QString &filepath) } loadManifestV1(m, obj); } + +bool Flame::File::parseFromBytes(const QByteArray& bytes) +{ + auto doc = Json::requireDocument(bytes); + auto obj = Json::requireObject(doc); + // result code signifies true failure. + if(obj.contains("code")) + { + qCritical() << "Resolving of" << projectId << fileId << "failed because of a negative result:"; + qCritical() << bytes; + return false; + } + fileName = Json::requireString(obj, "FileNameOnDisk"); + QString rawUrl = Json::requireString(obj, "DownloadURL"); + url = QUrl(rawUrl, QUrl::TolerantMode); + if(!url.isValid()) + { + throw JSONValidationError(QString("Invalid URL: %1").arg(rawUrl)); + } + // This is a piece of a Flame project JSON pulled out into the file metadata (here) for convenience + // It is also optional + QJsonObject projObj = Json::ensureObject(obj, "_Project", {}); + if(!projObj.isEmpty()) + { + QString strType = Json::ensureString(projObj, "PackageType", "mod").toLower(); + if(strType == "singlefile") + { + type = File::Type::SingleFile; + } + else if(strType == "ctoc") + { + type = File::Type::Ctoc; + } + else if(strType == "cmod2") + { + type = File::Type::Cmod2; + } + else if(strType == "mod") + { + type = File::Type::Mod; + } + else if(strType == "folder") + { + type = File::Type::Folder; + } + else if(strType == "modpack") + { + type = File::Type::Modpack; + } + else + { + qCritical() << "Resolving of" << projectId << fileId << "failed because of unknown file type:" << strType; + type = File::Type::Unknown; + return false; + } + targetFolder = Json::ensureString(projObj, "Path", "mods"); + } + resolved = true; + return true; +} diff --git a/api/logic/modplatform/flame/PackManifest.h b/api/logic/modplatform/flame/PackManifest.h index 34232eee..02f39f0e 100644 --- a/api/logic/modplatform/flame/PackManifest.h +++ b/api/logic/modplatform/flame/PackManifest.h @@ -8,6 +8,9 @@ namespace Flame { struct File { + // NOTE: throws JSONValidationError + bool parseFromBytes(const QByteArray &bytes); + int projectId = 0; int fileId = 0; // NOTE: the opposite to 'optional'. This is at the time of writing unused. diff --git a/api/logic/modplatform/flame/UrlResolvingTask.cpp b/api/logic/modplatform/flame/UrlResolvingTask.cpp index 068b6a34..9d53e7e5 100644 --- a/api/logic/modplatform/flame/UrlResolvingTask.cpp +++ b/api/logic/modplatform/flame/UrlResolvingTask.cpp @@ -1,11 +1,11 @@ #include "UrlResolvingTask.h" #include <QtXml> +#include <Json.h> + -/* namespace { -const char * metabase = "https://cursemeta.dries007.net"; + const char * metabase = "https://cursemeta.dries007.net"; } -*/ Flame::UrlResolvingTask::UrlResolvingTask(const QString& toProcess) : m_url(toProcess) @@ -14,11 +14,16 @@ Flame::UrlResolvingTask::UrlResolvingTask(const QString& toProcess) void Flame::UrlResolvingTask::executeTask() { + resolveUrl(); +} + +void Flame::UrlResolvingTask::resolveUrl() +{ setStatus(tr("Resolving URL...")); setProgress(0, 1); m_dljob.reset(new NetJob("URL resolver")); - weAreDigging = false; + bool weAreDigging = false; needle = QString(); if(m_url.startsWith("https://")) { @@ -48,17 +53,12 @@ void Flame::UrlResolvingTask::executeTask() } auto dl = Net::Download::makeByteArray(QUrl(m_url), &results); m_dljob->addNetAction(dl); - connect(m_dljob.get(), &NetJob::finished, this, &Flame::UrlResolvingTask::netJobFinished); - m_dljob->start(); -} - -void Flame::UrlResolvingTask::netJobFinished() -{ if(weAreDigging) { - processHTML(); + connect(m_dljob.get(), &NetJob::finished, this, &Flame::UrlResolvingTask::processHTML); } else { - processCCIP(); + connect(m_dljob.get(), &NetJob::finished, this, &Flame::UrlResolvingTask::processCCIP); } + m_dljob->start(); } void Flame::UrlResolvingTask::processHTML() @@ -83,7 +83,7 @@ void Flame::UrlResolvingTask::processHTML() qDebug() << "Found needle: " << found; // twitch://www.curseforge.com/minecraft/modpacks/ftb-sky-odyssey/download-client/2697088 m_url = found; - executeTask(); + resolveUrl(); return; } emitFailed(tr("Couldn't find the end of the needle in the haystack...")); @@ -135,6 +135,36 @@ void Flame::UrlResolvingTask::processCCIP() return; } qDebug() << "Resolved" << m_url << "as" << m_result.projectId << "/" << m_result.fileId; - emitSucceeded(); + resolveIDs(); } +void Flame::UrlResolvingTask::resolveIDs() +{ + setStatus(tr("Resolving mod IDs...")); + m_dljob.reset(new NetJob("Mod id resolver")); + auto projectIdStr = QString::number(m_result.projectId); + auto fileIdStr = QString::number(m_result.fileId); + QString metaurl = QString("%1/%2/%3.json").arg(metabase, projectIdStr, fileIdStr); + auto dl = Net::Download::makeByteArray(QUrl(metaurl), &results); + m_dljob->addNetAction(dl); + connect(m_dljob.get(), &NetJob::finished, this, &Flame::UrlResolvingTask::processCursemeta); + m_dljob->start(); +} + +void Flame::UrlResolvingTask::processCursemeta() +{ + try { + if(m_result.parseFromBytes(results)) { + emitSucceeded(); + qDebug() << results; + return; + } + } catch (const JSONValidationError &e) { + + qCritical() << "Resolving of" << m_result.projectId << m_result.fileId << "failed because of a parsing error:"; + qCritical() << e.cause(); + qCritical() << "JSON:"; + qCritical() << results; + } + emitFailed(tr("Failed to resolve the modpack file.")); +} diff --git a/api/logic/modplatform/flame/UrlResolvingTask.h b/api/logic/modplatform/flame/UrlResolvingTask.h index 72f3dce1..98b78f67 100644 --- a/api/logic/modplatform/flame/UrlResolvingTask.h +++ b/api/logic/modplatform/flame/UrlResolvingTask.h @@ -26,7 +26,11 @@ protected: protected slots: void processCCIP(); void processHTML(); - void netJobFinished(); + void processCursemeta(); + +private: + void resolveUrl(); + void resolveIDs(); private: /* data */ QString m_url; @@ -34,7 +38,6 @@ private: /* data */ Flame::File m_result; QByteArray results; NetJobPtr m_dljob; - bool weAreDigging = false; }; } diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index f8709cfd..10e1afc7 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -119,8 +119,8 @@ SET(MULTIMC_SOURCES pages/global/LanguagePage.h pages/global/MinecraftPage.cpp pages/global/MinecraftPage.h - pages/global/MultiMCPage.cpp - pages/global/MultiMCPage.h + pages/global/MultiMCSettingsPage.cpp + pages/global/MultiMCSettingsPage.h pages/global/ProxyPage.cpp pages/global/ProxyPage.h pages/global/PasteEEPage.cpp @@ -139,8 +139,8 @@ SET(MULTIMC_SOURCES pages/modplatform/TwitchPage.h pages/modplatform/TechnicPage.cpp pages/modplatform/TechnicPage.h - pages/modplatform/ImportPage.cpp - pages/modplatform/ImportPage.h + pages/modplatform/MultiMCPage.cpp + pages/modplatform/MultiMCPage.h # GUI - dialogs dialogs/AboutDialog.cpp @@ -245,7 +245,7 @@ SET(MULTIMC_UIS pages/global/ExternalToolsPage.ui pages/global/JavaPage.ui pages/global/MinecraftPage.ui - pages/global/MultiMCPage.ui + pages/global/MultiMCSettingsPage.ui pages/global/ProxyPage.ui pages/global/PasteEEPage.ui pages/global/PackagesPage.ui @@ -255,7 +255,7 @@ SET(MULTIMC_UIS pages/modplatform/FTBPage.ui pages/modplatform/TwitchPage.ui pages/modplatform/TechnicPage.ui - pages/modplatform/ImportPage.ui + pages/modplatform/MultiMCPage.ui # Dialogs dialogs/CopyInstanceDialog.ui diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 179839fe..d76bd0a7 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -3,7 +3,7 @@ #include "MainWindow.h" #include "InstanceWindow.h" #include "pages/BasePageProvider.h" -#include "pages/global/MultiMCPage.h" +#include "pages/global/MultiMCSettingsPage.h" #include "pages/global/MinecraftPage.h" #include "pages/global/JavaPage.h" #include "pages/global/LanguagePage.h" @@ -517,7 +517,7 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv) // Init page provider { m_globalSettingsProvider = std::make_shared<GenericPageProvider>(tr("Settings")); - m_globalSettingsProvider->addPage<MultiMCPage>(); + m_globalSettingsProvider->addPage<MultiMCSettingsPage>(); m_globalSettingsProvider->addPage<MinecraftPage>(); m_globalSettingsProvider->addPage<JavaPage>(); m_globalSettingsProvider->addPage<LanguagePage>(); diff --git a/application/dialogs/NewInstanceDialog.cpp b/application/dialogs/NewInstanceDialog.cpp index 402a3417..e850d728 100644 --- a/application/dialogs/NewInstanceDialog.cpp +++ b/application/dialogs/NewInstanceDialog.cpp @@ -36,7 +36,7 @@ #include <pages/modplatform/VanillaPage.h> #include <pages/modplatform/FTBPage.h> #include <pages/modplatform/TwitchPage.h> -#include <pages/modplatform/ImportPage.h> +#include <pages/modplatform/MultiMCPage.h> #include <pages/modplatform/TechnicPage.h> NewInstanceDialog::NewInstanceDialog(const QString & initialGroup, const QString & url, QWidget *parent) @@ -118,13 +118,13 @@ void NewInstanceDialog::accept() QList<BasePage *> NewInstanceDialog::getPages() { - importPage = new ImportPage(this); + importPage = new MultiMCPage(this); return { new VanillaPage(this), - new FTBPage(this), importPage, new TwitchPage(this), + new FTBPage(this), new TechnicPage(this) }; } diff --git a/application/dialogs/NewInstanceDialog.h b/application/dialogs/NewInstanceDialog.h index c86ab73f..afeab4d1 100644 --- a/application/dialogs/NewInstanceDialog.h +++ b/application/dialogs/NewInstanceDialog.h @@ -28,7 +28,7 @@ class NewInstanceDialog; class PageContainer; class QDialogButtonBox; -class ImportPage; +class MultiMCPage; class NewInstanceDialog : public QDialog, public BasePageProvider { @@ -66,7 +66,7 @@ private: QDialogButtonBox * m_buttons = nullptr; QString InstIconKey; - ImportPage *importPage = nullptr; + MultiMCPage *importPage = nullptr; std::unique_ptr<InstanceTask> creationTask; bool importIcon = false; diff --git a/application/pages/global/MultiMCPage.cpp b/application/pages/global/MultiMCSettingsPage.cpp index 9baaa55b..b5505127 100644 --- a/application/pages/global/MultiMCPage.cpp +++ b/application/pages/global/MultiMCSettingsPage.cpp @@ -13,8 +13,8 @@ * limitations under the License. */ -#include "MultiMCPage.h" -#include "ui_MultiMCPage.h" +#include "MultiMCSettingsPage.h" +#include "ui_MultiMCSettingsPage.h" #include <QFileDialog> #include <QMessageBox> @@ -38,7 +38,7 @@ enum InstSortMode Sort_LastLaunch }; -MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCPage) +MultiMCSettingsPage::MultiMCSettingsPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCSettingsPage) { ui->setupUi(this); auto origForeground = ui->fontPreview->palette().color(ui->fontPreview->foregroundRole()); @@ -56,7 +56,7 @@ MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCP if(BuildConfig.UPDATER_ENABLED) { QObject::connect(MMC->updateChecker().get(), &UpdateChecker::channelListLoaded, this, - &MultiMCPage::refreshUpdateChannelList); + &MultiMCSettingsPage::refreshUpdateChannelList); if (MMC->updateChecker()->hasChannels()) { @@ -81,18 +81,18 @@ MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCP connect(ui->languageBox, SIGNAL(currentIndexChanged(int)), SLOT(languageIndexChanged(int))); } -MultiMCPage::~MultiMCPage() +MultiMCSettingsPage::~MultiMCSettingsPage() { delete ui; } -bool MultiMCPage::apply() +bool MultiMCSettingsPage::apply() { applySettings(); return true; } -void MultiMCPage::on_instDirBrowseBtn_clicked() +void MultiMCSettingsPage::on_instDirBrowseBtn_clicked() { QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Instance Folder"), ui->instDirTextBox->text()); @@ -124,7 +124,7 @@ void MultiMCPage::on_instDirBrowseBtn_clicked() } } -void MultiMCPage::on_iconsDirBrowseBtn_clicked() +void MultiMCSettingsPage::on_iconsDirBrowseBtn_clicked() { QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Icons Folder"), ui->iconsDirTextBox->text()); @@ -135,7 +135,7 @@ void MultiMCPage::on_iconsDirBrowseBtn_clicked() ui->iconsDirTextBox->setText(cooked_dir); } } -void MultiMCPage::on_modsDirBrowseBtn_clicked() +void MultiMCSettingsPage::on_modsDirBrowseBtn_clicked() { QString raw_dir = QFileDialog::getExistingDirectory(this, tr("Mods Folder"), ui->modsDirTextBox->text()); @@ -147,7 +147,7 @@ void MultiMCPage::on_modsDirBrowseBtn_clicked() } } -void MultiMCPage::languageIndexChanged(int index) +void MultiMCSettingsPage::languageIndexChanged(int index) { auto languageCode = ui->languageBox->itemData(ui->languageBox->currentIndex()).toString(); if(languageCode.isEmpty()) @@ -160,7 +160,7 @@ void MultiMCPage::languageIndexChanged(int index) translations->updateLanguage(languageCode); } -void MultiMCPage::refreshUpdateChannelList() +void MultiMCSettingsPage::refreshUpdateChannelList() { // Stop listening for selection changes. It's going to change a lot while we update it and // we don't need to update the @@ -205,12 +205,12 @@ void MultiMCPage::refreshUpdateChannelList() ui->updateChannelComboBox->setEnabled(true); } -void MultiMCPage::updateChannelSelectionChanged(int index) +void MultiMCSettingsPage::updateChannelSelectionChanged(int index) { refreshUpdateChannelDesc(); } -void MultiMCPage::refreshUpdateChannelDesc() +void MultiMCSettingsPage::refreshUpdateChannelDesc() { // Get the channel list. QList<UpdateChecker::ChannelListEntry> channelList = MMC->updateChecker()->getChannelList(); @@ -232,7 +232,7 @@ void MultiMCPage::refreshUpdateChannelDesc() } } -void MultiMCPage::applySettings() +void MultiMCSettingsPage::applySettings() { auto s = MMC->settings(); @@ -329,7 +329,7 @@ void MultiMCPage::applySettings() s->set("Analytics", ui->analyticsCheck->isChecked()); } } -void MultiMCPage::loadSettings() +void MultiMCSettingsPage::loadSettings() { auto s = MMC->settings(); // Language @@ -437,7 +437,7 @@ void MultiMCPage::loadSettings() } } -void MultiMCPage::refreshFontPreview() +void MultiMCSettingsPage::refreshFontPreview() { int fontSize = ui->fontSizeBox->value(); QString fontFamily = ui->consoleFont->currentFont().family(); diff --git a/application/pages/global/MultiMCPage.h b/application/pages/global/MultiMCSettingsPage.h index 7e7f655d..7b508ad9 100644 --- a/application/pages/global/MultiMCPage.h +++ b/application/pages/global/MultiMCSettingsPage.h @@ -29,16 +29,16 @@ class SettingsObject; namespace Ui { -class MultiMCPage; +class MultiMCSettingsPage; } -class MultiMCPage : public QWidget, public BasePage +class MultiMCSettingsPage : public QWidget, public BasePage { Q_OBJECT public: - explicit MultiMCPage(QWidget *parent = 0); - ~MultiMCPage(); + explicit MultiMCSettingsPage(QWidget *parent = 0); + ~MultiMCSettingsPage(); QString displayName() const override { @@ -88,7 +88,7 @@ slots: void updateChannelSelectionChanged(int index); private: - Ui::MultiMCPage *ui; + Ui::MultiMCSettingsPage *ui; /*! * Stores the currently selected update channel. diff --git a/application/pages/global/MultiMCPage.ui b/application/pages/global/MultiMCSettingsPage.ui index 124401c3..5e02d0aa 100644 --- a/application/pages/global/MultiMCPage.ui +++ b/application/pages/global/MultiMCSettingsPage.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>MultiMCPage</class> - <widget class="QWidget" name="MultiMCPage"> + <class>MultiMCSettingsPage</class> + <widget class="QWidget" name="MultiMCSettingsPage"> <property name="geometry"> <rect> <x>0</x> diff --git a/application/pages/modplatform/ImportPage.cpp b/application/pages/modplatform/MultiMCPage.cpp index 3910dfda..c98596c2 100644 --- a/application/pages/modplatform/ImportPage.cpp +++ b/application/pages/modplatform/MultiMCPage.cpp @@ -1,5 +1,5 @@ -#include "ImportPage.h" -#include "ui_ImportPage.h" +#include "MultiMCPage.h" +#include "ui_MultiMCPage.h" #include "MultiMC.h" #include "dialogs/NewInstanceDialog.h" @@ -30,30 +30,30 @@ public: } }; -ImportPage::ImportPage(NewInstanceDialog* dialog, QWidget *parent) - : QWidget(parent), ui(new Ui::ImportPage), dialog(dialog) +MultiMCPage::MultiMCPage(NewInstanceDialog* dialog, QWidget *parent) + : QWidget(parent), ui(new Ui::MultiMCPage), dialog(dialog) { ui->setupUi(this); ui->modpackEdit->setValidator(new UrlValidator(ui->modpackEdit)); - connect(ui->modpackEdit, &QLineEdit::textChanged, this, &ImportPage::updateState); + connect(ui->modpackEdit, &QLineEdit::textChanged, this, &MultiMCPage::updateState); } -ImportPage::~ImportPage() +MultiMCPage::~MultiMCPage() { delete ui; } -bool ImportPage::shouldDisplay() const +bool MultiMCPage::shouldDisplay() const { return true; } -void ImportPage::openedImpl() +void MultiMCPage::openedImpl() { updateState(); } -void ImportPage::updateState() +void MultiMCPage::updateState() { if(!isOpened) { @@ -75,11 +75,6 @@ void ImportPage::updateState() } else { - if(input.endsWith("?client=y")) { - input.chop(9); - input.append("/file"); - url = QUrl::fromUserInput(input); - } // hook, line and sinker. QFileInfo fi(url.fileName()); dialog->setSuggestedPack(fi.completeBaseName(), new InstanceImportTask(url)); @@ -91,13 +86,13 @@ void ImportPage::updateState() } } -void ImportPage::setUrl(const QString& url) +void MultiMCPage::setUrl(const QString& url) { ui->modpackEdit->setText(url); updateState(); } -void ImportPage::on_modpackBtn_clicked() +void MultiMCPage::on_modpackBtn_clicked() { const QUrl url = QFileDialog::getOpenFileUrl(this, tr("Choose modpack"), modpackUrl(), tr("Zip (*.zip)")); if (url.isValid()) @@ -114,7 +109,7 @@ void ImportPage::on_modpackBtn_clicked() } -QUrl ImportPage::modpackUrl() const +QUrl MultiMCPage::modpackUrl() const { const QUrl url(ui->modpackEdit->text()); if (url.isValid() && !url.isRelative() && !url.host().isEmpty()) diff --git a/application/pages/modplatform/ImportPage.h b/application/pages/modplatform/MultiMCPage.h index 3afb0045..1d9b7744 100644 --- a/application/pages/modplatform/ImportPage.h +++ b/application/pages/modplatform/MultiMCPage.h @@ -23,33 +23,33 @@ namespace Ui { -class ImportPage; +class MultiMCPage; } class NewInstanceDialog; -class ImportPage : public QWidget, public BasePage +class MultiMCPage : public QWidget, public BasePage { Q_OBJECT public: - explicit ImportPage(NewInstanceDialog* dialog, QWidget *parent = 0); - virtual ~ImportPage(); + explicit MultiMCPage(NewInstanceDialog* dialog, QWidget *parent = 0); + virtual ~MultiMCPage(); virtual QString displayName() const override { - return tr("Import from zip"); + return tr("MultiMC"); } virtual QIcon icon() const override { - return MMC->getThemedIcon("viewfolder"); + return MMC->getThemedIcon("multimc"); } virtual QString id() const override { - return "import"; + return "multimc"; } virtual QString helpPage() const override { - return "Zip-import"; + return "MultiMC-packs"; } virtual bool shouldDisplay() const override; @@ -64,7 +64,7 @@ private: QUrl modpackUrl() const; private: - Ui::ImportPage *ui = nullptr; + Ui::MultiMCPage *ui = nullptr; NewInstanceDialog* dialog = nullptr; }; diff --git a/application/pages/modplatform/ImportPage.ui b/application/pages/modplatform/MultiMCPage.ui index eb63cbe9..dc329c4c 100644 --- a/application/pages/modplatform/ImportPage.ui +++ b/application/pages/modplatform/MultiMCPage.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>ImportPage</class> - <widget class="QWidget" name="ImportPage"> + <class>MultiMCPage</class> + <widget class="QWidget" name="MultiMCPage"> <property name="geometry"> <rect> <x>0</x> diff --git a/application/pages/modplatform/TwitchPage.cpp b/application/pages/modplatform/TwitchPage.cpp index 2f138b94..52d87fa4 100644 --- a/application/pages/modplatform/TwitchPage.cpp +++ b/application/pages/modplatform/TwitchPage.cpp @@ -3,6 +3,7 @@ #include "MultiMC.h" #include "dialogs/NewInstanceDialog.h" +#include <InstanceImportTask.h> TwitchPage::TwitchPage(NewInstanceDialog* dialog, QWidget *parent) : QWidget(parent), ui(new Ui::TwitchPage), dialog(dialog) @@ -42,6 +43,13 @@ void TwitchPage::checkDone() { auto result = m_modIdResolver->getResults(); auto formatted = QString("Project %1, File %2").arg(result.projectId).arg(result.fileId); - ui->twitchLabel->setText(formatted); + if(result.resolved && result.type == Flame::File::Type::Modpack) { + ui->twitchLabel->setText(formatted); + QFileInfo fi(result.fileName); + dialog->setSuggestedPack(fi.completeBaseName(), new InstanceImportTask(result.url)); + } else { + ui->twitchLabel->setPixmap(QPixmap(QString::fromUtf8(":/assets/deadglitch"))); + dialog->setSuggestedPack(); + } m_modIdResolver.reset(); } |