Technic: Display available versions for Solder packs
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
// SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
/*
 | 
			
		||||
 *  PolyMC - Minecraft Launcher
 | 
			
		||||
 *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *  Copyright (c) 2021-2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -45,12 +45,16 @@
 | 
			
		||||
 | 
			
		||||
Technic::SolderPackInstallTask::SolderPackInstallTask(
 | 
			
		||||
    shared_qobject_ptr<QNetworkAccessManager> network,
 | 
			
		||||
    const QUrl &sourceUrl,
 | 
			
		||||
    const QUrl &solderUrl,
 | 
			
		||||
    const QString &pack,
 | 
			
		||||
    const QString &version,
 | 
			
		||||
    const QString &minecraftVersion
 | 
			
		||||
) {
 | 
			
		||||
    m_sourceUrl = sourceUrl;
 | 
			
		||||
    m_minecraftVersion = minecraftVersion;
 | 
			
		||||
    m_solderUrl = solderUrl;
 | 
			
		||||
    m_pack = pack;
 | 
			
		||||
    m_version = version;
 | 
			
		||||
    m_network = network;
 | 
			
		||||
    m_minecraftVersion = minecraftVersion;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Technic::SolderPackInstallTask::abort() {
 | 
			
		||||
@@ -62,45 +66,13 @@ bool Technic::SolderPackInstallTask::abort() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Technic::SolderPackInstallTask::executeTask()
 | 
			
		||||
{
 | 
			
		||||
    setStatus(tr("Finding recommended version"));
 | 
			
		||||
 | 
			
		||||
    m_filesNetJob = new NetJob(tr("Finding recommended version"), m_network);
 | 
			
		||||
    m_filesNetJob->addNetAction(Net::Download::makeByteArray(m_sourceUrl, &m_response));
 | 
			
		||||
 | 
			
		||||
    auto job = m_filesNetJob.get();
 | 
			
		||||
    connect(job, &NetJob::succeeded, this, &Technic::SolderPackInstallTask::versionSucceeded);
 | 
			
		||||
    connect(job, &NetJob::failed, this, &Technic::SolderPackInstallTask::downloadFailed);
 | 
			
		||||
    m_filesNetJob->start();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Technic::SolderPackInstallTask::versionSucceeded()
 | 
			
		||||
{
 | 
			
		||||
    setStatus(tr("Resolving modpack files"));
 | 
			
		||||
 | 
			
		||||
    QJsonParseError parse_error {};
 | 
			
		||||
    QJsonDocument doc = QJsonDocument::fromJson(m_response, &parse_error);
 | 
			
		||||
    if (parse_error.error != QJsonParseError::NoError) {
 | 
			
		||||
        qWarning() << "Error while parsing JSON response from Solder at " << parse_error.offset << " reason: " << parse_error.errorString();
 | 
			
		||||
        qWarning() << m_response;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    auto obj = doc.object();
 | 
			
		||||
 | 
			
		||||
    TechnicSolder::Pack pack;
 | 
			
		||||
    try {
 | 
			
		||||
        TechnicSolder::loadPack(pack, obj);
 | 
			
		||||
    }
 | 
			
		||||
    catch (const JSONValidationError& e) {
 | 
			
		||||
        emitFailed(tr("Could not understand pack manifest:\n") + e.cause());
 | 
			
		||||
        m_filesNetJob.reset();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_sourceUrl = m_sourceUrl.toString() + '/' + pack.recommended;
 | 
			
		||||
 | 
			
		||||
    m_filesNetJob = new NetJob(tr("Resolving modpack files"), m_network);
 | 
			
		||||
    m_filesNetJob->addNetAction(Net::Download::makeByteArray(m_sourceUrl, &m_response));
 | 
			
		||||
    auto sourceUrl = QString("%1/modpack/%2/%3").arg(m_solderUrl.toString(), m_pack, m_version);
 | 
			
		||||
    m_filesNetJob->addNetAction(Net::Download::makeByteArray(sourceUrl, &m_response));
 | 
			
		||||
 | 
			
		||||
    auto job = m_filesNetJob.get();
 | 
			
		||||
    connect(job, &NetJob::succeeded, this, &Technic::SolderPackInstallTask::fileListSucceeded);
 | 
			
		||||
    connect(job, &NetJob::failed, this, &Technic::SolderPackInstallTask::downloadFailed);
 | 
			
		||||
@@ -136,8 +108,7 @@ void Technic::SolderPackInstallTask::fileListSucceeded()
 | 
			
		||||
    m_filesNetJob = new NetJob(tr("Downloading modpack"), m_network);
 | 
			
		||||
 | 
			
		||||
    int i = 0;
 | 
			
		||||
    for (const auto &mod : build.mods)
 | 
			
		||||
    {
 | 
			
		||||
    for (const auto &mod : build.mods) {
 | 
			
		||||
        auto path = FS::PathCombine(m_outputDir.path(), QString("%1").arg(i));
 | 
			
		||||
        m_filesNetJob->addNetAction(Net::Download::makeFile(mod.url, path));
 | 
			
		||||
        i++;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,36 @@
 | 
			
		||||
/* Copyright 2013-2021 MultiMC Contributors
 | 
			
		||||
// SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
/*
 | 
			
		||||
 *  PolyMC - Minecraft Launcher
 | 
			
		||||
 *  Copyright (c) 2021-2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *  This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
 *  the Free Software Foundation, version 3.
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *  This program is distributed in the hope that it will be useful,
 | 
			
		||||
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 *  GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * This file incorporates work covered by the following copyright and
 | 
			
		||||
 * permission notice:
 | 
			
		||||
 *
 | 
			
		||||
 *      Copyright 2013-2021 MultiMC Contributors
 | 
			
		||||
 *
 | 
			
		||||
 *      Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 *      you may not use this file except in compliance with the License.
 | 
			
		||||
 *      You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *          http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *      Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 *      distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 *      See the License for the specific language governing permissions and
 | 
			
		||||
 *      limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
@@ -27,7 +47,7 @@ namespace Technic
 | 
			
		||||
    {
 | 
			
		||||
        Q_OBJECT
 | 
			
		||||
    public:
 | 
			
		||||
        explicit SolderPackInstallTask(shared_qobject_ptr<QNetworkAccessManager> network, const QUrl &sourceUrl, const QString &minecraftVersion);
 | 
			
		||||
        explicit SolderPackInstallTask(shared_qobject_ptr<QNetworkAccessManager> network, const QUrl &solderUrl, const QString& pack, const QString& version, const QString &minecraftVersion);
 | 
			
		||||
 | 
			
		||||
        bool canAbort() const override { return true; }
 | 
			
		||||
        bool abort() override;
 | 
			
		||||
@@ -37,7 +57,6 @@ namespace Technic
 | 
			
		||||
        virtual void executeTask() override;
 | 
			
		||||
 | 
			
		||||
    private slots:
 | 
			
		||||
        void versionSucceeded();
 | 
			
		||||
        void fileListSucceeded();
 | 
			
		||||
        void downloadSucceeded();
 | 
			
		||||
        void downloadFailed(QString reason);
 | 
			
		||||
@@ -51,7 +70,9 @@ namespace Technic
 | 
			
		||||
        shared_qobject_ptr<QNetworkAccessManager> m_network;
 | 
			
		||||
 | 
			
		||||
        NetJob::Ptr m_filesNetJob;
 | 
			
		||||
        QUrl m_sourceUrl;
 | 
			
		||||
        QUrl m_solderUrl;
 | 
			
		||||
        QString m_pack;
 | 
			
		||||
        QString m_version;
 | 
			
		||||
        QString m_minecraftVersion;
 | 
			
		||||
        QByteArray m_response;
 | 
			
		||||
        QTemporaryDir m_outputDir;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,43 @@
 | 
			
		||||
/* Copyright 2020-2021 MultiMC Contributors
 | 
			
		||||
// SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
/*
 | 
			
		||||
 *  PolyMC - Minecraft Launcher
 | 
			
		||||
 *  Copyright (c) 2021-2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *  This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
 *  the Free Software Foundation, version 3.
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *  This program is distributed in the hope that it will be useful,
 | 
			
		||||
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 *  GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * This file incorporates work covered by the following copyright and
 | 
			
		||||
 * permission notice:
 | 
			
		||||
 *
 | 
			
		||||
 *      Copyright 2020-2021 MultiMC Contributors
 | 
			
		||||
 *
 | 
			
		||||
 *      Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 *      you may not use this file except in compliance with the License.
 | 
			
		||||
 *      You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *          http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *      Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 *      distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 *      See the License for the specific language governing permissions and
 | 
			
		||||
 *      limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <QList>
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <QVector>
 | 
			
		||||
 | 
			
		||||
namespace Technic {
 | 
			
		||||
struct Modpack {
 | 
			
		||||
@@ -37,6 +58,10 @@ struct Modpack {
 | 
			
		||||
    QString author;
 | 
			
		||||
    QString description;
 | 
			
		||||
    QString currentVersion;
 | 
			
		||||
 | 
			
		||||
    bool versionsLoaded = false;
 | 
			
		||||
    QString recommended;
 | 
			
		||||
    QVector<QString> versions;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
/*
 | 
			
		||||
 *  PolyMC - Minecraft Launcher
 | 
			
		||||
 *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *  Copyright (c) 2021-2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -46,6 +46,7 @@
 | 
			
		||||
#include "Json.h"
 | 
			
		||||
 | 
			
		||||
#include "Application.h"
 | 
			
		||||
#include "modplatform/technic/SolderPackManifest.h"
 | 
			
		||||
 | 
			
		||||
TechnicPage::TechnicPage(NewInstanceDialog* dialog, QWidget *parent)
 | 
			
		||||
    : QWidget(parent), ui(new Ui::TechnicPage), dialog(dialog)
 | 
			
		||||
@@ -55,7 +56,9 @@ TechnicPage::TechnicPage(NewInstanceDialog* dialog, QWidget *parent)
 | 
			
		||||
    ui->searchEdit->installEventFilter(this);
 | 
			
		||||
    model = new Technic::ListModel(this);
 | 
			
		||||
    ui->packView->setModel(model);
 | 
			
		||||
 | 
			
		||||
    connect(ui->packView->selectionModel(), &QItemSelectionModel::currentChanged, this, &TechnicPage::onSelectionChanged);
 | 
			
		||||
    connect(ui->versionSelectionBox, &QComboBox::currentTextChanged, this, &TechnicPage::onVersionSelectionChanged);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TechnicPage::eventFilter(QObject* watched, QEvent* event)
 | 
			
		||||
@@ -98,13 +101,14 @@ void TechnicPage::triggerSearch() {
 | 
			
		||||
 | 
			
		||||
void TechnicPage::onSelectionChanged(QModelIndex first, QModelIndex second)
 | 
			
		||||
{
 | 
			
		||||
    ui->versionSelectionBox->clear();
 | 
			
		||||
 | 
			
		||||
    if(!first.isValid())
 | 
			
		||||
    {
 | 
			
		||||
        if(isOpened)
 | 
			
		||||
        {
 | 
			
		||||
            dialog->setSuggestedPack();
 | 
			
		||||
        }
 | 
			
		||||
        //ui->frame->clear();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -137,17 +141,19 @@ void TechnicPage::suggestCurrent()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    NetJob *netJob = new NetJob(QString("Technic::PackMeta(%1)").arg(current.name), APPLICATION->network());
 | 
			
		||||
    std::shared_ptr<QByteArray> response = std::make_shared<QByteArray>();
 | 
			
		||||
    QString slug = current.slug;
 | 
			
		||||
    netJob->addNetAction(Net::Download::makeByteArray(QString("https://api.technicpack.net/modpack/%1?build=multimc").arg(slug), response.get()));
 | 
			
		||||
    QObject::connect(netJob, &NetJob::succeeded, this, [this, response, slug]
 | 
			
		||||
    netJob->addNetAction(Net::Download::makeByteArray(QString("https://api.technicpack.net/modpack/%1?build=multimc").arg(slug), &response));
 | 
			
		||||
    QObject::connect(netJob, &NetJob::succeeded, this, [this, slug]
 | 
			
		||||
    {
 | 
			
		||||
        jobPtr.reset();
 | 
			
		||||
 | 
			
		||||
        if (current.slug != slug)
 | 
			
		||||
        {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        QJsonParseError parse_error;
 | 
			
		||||
        QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
 | 
			
		||||
 | 
			
		||||
        QJsonParseError parse_error {};
 | 
			
		||||
        QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error);
 | 
			
		||||
        QJsonObject obj = doc.object();
 | 
			
		||||
        if(parse_error.error != QJsonParseError::NoError)
 | 
			
		||||
        {
 | 
			
		||||
@@ -191,9 +197,12 @@ void TechnicPage::suggestCurrent()
 | 
			
		||||
        current.description = Json::ensureString(obj, "description", QString(), "__placeholder__");
 | 
			
		||||
        current.currentVersion = Json::ensureString(obj, "version", QString(), "__placeholder__");
 | 
			
		||||
        current.metadataLoaded = true;
 | 
			
		||||
 | 
			
		||||
        metadataLoaded();
 | 
			
		||||
    });
 | 
			
		||||
    netJob->start();
 | 
			
		||||
 | 
			
		||||
    jobPtr = netJob;
 | 
			
		||||
    jobPtr->start();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// expects current.metadataLoaded to be true
 | 
			
		||||
@@ -211,15 +220,111 @@ void TechnicPage::metadataLoaded()
 | 
			
		||||
        text += "<br>" + tr(" by ") + current.author.toHtmlEscaped();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ui->frame->setModText(text);
 | 
			
		||||
    ui->frame->setModDescription(current.description);
 | 
			
		||||
    text += "<br><br>";
 | 
			
		||||
 | 
			
		||||
    ui->packDescription->setHtml(text + current.description);
 | 
			
		||||
 | 
			
		||||
    // Strip trailing forward-slashes from Solder URL's
 | 
			
		||||
    if (current.isSolder) {
 | 
			
		||||
        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) {
 | 
			
		||||
        // 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 {
 | 
			
		||||
        // 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);
 | 
			
		||||
 | 
			
		||||
        auto* netJob = new NetJob(QString("Technic::SolderMeta(%1)").arg(current.name), APPLICATION->network());
 | 
			
		||||
        auto url = QString("%1/modpack/%2").arg(current.url, current.slug);
 | 
			
		||||
        netJob->addNetAction(Net::Download::makeByteArray(QUrl(url), &response));
 | 
			
		||||
 | 
			
		||||
        QObject::connect(netJob, &NetJob::succeeded, this, &TechnicPage::onSolderLoaded);
 | 
			
		||||
 | 
			
		||||
        jobPtr = netJob;
 | 
			
		||||
        jobPtr->start();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    selectVersion();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TechnicPage::selectVersion() {
 | 
			
		||||
    if (!isOpened) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (current.broken) {
 | 
			
		||||
        dialog->setSuggestedPack();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!current.isSolder)
 | 
			
		||||
    {
 | 
			
		||||
        dialog->setSuggestedPack(current.name + " " + current.currentVersion, new Technic::SingleZipPackInstallTask(current.url, current.minecraftVersion));
 | 
			
		||||
        dialog->setSuggestedPack(current.name + " " + selectedVersion, new Technic::SingleZipPackInstallTask(current.url, current.minecraftVersion));
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        while (current.url.endsWith('/')) current.url.chop(1);
 | 
			
		||||
        dialog->setSuggestedPack(current.name + " " + current.currentVersion, new Technic::SolderPackInstallTask(APPLICATION->network(), current.url + "/modpack/" + current.slug, current.minecraftVersion));
 | 
			
		||||
        dialog->setSuggestedPack(current.name + " " + selectedVersion, new Technic::SolderPackInstallTask(APPLICATION->network(), current.url, current.slug, selectedVersion, current.minecraftVersion));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TechnicPage::onSolderLoaded() {
 | 
			
		||||
    jobPtr.reset();
 | 
			
		||||
 | 
			
		||||
    auto fallback = [this]() {
 | 
			
		||||
        current.versionsLoaded = true;
 | 
			
		||||
 | 
			
		||||
        current.versions.clear();
 | 
			
		||||
        current.versions.append(current.currentVersion);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    current.versions.clear();
 | 
			
		||||
 | 
			
		||||
    QJsonParseError parse_error {};
 | 
			
		||||
    auto doc = QJsonDocument::fromJson(response, &parse_error);
 | 
			
		||||
    if (parse_error.error != QJsonParseError::NoError) {
 | 
			
		||||
        qWarning() << "Error while parsing JSON response from Solder at " << parse_error.offset << " reason: " << parse_error.errorString();
 | 
			
		||||
        qWarning() << response;
 | 
			
		||||
        fallback();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    auto obj = doc.object();
 | 
			
		||||
 | 
			
		||||
    TechnicSolder::Pack pack;
 | 
			
		||||
    try {
 | 
			
		||||
        TechnicSolder::loadPack(pack, obj);
 | 
			
		||||
    }
 | 
			
		||||
    catch (const JSONValidationError& err) {
 | 
			
		||||
        qCritical() << "Couldn't parse Solder pack metadata:" << err.cause();
 | 
			
		||||
        fallback();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    current.versionsLoaded = true;
 | 
			
		||||
    current.recommended = pack.recommended;
 | 
			
		||||
    current.versions.append(pack.builds);
 | 
			
		||||
 | 
			
		||||
    // Finally, let's reload :)
 | 
			
		||||
    ui->versionSelectionBox->clear();
 | 
			
		||||
    metadataLoaded();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TechnicPage::onVersionSelectionChanged(QString data) {
 | 
			
		||||
    if (data.isNull() || data.isEmpty()) {
 | 
			
		||||
        selectedVersion = "";
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    selectedVersion = data;
 | 
			
		||||
    selectVersion();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
/*
 | 
			
		||||
 *  PolyMC - Minecraft Launcher
 | 
			
		||||
 *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *  Copyright (c) 2021-2022 Jamie Mansfield <jmansfield@cadixdev.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -39,6 +39,7 @@
 | 
			
		||||
 | 
			
		||||
#include "ui/pages/BasePage.h"
 | 
			
		||||
#include <Application.h>
 | 
			
		||||
#include "net/NetJob.h"
 | 
			
		||||
#include "tasks/Task.h"
 | 
			
		||||
#include "TechnicData.h"
 | 
			
		||||
 | 
			
		||||
@@ -86,14 +87,22 @@ public:
 | 
			
		||||
private:
 | 
			
		||||
    void suggestCurrent();
 | 
			
		||||
    void metadataLoaded();
 | 
			
		||||
    void selectVersion();
 | 
			
		||||
 | 
			
		||||
private slots:
 | 
			
		||||
    void triggerSearch();
 | 
			
		||||
    void onSelectionChanged(QModelIndex first, QModelIndex second);
 | 
			
		||||
    void onSolderLoaded();
 | 
			
		||||
    void onVersionSelectionChanged(QString data);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Ui::TechnicPage *ui = nullptr;
 | 
			
		||||
    NewInstanceDialog* dialog = nullptr;
 | 
			
		||||
    Technic::ListModel* model = nullptr;
 | 
			
		||||
 | 
			
		||||
    Technic::Modpack current;
 | 
			
		||||
    QString selectedVersion;
 | 
			
		||||
 | 
			
		||||
    NetJob::Ptr jobPtr;
 | 
			
		||||
    QByteArray response;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -10,86 +10,76 @@
 | 
			
		||||
    <height>405</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
  <layout class="QVBoxLayout" name="verticalLayout">
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QWidget" name="widget" native="true">
 | 
			
		||||
     <layout class="QHBoxLayout" name="horizontalLayout">
 | 
			
		||||
      <property name="leftMargin">
 | 
			
		||||
       <number>0</number>
 | 
			
		||||
      </property>
 | 
			
		||||
      <property name="topMargin">
 | 
			
		||||
       <number>0</number>
 | 
			
		||||
      </property>
 | 
			
		||||
      <property name="rightMargin">
 | 
			
		||||
       <number>0</number>
 | 
			
		||||
      </property>
 | 
			
		||||
      <property name="bottomMargin">
 | 
			
		||||
       <number>0</number>
 | 
			
		||||
      </property>
 | 
			
		||||
      <item>
 | 
			
		||||
       <widget class="QLineEdit" name="searchEdit">
 | 
			
		||||
        <property name="placeholderText">
 | 
			
		||||
         <string>Search and filter...</string>
 | 
			
		||||
        </property>
 | 
			
		||||
       </widget>
 | 
			
		||||
      </item>
 | 
			
		||||
      <item>
 | 
			
		||||
       <widget class="QPushButton" name="searchButton">
 | 
			
		||||
        <property name="text">
 | 
			
		||||
         <string>Search</string>
 | 
			
		||||
        </property>
 | 
			
		||||
       </widget>
 | 
			
		||||
      </item>
 | 
			
		||||
     </layout>
 | 
			
		||||
    </widget>
 | 
			
		||||
  <layout class="QGridLayout" name="gridLayout">
 | 
			
		||||
   <item row="3" column="0" colspan="2">
 | 
			
		||||
    <layout class="QGridLayout" name="gridLayout_3">
 | 
			
		||||
     <item row="0" column="2">
 | 
			
		||||
      <widget class="QComboBox" name="versionSelectionBox"/>
 | 
			
		||||
     </item>
 | 
			
		||||
     <item row="0" column="1">
 | 
			
		||||
      <widget class="QLabel" name="label">
 | 
			
		||||
       <property name="text">
 | 
			
		||||
        <string>Version selected:</string>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="alignment">
 | 
			
		||||
        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
 | 
			
		||||
       </property>
 | 
			
		||||
      </widget>
 | 
			
		||||
     </item>
 | 
			
		||||
     <item row="0" column="0">
 | 
			
		||||
      <spacer name="horizontalSpacer">
 | 
			
		||||
       <property name="orientation">
 | 
			
		||||
        <enum>Qt::Horizontal</enum>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="sizeType">
 | 
			
		||||
        <enum>QSizePolicy::Preferred</enum>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="sizeHint" stdset="0">
 | 
			
		||||
        <size>
 | 
			
		||||
         <width>1</width>
 | 
			
		||||
         <height>1</height>
 | 
			
		||||
        </size>
 | 
			
		||||
       </property>
 | 
			
		||||
      </spacer>
 | 
			
		||||
     </item>
 | 
			
		||||
    </layout>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QListView" name="packView">
 | 
			
		||||
     <property name="horizontalScrollBarPolicy">
 | 
			
		||||
      <enum>Qt::ScrollBarAlwaysOff</enum>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="alternatingRowColors">
 | 
			
		||||
      <bool>true</bool>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="iconSize">
 | 
			
		||||
      <size>
 | 
			
		||||
       <width>48</width>
 | 
			
		||||
       <height>48</height>
 | 
			
		||||
      </size>
 | 
			
		||||
   <item row="2" column="0" colspan="2">
 | 
			
		||||
    <layout class="QGridLayout" name="gridLayout_2">
 | 
			
		||||
     <item row="0" column="0">
 | 
			
		||||
      <widget class="QListView" name="packView">
 | 
			
		||||
       <property name="alternatingRowColors">
 | 
			
		||||
        <bool>true</bool>
 | 
			
		||||
       </property>
 | 
			
		||||
       <property name="iconSize">
 | 
			
		||||
        <size>
 | 
			
		||||
         <width>48</width>
 | 
			
		||||
         <height>48</height>
 | 
			
		||||
        </size>
 | 
			
		||||
       </property>
 | 
			
		||||
      </widget>
 | 
			
		||||
     </item>
 | 
			
		||||
     <item row="0" column="1">
 | 
			
		||||
      <widget class="QTextBrowser" name="packDescription"/>
 | 
			
		||||
     </item>
 | 
			
		||||
    </layout>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="1" column="0">
 | 
			
		||||
    <widget class="QLineEdit" name="searchEdit">
 | 
			
		||||
     <property name="placeholderText">
 | 
			
		||||
      <string>Search and filter...</string>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="MCModInfoFrame" name="frame">
 | 
			
		||||
     <property name="sizePolicy">
 | 
			
		||||
      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
 | 
			
		||||
       <horstretch>0</horstretch>
 | 
			
		||||
       <verstretch>0</verstretch>
 | 
			
		||||
      </sizepolicy>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="frameShape">
 | 
			
		||||
      <enum>QFrame::StyledPanel</enum>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="frameShadow">
 | 
			
		||||
      <enum>QFrame::Raised</enum>
 | 
			
		||||
   <item row="1" column="1">
 | 
			
		||||
    <widget class="QPushButton" name="searchButton">
 | 
			
		||||
     <property name="text">
 | 
			
		||||
      <string>Search</string>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
  </layout>
 | 
			
		||||
 </widget>
 | 
			
		||||
 <customwidgets>
 | 
			
		||||
  <customwidget>
 | 
			
		||||
   <class>MCModInfoFrame</class>
 | 
			
		||||
   <extends>QFrame</extends>
 | 
			
		||||
   <header>ui/widgets/MCModInfoFrame.h</header>
 | 
			
		||||
   <container>1</container>
 | 
			
		||||
  </customwidget>
 | 
			
		||||
 </customwidgets>
 | 
			
		||||
 <tabstops>
 | 
			
		||||
  <tabstop>searchEdit</tabstop>
 | 
			
		||||
  <tabstop>searchButton</tabstop>
 | 
			
		||||
  <tabstop>packView</tabstop>
 | 
			
		||||
 </tabstops>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 <connections/>
 | 
			
		||||
</ui>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user