@ -63,6 +63,6 @@ struct Modpack {
|
||||
QString recommended;
|
||||
QVector<QString> versions;
|
||||
};
|
||||
}
|
||||
} // namespace Technic
|
||||
|
||||
Q_DECLARE_METATYPE(Technic::Modpack)
|
||||
|
@ -41,18 +41,17 @@
|
||||
#include "ui/dialogs/NewInstanceDialog.h"
|
||||
|
||||
#include "BuildConfig.h"
|
||||
#include "Json.h"
|
||||
#include "TechnicModel.h"
|
||||
#include "modplatform/technic/SingleZipPackInstallTask.h"
|
||||
#include "modplatform/technic/SolderPackInstallTask.h"
|
||||
#include "Json.h"
|
||||
|
||||
#include "Application.h"
|
||||
#include "modplatform/technic/SolderPackManifest.h"
|
||||
|
||||
#include "net/ApiDownload.h"
|
||||
|
||||
TechnicPage::TechnicPage(NewInstanceDialog* dialog, QWidget *parent)
|
||||
: QWidget(parent), ui(new Ui::TechnicPage), dialog(dialog)
|
||||
TechnicPage::TechnicPage(NewInstanceDialog* dialog, QWidget* parent) : QWidget(parent), ui(new Ui::TechnicPage), dialog(dialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
connect(ui->searchButton, &QPushButton::clicked, this, &TechnicPage::triggerSearch);
|
||||
@ -98,7 +97,8 @@ void TechnicPage::openedImpl()
|
||||
triggerSearch();
|
||||
}
|
||||
|
||||
void TechnicPage::triggerSearch() {
|
||||
void TechnicPage::triggerSearch()
|
||||
{
|
||||
model->searchWithTerm(ui->searchEdit->text());
|
||||
}
|
||||
|
||||
@ -106,10 +106,8 @@ void TechnicPage::onSelectionChanged(QModelIndex first, [[maybe_unused]] QModelI
|
||||
{
|
||||
ui->versionSelectionBox->clear();
|
||||
|
||||
if(!first.isValid())
|
||||
{
|
||||
if(isOpened)
|
||||
{
|
||||
if (!first.isValid()) {
|
||||
if (isOpened) {
|
||||
dialog->setSuggestedPack();
|
||||
}
|
||||
return;
|
||||
@ -121,12 +119,10 @@ void TechnicPage::onSelectionChanged(QModelIndex first, [[maybe_unused]] QModelI
|
||||
|
||||
void TechnicPage::suggestCurrent()
|
||||
{
|
||||
if (!isOpened)
|
||||
{
|
||||
if (!isOpened) {
|
||||
return;
|
||||
}
|
||||
if (current.broken)
|
||||
{
|
||||
if (current.broken) {
|
||||
dialog->setSuggestedPack();
|
||||
return;
|
||||
}
|
||||
@ -142,50 +138,41 @@ void TechnicPage::suggestCurrent()
|
||||
|
||||
auto netJob = makeShared<NetJob>(QString("Technic::PackMeta(%1)").arg(current.name), APPLICATION->network());
|
||||
QString slug = current.slug;
|
||||
netJob->addNetAction(Net::ApiDownload::makeByteArray(QString("%1modpack/%2?build=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, slug, BuildConfig.TECHNIC_API_BUILD), response));
|
||||
QObject::connect(netJob.get(), &NetJob::succeeded, this, [this, slug]
|
||||
{
|
||||
netJob->addNetAction(Net::ApiDownload::makeByteArray(
|
||||
QString("%1modpack/%2?build=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, slug, BuildConfig.TECHNIC_API_BUILD), response));
|
||||
QObject::connect(netJob.get(), &NetJob::succeeded, this, [this, slug] {
|
||||
jobPtr.reset();
|
||||
|
||||
if (current.slug != slug)
|
||||
{
|
||||
if (current.slug != slug) {
|
||||
return;
|
||||
}
|
||||
|
||||
QJsonParseError parse_error {};
|
||||
QJsonParseError parse_error{};
|
||||
QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
|
||||
QJsonObject obj = doc.object();
|
||||
if(parse_error.error != QJsonParseError::NoError)
|
||||
{
|
||||
qWarning() << "Error while parsing JSON response from Technic at " << parse_error.offset << " reason: " << parse_error.errorString();
|
||||
if (parse_error.error != QJsonParseError::NoError) {
|
||||
qWarning() << "Error while parsing JSON response from Technic at " << parse_error.offset
|
||||
<< " reason: " << parse_error.errorString();
|
||||
qWarning() << *response;
|
||||
return;
|
||||
}
|
||||
if (!obj.contains("url"))
|
||||
{
|
||||
if (!obj.contains("url")) {
|
||||
qWarning() << "Json doesn't contain an url key";
|
||||
return;
|
||||
}
|
||||
QJsonValueRef url = obj["url"];
|
||||
if (url.isString())
|
||||
{
|
||||
if (url.isString()) {
|
||||
current.url = url.toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!obj.contains("solder"))
|
||||
{
|
||||
} else {
|
||||
if (!obj.contains("solder")) {
|
||||
qWarning() << "Json doesn't contain a valid url or solder key";
|
||||
return;
|
||||
}
|
||||
QJsonValueRef solderUrl = obj["solder"];
|
||||
if (solderUrl.isString())
|
||||
{
|
||||
if (solderUrl.isString()) {
|
||||
current.url = solderUrl.toString();
|
||||
current.isSolder = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
qWarning() << "Json doesn't contain a valid url or solder key";
|
||||
return;
|
||||
}
|
||||
@ -226,22 +213,21 @@ void TechnicPage::metadataLoaded()
|
||||
|
||||
// Strip trailing forward-slashes from Solder URL's
|
||||
if (current.isSolder) {
|
||||
while (current.url.endsWith('/')) current.url.chop(1);
|
||||
while (current.url.endsWith('/'))
|
||||
current.url.chop(1);
|
||||
}
|
||||
|
||||
// Display versions from Solder
|
||||
if (!current.isSolder) {
|
||||
// If the pack isn't a Solder pack, it only has the single version
|
||||
ui->versionSelectionBox->addItem(current.currentVersion);
|
||||
}
|
||||
else if (current.versionsLoaded) {
|
||||
} else if (current.versionsLoaded) {
|
||||
// reverse foreach, so that the newest versions are first
|
||||
for (auto i = current.versions.size(); i--;) {
|
||||
ui->versionSelectionBox->addItem(current.versions.at(i));
|
||||
}
|
||||
ui->versionSelectionBox->setCurrentText(current.recommended);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// For now, until the versions are pulled from the Solder instance, display the current
|
||||
// version so we can display something quicker
|
||||
ui->versionSelectionBox->addItem(current.currentVersion);
|
||||
@ -259,7 +245,8 @@ void TechnicPage::metadataLoaded()
|
||||
selectVersion();
|
||||
}
|
||||
|
||||
void TechnicPage::selectVersion() {
|
||||
void TechnicPage::selectVersion()
|
||||
{
|
||||
if (!isOpened) {
|
||||
return;
|
||||
}
|
||||
@ -268,17 +255,18 @@ void TechnicPage::selectVersion() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!current.isSolder)
|
||||
{
|
||||
dialog->setSuggestedPack(current.name, selectedVersion, new Technic::SingleZipPackInstallTask(current.url, current.minecraftVersion));
|
||||
}
|
||||
else
|
||||
{
|
||||
dialog->setSuggestedPack(current.name, selectedVersion, new Technic::SolderPackInstallTask(APPLICATION->network(), current.url, current.slug, selectedVersion, current.minecraftVersion));
|
||||
if (!current.isSolder) {
|
||||
dialog->setSuggestedPack(current.name, selectedVersion,
|
||||
new Technic::SingleZipPackInstallTask(current.url, current.minecraftVersion));
|
||||
} else {
|
||||
dialog->setSuggestedPack(current.name, selectedVersion,
|
||||
new Technic::SolderPackInstallTask(APPLICATION->network(), current.url, current.slug, selectedVersion,
|
||||
current.minecraftVersion));
|
||||
}
|
||||
}
|
||||
|
||||
void TechnicPage::onSolderLoaded() {
|
||||
void TechnicPage::onSolderLoaded()
|
||||
{
|
||||
jobPtr.reset();
|
||||
|
||||
auto fallback = [this]() {
|
||||
@ -318,7 +306,8 @@ void TechnicPage::onSolderLoaded() {
|
||||
metadataLoaded();
|
||||
}
|
||||
|
||||
void TechnicPage::onVersionSelectionChanged(QString version) {
|
||||
void TechnicPage::onVersionSelectionChanged(QString version)
|
||||
{
|
||||
if (version.isNull() || version.isEmpty()) {
|
||||
selectedVersion = "";
|
||||
return;
|
||||
|
@ -37,46 +37,32 @@
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
#include "ui/pages/BasePage.h"
|
||||
#include <Application.h>
|
||||
#include "TechnicData.h"
|
||||
#include "net/NetJob.h"
|
||||
#include "tasks/Task.h"
|
||||
#include "TechnicData.h"
|
||||
#include "ui/pages/BasePage.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
namespace Ui {
|
||||
class TechnicPage;
|
||||
}
|
||||
|
||||
class NewInstanceDialog;
|
||||
|
||||
namespace Technic {
|
||||
class ListModel;
|
||||
class ListModel;
|
||||
}
|
||||
|
||||
class TechnicPage : public QWidget, public BasePage
|
||||
{
|
||||
class TechnicPage : public QWidget, public BasePage {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit TechnicPage(NewInstanceDialog* dialog, QWidget *parent = 0);
|
||||
public:
|
||||
explicit TechnicPage(NewInstanceDialog* dialog, QWidget* parent = 0);
|
||||
virtual ~TechnicPage();
|
||||
virtual QString displayName() const override
|
||||
{
|
||||
return "Technic";
|
||||
}
|
||||
virtual QIcon icon() const override
|
||||
{
|
||||
return APPLICATION->getThemedIcon("technic");
|
||||
}
|
||||
virtual QString id() const override
|
||||
{
|
||||
return "technic";
|
||||
}
|
||||
virtual QString helpPage() const override
|
||||
{
|
||||
return "Technic-platform";
|
||||
}
|
||||
virtual QString displayName() const override { return "Technic"; }
|
||||
virtual QIcon icon() const override { return APPLICATION->getThemedIcon("technic"); }
|
||||
virtual QString id() const override { return "technic"; }
|
||||
virtual QString helpPage() const override { return "Technic-platform"; }
|
||||
virtual bool shouldDisplay() const override;
|
||||
void retranslate() override;
|
||||
|
||||
@ -84,19 +70,19 @@ public:
|
||||
|
||||
bool eventFilter(QObject* watched, QEvent* event) override;
|
||||
|
||||
private:
|
||||
private:
|
||||
void suggestCurrent();
|
||||
void metadataLoaded();
|
||||
void selectVersion();
|
||||
|
||||
private slots:
|
||||
private slots:
|
||||
void triggerSearch();
|
||||
void onSelectionChanged(QModelIndex first, QModelIndex second);
|
||||
void onSolderLoaded();
|
||||
void onVersionSelectionChanged(QString data);
|
||||
|
||||
private:
|
||||
Ui::TechnicPage *ui = nullptr;
|
||||
private:
|
||||
Ui::TechnicPage* ui = nullptr;
|
||||
NewInstanceDialog* dialog = nullptr;
|
||||
Technic::ListModel* model = nullptr;
|
||||
|
||||
|
Reference in New Issue
Block a user