diff options
author | Taeyeon Mori <orochimarufan.x3@gmail.com> | 2014-04-16 16:19:12 +0200 |
---|---|---|
committer | Taeyeon Mori <orochimarufan.x3@gmail.com> | 2014-04-16 16:19:12 +0200 |
commit | 4674aad12500ddf94dc36cb2b479bbbd121ff088 (patch) | |
tree | 161a1ef586f49719d92bb8f0a22e84d9fc80935e /gui/dialogs | |
parent | bf1632e4ed09f3fdc140b25a67b82f2bedb66f76 (diff) | |
download | MultiMC-4674aad12500ddf94dc36cb2b479bbbd121ff088.tar MultiMC-4674aad12500ddf94dc36cb2b479bbbd121ff088.tar.gz MultiMC-4674aad12500ddf94dc36cb2b479bbbd121ff088.tar.lz MultiMC-4674aad12500ddf94dc36cb2b479bbbd121ff088.tar.xz MultiMC-4674aad12500ddf94dc36cb2b479bbbd121ff088.zip |
Create a new login dialog
Diffstat (limited to 'gui/dialogs')
-rw-r--r-- | gui/dialogs/AccountListDialog.cpp | 71 | ||||
-rw-r--r-- | gui/dialogs/LoginDialog.cpp | 152 | ||||
-rw-r--r-- | gui/dialogs/LoginDialog.h | 61 | ||||
-rw-r--r-- | gui/dialogs/LoginDialog.ui | 77 |
4 files changed, 318 insertions, 43 deletions
diff --git a/gui/dialogs/AccountListDialog.cpp b/gui/dialogs/AccountListDialog.cpp index a38035a6..688cffa8 100644 --- a/gui/dialogs/AccountListDialog.cpp +++ b/gui/dialogs/AccountListDialog.cpp @@ -26,6 +26,7 @@ #include <gui/dialogs/EditAccountDialog.h> #include <gui/dialogs/ProgressDialog.h> #include <gui/dialogs/AccountSelectDialog.h> +#include <gui/dialogs/LoginDialog.h> #include "CustomMessageBox.h" #include <logic/tasks/Task.h> #include <logic/auth/YggdrasilTask.h> @@ -45,10 +46,11 @@ AccountListDialog::AccountListDialog(QWidget *parent) // Expand the account column ui->listView->header()->setSectionResizeMode(1, QHeaderView::Stretch); - QItemSelectionModel* selectionModel = ui->listView->selectionModel(); + QItemSelectionModel *selectionModel = ui->listView->selectionModel(); - connect(selectionModel, &QItemSelectionModel::selectionChanged, - [this] (const QItemSelection& sel, const QItemSelection& dsel) { updateButtonStates(); }); + connect(selectionModel, &QItemSelectionModel::selectionChanged, + [this](const QItemSelection &sel, const QItemSelection &dsel) + { updateButtonStates(); }); connect(m_accounts.get(), SIGNAL(listChanged()), SLOT(listChanged())); connect(m_accounts.get(), SIGNAL(activeAccountChanged()), SLOT(listChanged())); @@ -68,7 +70,8 @@ void AccountListDialog::listChanged() void AccountListDialog::on_addAccountBtn_clicked() { - addAccount(tr("Please enter your Mojang or Minecraft account username and password to add your account.")); + addAccount(tr("Please enter your Mojang or Minecraft account username and password to add " + "your account.")); } void AccountListDialog::on_rmAccountBtn_clicked() @@ -87,7 +90,8 @@ void AccountListDialog::on_setDefaultBtn_clicked() if (selection.size() > 0) { QModelIndex selected = selection.first(); - MojangAccountPtr account = selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>(); + MojangAccountPtr account = + selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>(); m_accounts->setActiveAccount(account->username()); } } @@ -113,48 +117,29 @@ void AccountListDialog::updateButtonStates() ui->noDefaultBtn->setDown(m_accounts->activeAccount().get() == nullptr); } -void AccountListDialog::addAccount(const QString& errMsg) +void AccountListDialog::addAccount(const QString &errMsg) { - // TODO: We can use the login dialog for this for now, but we'll have to make something better for it eventually. - EditAccountDialog loginDialog(errMsg, this, EditAccountDialog::UsernameField | EditAccountDialog::PasswordField); - loginDialog.exec(); + // TODO: The login dialog isn't quite done yet + MojangAccountPtr account = LoginDialog::newAccount(this, errMsg); - if (loginDialog.result() == QDialog::Accepted) + if (account != nullptr) { - QString username(loginDialog.username()); - QString password(loginDialog.password()); - - MojangAccountPtr account = MojangAccount::createFromUsername(username); - ProgressDialog progDialog(this); - auto task = account->login(nullptr, password); - progDialog.exec(task.get()); - if(task->successful()) - { - m_accounts->addAccount(account); - if (m_accounts->count() == 1) - m_accounts->setActiveAccount(account->username()); - - // Grab associated player skins - auto job = new NetJob("Player skins: " + account->username()); - - for(AccountProfile profile : account->profiles()) - { - auto meta = MMC->metacache()->resolveEntry("skins", profile.name + ".png"); - auto action = CacheDownload::make( - QUrl("http://" + URLConstants::SKINS_BASE + profile.name + ".png"), - meta); - job->addNetAction(action); - meta->stale = true; - } - - job->start(); - } - else + m_accounts->addAccount(account); + if (m_accounts->count() == 1) + m_accounts->setActiveAccount(account->username()); + + // Grab associated player skins + auto job = new NetJob("Player skins: " + account->username()); + + for (AccountProfile profile : account->profiles()) { - auto reason = task->failReason(); - auto dlg = CustomMessageBox::selectable(this, tr("Login error."), reason, QMessageBox::Critical); - dlg->exec(); - delete dlg; + auto meta = MMC->metacache()->resolveEntry("skins", profile.name + ".png"); + auto action = CacheDownload::make( + QUrl("http://" + URLConstants::SKINS_BASE + profile.name + ".png"), meta); + job->addNetAction(action); + meta->stale = true; } + + job->start(); } } diff --git a/gui/dialogs/LoginDialog.cpp b/gui/dialogs/LoginDialog.cpp new file mode 100644 index 00000000..5344ead8 --- /dev/null +++ b/gui/dialogs/LoginDialog.cpp @@ -0,0 +1,152 @@ +/* Copyright 2014 MultiMC Contributors + * + * Authors: + * Taeyeon Mori <orochimarufan.x3@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 "LoginDialog.h" +#include "ui_LoginDialog.h" + +#include "logic/auth/YggdrasilTask.h" + +#include <QtWidgets/QPushButton> + +LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LoginDialog) +{ + ui->setupUi(this); + ui->progressBar->setVisible(false); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + + setAttribute(Qt::WA_ShowModal); + + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + +LoginDialog::~LoginDialog() +{ + delete ui; +} + +// Stage 1: User interaction +void LoginDialog::accept() +{ + setResult(Accepted); + loop.quit(); +} + +void LoginDialog::reject() +{ + setResult(Rejected); + loop.quit(); +} + +void LoginDialog::setUserInputsEnabled(bool enable) +{ + ui->userTextBox->setEnabled(enable); + ui->passTextBox->setEnabled(enable); + ui->buttonBox->setEnabled(enable); +} + +// Enable the OK button only when both textboxes contain something. +void LoginDialog::on_userTextBox_textEdited(QString newText) +{ + ui->buttonBox->button(QDialogButtonBox::Ok) + ->setEnabled(!newText.isEmpty() && !ui->passTextBox->text().isEmpty()); +} + +void LoginDialog::on_passTextBox_textEdited(QString newText) +{ + ui->buttonBox->button(QDialogButtonBox::Ok) + ->setEnabled(!newText.isEmpty() && !ui->userTextBox->text().isEmpty()); +} + +// Stage 2: Task interaction +void LoginDialog::onTaskFailed(QString failure) +{ + // Set message + ui->label->setText("<span style='color:red'>" + failure + "</span>"); + + // Return + setResult(Rejected); + loop.quit(); +} + +void LoginDialog::onTaskSucceeded() +{ + setResult(Accepted); + loop.quit(); +} + +void LoginDialog::onTaskStatus(QString status) +{ + ui->label->setText(status); +} + +void LoginDialog::onTaskProgress(qint64 current, qint64 total) +{ + ui->progressBar->setMaximum(total); + ui->progressBar->setValue(current); +} + +// Public interface +MojangAccountPtr LoginDialog::newAccount(QWidget *parent, QString msg) +{ + LoginDialog dlg(parent); + dlg.show(); + dlg.ui->label->setText(msg); + + while (1) + { + // Show dialog + dlg.loop.exec(); + + // Close if cancel was clicked + if (dlg.result() == Rejected) + return nullptr; + + // Read values + QString username(dlg.ui->userTextBox->text()); + QString password(dlg.ui->passTextBox->text()); + + // disable inputs + dlg.setUserInputsEnabled(false); + dlg.ui->progressBar->setVisible(true); + + // Start login process + MojangAccountPtr account = MojangAccount::createFromUsername(username); + auto task = account->login(nullptr, password); + + // show progess + connect(task.get(), &ProgressProvider::failed, &dlg, &LoginDialog::onTaskFailed); + connect(task.get(), &ProgressProvider::succeeded, &dlg, &LoginDialog::onTaskSucceeded); + connect(task.get(), &ProgressProvider::status, &dlg, &LoginDialog::onTaskStatus); + connect(task.get(), &ProgressProvider::progress, &dlg, &LoginDialog::onTaskProgress); + + // Start task + if (!task->isRunning()) + task->start(); + if (task->isRunning()) + dlg.loop.exec(); + + // Be done + if (dlg.result() == Accepted) + return account; + + // Otherwise, re-enable user inputs and begin anew + dlg.setUserInputsEnabled(true); + dlg.ui->progressBar->setVisible(false); + } +} diff --git a/gui/dialogs/LoginDialog.h b/gui/dialogs/LoginDialog.h new file mode 100644 index 00000000..e7dbf52b --- /dev/null +++ b/gui/dialogs/LoginDialog.h @@ -0,0 +1,61 @@ +/* Copyright 2014 MultiMC Contributors + * + * Authors: + * Taeyeon Mori <orochimarufan.x3@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 + +#include <QtWidgets/QDialog> +#include <QtCore/QEventLoop> + +#include "logic/auth/MojangAccount.h" + +namespace Ui +{ +class LoginDialog; +} + +class LoginDialog : public QDialog +{ + Q_OBJECT + +public: + ~LoginDialog(); + + static MojangAccountPtr newAccount(QWidget *parent, QString message); + +private: + explicit LoginDialog(QWidget *parent = 0); + + void setUserInputsEnabled(bool enable); + +protected +slots: + void accept(); + void reject(); + + void onTaskFailed(QString); + void onTaskSucceeded(); + void onTaskStatus(QString); + void onTaskProgress(qint64, qint64); + + void on_userTextBox_textEdited(QString); + void on_passTextBox_textEdited(QString); + +private: + Ui::LoginDialog *ui; + QEventLoop loop; +}; diff --git a/gui/dialogs/LoginDialog.ui b/gui/dialogs/LoginDialog.ui new file mode 100644 index 00000000..b24b1c0c --- /dev/null +++ b/gui/dialogs/LoginDialog.ui @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>LoginDialog</class> + <widget class="QDialog" name="LoginDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>162</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Add Account</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Message label placeholder.</string> + </property> + <property name="textFormat"> + <enum>Qt::RichText</enum> + </property> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="userTextBox"> + <property name="placeholderText"> + <string>Email / Username</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="passTextBox"> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + <property name="placeholderText"> + <string>Password</string> + </property> + </widget> + </item> + <item> + <widget class="QProgressBar" name="progressBar"> + <property name="value"> + <number>24</number> + </property> + <property name="textVisible"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> |