a simple signup dialog copied from login dialog

This commit is contained in:
Stephen Birarda 2016-12-07 16:14:20 -08:00
parent bc9f2b4007
commit 801a384607
5 changed files with 353 additions and 1 deletions

View file

@ -0,0 +1,257 @@
//
// SignupDialog.qml
//
// Created by David Rowe on 7 Dec 2016
// Copyright 2015 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
//
import Hifi 1.0
import QtQuick 2.4
import "controls-uit"
import "styles-uit"
import "windows"
import "SignupDialog"
ModalWindow {
id: root
HifiConstants { id: hifi }
objectName: "SignupDialog"
implicitWidth: 520
implicitHeight: 320
destroyOnCloseButton: true
destroyOnHidden: true
visible: true
property string iconText: ""
property int iconSize: 50
property string title: ""
property int titleWidth: 0
keyboardOverride: true // Disable ModalWindow's keyboard.
SignupDialog {
id: signupDialog
Item {
id: signupBody
clip: true
width: root.pane.width
height: root.pane.height
function signup() {
mainTextContainer.visible = false
signupDialog.signup(usernameField.text, passwordField.text)
}
property bool keyboardEnabled: false
property bool keyboardRaised: false
property bool punctuationMode: false
onKeyboardRaisedChanged: d.resize();
QtObject {
id: d
readonly property int minWidth: 480
readonly property int maxWidth: 1280
readonly property int minHeight: 120
readonly property int maxHeight: 720
function resize() {
var targetWidth = Math.max(titleWidth, form.contentWidth);
var targetHeight = hifi.dimensions.contentSpacing.y + mainTextContainer.height +
4 * hifi.dimensions.contentSpacing.y + form.height +
hifi.dimensions.contentSpacing.y + buttons.height;
if (additionalInformation.visible) {
targetWidth = Math.max(targetWidth, additionalInformation.width);
targetHeight += hifi.dimensions.contentSpacing.y + additionalInformation.height
}
root.width = Math.max(d.minWidth, Math.min(d.maxWidth, targetWidth));
root.height = Math.max(d.minHeight, Math.min(d.maxHeight, targetHeight))
+ (keyboardEnabled && keyboardRaised ? (200 + 2 * hifi.dimensions.contentSpacing.y) : hifi.dimensions.contentSpacing.y);
}
}
ShortcutText {
id: mainTextContainer
anchors {
top: parent.top
left: parent.left
margins: 0
topMargin: hifi.dimensions.contentSpacing.y
}
visible: false
text: qsTr("Username or password incorrect.")
wrapMode: Text.WordWrap
color: hifi.colors.redAccent
lineHeight: 1
lineHeightMode: Text.ProportionalHeight
horizontalAlignment: Text.AlignHCenter
}
Column {
id: form
anchors {
top: mainTextContainer.bottom
left: parent.left
margins: 0
topMargin: 2 * hifi.dimensions.contentSpacing.y
}
spacing: 2 * hifi.dimensions.contentSpacing.y
Row {
spacing: hifi.dimensions.contentSpacing.x
TextField {
id: usernameField
anchors {
verticalCenter: parent.verticalCenter
}
width: 350
label: "User Name or Email"
}
}
Row {
spacing: hifi.dimensions.contentSpacing.x
TextField {
id: passwordField
anchors {
verticalCenter: parent.verticalCenter
}
width: 350
label: "Password"
echoMode: TextInput.Password
}
}
}
// Override ScrollingWindow's keyboard that would be at very bottom of dialog.
Keyboard {
raised: keyboardEnabled && keyboardRaised
numeric: punctuationMode
anchors {
left: parent.left
right: parent.right
bottom: buttons.top
bottomMargin: keyboardRaised ? 2 * hifi.dimensions.contentSpacing.y : 0
}
}
Row {
id: buttons
anchors {
right: parent.right
bottom: parent.bottom
bottomMargin: hifi.dimensions.contentSpacing.y
}
spacing: hifi.dimensions.contentSpacing.x
onHeightChanged: d.resize(); onWidthChanged: d.resize();
Button {
id: linkAccountButton
anchors.verticalCenter: parent.verticalCenter
width: 200
text: qsTr("Signup")
color: hifi.buttons.blue
onClicked: signupBody.signup()
}
Button {
anchors.verticalCenter: parent.verticalCenter
text: qsTr("Cancel")
onClicked: root.destroy()
}
}
Component.onCompleted: {
root.title = qsTr("Sign into High Fidelity")
root.iconText = "<"
keyboardEnabled = HMD.active;
d.resize();
usernameField.forceActiveFocus();
}
Connections {
target: signupDialog
onHandleSignupCompleted: {
console.log("Signup Succeeded")
bodyLoader.setSource("WelcomeBody.qml", { "welcomeBack" : true })
bodyLoader.item.width = root.pane.width
bodyLoader.item.height = root.pane.height
}
onHandleSignupFailed: {
console.log("Signup Failed")
mainTextContainer.visible = true
}
}
Keys.onPressed: {
if (!visible) {
return
}
switch (event.key) {
case Qt.Key_Enter:
case Qt.Key_Return:
event.accepted = true
signupBody.signup()
break
}
}
}
}
Keys.onPressed: {
if (!visible) {
return
}
if (event.modifiers === Qt.ControlModifier)
switch (event.key) {
case Qt.Key_A:
event.accepted = true
detailedText.selectAll()
break
case Qt.Key_C:
event.accepted = true
detailedText.copy()
break
case Qt.Key_Period:
if (Qt.platform.os === "osx") {
event.accepted = true
content.reject()
}
break
} else switch (event.key) {
case Qt.Key_Escape:
case Qt.Key_Back:
event.accepted = true
destroy()
break
case Qt.Key_Enter:
case Qt.Key_Return:
event.accepted = true
break
}
}
}

View file

@ -153,6 +153,7 @@
#include "ui/DialogsManager.h"
#include "ui/LoginDialog.h"
#include "ui/overlays/Cube3DOverlay.h"
#include "ui/SignupDialog.h"
#include "ui/Snapshot.h"
#include "ui/SnapshotAnimated.h"
#include "ui/StandAloneJSConsole.h"
@ -1751,6 +1752,7 @@ void Application::initializeUi() {
AddressBarDialog::registerType();
ErrorDialog::registerType();
LoginDialog::registerType();
SignupDialog::registerType();
Tooltip::registerType();
UpdateDialog::registerType();
qmlRegisterType<Preference>("Hifi", 1, 0, "Preference");

View file

@ -30,6 +30,7 @@
#include "OctreeStatsDialog.h"
#include "PreferencesDialog.h"
#include "ScriptEditorWindow.h"
#include "SignupDialog.h"
#include "UpdateDialog.h"
template<typename T>
@ -74,7 +75,7 @@ void DialogsManager::toggleDiskCacheEditor() {
}
void DialogsManager::toggleLoginDialog() {
LoginDialog::toggleAction();
SignupDialog::show();
}
void DialogsManager::showLoginDialog() {

View file

@ -0,0 +1,52 @@
//
// SignupDialog.cpp
// interface/src/ui
//
// Created by Stephen Birarda on December 7 2016
// Copyright 2016 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 "SignupDialog.h"
#include <QtCore/QJsonDocument>
#include <AccountManager.h>
HIFI_QML_DEF(SignupDialog)
SignupDialog::SignupDialog(QQuickItem *parent) : OffscreenQmlDialog(parent) {
}
void SignupDialog::signup(const QString& username, const QString& password) {
JSONCallbackParameters callbackParams;
callbackParams.jsonCallbackReceiver = this;
callbackParams.jsonCallbackMethod = "signupCompleted";
callbackParams.errorCallbackReceiver = this;
callbackParams.errorCallbackMethod = "signupFailed";
QJsonObject payload;
payload.insert("username", username);
payload.insert("password", password);
static const QString API_SIGNUP_PATH = "api/v1/users";
qDebug() << "Sending a request to create an account for" << username;
auto accountManager = DependencyManager::get<AccountManager>();
accountManager->sendRequest(API_SIGNUP_PATH, AccountManagerAuth::None,
QNetworkAccessManager::PostOperation, callbackParams,
QJsonDocument(payload).toJson());
}
void SignupDialog::signupCompleted(QNetworkReply& reply) {
emit handleSignupCompleted();
}
void SignupDialog::signupFailed(QNetworkReply& reply) {
}

View file

@ -0,0 +1,40 @@
//
// SignupDialog.h
// interface/src/ui
//
// Created by Stephen Birarda on December 7 2016
// Copyright 2016 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
//
#pragma once
#ifndef hifi_SignupDialog_h
#define hifi_SignupDialog_h
#include <OffscreenQmlDialog.h>
class QNetworkReply;
class SignupDialog : public OffscreenQmlDialog {
Q_OBJECT
HIFI_QML_DECL
public:
SignupDialog(QQuickItem* parent = nullptr);
public slots:
void signupCompleted(QNetworkReply& reply);
void signupFailed(QNetworkReply& reply);
signals:
void handleSignupCompleted();
void handleSignupFailed(QString error);
protected slots:
Q_INVOKABLE void signup(const QString& username, const QString& password);
};
#endif // hifi_SignupDialog_h