From fb323d8a0b1dce83fe23207e9fabbcadb35b84e9 Mon Sep 17 00:00:00 2001 From: Neptune Date: Tue, 5 Mar 2024 17:26:00 -0500 Subject: [PATCH] UltimMC: Make separate section for local accounts --- launcher/CMakeLists.txt | 3 + launcher/ui/dialogs/LocalLoginDialog.cpp | 106 +++++++++++++++++++ launcher/ui/dialogs/LocalLoginDialog.h | 58 ++++++++++ launcher/ui/dialogs/LocalLoginDialog.ui | 70 ++++++++++++ launcher/ui/dialogs/LoginDialog.cpp | 6 +- launcher/ui/pages/global/AccountListPage.cpp | 20 +++- launcher/ui/pages/global/AccountListPage.h | 1 + launcher/ui/pages/global/AccountListPage.ui | 8 +- 8 files changed, 267 insertions(+), 5 deletions(-) create mode 100644 launcher/ui/dialogs/LocalLoginDialog.cpp create mode 100644 launcher/ui/dialogs/LocalLoginDialog.h create mode 100644 launcher/ui/dialogs/LocalLoginDialog.ui diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index ebc2ad30c8..d6b8694279 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -782,6 +782,8 @@ SET(LAUNCHER_SOURCES ui/dialogs/LoginDialog.h ui/dialogs/MSALoginDialog.cpp ui/dialogs/MSALoginDialog.h + ui/dialogs/LocalLoginDialog.cpp + ui/dialogs/LocalLoginDialog.h ui/dialogs/NewComponentDialog.cpp ui/dialogs/NewComponentDialog.h ui/dialogs/NewInstanceDialog.cpp @@ -897,6 +899,7 @@ qt5_wrap_ui(LAUNCHER_UI ui/dialogs/IconPickerDialog.ui ui/dialogs/MSALoginDialog.ui ui/dialogs/AboutDialog.ui + ui/dialogs/LocalLoginDialog.ui ui/dialogs/LoginDialog.ui ui/dialogs/EditAccountDialog.ui ui/dialogs/CreateShortcutDialog.ui diff --git a/launcher/ui/dialogs/LocalLoginDialog.cpp b/launcher/ui/dialogs/LocalLoginDialog.cpp new file mode 100644 index 0000000000..230094bc53 --- /dev/null +++ b/launcher/ui/dialogs/LocalLoginDialog.cpp @@ -0,0 +1,106 @@ +#include "LocalLoginDialog.h" +#include "ui_LocalLoginDialog.h" + +#include "minecraft/auth/AuthProviders.h" +#include "minecraft/auth/AccountTask.h" + +#include + +LocalLoginDialog::LocalLoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LocalLoginDialog) +{ + ui->setupUi(this); + ui->progressBar->setVisible(false); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + +LocalLoginDialog::~LocalLoginDialog() +{ + delete ui; +} + +// Stage 1: User interaction +void LocalLoginDialog::accept() +{ + setUserInputsEnabled(false); + ui->progressBar->setVisible(true); + + m_account = MinecraftAccount::createFromUsername(ui->userTextBox->text()); + m_account->setProvider(AuthProviders::lookup("dummy")); + + // Setup the login task and start it + const char *dummy_password = " "; + m_loginTask = m_account->login(QString::fromLatin1(dummy_password)); + connect(m_loginTask.get(), &Task::failed, this, &LocalLoginDialog::onTaskFailed); + connect(m_loginTask.get(), &Task::succeeded, this, &LocalLoginDialog::onTaskSucceeded); + connect(m_loginTask.get(), &Task::status, this, &LocalLoginDialog::onTaskStatus); + connect(m_loginTask.get(), &Task::progress, this, &LocalLoginDialog::onTaskProgress); + if (!m_loginTask) + { + onTaskSucceeded(); + } else { + m_loginTask->start(); + } +} + +void LocalLoginDialog::setUserInputsEnabled(bool enable) +{ + ui->userTextBox->setEnabled(enable); + ui->buttonBox->setEnabled(enable); +} + +void LocalLoginDialog::on_userTextBox_textEdited(const QString &newText) +{ + ui->buttonBox->button(QDialogButtonBox::Ok) + ->setEnabled(!newText.isEmpty()); +} + +void LocalLoginDialog::onTaskFailed(const QString &reason) +{ + // Set message + auto lines = reason.split('\n'); + QString processed; + for(auto line: lines) { + if(line.size()) { + processed += "" + line + "
"; + } + else { + processed += "
"; + } + } + ui->label->setText(processed); + + // Re-enable user-interaction + setUserInputsEnabled(true); + ui->progressBar->setVisible(false); +} + +void LocalLoginDialog::onTaskSucceeded() +{ + QDialog::accept(); +} + +void LocalLoginDialog::onTaskStatus(const QString &status) +{ + ui->label->setText(status); +} + +void LocalLoginDialog::onTaskProgress(qint64 current, qint64 total) +{ + ui->progressBar->setMaximum(total); + ui->progressBar->setValue(current); +} + +// Public interface +MinecraftAccountPtr LocalLoginDialog::newAccount(QWidget *parent, QString msg) +{ + LocalLoginDialog dlg(parent); + dlg.ui->label->setText(msg); + if (dlg.exec() == QDialog::Accepted) + { + return dlg.m_account; + } + return 0; +} diff --git a/launcher/ui/dialogs/LocalLoginDialog.h b/launcher/ui/dialogs/LocalLoginDialog.h new file mode 100644 index 0000000000..9f08c28b77 --- /dev/null +++ b/launcher/ui/dialogs/LocalLoginDialog.h @@ -0,0 +1,58 @@ +/* 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 + +#include +#include + +#include "minecraft/auth/MinecraftAccount.h" +#include "tasks/Task.h" + +namespace Ui +{ +class LocalLoginDialog; +} + +class LocalLoginDialog : public QDialog +{ + Q_OBJECT + +public: + ~LocalLoginDialog(); + + static MinecraftAccountPtr newAccount(QWidget *parent, QString message); + +private: + explicit LocalLoginDialog(QWidget *parent = 0); + + void setUserInputsEnabled(bool enable); + +protected +slots: + void accept(); + + void onTaskFailed(const QString &reason); + void onTaskSucceeded(); + void onTaskStatus(const QString &status); + void onTaskProgress(qint64 current, qint64 total); + + void on_userTextBox_textEdited(const QString &newText); + +private: + Ui::LocalLoginDialog *ui; + MinecraftAccountPtr m_account; + Task::Ptr m_loginTask; +}; diff --git a/launcher/ui/dialogs/LocalLoginDialog.ui b/launcher/ui/dialogs/LocalLoginDialog.ui new file mode 100644 index 0000000000..54f8f273f1 --- /dev/null +++ b/launcher/ui/dialogs/LocalLoginDialog.ui @@ -0,0 +1,70 @@ + + + LocalLoginDialog + + + + 0 + 0 + 421 + 198 + + + + + 0 + 0 + + + + Add Local Account + + + + + + Message label placeholder. + + + Qt::RichText + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Username + + + + + + + 24 + + + false + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + diff --git a/launcher/ui/dialogs/LoginDialog.cpp b/launcher/ui/dialogs/LoginDialog.cpp index dcbd5bd97f..f403002c70 100644 --- a/launcher/ui/dialogs/LoginDialog.cpp +++ b/launcher/ui/dialogs/LoginDialog.cpp @@ -29,14 +29,14 @@ LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LoginDia for(auto provider: AuthProviders::getAll()) { auto providerId = provider->id(); - // Exclude Microsoft account from here... - if (providerId != "MSA") { + // Exclude Microsoft and Local accounts from here... + if (providerId != "MSA" && providerId != "dummy") { QRadioButton *button = new QRadioButton(provider->displayName()); m_radioButtons[providerId] = button; ui->radioLayout->addWidget(button); } } - m_radioButtons["dummy"]->setChecked(true); + m_radioButtons["elyby"]->setChecked(true); adjustSize(); connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); diff --git a/launcher/ui/pages/global/AccountListPage.cpp b/launcher/ui/pages/global/AccountListPage.cpp index 6dc6b39a0b..a389c302a3 100644 --- a/launcher/ui/pages/global/AccountListPage.cpp +++ b/launcher/ui/pages/global/AccountListPage.cpp @@ -26,6 +26,7 @@ #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/LoginDialog.h" #include "ui/dialogs/MSALoginDialog.h" +#include "ui/dialogs/LocalLoginDialog.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/SkinUploadDialog.h" @@ -45,7 +46,8 @@ AccountListPage::AccountListPage(QWidget *parent) ui->setupUi(this); ui->listView->setEmptyString(tr( "Welcome!\n" - "If you're new here, you can click the \"Add\" button to add your Mojang, local, or ElyBy account." + "If you're new here, you can click the \"Add Local\" button to add your local account.\n" + "Or click the \"Add Premium\" button to add your Ely.by or Mojang account." )); ui->listView->setEmptyMode(VersionListView::String); ui->listView->setContextMenuPolicy(Qt::CustomContextMenu); @@ -111,6 +113,22 @@ void AccountListPage::listChanged() updateButtonStates(); } +void AccountListPage::on_actionAddLocal_triggered() +{ + MinecraftAccountPtr account = LocalLoginDialog::newAccount( + this, + tr("Please enter your desired username to add your account.") + ); + + if (account) + { + m_accounts->addAccount(account); + if (m_accounts->count() == 1) { + m_accounts->setDefaultAccount(account); + } + } +} + void AccountListPage::on_actionAddMojang_triggered() { MinecraftAccountPtr account = LoginDialog::newAccount( diff --git a/launcher/ui/pages/global/AccountListPage.h b/launcher/ui/pages/global/AccountListPage.h index 1c65e70814..84b174953a 100644 --- a/launcher/ui/pages/global/AccountListPage.h +++ b/launcher/ui/pages/global/AccountListPage.h @@ -60,6 +60,7 @@ class AccountListPage : public QMainWindow, public BasePage } public slots: + void on_actionAddLocal_triggered(); void on_actionAddMojang_triggered(); void on_actionAddMicrosoft_triggered(); void on_actionRemove_triggered(); diff --git a/launcher/ui/pages/global/AccountListPage.ui b/launcher/ui/pages/global/AccountListPage.ui index 433d1a7d36..a955ddd31b 100644 --- a/launcher/ui/pages/global/AccountListPage.ui +++ b/launcher/ui/pages/global/AccountListPage.ui @@ -52,6 +52,7 @@ false + @@ -62,9 +63,14 @@ + + + Add Local + + - Add Account + Add Premium