aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/ui')
-rw-r--r--launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp144
-rw-r--r--launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h50
-rw-r--r--launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.ui16
3 files changed, 179 insertions, 31 deletions
diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
index ac3869dc..39ecf179 100644
--- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
+++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
@@ -1,30 +1,56 @@
+// SPDX-License-Identifier: GPL-3.0-only
/*
- * Copyright 2021 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");
- * 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 2021 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.
*/
#include "AtlOptionalModDialog.h"
#include "ui_AtlOptionalModDialog.h"
+#include <QInputDialog>
+#include <QMessageBox>
+#include "BuildConfig.h"
+#include "Json.h"
+#include "modplatform/atlauncher/ATLShareCode.h"
+#include "Application.h"
+
AtlOptionalModListModel::AtlOptionalModListModel(QWidget *parent, QVector<ATLauncher::VersionMod> mods)
: QAbstractListModel(parent), m_mods(mods) {
-
// fill mod index
for (int i = 0; i < m_mods.size(); i++) {
auto mod = m_mods.at(i);
m_index[mod.name] = i;
}
+
// set initial state
for (int i = 0; i < m_mods.size(); i++) {
auto mod = m_mods.at(i);
@@ -77,7 +103,7 @@ QVariant AtlOptionalModListModel::data(const QModelIndex &index, int role) const
}
}
- return QVariant();
+ return {};
}
bool AtlOptionalModListModel::setData(const QModelIndex &index, const QVariant &value, int role) {
@@ -104,7 +130,7 @@ QVariant AtlOptionalModListModel::headerData(int section, Qt::Orientation orient
}
}
- return QVariant();
+ return {};
}
Qt::ItemFlags AtlOptionalModListModel::flags(const QModelIndex &index) const {
@@ -115,6 +141,69 @@ Qt::ItemFlags AtlOptionalModListModel::flags(const QModelIndex &index) const {
return flags;
}
+void AtlOptionalModListModel::useShareCode(const QString& code) {
+ m_jobPtr.reset(new NetJob("Atl::Request", APPLICATION->network()));
+ auto url = QString(BuildConfig.ATL_API_BASE_URL + "share-codes/" + code);
+ m_jobPtr->addNetAction(Net::Download::makeByteArray(QUrl(url), &m_response));
+
+ connect(m_jobPtr.get(), &NetJob::succeeded,
+ this, &AtlOptionalModListModel::shareCodeSuccess);
+ connect(m_jobPtr.get(), &NetJob::failed,
+ this, &AtlOptionalModListModel::shareCodeFailure);
+
+ m_jobPtr->start();
+}
+
+void AtlOptionalModListModel::shareCodeSuccess() {
+ m_jobPtr.reset();
+
+ QJsonParseError parse_error {};
+ auto doc = QJsonDocument::fromJson(m_response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from ATL at " << parse_error.offset << " reason: " << parse_error.errorString();
+ qWarning() << m_response;
+ return;
+ }
+ auto obj = doc.object();
+
+ ATLauncher::ShareCodeResponse response;
+ try {
+ ATLauncher::loadShareCodeResponse(response, obj);
+ }
+ catch (const JSONValidationError& e) {
+ qDebug() << QString::fromUtf8(m_response);
+ qWarning() << "Error while reading response from ATLauncher: " << e.cause();
+ return;
+ }
+
+ if (response.error) {
+ // fixme: plumb in an error message
+ qWarning() << "ATLauncher API Response Error" << response.message;
+ return;
+ }
+
+ // FIXME: verify pack and version, error if not matching.
+
+ // Clear the current selection
+ for (const auto& mod : m_mods) {
+ m_selection[mod.name] = false;
+ }
+
+ // Make the selections, as per the share code.
+ for (const auto& mod : response.data.mods) {
+ m_selection[mod.name] = mod.selected;
+ }
+
+ emit dataChanged(AtlOptionalModListModel::index(0, EnabledColumn),
+ AtlOptionalModListModel::index(m_mods.size() - 1, EnabledColumn));
+}
+
+void AtlOptionalModListModel::shareCodeFailure(const QString& reason) {
+ m_jobPtr.reset();
+
+ // fixme: plumb in an error message
+}
+
void AtlOptionalModListModel::selectRecommended() {
for (const auto& mod : m_mods) {
m_selection[mod.name] = mod.recommended;
@@ -212,6 +301,8 @@ AtlOptionalModDialog::AtlOptionalModDialog(QWidget *parent, QVector<ATLauncher::
ui->treeView->header()->setSectionResizeMode(
AtlOptionalModListModel::DescriptionColumn, QHeaderView::Stretch);
+ connect(ui->shareCodeButton, &QPushButton::pressed,
+ this, &AtlOptionalModDialog::useShareCode);
connect(ui->selectRecommendedButton, &QPushButton::pressed,
listModel, &AtlOptionalModListModel::selectRecommended);
connect(ui->clearAllButton, &QPushButton::pressed,
@@ -223,3 +314,30 @@ AtlOptionalModDialog::AtlOptionalModDialog(QWidget *parent, QVector<ATLauncher::
AtlOptionalModDialog::~AtlOptionalModDialog() {
delete ui;
}
+
+void AtlOptionalModDialog::useShareCode() {
+ bool ok;
+ auto shareCode = QInputDialog::getText(
+ this,
+ tr("Select a share code"),
+ tr("Share code:"),
+ QLineEdit::Normal,
+ "",
+ &ok
+ );
+
+ if (!ok) {
+ // If the user cancels the dialog, we don't need to show any error dialogs.
+ return;
+ }
+
+ if (shareCode.isEmpty()) {
+ QMessageBox box;
+ box.setIcon(QMessageBox::Warning);
+ box.setText(tr("No share code specified!"));
+ box.exec();
+ return;
+ }
+
+ listModel->useShareCode(shareCode);
+}
diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h
index 9832014c..953b288e 100644
--- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h
+++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h
@@ -1,17 +1,36 @@
+// SPDX-License-Identifier: GPL-3.0-only
/*
- * Copyright 2021 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");
- * 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 2021 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
@@ -20,6 +39,7 @@
#include <QAbstractListModel>
#include "modplatform/atlauncher/ATLPackIndex.h"
+#include "net/NetJob.h"
namespace Ui {
class AtlOptionalModDialog;
@@ -49,7 +69,12 @@ public:
Qt::ItemFlags flags(const QModelIndex &index) const override;
+ void useShareCode(const QString& code);
+
public slots:
+ void shareCodeSuccess();
+ void shareCodeFailure(const QString& reason);
+
void selectRecommended();
void clearAll();
@@ -58,6 +83,9 @@ private:
void setMod(ATLauncher::VersionMod mod, int index, bool enable, bool shouldEmit = true);
private:
+ NetJob::Ptr m_jobPtr;
+ QByteArray m_response;
+
QVector<ATLauncher::VersionMod> m_mods;
QMap<QString, bool> m_selection;
QMap<QString, int> m_index;
@@ -75,6 +103,8 @@ public:
return listModel->getResult();
}
+ void useShareCode();
+
private:
Ui::AtlOptionalModDialog *ui;
diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.ui b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.ui
index 4c5c2ec5..d9496142 100644
--- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.ui
+++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.ui
@@ -24,23 +24,23 @@
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QPushButton" name="selectRecommendedButton">
- <property name="text">
- <string>Select Recommended</string>
- </property>
- </widget>
- </item>
<item row="1" column="0">
<widget class="QPushButton" name="shareCodeButton">
<property name="enabled">
- <bool>false</bool>
+ <bool>true</bool>
</property>
<property name="text">
<string>Use Share Code</string>
</property>
</widget>
</item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="selectRecommendedButton">
+ <property name="text">
+ <string>Select Recommended</string>
+ </property>
+ </widget>
+ </item>
<item row="1" column="2">
<widget class="QPushButton" name="clearAllButton">
<property name="text">