From 23397a4b10f84db17c484d57a4bbebac47c9880c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 28 Apr 2014 08:55:03 -0700 Subject: [PATCH] Add LoginDialog --- interface/resources/images/hifi-logo.png | Bin 0 -> 5408 bytes interface/resources/images/login.svg | 18 + interface/src/ui/LoginDialog.cpp | 98 ++++++ interface/src/ui/LoginDialog.h | 43 +++ interface/ui/loginDialog.ui | 410 +++++++++++++++++++++++ 5 files changed, 569 insertions(+) create mode 100644 interface/resources/images/hifi-logo.png create mode 100644 interface/resources/images/login.svg create mode 100644 interface/src/ui/LoginDialog.cpp create mode 100644 interface/src/ui/LoginDialog.h create mode 100644 interface/ui/loginDialog.ui diff --git a/interface/resources/images/hifi-logo.png b/interface/resources/images/hifi-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dde423ff8be878a2418b179b62dbb3d21f354bfa GIT binary patch literal 5408 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 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp new file mode 100644 index 0000000000..67c99ad53d --- /dev/null +++ b/interface/src/ui/LoginDialog.cpp @@ -0,0 +1,98 @@ +// +// LoginDialog.cpp +// interface/src/ui +// +// Created by Ryan Huffman on 4/23/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +#include +#include +#include + +#include "Application.h" +#include "Menu.h" +#include "AccountManager.h" +#include "ui_loginDialog.h" + +#include "LoginDialog.h" + +const QString FORGOT_PASSWORD_URL = "http://highfidelity.io"; + +LoginDialog::LoginDialog(QWidget* parent) : + FramelessDialog(parent, 0, FramelessDialog::POSITION_TOP), + _ui(new Ui::LoginDialog) { + + _ui->setupUi(this); + _ui->errorLabel->hide(); + _ui->emailLineEdit->setFocus(); + _ui->logoLabel->setPixmap(QPixmap(Application::resourcesPath() + "images/hifi-logo.png")); + _ui->loginButton->setIcon(QIcon(Application::resourcesPath() + "images/login.svg")); + _ui->infoLabel->setVisible(false); + _ui->errorLabel->setVisible(false); + + setModal(true); + setHideOnBlur(false); + + connect(&AccountManager::getInstance(), &AccountManager::loginComplete, + this, &LoginDialog::handleLoginCompleted); + connect(&AccountManager::getInstance(), &AccountManager::loginFailed, + this, &LoginDialog::handleLoginFailed); + connect(_ui->loginButton, &QPushButton::clicked, + this, &LoginDialog::handleLoginClicked); + connect(_ui->closeButton, &QPushButton::clicked, + this, &LoginDialog::close); + connect(_ui->forgotPasswordButton, &QPushButton::clicked, + this, &LoginDialog::handleForgotPasswordClicked); +}; + +LoginDialog::~LoginDialog() { + delete _ui; +}; + +void LoginDialog::handleLoginCompleted(const QUrl& authURL) { + _ui->infoLabel->setVisible(false); + _ui->errorLabel->setVisible(false); + close(); +}; + +void LoginDialog::handleLoginFailed() { + _ui->errorLabel->setText("Login Failure: Invalid username or password"); + + _ui->infoLabel->setVisible(false); + _ui->errorLabel->setVisible(true); + + _ui->errorLabel->show(); + _ui->loginAreaContainer->setDisabled(false); + _ui->emailLineEdit->setFocus(); + _ui->emailLineEdit->setSelection(0, _ui->emailLineEdit->maxLength()); +}; + +void LoginDialog::handleLoginClicked() { + // If the email or password inputs are empty, move focus to them, otherwise attempt to login. + if (_ui->emailLineEdit->text().isEmpty()) { + _ui->emailLineEdit->setFocus(); + } else if (_ui->passwordLineEdit->text().isEmpty()) { + _ui->passwordLineEdit->setFocus(); + } else { + _ui->infoLabel->setText("Authenticating..."); + _ui->infoLabel->setVisible(true); + _ui->errorLabel->setVisible(false); + + _ui->loginAreaContainer->setDisabled(true); + AccountManager::getInstance().requestAccessToken(_ui->emailLineEdit->text(), _ui->passwordLineEdit->text()); + } +}; + +void LoginDialog::handleForgotPasswordClicked() { + Menu::getInstance()->openUrl(FORGOT_PASSWORD_URL); +}; + +void LoginDialog::moveEvent(QMoveEvent* event) { + // Modal dialogs seemed to get repositioned automatically. Combat this by moving the window if needed. + resizeAndPosition(); +}; diff --git a/interface/src/ui/LoginDialog.h b/interface/src/ui/LoginDialog.h new file mode 100644 index 0000000000..91634559ee --- /dev/null +++ b/interface/src/ui/LoginDialog.h @@ -0,0 +1,43 @@ +// +// LoginDialog.h +// interface/src/ui +// +// Created by Ryan Huffman on 4/23/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_LoginDialog_h +#define hifi_LoginDialog_h + +#include +#include "FramelessDialog.h" + +namespace Ui { + class LoginDialog; +} + +class LoginDialog : public FramelessDialog { + Q_OBJECT + +public: + LoginDialog(QWidget* parent); + ~LoginDialog(); + +public slots: + void handleLoginClicked(); + void handleForgotPasswordClicked(); + void handleLoginCompleted(const QUrl& authURL); + void handleLoginFailed(); + +protected: + void moveEvent(QMoveEvent* event); + +private: + Ui::LoginDialog* _ui; + +}; + +#endif // hifi_LoginDialog_h diff --git a/interface/ui/loginDialog.ui b/interface/ui/loginDialog.ui new file mode 100644 index 0000000000..2764815c1e --- /dev/null +++ b/interface/ui/loginDialog.ui @@ -0,0 +1,410 @@ + + + LoginDialog + + + + 0 + 0 + 1159 + 130 + + + + + 0 + 130 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 5 + + + 0 + + + 6 + + + 10 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 18 + + + + Message + + + + + + + true + + + + 18 + + + + color: red + + + Error + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 16 + 16 + + + + SplitHCursor + + + + + + + + + + ../resources/images/close.svg../resources/images/close.svg + + + true + + + + + + + + + + true + + + + 0 + 0 + + + + + 0 + 102 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 30 + + + + + + 0 + 0 + + + + + 931 + 60 + + + + QLineEdit { + padding: 10px; +border-width: 1px; border-style: solid; border-radius: 3px; border-color: #aaa; +} + + + + 12 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + ../resources/images/hifi-logo.png + + + + + + + + 0 + 0 + + + + + 300 + 54 + + + + + 20 + + + + + + + + + + Username or Email + + + + + + + + 0 + 0 + + + + + 300 + 54 + + + + + 20 + + + + + + + + + + QLineEdit::Password + + + Password + + + + + + + + 0 + 0 + + + + + 141 + 54 + + + + + 20 + + + + PointingHandCursor + + + +background: #0e7077; +color: #fff; +border-radius: 4px; + + + Login + + + + ../resources/images/login.svg../resources/images/login.svg + + + + 32 + 32 + + + + true + + + true + + + + + + + + 0 + 0 + + + + + 141 + 26 + + + + + 15 + + + + PointingHandCursor + + + color: #0e7077; +background: rgba(0, 0, 0, 0); +border-radius: 4px; + + + Recover Password? + + + false + + + true + + + + + + + + + + + + + +