Merge pull request #605 from jamierocks/h-atl-improv
ATLauncher: Various work to improve the platform support
This commit is contained in:
commit
ac4497a1f2
@ -1,18 +1,37 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright 2020-2021 Jamie Mansfield <jmansfield@cadixdev.org>
|
* PolyMC - Minecraft Launcher
|
||||||
* Copyright 2021 Petr Mrazek <peterix@gmail.com>
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* you may not use this file except in compliance with the License.
|
* it under the terms of the GNU General Public License as published by
|
||||||
* You may obtain a copy of the License at
|
* 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
|
* You should have received a copy of the GNU General Public License
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
*
|
||||||
* See the License for the specific language governing permissions and
|
* This file incorporates work covered by the following copyright and
|
||||||
* limitations under the License.
|
* permission notice:
|
||||||
|
*
|
||||||
|
* Copyright 2020-2021 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
|
* Copyright 2021 Petr Mrazek <peterix@gmail.com>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ATLPackInstallTask.h"
|
#include "ATLPackInstallTask.h"
|
||||||
@ -39,6 +58,8 @@
|
|||||||
|
|
||||||
namespace ATLauncher {
|
namespace ATLauncher {
|
||||||
|
|
||||||
|
static Meta::VersionPtr getComponentVersion(const QString& uid, const QString& version);
|
||||||
|
|
||||||
PackInstallTask::PackInstallTask(UserInteractionSupport *support, QString pack, QString version)
|
PackInstallTask::PackInstallTask(UserInteractionSupport *support, QString pack, QString version)
|
||||||
{
|
{
|
||||||
m_support = support;
|
m_support = support;
|
||||||
@ -74,14 +95,13 @@ void PackInstallTask::onDownloadSucceeded()
|
|||||||
qDebug() << "PackInstallTask::onDownloadSucceeded: " << QThread::currentThreadId();
|
qDebug() << "PackInstallTask::onDownloadSucceeded: " << QThread::currentThreadId();
|
||||||
jobPtr.reset();
|
jobPtr.reset();
|
||||||
|
|
||||||
QJsonParseError parse_error;
|
QJsonParseError parse_error {};
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error);
|
QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error);
|
||||||
if(parse_error.error != QJsonParseError::NoError) {
|
if(parse_error.error != QJsonParseError::NoError) {
|
||||||
qWarning() << "Error while parsing JSON response from FTB at " << parse_error.offset << " reason: " << parse_error.errorString();
|
qWarning() << "Error while parsing JSON response from FTB at " << parse_error.offset << " reason: " << parse_error.errorString();
|
||||||
qWarning() << response;
|
qWarning() << response;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto obj = doc.object();
|
auto obj = doc.object();
|
||||||
|
|
||||||
ATLauncher::PackVersion version;
|
ATLauncher::PackVersion version;
|
||||||
@ -96,19 +116,15 @@ void PackInstallTask::onDownloadSucceeded()
|
|||||||
}
|
}
|
||||||
m_version = version;
|
m_version = version;
|
||||||
|
|
||||||
auto vlist = APPLICATION->metadataIndex()->get("net.minecraft");
|
// Display install message if one exists
|
||||||
if(!vlist)
|
if (!m_version.messages.install.isEmpty())
|
||||||
{
|
m_support->displayMessage(m_version.messages.install);
|
||||||
emitFailed(tr("Failed to get local metadata index for %1").arg("net.minecraft"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto ver = vlist->getVersion(m_version.minecraft);
|
auto ver = getComponentVersion("net.minecraft", m_version.minecraft);
|
||||||
if (!ver) {
|
if (!ver) {
|
||||||
emitFailed(tr("Failed to get local metadata index for '%1' v%2").arg("net.minecraft").arg(m_version.minecraft));
|
emitFailed(tr("Failed to get local metadata index for '%1' v%2").arg("net.minecraft", m_version.minecraft));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ver->load(Net::Mode::Online);
|
|
||||||
minecraftVersion = ver;
|
minecraftVersion = ver;
|
||||||
|
|
||||||
if(m_version.noConfigs) {
|
if(m_version.noConfigs) {
|
||||||
@ -305,7 +321,48 @@ bool PackInstallTask::createLibrariesComponent(QString instanceRoot, std::shared
|
|||||||
auto f = std::make_shared<VersionFile>();
|
auto f = std::make_shared<VersionFile>();
|
||||||
f->name = m_pack + " " + m_version_name + " (libraries)";
|
f->name = m_pack + " " + m_version_name + " (libraries)";
|
||||||
|
|
||||||
|
const static QMap<QString, QString> liteLoaderMap = {
|
||||||
|
{ "61179803bcd5fb7790789b790908663d", "1.12-SNAPSHOT" },
|
||||||
|
{ "1420785ecbfed5aff4a586c5c9dd97eb", "1.12.2-SNAPSHOT" },
|
||||||
|
{ "073f68e2fcb518b91fd0d99462441714", "1.6.2_03" },
|
||||||
|
{ "10a15b52fc59b1bfb9c05b56de1097d6", "1.6.2_02" },
|
||||||
|
{ "b52f90f08303edd3d4c374e268a5acf1", "1.6.2_04" },
|
||||||
|
{ "ea747e24e03e24b7cad5bc8a246e0319", "1.6.2_01" },
|
||||||
|
{ "55785ccc82c07ff0ba038fe24be63ea2", "1.7.10_01" },
|
||||||
|
{ "63ada46e033d0cb6782bada09ad5ca4e", "1.7.10_04" },
|
||||||
|
{ "7983e4b28217c9ae8569074388409c86", "1.7.10_03" },
|
||||||
|
{ "c09882458d74fe0697c7681b8993097e", "1.7.10_02" },
|
||||||
|
{ "db7235aefd407ac1fde09a7baba50839", "1.7.10_00" },
|
||||||
|
{ "6e9028816027f53957bd8fcdfabae064", "1.8" },
|
||||||
|
{ "5e732dc446f9fe2abe5f9decaec40cde", "1.10-SNAPSHOT" },
|
||||||
|
{ "3a98b5ed95810bf164e71c1a53be568d", "1.11.2-SNAPSHOT" },
|
||||||
|
{ "ba8e6285966d7d988a96496f48cbddaa", "1.8.9-SNAPSHOT" },
|
||||||
|
{ "8524af3ac3325a82444cc75ae6e9112f", "1.11-SNAPSHOT" },
|
||||||
|
{ "53639d52340479ccf206a04f5e16606f", "1.5.2_01" },
|
||||||
|
{ "1fcdcf66ce0a0806b7ad8686afdce3f7", "1.6.4_00" },
|
||||||
|
{ "531c116f71ae2b11033f9a11a0f8e668", "1.6.4_01" },
|
||||||
|
{ "4009eeb99c9068f608d3483a6439af88", "1.7.2_03" },
|
||||||
|
{ "66f343354b8417abce1a10d557d2c6e9", "1.7.2_04" },
|
||||||
|
{ "ab554c21f28fbc4ae9b098bcb5f4cceb", "1.7.2_05" },
|
||||||
|
{ "e1d76a05a3723920e2f80a5e66c45f16", "1.7.2_02" },
|
||||||
|
{ "00318cb0c787934d523f63cdfe8ddde4", "1.9-SNAPSHOT" },
|
||||||
|
{ "986fd1ee9525cb0dcab7609401cef754", "1.9.4-SNAPSHOT" },
|
||||||
|
{ "571ad5e6edd5ff40259570c9be588bb5", "1.9.4" },
|
||||||
|
{ "1cdd72f7232e45551f16cc8ffd27ccf3", "1.10.2-SNAPSHOT" },
|
||||||
|
{ "8a7c21f32d77ee08b393dd3921ced8eb", "1.10.2" },
|
||||||
|
{ "b9bef8abc8dc309069aeba6fbbe58980", "1.12.1-SNAPSHOT" }
|
||||||
|
};
|
||||||
|
|
||||||
for(const auto & lib : m_version.libraries) {
|
for(const auto & lib : m_version.libraries) {
|
||||||
|
// If the library is LiteLoader, we need to ignore it and handle it separately.
|
||||||
|
if (liteLoaderMap.contains(lib.md5)) {
|
||||||
|
auto ver = getComponentVersion("com.mumfrey.liteloader", liteLoaderMap.value(lib.md5));
|
||||||
|
if (ver) {
|
||||||
|
componentsToInstall.insert("com.mumfrey.liteloader", ver);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto libName = detectLibrary(lib);
|
auto libName = detectLibrary(lib);
|
||||||
GradleSpecifier libSpecifier(libName);
|
GradleSpecifier libSpecifier(libName);
|
||||||
|
|
||||||
@ -502,7 +559,7 @@ void PackInstallTask::downloadMods()
|
|||||||
QVector<QString> selectedMods;
|
QVector<QString> selectedMods;
|
||||||
if (!optionalMods.isEmpty()) {
|
if (!optionalMods.isEmpty()) {
|
||||||
setStatus(tr("Selecting optional mods..."));
|
setStatus(tr("Selecting optional mods..."));
|
||||||
selectedMods = m_support->chooseOptionalMods(optionalMods);
|
selectedMods = m_support->chooseOptionalMods(m_version, optionalMods);
|
||||||
}
|
}
|
||||||
|
|
||||||
setStatus(tr("Downloading mods..."));
|
setStatus(tr("Downloading mods..."));
|
||||||
@ -574,19 +631,12 @@ void PackInstallTask::downloadMods()
|
|||||||
jobPtr->addNetAction(dl);
|
jobPtr->addNetAction(dl);
|
||||||
|
|
||||||
auto path = FS::PathCombine(m_stagingPath, "minecraft", relpath, mod.file);
|
auto path = FS::PathCombine(m_stagingPath, "minecraft", relpath, mod.file);
|
||||||
qDebug() << "Will download" << url << "to" << path;
|
|
||||||
modsToCopy[entry->getFullPath()] = path;
|
|
||||||
|
|
||||||
if(mod.type == ModType::Forge) {
|
if(mod.type == ModType::Forge) {
|
||||||
auto vlist = APPLICATION->metadataIndex()->get("net.minecraftforge");
|
auto ver = getComponentVersion("net.minecraftforge", mod.version);
|
||||||
if(vlist)
|
if (ver) {
|
||||||
{
|
componentsToInstall.insert("net.minecraftforge", ver);
|
||||||
auto ver = vlist->getVersion(mod.version);
|
continue;
|
||||||
if(ver) {
|
|
||||||
ver->load(Net::Mode::Online);
|
|
||||||
componentsToInstall.insert("net.minecraftforge", ver);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "Jarmod: " + path;
|
qDebug() << "Jarmod: " + path;
|
||||||
@ -597,6 +647,10 @@ void PackInstallTask::downloadMods()
|
|||||||
qDebug() << "Jarmod: " + path;
|
qDebug() << "Jarmod: " + path;
|
||||||
jarmods.push_back(path);
|
jarmods.push_back(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Download after Forge handling, to avoid downloading Forge twice.
|
||||||
|
qDebug() << "Will download" << url << "to" << path;
|
||||||
|
modsToCopy[entry->getFullPath()] = path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,4 +833,23 @@ void PackInstallTask::install()
|
|||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Meta::VersionPtr getComponentVersion(const QString& uid, const QString& version)
|
||||||
|
{
|
||||||
|
auto vlist = APPLICATION->metadataIndex()->get(uid);
|
||||||
|
if (!vlist)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (!vlist->isLoaded())
|
||||||
|
vlist->load(Net::Mode::Online);
|
||||||
|
|
||||||
|
auto ver = vlist->getVersion(version);
|
||||||
|
if (!ver)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (!ver->isLoaded())
|
||||||
|
ver->load(Net::Mode::Online);
|
||||||
|
|
||||||
|
return ver;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,37 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright 2020-2021 Jamie Mansfield <jmansfield@cadixdev.org>
|
* PolyMC - Minecraft Launcher
|
||||||
* Copyright 2021 Petr Mrazek <peterix@gmail.com>
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* you may not use this file except in compliance with the License.
|
* it under the terms of the GNU General Public License as published by
|
||||||
* You may obtain a copy of the License at
|
* 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
|
* You should have received a copy of the GNU General Public License
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
*
|
||||||
* See the License for the specific language governing permissions and
|
* This file incorporates work covered by the following copyright and
|
||||||
* limitations under the License.
|
* permission notice:
|
||||||
|
*
|
||||||
|
* Copyright 2020-2021 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
|
* Copyright 2021 Petr Mrazek <peterix@gmail.com>
|
||||||
|
*
|
||||||
|
* 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
|
#pragma once
|
||||||
@ -37,7 +56,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Requests a user interaction to select which optional mods should be installed.
|
* Requests a user interaction to select which optional mods should be installed.
|
||||||
*/
|
*/
|
||||||
virtual QVector<QString> chooseOptionalMods(QVector<ATLauncher::VersionMod> mods) = 0;
|
virtual QVector<QString> chooseOptionalMods(PackVersion version, QVector<ATLauncher::VersionMod> mods) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests a user interaction to select a component version from a given version list
|
* Requests a user interaction to select a component version from a given version list
|
||||||
@ -45,6 +64,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) = 0;
|
virtual QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests a user interaction to display a message.
|
||||||
|
*/
|
||||||
|
virtual void displayMessage(QString message) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PackInstallTask : public InstanceTask
|
class PackInstallTask : public InstanceTask
|
||||||
|
@ -1,18 +1,37 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright 2020-2021 Jamie Mansfield <jmansfield@cadixdev.org>
|
* PolyMC - Minecraft Launcher
|
||||||
* Copyright 2021 Petr Mrazek <peterix@gmail.com>
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* you may not use this file except in compliance with the License.
|
* it under the terms of the GNU General Public License as published by
|
||||||
* You may obtain a copy of the License at
|
* 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
|
* You should have received a copy of the GNU General Public License
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
*
|
||||||
* See the License for the specific language governing permissions and
|
* This file incorporates work covered by the following copyright and
|
||||||
* limitations under the License.
|
* permission notice:
|
||||||
|
*
|
||||||
|
* Copyright 2020-2021 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
|
* Copyright 2021 Petr Mrazek <peterix@gmail.com>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ATLPackManifest.h"
|
#include "ATLPackManifest.h"
|
||||||
@ -178,6 +197,8 @@ static void loadVersionMod(ATLauncher::VersionMod & p, QJsonObject & obj) {
|
|||||||
p.depends.append(Json::requireString(depends));
|
p.depends.append(Json::requireString(depends));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
p.colour = Json::ensureString(obj, QString("colour"), "");
|
||||||
|
p.warning = Json::ensureString(obj, QString("warning"), "");
|
||||||
|
|
||||||
p.client = Json::ensureBoolean(obj, QString("client"), false);
|
p.client = Json::ensureBoolean(obj, QString("client"), false);
|
||||||
|
|
||||||
@ -185,6 +206,12 @@ static void loadVersionMod(ATLauncher::VersionMod & p, QJsonObject & obj) {
|
|||||||
p.effectively_hidden = p.hidden || p.library;
|
p.effectively_hidden = p.hidden || p.library;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void loadVersionMessages(ATLauncher::VersionMessages& m, QJsonObject& obj)
|
||||||
|
{
|
||||||
|
m.install = Json::ensureString(obj, "install", "");
|
||||||
|
m.update = Json::ensureString(obj, "update", "");
|
||||||
|
}
|
||||||
|
|
||||||
void ATLauncher::loadVersion(PackVersion & v, QJsonObject & obj)
|
void ATLauncher::loadVersion(PackVersion & v, QJsonObject & obj)
|
||||||
{
|
{
|
||||||
v.version = Json::requireString(obj, "version");
|
v.version = Json::requireString(obj, "version");
|
||||||
@ -232,4 +259,17 @@ void ATLauncher::loadVersion(PackVersion & v, QJsonObject & obj)
|
|||||||
auto configsObj = Json::requireObject(obj, "configs");
|
auto configsObj = Json::requireObject(obj, "configs");
|
||||||
loadVersionConfigs(v.configs, configsObj);
|
loadVersionConfigs(v.configs, configsObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto colourObj = Json::ensureObject(obj, "colours");
|
||||||
|
for (const auto &key : colourObj.keys()) {
|
||||||
|
v.colours[key] = Json::requireString(colourObj.value(key), "colour");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto warningsObj = Json::ensureObject(obj, "warnings");
|
||||||
|
for (const auto &key : warningsObj.keys()) {
|
||||||
|
v.warnings[key] = Json::requireString(warningsObj.value(key), "warning");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto messages = Json::ensureObject(obj, "messages");
|
||||||
|
loadVersionMessages(v.messages, messages);
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,44 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright 2020 Jamie Mansfield <jmansfield@cadixdev.org>
|
* PolyMC - Minecraft Launcher
|
||||||
|
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* you may not use this file except in compliance with the License.
|
* it under the terms of the GNU General Public License as published by
|
||||||
* You may obtain a copy of the License at
|
* 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
|
* You should have received a copy of the GNU General Public License
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
*
|
||||||
* See the License for the specific language governing permissions and
|
* This file incorporates work covered by the following copyright and
|
||||||
* limitations under the License.
|
* permission notice:
|
||||||
|
*
|
||||||
|
* Copyright 2020 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
|
||||||
|
*
|
||||||
|
* 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
|
#pragma once
|
||||||
|
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QMap>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QJsonObject>
|
|
||||||
|
|
||||||
namespace ATLauncher
|
namespace ATLauncher
|
||||||
{
|
{
|
||||||
@ -109,6 +129,8 @@ struct VersionMod
|
|||||||
bool library;
|
bool library;
|
||||||
QString group;
|
QString group;
|
||||||
QVector<QString> depends;
|
QVector<QString> depends;
|
||||||
|
QString colour;
|
||||||
|
QString warning;
|
||||||
|
|
||||||
bool client;
|
bool client;
|
||||||
|
|
||||||
@ -122,6 +144,12 @@ struct VersionConfigs
|
|||||||
QString sha1;
|
QString sha1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct VersionMessages
|
||||||
|
{
|
||||||
|
QString install;
|
||||||
|
QString update;
|
||||||
|
};
|
||||||
|
|
||||||
struct PackVersion
|
struct PackVersion
|
||||||
{
|
{
|
||||||
QString version;
|
QString version;
|
||||||
@ -134,6 +162,10 @@ struct PackVersion
|
|||||||
QVector<VersionLibrary> libraries;
|
QVector<VersionLibrary> libraries;
|
||||||
QVector<VersionMod> mods;
|
QVector<VersionMod> mods;
|
||||||
VersionConfigs configs;
|
VersionConfigs configs;
|
||||||
|
|
||||||
|
QMap<QString, QString> colours;
|
||||||
|
QMap<QString, QString> warnings;
|
||||||
|
VersionMessages messages;
|
||||||
};
|
};
|
||||||
|
|
||||||
void loadVersion(PackVersion & v, QJsonObject & obj);
|
void loadVersion(PackVersion & v, QJsonObject & obj);
|
||||||
|
@ -43,8 +43,11 @@
|
|||||||
#include "modplatform/atlauncher/ATLShareCode.h"
|
#include "modplatform/atlauncher/ATLShareCode.h"
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
AtlOptionalModListModel::AtlOptionalModListModel(QWidget *parent, QVector<ATLauncher::VersionMod> mods)
|
AtlOptionalModListModel::AtlOptionalModListModel(QWidget* parent, ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods)
|
||||||
: QAbstractListModel(parent), m_mods(mods) {
|
: QAbstractListModel(parent)
|
||||||
|
, m_version(version)
|
||||||
|
, m_mods(mods)
|
||||||
|
{
|
||||||
// fill mod index
|
// fill mod index
|
||||||
for (int i = 0; i < m_mods.size(); i++) {
|
for (int i = 0; i < m_mods.size(); i++) {
|
||||||
auto mod = m_mods.at(i);
|
auto mod = m_mods.at(i);
|
||||||
@ -97,6 +100,11 @@ QVariant AtlOptionalModListModel::data(const QModelIndex &index, int role) const
|
|||||||
return mod.description;
|
return mod.description;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (role == Qt::ForegroundRole) {
|
||||||
|
if (!mod.colour.isEmpty() && m_version.colours.contains(mod.colour)) {
|
||||||
|
return QColor(QString("#%1").arg(m_version.colours[mod.colour]));
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (role == Qt::CheckStateRole) {
|
else if (role == Qt::CheckStateRole) {
|
||||||
if (index.column() == EnabledColumn) {
|
if (index.column() == EnabledColumn) {
|
||||||
return m_selection[mod.name] ? Qt::Checked : Qt::Unchecked;
|
return m_selection[mod.name] ? Qt::Checked : Qt::Unchecked;
|
||||||
@ -223,7 +231,21 @@ void AtlOptionalModListModel::clearAll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AtlOptionalModListModel::toggleMod(ATLauncher::VersionMod mod, int index) {
|
void AtlOptionalModListModel::toggleMod(ATLauncher::VersionMod mod, int index) {
|
||||||
setMod(mod, index, !m_selection[mod.name]);
|
auto enable = !m_selection[mod.name];
|
||||||
|
|
||||||
|
// If there is a warning for the mod, display that first (if we would be enabling the mod)
|
||||||
|
if (enable && !mod.warning.isEmpty() && m_version.warnings.contains(mod.warning)) {
|
||||||
|
auto message = QString("%1<br><br>%2")
|
||||||
|
.arg(m_version.warnings[mod.warning], tr("Are you sure that you want to enable this mod?"));
|
||||||
|
|
||||||
|
// fixme: avoid casting here
|
||||||
|
auto result = QMessageBox::warning((QWidget*) this->parent(), tr("Warning"), message, QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if (result != QMessageBox::Yes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setMod(mod, index, enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtlOptionalModListModel::setMod(ATLauncher::VersionMod mod, int index, bool enable, bool shouldEmit) {
|
void AtlOptionalModListModel::setMod(ATLauncher::VersionMod mod, int index, bool enable, bool shouldEmit) {
|
||||||
@ -287,12 +309,13 @@ void AtlOptionalModListModel::setMod(ATLauncher::VersionMod mod, int index, bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AtlOptionalModDialog::AtlOptionalModDialog(QWidget* parent, ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods)
|
||||||
AtlOptionalModDialog::AtlOptionalModDialog(QWidget *parent, QVector<ATLauncher::VersionMod> mods)
|
: QDialog(parent)
|
||||||
: QDialog(parent), ui(new Ui::AtlOptionalModDialog) {
|
, ui(new Ui::AtlOptionalModDialog)
|
||||||
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
listModel = new AtlOptionalModListModel(this, mods);
|
listModel = new AtlOptionalModListModel(this, version, mods);
|
||||||
ui->treeView->setModel(listModel);
|
ui->treeView->setModel(listModel);
|
||||||
|
|
||||||
ui->treeView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
ui->treeView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
@ -56,7 +56,7 @@ public:
|
|||||||
DescriptionColumn,
|
DescriptionColumn,
|
||||||
};
|
};
|
||||||
|
|
||||||
AtlOptionalModListModel(QWidget *parent, QVector<ATLauncher::VersionMod> mods);
|
AtlOptionalModListModel(QWidget *parent, ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods);
|
||||||
|
|
||||||
QVector<QString> getResult();
|
QVector<QString> getResult();
|
||||||
|
|
||||||
@ -86,7 +86,9 @@ private:
|
|||||||
NetJob::Ptr m_jobPtr;
|
NetJob::Ptr m_jobPtr;
|
||||||
QByteArray m_response;
|
QByteArray m_response;
|
||||||
|
|
||||||
|
ATLauncher::PackVersion m_version;
|
||||||
QVector<ATLauncher::VersionMod> m_mods;
|
QVector<ATLauncher::VersionMod> m_mods;
|
||||||
|
|
||||||
QMap<QString, bool> m_selection;
|
QMap<QString, bool> m_selection;
|
||||||
QMap<QString, int> m_index;
|
QMap<QString, int> m_index;
|
||||||
QMap<QString, QVector<QString>> m_dependants;
|
QMap<QString, QVector<QString>> m_dependants;
|
||||||
@ -96,7 +98,7 @@ class AtlOptionalModDialog : public QDialog {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AtlOptionalModDialog(QWidget *parent, QVector<ATLauncher::VersionMod> mods);
|
AtlOptionalModDialog(QWidget *parent, ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods);
|
||||||
~AtlOptionalModDialog() override;
|
~AtlOptionalModDialog() override;
|
||||||
|
|
||||||
QVector<QString> getResult() {
|
QVector<QString> getResult() {
|
||||||
|
@ -45,8 +45,12 @@
|
|||||||
|
|
||||||
#include <BuildConfig.h>
|
#include <BuildConfig.h>
|
||||||
|
|
||||||
AtlPage::AtlPage(NewInstanceDialog* dialog, QWidget *parent)
|
#include <QMessageBox>
|
||||||
: QWidget(parent), ui(new Ui::AtlPage), dialog(dialog)
|
|
||||||
|
AtlPage::AtlPage(NewInstanceDialog* dialog, QWidget* parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, ui(new Ui::AtlPage)
|
||||||
|
, dialog(dialog)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
@ -169,8 +173,9 @@ void AtlPage::onVersionSelectionChanged(QString data)
|
|||||||
suggestCurrent();
|
suggestCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<QString> AtlPage::chooseOptionalMods(QVector<ATLauncher::VersionMod> mods) {
|
QVector<QString> AtlPage::chooseOptionalMods(ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods)
|
||||||
AtlOptionalModDialog optionalModDialog(this, mods);
|
{
|
||||||
|
AtlOptionalModDialog optionalModDialog(this, version, mods);
|
||||||
optionalModDialog.exec();
|
optionalModDialog.exec();
|
||||||
return optionalModDialog.getResult();
|
return optionalModDialog.getResult();
|
||||||
}
|
}
|
||||||
@ -210,3 +215,8 @@ QString AtlPage::chooseVersion(Meta::VersionListPtr vlist, QString minecraftVers
|
|||||||
vselect.exec();
|
vselect.exec();
|
||||||
return vselect.selectedVersion()->descriptor();
|
return vselect.selectedVersion()->descriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AtlPage::displayMessage(QString message)
|
||||||
|
{
|
||||||
|
QMessageBox::information(this, tr("Installing"), message);
|
||||||
|
}
|
||||||
|
@ -84,7 +84,8 @@ private:
|
|||||||
void suggestCurrent();
|
void suggestCurrent();
|
||||||
|
|
||||||
QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) override;
|
QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) override;
|
||||||
QVector<QString> chooseOptionalMods(QVector<ATLauncher::VersionMod> mods) override;
|
QVector<QString> chooseOptionalMods(ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods) override;
|
||||||
|
void displayMessage(QString message) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void triggerSearch();
|
void triggerSearch();
|
||||||
|
Loading…
Reference in New Issue
Block a user