From 2c17274f49334c00305105f571afd1bdaaade13d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 3 Jun 2015 11:11:31 -0700 Subject: [PATCH 01/21] Rename Dialog.qml to DialogOld.qml --- interface/resources/qml/Browser.qml | 2 +- interface/resources/qml/InfoView.qml | 2 +- interface/resources/qml/LoginDialog.qml | 2 +- interface/resources/qml/MarketplaceDialog.qml | 2 +- interface/resources/qml/MessageDialog.qml | 2 +- interface/resources/qml/TestDialog.qml | 2 +- interface/resources/qml/controls/{Dialog.qml => DialogOld.qml} | 0 7 files changed, 6 insertions(+), 6 deletions(-) rename interface/resources/qml/controls/{Dialog.qml => DialogOld.qml} (100%) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index 55a0a6a461..3de616e05b 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -4,7 +4,7 @@ import QtWebKit 3.0 import "controls" import "styles" -Dialog { +DialogOld { id: root HifiConstants { id: hifi } title: "Browser" diff --git a/interface/resources/qml/InfoView.qml b/interface/resources/qml/InfoView.qml index 6b49e6f0c7..e97ebdeaf3 100644 --- a/interface/resources/qml/InfoView.qml +++ b/interface/resources/qml/InfoView.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.3 import QtWebKit 3.0 import "controls" -Dialog { +DialogOld { id: root width: 800 height: 800 diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 5653dfc7a1..0c02c0af64 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -4,7 +4,7 @@ import QtQuick.Controls.Styles 1.3 import "controls" import "styles" -Dialog { +DialogOld { HifiConstants { id: hifi } title: "Login" objectName: "LoginDialog" diff --git a/interface/resources/qml/MarketplaceDialog.qml b/interface/resources/qml/MarketplaceDialog.qml index 58bb3e6183..4ad3c6515f 100644 --- a/interface/resources/qml/MarketplaceDialog.qml +++ b/interface/resources/qml/MarketplaceDialog.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.3 import QtWebKit 3.0 import "controls" -Dialog { +DialogOld { title: "Test Dlg" id: testDialog objectName: "Browser" diff --git a/interface/resources/qml/MessageDialog.qml b/interface/resources/qml/MessageDialog.qml index dd410b8070..5c699e1f1f 100644 --- a/interface/resources/qml/MessageDialog.qml +++ b/interface/resources/qml/MessageDialog.qml @@ -5,7 +5,7 @@ import QtQuick.Dialogs 1.2 import "controls" import "styles" -Dialog { +DialogOld { id: root HifiConstants { id: hifi } property real spacing: hifi.layout.spacing diff --git a/interface/resources/qml/TestDialog.qml b/interface/resources/qml/TestDialog.qml index 15bd790c22..3ae61fa054 100644 --- a/interface/resources/qml/TestDialog.qml +++ b/interface/resources/qml/TestDialog.qml @@ -3,7 +3,7 @@ import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.3 import "controls" -Dialog { +DialogOld { title: "Test Dialog" id: testDialog objectName: "TestDialog" diff --git a/interface/resources/qml/controls/Dialog.qml b/interface/resources/qml/controls/DialogOld.qml similarity index 100% rename from interface/resources/qml/controls/Dialog.qml rename to interface/resources/qml/controls/DialogOld.qml From d33a249b3e795e5a7c8cba3323400da097489aa1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 3 Jun 2015 13:01:47 -0700 Subject: [PATCH 02/21] Refactor common new dialog functionality into new Dialog.qml --- interface/resources/qml/AddressBarDialog.qml | 62 ++++--------------- interface/resources/qml/ErrorDialog.qml | 50 ++------------- interface/resources/qml/controls/Dialog.qml | 65 ++++++++++++++++++++ 3 files changed, 82 insertions(+), 95 deletions(-) create mode 100644 interface/resources/qml/controls/Dialog.qml diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 91e05d020d..b4f1b2b247 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -9,18 +9,16 @@ // import Hifi 1.0 -import QtQuick 2.3 -import QtQuick.Controls 1.2 +import QtQuick 2.4 import "controls" import "styles" -Item { +Dialog { id: root HifiConstants { id: hifi } objectName: "AddressBarDialog" - property int animationDuration: hifi.effects.fadeInDuration property bool destroyOnInvisible: false property real scale: 1.25 // Make this dialog a little larger than normal @@ -101,47 +99,16 @@ Item { } } - // The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions. - // Because visibility and enabled are booleans, they cannot be animated. So when enabled is changed, we modify a property - // that can be animated, like scale or opacity, and then when the target animation value is reached, we can modify the - // visibility. - enabled: false - opacity: 0.0 - onEnabledChanged: { - opacity = enabled ? 1.0 : 0.0 if (enabled) { addressLine.forceActiveFocus(); } } - Behavior on opacity { - // Animate opacity. - NumberAnimation { - duration: animationDuration - easing.type: Easing.OutCubic - } - } - - onOpacityChanged: { - // Once we're transparent, disable the dialog's visibility. - visible = (opacity != 0.0) - } - onVisibleChanged: { if (!visible) { - reset() - - // Some dialogs should be destroyed when they become invisible. - if (destroyOnInvisible) { - destroy() - } + addressLine.text = "" } - - } - - function reset() { - addressLine.text = "" } function toggleOrGo() { @@ -152,21 +119,18 @@ Item { } } - Keys.onEscapePressed: { - enabled = false - } - Keys.onPressed: { - switch(event.key) { - case Qt.Key_W: - if (event.modifiers == Qt.ControlModifier) { - event.accepted = true - enabled = false - } + switch (event.key) { + case Qt.Key_Escape: + case Qt.Key_Back: + enabled = false; + event.accepted = true + break + case Qt.Key_Enter: + case Qt.Key_Return: + toggleOrGo() + event.accepted = true break } } - - Keys.onReturnPressed: toggleOrGo() - Keys.onEnterPressed: toggleOrGo() } diff --git a/interface/resources/qml/ErrorDialog.qml b/interface/resources/qml/ErrorDialog.qml index c0f8132f14..c3639f5f3c 100644 --- a/interface/resources/qml/ErrorDialog.qml +++ b/interface/resources/qml/ErrorDialog.qml @@ -9,17 +9,14 @@ // import Hifi 1.0 as Hifi -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Dialogs 1.2 +import QtQuick 2.4 import "controls" import "styles" -Item { +Dialog { id: root HifiConstants { id: hifi } - property int animationDuration: hifi.effects.fadeInDuration property bool destroyOnInvisible: true Component.onCompleted: { @@ -69,7 +66,7 @@ Item { Text { id: messageText - font.pointSize: 10 + font.pixelSize: hifi.fonts.pixelSize * 0.6 font.weight: Font.Bold anchors { @@ -99,47 +96,8 @@ Item { } } - // The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions. - // Because visibility and enabled are booleans, they cannot be animated. So when enabled is changed, we modify a property - // that can be animated, like scale or opacity, and then when the target animation value is reached, we can modify the - // visibility. - enabled: false - opacity: 0.0 - - onEnabledChanged: { - opacity = enabled ? 1.0 : 0.0 - } - - Behavior on opacity { - // Animate opacity. - NumberAnimation { - duration: animationDuration - easing.type: Easing.OutCubic - } - } - - onOpacityChanged: { - // Once we're transparent, disable the dialog's visibility. - visible = (opacity != 0.0) - } - - onVisibleChanged: { - if (!visible) { - // Some dialogs should be destroyed when they become invisible. - if (destroyOnInvisible) { - destroy() - } - } - } - Keys.onPressed: { - if (event.modifiers === Qt.ControlModifier) - switch (event.key) { - case Qt.Key_W: - event.accepted = true - content.accept() - break - } else switch (event.key) { + switch (event.key) { case Qt.Key_Escape: case Qt.Key_Back: case Qt.Key_Enter: diff --git a/interface/resources/qml/controls/Dialog.qml b/interface/resources/qml/controls/Dialog.qml new file mode 100644 index 0000000000..63430bdae0 --- /dev/null +++ b/interface/resources/qml/controls/Dialog.qml @@ -0,0 +1,65 @@ +// +// Dialog.qml +// +// Created by David Rowe on 3 Jun 2015 +// 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 "../styles" + +Item { + id: root + + property int animationDuration: hifi.effects.fadeInDuration + + + // The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions. + // Because visibility and enabled are booleans, they cannot be animated. So when enabled is changed, we modify a property + // that can be animated, like scale or opacity, and then when the target animation value is reached, we can modify the + // visibility. + enabled: false + opacity: 0.0 + + onEnabledChanged: { + opacity = enabled ? 1.0 : 0.0 + } + + Behavior on opacity { + // Animate opacity. + NumberAnimation { + duration: animationDuration + easing.type: Easing.OutCubic + } + } + + onOpacityChanged: { + // Once we're transparent, disable the dialog's visibility. + visible = (opacity != 0.0) + } + + onVisibleChanged: { + if (!visible) { + // Some dialogs should be destroyed when they become invisible. + if (destroyOnInvisible) { + destroy() + } + } + } + + + Keys.onPressed: { + switch(event.key) { + case Qt.Key_W: + if (event.modifiers == Qt.ControlModifier) { + enabled = false + event.accepted = true + } + break + } + } +} From afc2f374e54feafc6386dfe978b17f34ef281d69 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 4 Jun 2015 13:20:48 -0700 Subject: [PATCH 03/21] New login dialog background with circular and rectangular variations Developer menu item toggles between the two. --- interface/resources/images/login-circle.svg | 3 + interface/resources/images/login-close.svg | 55 ++++ .../resources/images/login-rectangle.svg | 3 + interface/resources/qml/ErrorDialog.qml | 5 +- interface/resources/qml/LoginDialog.qml | 253 ++++++------------ interface/src/Menu.cpp | 15 ++ interface/src/Menu.h | 2 + interface/src/ui/DialogsManager.cpp | 4 + interface/src/ui/DialogsManager.h | 4 + interface/src/ui/LoginDialog.cpp | 37 ++- interface/src/ui/LoginDialog.h | 11 + 11 files changed, 219 insertions(+), 173 deletions(-) create mode 100644 interface/resources/images/login-circle.svg create mode 100644 interface/resources/images/login-close.svg create mode 100644 interface/resources/images/login-rectangle.svg diff --git a/interface/resources/images/login-circle.svg b/interface/resources/images/login-circle.svg new file mode 100644 index 0000000000..8a98902e6b --- /dev/null +++ b/interface/resources/images/login-circle.svg @@ -0,0 +1,3 @@ + + +2015-06-02 19:43ZCanvas 1Login Circle diff --git a/interface/resources/images/login-close.svg b/interface/resources/images/login-close.svg new file mode 100644 index 0000000000..88ca90b96f --- /dev/null +++ b/interface/resources/images/login-close.svg @@ -0,0 +1,55 @@ + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/images/login-rectangle.svg b/interface/resources/images/login-rectangle.svg new file mode 100644 index 0000000000..774baf8193 --- /dev/null +++ b/interface/resources/images/login-rectangle.svg @@ -0,0 +1,3 @@ + + +2015-06-02 19:42ZCanvas 1Login2 diff --git a/interface/resources/qml/ErrorDialog.qml b/interface/resources/qml/ErrorDialog.qml index c3639f5f3c..51befb12a7 100644 --- a/interface/resources/qml/ErrorDialog.qml +++ b/interface/resources/qml/ErrorDialog.qml @@ -8,7 +8,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -import Hifi 1.0 as Hifi +import Hifi 1.0 import QtQuick 2.4 import "controls" import "styles" @@ -35,7 +35,7 @@ Dialog { x: parent ? parent.width / 2 - width / 2 : 0 y: parent ? parent.height / 2 - height / 2 : 0 - Hifi.ErrorDialog { + ErrorDialog { id: content implicitWidth: box.width @@ -88,6 +88,7 @@ Dialog { } MouseArea { anchors.fill: parent + cursorShape: "PointingHandCursor" onClicked: { content.accept(); } diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 0c02c0af64..6db56d21bf 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -1,198 +1,119 @@ +// +// LoginDialog.qml +// +// Created by David Rowe on 3 Jun 2015 +// 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.3 -import QtQuick.Controls.Styles 1.3 +import QtQuick 2.4 +import QtQuick.Controls 1.3 // TODO: Needed? import "controls" import "styles" -DialogOld { +Dialog { + id: root HifiConstants { id: hifi } - title: "Login" + objectName: "LoginDialog" - height: 512 - width: 384 - onVisibleChanged: { - if (!visible) { - reset() - } - } + property bool destroyOnInvisible: false - onEnabledChanged: { - if (enabled) { - username.forceActiveFocus(); - } - } + implicitWidth: loginDialog.implicitWidth + implicitHeight: loginDialog.implicitHeight - function reset() { - username.text = "" - password.text = "" - loginDialog.statusText = "" + x: parent ? parent.width / 2 - width / 2 : 0 + y: parent ? parent.height / 2 - height / 2 : 0 + property int maximumX: parent ? parent.width - width : 0 + property int maximumY: parent ? parent.height - height : 0 + + function isCircular() { + return loginDialog.dialogFormat == "circular" } LoginDialog { id: loginDialog - anchors.fill: parent - anchors.margins: parent.margins - anchors.topMargin: parent.topMargin - Column { - anchors.topMargin: 8 - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.top: parent.top - spacing: 8 - Image { - height: 64 - anchors.horizontalCenter: parent.horizontalCenter - width: 64 - source: "../images/hifi-logo.svg" + implicitWidth: isCircular() ? circularBackground.width : rectangularBackground.width + implicitHeight: isCircular() ? circularBackground.height : rectangularBackground.height + + Image { + id: circularBackground + visible: isCircular() + + source: "../images/login-circle.svg" + width: 500 + height: 500 + } + + Image { + id: rectangularBackground + visible: !isCircular() + + source: "../images/login-rectangle.svg" + width: 400 + height: 400 + } + + Text { + id: closeText + visible: isCircular() + + text: "Close" + font.pixelSize: hifi.fonts.pixelSize * 0.8 + font.weight: Font.Bold + color: "#175d74" + + anchors { + horizontalCenter: circularBackground.horizontalCenter + bottom: circularBackground.bottom + bottomMargin: hifi.layout.spacing * 4 } - Border { - width: 304 - height: 64 - anchors.horizontalCenter: parent.horizontalCenter - TextInput { - id: username - anchors.fill: parent - helperText: "Username or Email" - anchors.margins: 8 - KeyNavigation.tab: password - KeyNavigation.backtab: password + MouseArea { + anchors.fill: parent + cursorShape: "PointingHandCursor" + onClicked: { + root.enabled = false } } - - Border { - width: 304 - height: 64 - anchors.horizontalCenter: parent.horizontalCenter - TextInput { - id: password - anchors.fill: parent - echoMode: TextInput.Password - helperText: "Password" - anchors.margins: 8 - KeyNavigation.tab: username - KeyNavigation.backtab: username - onFocusChanged: { - if (password.focus) { - password.selectAll() - } - } - } - } - - Text { - anchors.horizontalCenter: parent.horizontalCenter - textFormat: Text.StyledText - width: parent.width - height: 96 - wrapMode: Text.WordWrap - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - text: loginDialog.statusText - } } - Column { - anchors.bottomMargin: 5 - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.bottom: parent.bottom + Image { + id: closeIcon + visible: !isCircular() - Rectangle { - width: 192 - height: 64 - anchors.horizontalCenter: parent.horizontalCenter - color: hifi.colors.hifiBlue - border.width: 0 - radius: 10 - - MouseArea { - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - anchors.top: parent.top - anchors.right: parent.right - anchors.left: parent.left - onClicked: { - loginDialog.login(username.text, password.text) - } - } - - Row { - anchors.centerIn: parent - anchors.verticalCenter: parent.verticalCenter - spacing: 8 - Image { - id: loginIcon - height: 32 - width: 32 - source: "../images/login.svg" - } - Text { - text: "Login" - color: "white" - width: 64 - height: parent.height - } - } + source: "../images/login-close.svg" + width: 20 + height: 20 + anchors { + top: rectangularBackground.top + right: rectangularBackground.right + topMargin: hifi.layout.spacing * 2 + rightMargin: hifi.layout.spacing * 2 } - Text { - width: parent.width - height: 24 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - text:"Create Account" - font.pointSize: 12 - font.bold: true - color: hifi.colors.hifiBlue - - MouseArea { - anchors.fill: parent - onClicked: { - loginDialog.openUrl(loginDialog.rootUrl + "/signup") - } - } - } - - Text { - width: parent.width - height: 24 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.pointSize: 12 - text: "Recover Password" - color: hifi.colors.hifiBlue - - MouseArea { - anchors.fill: parent - onClicked: { - loginDialog.openUrl(loginDialog.rootUrl + "/users/password/new") - } + MouseArea { + anchors.fill: parent + cursorShape: "PointingHandCursor" + onClicked: { + root.enabled = false } } } } + Keys.onPressed: { - switch(event.key) { - case Qt.Key_Enter: - case Qt.Key_Return: - if (username.activeFocus) { - event.accepted = true - password.forceActiveFocus() - } else if (password.activeFocus) { - event.accepted = true - if (username.text == "") { - username.forceActiveFocus() - } else { - loginDialog.login(username.text, password.text) - } - } - break; + switch (event.key) { + case Qt.Key_Escape: + case Qt.Key_Back: + enabled = false; + event.accepted = true + break } } } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 6242318170..b2b9553ea5 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -571,6 +571,21 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned); addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowHulls); + MenuWrapper* loginDialogFormatMenu = developerMenu->addMenu("Login Dialog"); + { + QActionGroup* dialogMenuFormatGroup = new QActionGroup(loginDialogFormatMenu); + + QAction* circularLoginDialog = addCheckableActionToQMenuAndActionHash(loginDialogFormatMenu, + MenuOption::LoginDialogCircular, 0, false, + dialogsManager.data(), SLOT(updateLoginDialogFormat())); + dialogMenuFormatGroup->addAction(circularLoginDialog); + + QAction* rectangularLoginDialog = addCheckableActionToQMenuAndActionHash(loginDialogFormatMenu, + MenuOption::LoginDialogRectangular, 0, true, + dialogsManager.data(), SLOT(updateLoginDialogFormat())); + dialogMenuFormatGroup->addAction(rectangularLoginDialog); + } + MenuWrapper* helpMenu = addMenu("Help"); addActionToQMenuAndActionHash(helpMenu, MenuOption::EditEntitiesHelp, 0, qApp, SLOT(showEditEntitiesHelp())); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 6107744abc..eb1bd94637 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -209,6 +209,8 @@ namespace MenuOption { const QString LoadRSSDKFile = "Load .rssdk file"; const QString LodTools = "LOD Tools"; const QString Login = "Login"; + const QString LoginDialogCircular = "Circular"; + const QString LoginDialogRectangular = "Rectangular"; const QString Log = "Log"; const QString LowVelocityFilter = "Low Velocity Filter"; const QString Mirror = "Mirror"; diff --git a/interface/src/ui/DialogsManager.cpp b/interface/src/ui/DialogsManager.cpp index 1170e3c3a6..705f55586c 100644 --- a/interface/src/ui/DialogsManager.cpp +++ b/interface/src/ui/DialogsManager.cpp @@ -50,6 +50,10 @@ void DialogsManager::showLoginDialog() { LoginDialog::show(); } +void DialogsManager::updateLoginDialogFormat() { + emit loginDialogFormatChanged(); +} + void DialogsManager::octreeStatsDetails() { if (!_octreeStatsDialog) { _octreeStatsDialog = new OctreeStatsDialog(qApp->getWindow(), qApp->getOcteeSceneStats()); diff --git a/interface/src/ui/DialogsManager.h b/interface/src/ui/DialogsManager.h index fc2dad072b..f7301f5444 100644 --- a/interface/src/ui/DialogsManager.h +++ b/interface/src/ui/DialogsManager.h @@ -47,11 +47,15 @@ public: QPointer getOctreeStatsDialog() const { return _octreeStatsDialog; } QPointer getPreferencesDialog() const { return _preferencesDialog; } +signals: + void loginDialogFormatChanged(); + public slots: void toggleAddressBar(); void toggleDiskCacheEditor(); void toggleLoginDialog(); void showLoginDialog(); + void updateLoginDialogFormat(); void octreeStatsDetails(); void cachesSizeDialog(); void editPreferences(); diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index b452f153f0..4ed338c7db 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -1,6 +1,6 @@ // -// // LoginDialog.cpp +// interface/src/ui // // Created by Bradley Austin Davis on 2015/04/14 // Copyright 2015 High Fidelity, Inc. @@ -8,20 +8,28 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // + #include "LoginDialog.h" -#include "DependencyManager.h" -#include "AccountManager.h" -#include "Menu.h" #include +#include "AccountManager.h" +#include "DependencyManager.h" +#include "Menu.h" + HIFI_QML_DEF(LoginDialog) -LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent), _rootUrl(NetworkingConstants::METAVERSE_SERVER_URL.toString()) { +LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent), + _dialogFormat("rectangular"), + _rootUrl(NetworkingConstants::METAVERSE_SERVER_URL.toString()) +{ connect(&AccountManager::getInstance(), &AccountManager::loginComplete, this, &LoginDialog::handleLoginCompleted); connect(&AccountManager::getInstance(), &AccountManager::loginFailed, this, &LoginDialog::handleLoginFailed); + + connect(DependencyManager::get().data(), &DialogsManager::loginDialogFormatChanged, + this, &LoginDialog::updateDialogFormat); } void LoginDialog::toggleAction() { @@ -51,6 +59,25 @@ void LoginDialog::handleLoginFailed() { setStatusText("Invalid username or password.< / font>"); } +void LoginDialog::setDialogFormat(const QString& dialogFormat) { + if (dialogFormat != _dialogFormat) { + _dialogFormat = dialogFormat; + emit dialogFormatChanged(); + } +} + +QString LoginDialog::dialogFormat() const { + return _dialogFormat; +} + +void LoginDialog::updateDialogFormat() { + if (Menu::getInstance()->isOptionChecked(MenuOption::LoginDialogCircular)) { + setDialogFormat("circular"); + } else { + setDialogFormat("rectangular"); + } +} + void LoginDialog::setStatusText(const QString& statusText) { if (statusText != _statusText) { _statusText = statusText; diff --git a/interface/src/ui/LoginDialog.h b/interface/src/ui/LoginDialog.h index e9ae0a1c16..5761914642 100644 --- a/interface/src/ui/LoginDialog.h +++ b/interface/src/ui/LoginDialog.h @@ -1,5 +1,6 @@ // // LoginDialog.h +// interface/src/ui // // Created by Bradley Austin Davis on 2015/04/14 // Copyright 2015 High Fidelity, Inc. @@ -9,9 +10,12 @@ // #pragma once + #ifndef hifi_LoginDialog_h #define hifi_LoginDialog_h +#include "DialogsManager.h" // Need before OffscreenQmlDialog.h in order to get gl.h and glew.h includes in correct order. + #include class LoginDialog : public OffscreenQmlDialog @@ -19,6 +23,7 @@ class LoginDialog : public OffscreenQmlDialog Q_OBJECT HIFI_QML_DECL + Q_PROPERTY(QString dialogFormat READ dialogFormat WRITE setDialogFormat NOTIFY dialogFormatChanged) Q_PROPERTY(QString statusText READ statusText WRITE setStatusText NOTIFY statusTextChanged) Q_PROPERTY(QString rootUrl READ rootUrl) @@ -27,12 +32,17 @@ public: LoginDialog(QQuickItem* parent = nullptr); + void setDialogFormat(const QString& dialogFormat); + QString dialogFormat() const; + void updateDialogFormat(); // protected? + void setStatusText(const QString& statusText); QString statusText() const; QString rootUrl() const; signals: + void dialogFormatChanged(); void statusTextChanged(); protected: @@ -42,6 +52,7 @@ protected: Q_INVOKABLE void login(const QString& username, const QString& password); Q_INVOKABLE void openUrl(const QString& url); private: + QString _dialogFormat; QString _statusText; const QString _rootUrl; }; From 3388406984988b2893f8775ed33071263ee55309 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 4 Jun 2015 18:48:21 -0700 Subject: [PATCH 04/21] Add basic username, password, login, and error functionality and styling --- interface/resources/qml/LoginDialog.qml | 180 +++++++++++++++++++----- interface/src/ui/LoginDialog.cpp | 4 +- 2 files changed, 148 insertions(+), 36 deletions(-) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 6db56d21bf..75adc30a1c 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -10,7 +10,6 @@ import Hifi 1.0 import QtQuick 2.4 -import QtQuick.Controls 1.3 // TODO: Needed? import "controls" import "styles" @@ -40,39 +39,148 @@ Dialog { implicitWidth: isCircular() ? circularBackground.width : rectangularBackground.width implicitHeight: isCircular() ? circularBackground.height : rectangularBackground.height + property int inputWidth: 500 + property int inputHeight: 60 + property int inputSpacing: isCircular() ? 24 : 16 + property int borderWidth: 30 + property int closeMargin: 16 + Image { id: circularBackground visible: isCircular() - source: "../images/login-circle.svg" - width: 500 - height: 500 + width: loginDialog.inputWidth * 1.2 + height: width } Image { id: rectangularBackground visible: !isCircular() - source: "../images/login-rectangle.svg" - width: 400 - height: 400 + width: loginDialog.inputWidth + loginDialog.borderWidth * 2 + height: loginDialog.inputHeight * 6 + } + + Image { + id: closeIcon + visible: !isCircular() + source: "../images/login-close.svg" + width: 20 + height: 20 + anchors { + top: rectangularBackground.top + right: rectangularBackground.right + topMargin: loginDialog.closeMargin + rightMargin: loginDialog.closeMargin + } + + MouseArea { + anchors.fill: parent + cursorShape: "PointingHandCursor" + onClicked: { + root.enabled = false + } + } + } + + Column { + id: mainContent + width: loginDialog.inputWidth + spacing: loginDialog.inputSpacing + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + + Rectangle { + width: loginDialog.inputWidth + height: loginDialog.inputHeight + radius: height / 2 + color: "#ebebeb" + + TextInput { + id: username + anchors.fill: parent + anchors.leftMargin: loginDialog.inputHeight / 2 + + helperText: "username or email" + + KeyNavigation.tab: password + KeyNavigation.backtab: password + } + } + + Rectangle { + width: loginDialog.inputWidth + height: loginDialog.inputHeight + radius: height / 2 + color: "#ebebeb" + + TextInput { + id: password + anchors.fill: parent + anchors.leftMargin: loginDialog.inputHeight / 2 + + helperText: "password" + echoMode: TextInput.Password + + KeyNavigation.tab: username + KeyNavigation.backtab: username + onFocusChanged: { + if (password.focus) { + password.selectAll() + } + } + } + } + + Text { + id: messageText + width: loginDialog.inputWidth + height: loginDialog.inputHeight / 2 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + text: loginDialog.statusText + } + + Rectangle { + width: loginDialog.inputWidth + height: loginDialog.inputHeight + radius: height / 2 + color: "#353535" + + TextInput { + anchors.fill: parent + text: "Login" + color: "white" + horizontalAlignment: Text.AlignHCenter + } + + MouseArea { + anchors.fill: parent + cursorShape: "PointingHandCursor" + onClicked: { + loginDialog.login(username.text, password.text) + } + } + } } Text { id: closeText visible: isCircular() + anchors { + horizontalCenter: parent.horizontalCenter + top: mainContent.bottom + topMargin: loginDialog.inputSpacing + } text: "Close" font.pixelSize: hifi.fonts.pixelSize * 0.8 font.weight: Font.Bold color: "#175d74" - anchors { - horizontalCenter: circularBackground.horizontalCenter - bottom: circularBackground.bottom - bottomMargin: hifi.layout.spacing * 4 - } - MouseArea { anchors.fill: parent cursorShape: "PointingHandCursor" @@ -81,29 +189,19 @@ Dialog { } } } + } - Image { - id: closeIcon - visible: !isCircular() + onEnabledChanged: { + if (enabled) { + username.forceActiveFocus(); + } + } - source: "../images/login-close.svg" - - width: 20 - height: 20 - anchors { - top: rectangularBackground.top - right: rectangularBackground.right - topMargin: hifi.layout.spacing * 2 - rightMargin: hifi.layout.spacing * 2 - } - - MouseArea { - anchors.fill: parent - cursorShape: "PointingHandCursor" - onClicked: { - root.enabled = false - } - } + onVisibleChanged: { + if (!visible) { + username.text = "" + password.text = "" + loginDialog.statusText = "" } } @@ -114,6 +212,20 @@ Dialog { enabled = false; event.accepted = true break + case Qt.Key_Enter: + case Qt.Key_Return: + if (username.activeFocus) { + event.accepted = true + password.forceActiveFocus() + } else if (password.activeFocus) { + event.accepted = true + if (username.text == "") { + username.forceActiveFocus() + } else { + loginDialog.login(username.text, password.text) + } + } + break; } } } diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index 4ed338c7db..a326d6a6d1 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -56,7 +56,7 @@ void LoginDialog::handleLoginCompleted(const QUrl&) { } void LoginDialog::handleLoginFailed() { - setStatusText("Invalid username or password.< / font>"); + setStatusText("Invalid username or password"); } void LoginDialog::setDialogFormat(const QString& dialogFormat) { @@ -95,7 +95,7 @@ QString LoginDialog::rootUrl() const { void LoginDialog::login(const QString& username, const QString& password) { qDebug() << "Attempting to login " << username; - setStatusText("Authenticating..."); + setStatusText("Logging in..."); AccountManager::getInstance().requestAccessToken(username, password); } From 0538eb5756a39944e18158cd4f9c6651f120f036 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 4 Jun 2015 22:27:23 -0700 Subject: [PATCH 05/21] Add remainder of dialog content and polish look --- .../resources/images/hifi-logo-blackish.svg | 123 ++++++++++++++++++ interface/resources/images/login-close.svg | 4 +- interface/resources/images/login-password.svg | 58 +++++++++ interface/resources/images/login-username.svg | 51 ++++++++ interface/resources/qml/LoginDialog.qml | 104 ++++++++++++++- .../resources/qml/styles/HifiConstants.qml | 3 +- 6 files changed, 333 insertions(+), 10 deletions(-) create mode 100644 interface/resources/images/hifi-logo-blackish.svg create mode 100644 interface/resources/images/login-password.svg create mode 100644 interface/resources/images/login-username.svg diff --git a/interface/resources/images/hifi-logo-blackish.svg b/interface/resources/images/hifi-logo-blackish.svg new file mode 100644 index 0000000000..60bfb3d418 --- /dev/null +++ b/interface/resources/images/hifi-logo-blackish.svg @@ -0,0 +1,123 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/images/login-close.svg b/interface/resources/images/login-close.svg index 88ca90b96f..2fb10c241b 100644 --- a/interface/resources/images/login-close.svg +++ b/interface/resources/images/login-close.svg @@ -35,7 +35,7 @@ id="namedview4139" showgrid="false" inkscape:zoom="4.8487496" - inkscape:cx="-11.452085" + inkscape:cx="-41.872299" inkscape:cy="37.53545" inkscape:window-x="77" inkscape:window-y="-8" @@ -48,7 +48,7 @@ d="M 38.400102,87.62655 C 28.705316,86.39839 21.084707,83.18102 13.982682,77.31765 5.5185024,70.329714 -0.09877759,60.244376 -1.7904936,48.998291 -2.1921426,46.328239 -2.2434696,39.677941 -1.8825126,37.07572 0.23131941,21.836625 9.4778634,8.9272213 23.005945,2.3281243 c 9.805646,-4.783264 20.444414,-5.902737 30.964952,-3.25830896 7.357662,1.849413 14.403738,5.75570696 19.976698,11.07495366 7.36697,7.031569 12.03213,16.084669 13.58981,26.37208 0.45133,2.980701 0.44981,9.518147 -0.003,12.481442 -0.72914,4.772737 -2.08456,9.199896 -4.04575,13.214497 -2.40852,4.930297 -4.94684,8.502038 -8.75077,12.313422 -6.78153,6.79482 -14.822805,10.95587 -24.504932,12.68035 -1.787127,0.3183 -3.134188,0.40875 -6.708441,0.45045 -2.459762,0.0287 -4.765789,0.0149 -5.124505,-0.0304 z m -3.02899,-27.869116 7.314939,-7.311007 7.360877,7.35692 7.360872,7.356917 4.983865,-4.982378 4.98386,-4.982378 -7.359111,-7.358686 -7.359105,-7.358687 7.359105,-7.358687 7.359111,-7.358686 -4.98387,-4.982383 -4.983864,-4.982384 -7.407456,7.393329 -7.407456,7.393328 -7.360652,-7.342464 -7.36065,-7.342467 -4.922357,4.916384 -4.922356,4.916381 7.300528,7.417269 7.300528,7.417267 -7.362706,7.362244 -7.362709,7.362244 4.890918,4.889465 c 2.690008,2.689205 4.974582,4.889463 5.076835,4.889463 0.102254,0 3.477639,-3.289951 7.500854,-7.311004 z" id="path4145" inkscape:connector-curvature="0" /> +image/svg+xml \ No newline at end of file diff --git a/interface/resources/images/login-username.svg b/interface/resources/images/login-username.svg new file mode 100644 index 0000000000..a40dd91cf7 --- /dev/null +++ b/interface/resources/images/login-username.svg @@ -0,0 +1,51 @@ + +image/svg+xml \ No newline at end of file diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 75adc30a1c..f39eb7f5f2 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -58,7 +58,7 @@ Dialog { visible: !isCircular() source: "../images/login-rectangle.svg" width: loginDialog.inputWidth + loginDialog.borderWidth * 2 - height: loginDialog.inputHeight * 6 + height: loginDialog.inputHeight * 6 + loginDialog.closeMargin * 2 } Image { @@ -92,18 +92,39 @@ Dialog { verticalCenter: parent.verticalCenter } + Item { + // Offset content down a little + width: loginDialog.inputWidth + height: isCircular() ? loginDialog.inputHeight : loginDialog.closeMargin + } + Rectangle { width: loginDialog.inputWidth height: loginDialog.inputHeight radius: height / 2 color: "#ebebeb" + Image { + source: "../images/login-username.svg" + width: loginDialog.inputHeight * 0.65 + height: width + anchors { + verticalCenter: parent.verticalCenter + left: parent.left + leftMargin: loginDialog.inputHeight / 4 + } + } + TextInput { id: username - anchors.fill: parent - anchors.leftMargin: loginDialog.inputHeight / 2 + anchors { + fill: parent + leftMargin: loginDialog.inputHeight + rightMargin: loginDialog.inputHeight / 2 + } helperText: "username or email" + color: hifi.colors.text KeyNavigation.tab: password KeyNavigation.backtab: password @@ -116,13 +137,28 @@ Dialog { radius: height / 2 color: "#ebebeb" + Image { + source: "../images/login-password.svg" + width: loginDialog.inputHeight * 0.65 + height: width + anchors { + verticalCenter: parent.verticalCenter + left: parent.left + leftMargin: loginDialog.inputHeight / 4 + } + } + TextInput { id: password - anchors.fill: parent - anchors.leftMargin: loginDialog.inputHeight / 2 + anchors { + fill: parent + leftMargin: loginDialog.inputHeight + rightMargin: loginDialog.inputHeight / 2 + } helperText: "password" echoMode: TextInput.Password + color: hifi.colors.text KeyNavigation.tab: username KeyNavigation.backtab: username @@ -142,6 +178,7 @@ Dialog { verticalAlignment: Text.AlignVCenter text: loginDialog.statusText + color: "black" } Rectangle { @@ -165,6 +202,62 @@ Dialog { } } } + + Row { + anchors.horizontalCenter: parent.horizontalCenter + + Text { + text: "Forgot Password?" + font.pixelSize: hifi.fonts.pixelSize * 0.8 + font.underline: true + color: "#e0e0e0" + width: loginDialog.inputHeight * 4 + horizontalAlignment: Text.AlignRight + anchors.verticalCenter: parent.verticalCenter + + MouseArea { + anchors.fill: parent + cursorShape: "PointingHandCursor" + onClicked: { + loginDialog.openUrl(loginDialog.rootUrl + "/users/password/new") + } + } + } + + Item { + width: loginDialog.inputHeight + loginDialog.inputSpacing * 2 + height: loginDialog.inputHeight + + Image { + id: hifiIcon + source: "../images/hifi-logo-blackish.svg" + width: loginDialog.inputHeight + height: width + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + } + } + + Text { + text: "Register" + font.pixelSize: hifi.fonts.pixelSize * 0.8 + font.underline: true + color: "#e0e0e0" + width: loginDialog.inputHeight * 4 + horizontalAlignment: Text.AlignLeft + anchors.verticalCenter: parent.verticalCenter + + MouseArea { + anchors.fill: parent + cursorShape: "PointingHandCursor" + onClicked: { + loginDialog.openUrl(loginDialog.rootUrl + "/signup") + } + } + } + } } Text { @@ -178,7 +271,6 @@ Dialog { text: "Close" font.pixelSize: hifi.fonts.pixelSize * 0.8 - font.weight: Font.Bold color: "#175d74" MouseArea { diff --git a/interface/resources/qml/styles/HifiConstants.qml b/interface/resources/qml/styles/HifiConstants.qml index fa556f2083..c232b993d1 100644 --- a/interface/resources/qml/styles/HifiConstants.qml +++ b/interface/resources/qml/styles/HifiConstants.qml @@ -13,10 +13,9 @@ Item { readonly property color hifiBlue: "#0e7077" readonly property color window: sysPalette.window readonly property color dialogBackground: sysPalette.window - //readonly property color dialogBackground: "#00000000" readonly property color inputBackground: "white" readonly property color background: sysPalette.dark - readonly property color text: sysPalette.text + readonly property color text: "#202020" readonly property color disabledText: "gray" readonly property color hintText: "gray" // A bit darker than sysPalette.dark so that it is visible on the DK2 readonly property color light: sysPalette.light From ce78a95dee84d63d4d0596901af6dbd98cb563f0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 08:22:36 -0700 Subject: [PATCH 06/21] Make login dialog able to be dragged --- interface/resources/qml/LoginDialog.qml | 82 +++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index f39eb7f5f2..55859cb83d 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -44,6 +44,9 @@ Dialog { property int inputSpacing: isCircular() ? 24 : 16 property int borderWidth: 30 property int closeMargin: 16 + property int maximumX: parent ? parent.width - width : 0 + property int maximumY: parent ? parent.height - height : 0 + property real tan30: 0.577 // tan(30°) Image { id: circularBackground @@ -51,6 +54,69 @@ Dialog { source: "../images/login-circle.svg" width: loginDialog.inputWidth * 1.2 height: width + + Item { + // Approximage circle with 3 rectangles that together contain the circle in a hexagon. + anchors.fill: parent + + MouseArea { + width: parent.width + height: parent.width * loginDialog.tan30 + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + drag { + target: root + minimumX: -loginDialog.borderWidth + minimumY: -loginDialog.borderWidth + maximumX: root.parent ? root.maximumX + loginDialog.borderWidth : 0 + maximumY: root.parent ? root.maximumY + loginDialog.borderWidth : 0 + } + } + + MouseArea { + width: parent.width + height: parent.width * loginDialog.tan30 + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + transform: Rotation { + origin.x: width / 2 + origin.y: width * loginDialog.tan30 / 2 + angle: -60 + } + drag { + target: root + minimumX: -loginDialog.borderWidth + minimumY: -loginDialog.borderWidth + maximumX: root.parent ? root.maximumX + loginDialog.borderWidth : 0 + maximumY: root.parent ? root.maximumY + loginDialog.borderWidth : 0 + } + } + + MouseArea { + width: parent.width + height: parent.width * loginDialog.tan30 + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + transform: Rotation { + origin.x: width / 2 + origin.y: width * loginDialog.tan30 / 2 + angle: 60 + } + drag { + target: root + minimumX: -loginDialog.borderWidth + minimumY: -loginDialog.borderWidth + maximumX: root.parent ? root.maximumX + loginDialog.borderWidth : 0 + maximumY: root.parent ? root.maximumY + loginDialog.borderWidth : 0 + } + } + } } Image { @@ -59,6 +125,22 @@ Dialog { source: "../images/login-rectangle.svg" width: loginDialog.inputWidth + loginDialog.borderWidth * 2 height: loginDialog.inputHeight * 6 + loginDialog.closeMargin * 2 + + MouseArea { + width: parent.width + height: parent.height + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + } + drag { + target: root + minimumX: 0 + minimumY: 0 + maximumX: root.parent ? root.maximumX : 0 + maximumY: root.parent ? root.maximumY : 0 + } + } } Image { From 977eae9f86136b029dfedcf93c28ebe1eeb211fe Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 08:42:33 -0700 Subject: [PATCH 07/21] Make login password and register links work --- interface/src/ui/LoginDialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index a326d6a6d1..3de8b5adf1 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -101,4 +101,5 @@ void LoginDialog::login(const QString& username, const QString& password) { void LoginDialog::openUrl(const QString& url) { qDebug() << url; + Application::getInstance()->openUrl(url); } From 6c7fb7e54cb25393c99988fd0bdf9eb6652f3207 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 09:02:35 -0700 Subject: [PATCH 08/21] Fix setting focus at start-up when not logged in --- interface/resources/qml/LoginDialog.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 55859cb83d..55a4fec34c 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -365,9 +365,10 @@ Dialog { } } - onEnabledChanged: { - if (enabled) { - username.forceActiveFocus(); + onOpacityChanged: { + // Set focus once animation is completed so that focus is set at start-up when not logged in + if (opacity == 1.0) { + username.forceActiveFocus() } } From 426fbc662a94794f42e3f8406bf38af87317d5e5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 09:03:46 -0700 Subject: [PATCH 09/21] White error text instead of black --- interface/resources/qml/LoginDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 55a4fec34c..b1d488e0cf 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -260,7 +260,7 @@ Dialog { verticalAlignment: Text.AlignVCenter text: loginDialog.statusText - color: "black" + color: "white" } Rectangle { From 37aefe73f8a28a7bf08201b7762187c933d2bd6b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 09:07:07 -0700 Subject: [PATCH 10/21] Remove unnecessary semicolons --- interface/resources/qml/AddressBarDialog.qml | 4 ++-- interface/resources/qml/ErrorDialog.qml | 4 ++-- interface/resources/qml/LoginDialog.qml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index b4f1b2b247..7fa6bb3481 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -101,7 +101,7 @@ Dialog { onEnabledChanged: { if (enabled) { - addressLine.forceActiveFocus(); + addressLine.forceActiveFocus() } } @@ -123,7 +123,7 @@ Dialog { switch (event.key) { case Qt.Key_Escape: case Qt.Key_Back: - enabled = false; + enabled = false event.accepted = true break case Qt.Key_Enter: diff --git a/interface/resources/qml/ErrorDialog.qml b/interface/resources/qml/ErrorDialog.qml index 51befb12a7..1757aee376 100644 --- a/interface/resources/qml/ErrorDialog.qml +++ b/interface/resources/qml/ErrorDialog.qml @@ -25,7 +25,7 @@ Dialog { onParentChanged: { if (visible && enabled) { - forceActiveFocus(); + forceActiveFocus() } } @@ -90,7 +90,7 @@ Dialog { anchors.fill: parent cursorShape: "PointingHandCursor" onClicked: { - content.accept(); + content.accept() } } } diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index b1d488e0cf..ba8c24f3a7 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -384,7 +384,7 @@ Dialog { switch (event.key) { case Qt.Key_Escape: case Qt.Key_Back: - enabled = false; + enabled = false event.accepted = true break case Qt.Key_Enter: @@ -400,7 +400,7 @@ Dialog { loginDialog.login(username.text, password.text) } } - break; + break } } } From 562228e924762c008a73674ac8f4991354d4eafb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 09:47:34 -0700 Subject: [PATCH 11/21] Change login password recovery link text --- interface/resources/qml/LoginDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index ba8c24f3a7..d75f692827 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -289,7 +289,7 @@ Dialog { anchors.horizontalCenter: parent.horizontalCenter Text { - text: "Forgot Password?" + text: "Password?" font.pixelSize: hifi.fonts.pixelSize * 0.8 font.underline: true color: "#e0e0e0" From c8236f867be2537eedd9006614ac8a5c6fcb4b4a Mon Sep 17 00:00:00 2001 From: Niraj Venkat Date: Fri, 5 Jun 2015 10:40:17 -0700 Subject: [PATCH 12/21] Address manager changes to support domain ID --- libraries/networking/src/AddressManager.cpp | 56 ++++++++++++++++++++- libraries/networking/src/AddressManager.h | 2 + 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 3c6b7bd3f5..0a50cc0793 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -123,6 +123,10 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl) { + (lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())))) { // we may have a path that defines a relative viewpoint - if so we should jump to that now handlePath(lookupUrl.path()); + } else if (handleDomainID(lookupUrl.host())){ + // no place name - this is probably a domain ID + // try to look up the domain ID on the metaverse API + attemptDomainIDLookup(lookupUrl.host(), lookupUrl.path()); } else { // wasn't an address - lookup the place name // we may have a path that defines a relative viewpoint - pass that through the lookup so we can go to it after @@ -165,7 +169,11 @@ void AddressManager::handleAPIResponse(QNetworkReply& requestReply) { QJsonObject responseObject = QJsonDocument::fromJson(requestReply.readAll()).object(); QJsonObject dataObject = responseObject["data"].toObject(); - goToAddressFromObject(dataObject.toVariantMap(), requestReply); + if (!dataObject.isEmpty()){ + goToAddressFromObject(dataObject.toVariantMap(), requestReply); + } else { + goToAddressFromObject(responseObject.toVariantMap(), requestReply); + } emit lookupResultsFinished(); } @@ -175,11 +183,14 @@ const char OVERRIDE_PATH_KEY[] = "override_path"; void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const QNetworkReply& reply) { const QString DATA_OBJECT_PLACE_KEY = "place"; + const QString DATA_OBJECT_DOMAIN_KEY = "domain"; const QString DATA_OBJECT_USER_LOCATION_KEY = "location"; QVariantMap locationMap; if (dataObject.contains(DATA_OBJECT_PLACE_KEY)) { locationMap = dataObject[DATA_OBJECT_PLACE_KEY].toMap(); + } else if (dataObject.contains(DATA_OBJECT_DOMAIN_KEY)) { + locationMap = dataObject; } else { locationMap = dataObject[DATA_OBJECT_USER_LOCATION_KEY].toMap(); } @@ -304,6 +315,24 @@ void AddressManager::attemptPlaceNameLookup(const QString& lookupString, const Q QByteArray(), NULL, requestParams); } +const QString GET_DOMAIN_ID = "/api/v1/domains/%1"; + +void AddressManager::attemptDomainIDLookup(const QString& lookupString, const QString& overridePath) { + // assume this is a domain ID and see if we can get any info on it + QString domainID = QUrl::toPercentEncoding(lookupString); + + QVariantMap requestParams; + if (!overridePath.isEmpty()) { + requestParams.insert(OVERRIDE_PATH_KEY, overridePath); + } + + AccountManager::getInstance().sendRequest(GET_DOMAIN_ID.arg(domainID), + AccountManagerAuth::None, + QNetworkAccessManager::GetOperation, + apiCallbackParameters(), + QByteArray(), NULL, requestParams); +} + bool AddressManager::handleNetworkAddress(const QString& lookupString) { const QString IP_ADDRESS_REGEX_STRING = "^((?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" "(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(?::(\\d{1,5}))?$"; @@ -335,7 +364,7 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) { quint16 domainPort = DEFAULT_DOMAIN_SERVER_PORT; if (!hostnameRegex.cap(2).isEmpty()) { - domainPort = (qint16) hostnameRegex.cap(2).toInt(); + domainPort = (qint16)hostnameRegex.cap(2).toInt(); } emit lookupResultsFinished(); @@ -347,6 +376,29 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) { return false; } +bool AddressManager::handleDomainID(const QString& host) { + const QString UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; + + QRegExp domainIDRegex(UUID_REGEX_STRING, Qt::CaseInsensitive); + + if (domainIDRegex.indexIn(host) != -1) { + QString domainID = domainIDRegex.cap(1); + + quint16 domainPort = DEFAULT_DOMAIN_SERVER_PORT; + + if (!domainIDRegex.cap(2).isEmpty()) { + domainPort = (qint16)domainIDRegex.cap(2).toInt(); + } + + emit lookupResultsFinished(); + setDomainInfo(domainID, domainPort); + + return true; + } + + return false; +} + void AddressManager::handlePath(const QString& path) { if (!handleViewpoint(path)) { qCDebug(networking) << "User entered path could not be handled as a viewpoint - " << path << diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 5831d62603..ccbdd4e037 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -50,6 +50,7 @@ public: void setRootPlaceName(const QString& rootPlaceName); void attemptPlaceNameLookup(const QString& lookupString, const QString& overridePath = QString()); + void attemptDomainIDLookup(const QString& lookupString, const QString& overridePath = QString()); void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } @@ -95,6 +96,7 @@ private: void handlePath(const QString& path); bool handleViewpoint(const QString& viewpointString, bool shouldFace = false); bool handleUsername(const QString& lookupString); + bool handleDomainID(const QString& host); QString _rootPlaceName; QUuid _rootPlaceID; From f168385798158c37d9d2d9fb2c075facbfe77e40 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 12:57:40 -0700 Subject: [PATCH 13/21] Add spinner in place of "Logging in..." --- interface/resources/qml/LoginDialog.qml | 69 ++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index d75f692827..0fa6ff43cc 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -252,15 +252,72 @@ Dialog { } } - Text { - id: messageText + Item { width: loginDialog.inputWidth height: loginDialog.inputHeight / 2 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - text: loginDialog.statusText - color: "white" + Text { + id: messageText + + visible: loginDialog.statusText != "" && loginDialog.statusText != "Logging in..." + + width: loginDialog.inputWidth + height: loginDialog.inputHeight / 2 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + text: loginDialog.statusText + color: "white" + } + + Row { + id: messageSpinner + + visible: loginDialog.statusText == "Logging in..." + onVisibleChanged: visible ? messageSpinnerAnimation.restart() : messageSpinnerAnimation.stop() + + spacing: 24 + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + } + + Rectangle { + id: spinner1 + width: 10 + height: 10 + color: "#ebebeb" + opacity: 0.05 + } + + Rectangle { + id: spinner2 + width: 10 + height: 10 + color: "#ebebeb" + opacity: 0.05 + } + + Rectangle { + id: spinner3 + width: 10 + height: 10 + color: "#ebebeb" + opacity: 0.05 + } + + SequentialAnimation { + id: messageSpinnerAnimation + running: messageSpinner.visible + loops: Animation.Infinite + NumberAnimation { target: spinner1; property: "opacity"; to: 1.0; duration: 1000 } + NumberAnimation { target: spinner2; property: "opacity"; to: 1.0; duration: 1000 } + NumberAnimation { target: spinner3; property: "opacity"; to: 1.0; duration: 1000 } + NumberAnimation { target: spinner1; property: "opacity"; to: 0.05; duration: 0 } + NumberAnimation { target: spinner2; property: "opacity"; to: 0.05; duration: 0 } + NumberAnimation { target: spinner3; property: "opacity"; to: 0.05; duration: 0 } + } + } } Rectangle { From 7e9122e3d13bf1d78f71ad70bc9cbcf2eb310d0b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 13:15:18 -0700 Subject: [PATCH 14/21] Replace login background SVGs with QML rectangles --- interface/resources/images/login-circle.svg | 3 --- interface/resources/images/login-rectangle.svg | 3 --- interface/resources/qml/LoginDialog.qml | 14 ++++++++++---- 3 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 interface/resources/images/login-circle.svg delete mode 100644 interface/resources/images/login-rectangle.svg diff --git a/interface/resources/images/login-circle.svg b/interface/resources/images/login-circle.svg deleted file mode 100644 index 8a98902e6b..0000000000 --- a/interface/resources/images/login-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -2015-06-02 19:43ZCanvas 1Login Circle diff --git a/interface/resources/images/login-rectangle.svg b/interface/resources/images/login-rectangle.svg deleted file mode 100644 index 774baf8193..0000000000 --- a/interface/resources/images/login-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -2015-06-02 19:42ZCanvas 1Login2 diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 0fa6ff43cc..aa6cbb162d 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -48,12 +48,15 @@ Dialog { property int maximumY: parent ? parent.height - height : 0 property real tan30: 0.577 // tan(30°) - Image { + Rectangle { id: circularBackground visible: isCircular() - source: "../images/login-circle.svg" width: loginDialog.inputWidth * 1.2 height: width + radius: width / 2 + + color: "#2c86b1" + opacity: 0.85 Item { // Approximage circle with 3 rectangles that together contain the circle in a hexagon. @@ -119,12 +122,15 @@ Dialog { } } - Image { + Rectangle { id: rectangularBackground visible: !isCircular() - source: "../images/login-rectangle.svg" width: loginDialog.inputWidth + loginDialog.borderWidth * 2 height: loginDialog.inputHeight * 6 + loginDialog.closeMargin * 2 + radius: loginDialog.closeMargin * 2 + + color: "#2c86b1" + opacity: 0.85 MouseArea { width: parent.width From ee8449712c243114d235d0a5636387af48c1b871 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 13:23:06 -0700 Subject: [PATCH 15/21] Code review and tidying --- interface/resources/qml/ErrorDialog.qml | 2 -- interface/resources/qml/LoginDialog.qml | 10 +++++----- interface/resources/qml/controls/Dialog.qml | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/interface/resources/qml/ErrorDialog.qml b/interface/resources/qml/ErrorDialog.qml index 1757aee376..26b18f4ffd 100644 --- a/interface/resources/qml/ErrorDialog.qml +++ b/interface/resources/qml/ErrorDialog.qml @@ -17,8 +17,6 @@ Dialog { id: root HifiConstants { id: hifi } - property bool destroyOnInvisible: true - Component.onCompleted: { enabled = true } diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index aa6cbb162d..3291fed0d0 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -39,14 +39,14 @@ Dialog { implicitWidth: isCircular() ? circularBackground.width : rectangularBackground.width implicitHeight: isCircular() ? circularBackground.height : rectangularBackground.height - property int inputWidth: 500 - property int inputHeight: 60 + readonly property int inputWidth: 500 + readonly property int inputHeight: 60 + readonly property int borderWidth: 30 + readonly property int closeMargin: 16 + readonly property real tan30: 0.577 // tan(30°) property int inputSpacing: isCircular() ? 24 : 16 - property int borderWidth: 30 - property int closeMargin: 16 property int maximumX: parent ? parent.width - width : 0 property int maximumY: parent ? parent.height - height : 0 - property real tan30: 0.577 // tan(30°) Rectangle { id: circularBackground diff --git a/interface/resources/qml/controls/Dialog.qml b/interface/resources/qml/controls/Dialog.qml index 63430bdae0..3cada90c3e 100644 --- a/interface/resources/qml/controls/Dialog.qml +++ b/interface/resources/qml/controls/Dialog.qml @@ -15,7 +15,7 @@ import "../styles" Item { id: root - property int animationDuration: hifi.effects.fadeInDuration + property bool destroyOnInvisible: true // The UI enables an object, rather than manipulating its visibility, so that we can do animations in both directions. @@ -32,7 +32,7 @@ Item { Behavior on opacity { // Animate opacity. NumberAnimation { - duration: animationDuration + duration: hifi.effects.fadeInDuration easing.type: Easing.OutCubic } } From a3f19e9d4c0371d95380736bb7e21175388798f4 Mon Sep 17 00:00:00 2001 From: Niraj Venkat Date: Fri, 5 Jun 2015 13:33:14 -0700 Subject: [PATCH 16/21] Fixing title bar update on teleport --- interface/src/Application.cpp | 4 +- libraries/networking/src/AddressManager.cpp | 47 ++++++++------------- libraries/networking/src/AddressManager.h | 10 ++--- 3 files changed, 25 insertions(+), 36 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2b6ec63d4b..bdc4b83aa6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -474,7 +474,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : addressManager->setPositionGetter(getPositionForPath); addressManager->setOrientationGetter(getOrientationForPath); - connect(addressManager.data(), &AddressManager::rootPlaceNameChanged, this, &Application::updateWindowTitle); + connect(addressManager.data(), &AddressManager::hostChanged, this, &Application::updateWindowTitle); connect(this, &QCoreApplication::aboutToQuit, addressManager.data(), &AddressManager::storeCurrentAddress); #ifdef _WIN32 @@ -3646,7 +3646,7 @@ void Application::updateWindowTitle(){ QString connectionStatus = nodeList->getDomainHandler().isConnected() ? "" : " (NOT CONNECTED) "; QString username = AccountManager::getInstance().getAccountInfo().getUsername(); - QString currentPlaceName = DependencyManager::get()->getRootPlaceName(); + QString currentPlaceName = DependencyManager::get()->getHost(); if (currentPlaceName.isEmpty()) { currentPlaceName = nodeList->getDomainHandler().getHostname(); diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 0a50cc0793..e813b214f1 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -30,7 +30,7 @@ const QString SETTINGS_CURRENT_ADDRESS_KEY = "address"; Setting::Handle currentAddressHandle(QStringList() << ADDRESS_MANAGER_SETTINGS_GROUP << "address", DEFAULT_HIFI_ADDRESS); AddressManager::AddressManager() : - _rootPlaceName(), + _host(), _rootPlaceID(), _positionGetter(NULL), _orientationGetter(NULL) @@ -45,7 +45,7 @@ const QUrl AddressManager::currentAddress() const { QUrl hifiURL; hifiURL.setScheme(HIFI_URL_SCHEME); - hifiURL.setHost(_rootPlaceName); + hifiURL.setHost(_host); hifiURL.setPath(currentPath()); return hifiURL; @@ -217,6 +217,10 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::HandleAddress); + const QString DOMAIN_ID_KEY = "id"; + QString domainIDString = domainObject[DOMAIN_ID_KEY].toString(); + QUuid domainID(domainIDString); + if (domainObject.contains(DOMAIN_NETWORK_ADDRESS_KEY)) { QString domainHostname = domainObject[DOMAIN_NETWORK_ADDRESS_KEY].toString(); @@ -230,10 +234,6 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const } else { QString iceServerAddress = domainObject[DOMAIN_ICE_SERVER_ADDRESS_KEY].toString(); - const QString DOMAIN_ID_KEY = "id"; - QString domainIDString = domainObject[DOMAIN_ID_KEY].toString(); - QUuid domainID(domainIDString); - qCDebug(networking) << "Possible domain change required to connect to domain with ID" << domainID << "via ice-server at" << iceServerAddress; @@ -246,8 +246,12 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const // set our current root place name to the name that came back const QString PLACE_NAME_KEY = "name"; - QString newRootPlaceName = rootMap[PLACE_NAME_KEY].toString(); - setRootPlaceName(newRootPlaceName); + QString placeName = rootMap[PLACE_NAME_KEY].toString(); + if (!placeName.isEmpty()) { + setHost(placeName); + } else { + setHost(domainIDString); + } // check if we had a path to override the path returned QString overridePath = reply.property(OVERRIDE_PATH_KEY).toString(); @@ -381,22 +385,7 @@ bool AddressManager::handleDomainID(const QString& host) { QRegExp domainIDRegex(UUID_REGEX_STRING, Qt::CaseInsensitive); - if (domainIDRegex.indexIn(host) != -1) { - QString domainID = domainIDRegex.cap(1); - - quint16 domainPort = DEFAULT_DOMAIN_SERVER_PORT; - - if (!domainIDRegex.cap(2).isEmpty()) { - domainPort = (qint16)domainIDRegex.cap(2).toInt(); - } - - emit lookupResultsFinished(); - setDomainInfo(domainID, domainPort); - - return true; - } - - return false; + return (domainIDRegex.indexIn(host) != -1); } void AddressManager::handlePath(const QString& path) { @@ -474,16 +463,16 @@ bool AddressManager::handleUsername(const QString& lookupString) { return false; } -void AddressManager::setRootPlaceName(const QString& rootPlaceName) { - if (rootPlaceName != _rootPlaceName) { - _rootPlaceName = rootPlaceName; - emit rootPlaceNameChanged(_rootPlaceName); +void AddressManager::setHost(const QString& host) { + if (host != _host) { + _host = host; + emit hostChanged(_host); } } void AddressManager::setDomainInfo(const QString& hostname, quint16 port) { - _rootPlaceName = hostname; + _host = hostname; _rootPlaceID = QUuid(); qCDebug(networking) << "Possible domain change required to connect to domain at" << hostname << "on" << port; diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index ccbdd4e037..2b587a9bd7 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -35,7 +35,7 @@ class AddressManager : public QObject, public Dependency { Q_PROPERTY(bool isConnected READ isConnected) Q_PROPERTY(QUrl href READ currentAddress) Q_PROPERTY(QString protocol READ getProtocol) - Q_PROPERTY(QString hostname READ getRootPlaceName) + Q_PROPERTY(QString hostname READ getHost) Q_PROPERTY(QString pathname READ currentPath) public: bool isConnected(); @@ -46,8 +46,8 @@ public: const QUuid& getRootPlaceID() const { return _rootPlaceID; } - const QString& getRootPlaceName() const { return _rootPlaceName; } - void setRootPlaceName(const QString& rootPlaceName); + const QString& getHost() const { return _host; } + void setHost(const QString& host); void attemptPlaceNameLookup(const QString& lookupString, const QString& overridePath = QString()); void attemptDomainIDLookup(const QString& lookupString, const QString& overridePath = QString()); @@ -79,7 +79,7 @@ signals: bool hasOrientationChange, const glm::quat& newOrientation, bool shouldFaceLocation); void pathChangeRequired(const QString& newPath); - void rootPlaceNameChanged(const QString& newRootPlaceName); + void hostChanged(const QString& newHost); protected: AddressManager(); private slots: @@ -98,7 +98,7 @@ private: bool handleUsername(const QString& lookupString); bool handleDomainID(const QString& host); - QString _rootPlaceName; + QString _host; QUuid _rootPlaceID; PositionGetter _positionGetter; OrientationGetter _orientationGetter; From 141ff70a60af68e204fb92e50472e660ba79b846 Mon Sep 17 00:00:00 2001 From: Niraj Venkat Date: Fri, 5 Jun 2015 15:36:42 -0700 Subject: [PATCH 17/21] Some changes to constants --- libraries/networking/src/AddressManager.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index e813b214f1..a86ce78655 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -165,13 +165,16 @@ void AddressManager::handleLookupString(const QString& lookupString) { } } +const QString DATA_OBJECT_DOMAIN_KEY = "domain"; + + void AddressManager::handleAPIResponse(QNetworkReply& requestReply) { QJsonObject responseObject = QJsonDocument::fromJson(requestReply.readAll()).object(); QJsonObject dataObject = responseObject["data"].toObject(); - if (!dataObject.isEmpty()){ + if (!dataObject.isEmpty()) { goToAddressFromObject(dataObject.toVariantMap(), requestReply); - } else { + } else if (responseObject.contains(DATA_OBJECT_DOMAIN_KEY)) { goToAddressFromObject(responseObject.toVariantMap(), requestReply); } @@ -183,7 +186,6 @@ const char OVERRIDE_PATH_KEY[] = "override_path"; void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const QNetworkReply& reply) { const QString DATA_OBJECT_PLACE_KEY = "place"; - const QString DATA_OBJECT_DOMAIN_KEY = "domain"; const QString DATA_OBJECT_USER_LOCATION_KEY = "location"; QVariantMap locationMap; From c7c355c19f1435ec8133ea37539d041b71875469 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 15:37:25 -0700 Subject: [PATCH 18/21] Remove circular login dialog variation --- interface/resources/qml/LoginDialog.qml | 116 ++---------------------- interface/src/Menu.cpp | 15 --- interface/src/Menu.h | 2 - interface/src/ui/DialogsManager.cpp | 4 - interface/src/ui/DialogsManager.h | 4 - interface/src/ui/LoginDialog.cpp | 26 +----- interface/src/ui/LoginDialog.h | 9 -- 7 files changed, 9 insertions(+), 167 deletions(-) diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index 3291fed0d0..e552532cbd 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -29,102 +29,23 @@ Dialog { property int maximumX: parent ? parent.width - width : 0 property int maximumY: parent ? parent.height - height : 0 - function isCircular() { - return loginDialog.dialogFormat == "circular" - } - LoginDialog { id: loginDialog - implicitWidth: isCircular() ? circularBackground.width : rectangularBackground.width - implicitHeight: isCircular() ? circularBackground.height : rectangularBackground.height + implicitWidth: backgroundRectangle.width + implicitHeight: backgroundRectangle.height readonly property int inputWidth: 500 readonly property int inputHeight: 60 readonly property int borderWidth: 30 readonly property int closeMargin: 16 readonly property real tan30: 0.577 // tan(30°) - property int inputSpacing: isCircular() ? 24 : 16 + readonly property int inputSpacing: 16 property int maximumX: parent ? parent.width - width : 0 property int maximumY: parent ? parent.height - height : 0 Rectangle { - id: circularBackground - visible: isCircular() - width: loginDialog.inputWidth * 1.2 - height: width - radius: width / 2 - - color: "#2c86b1" - opacity: 0.85 - - Item { - // Approximage circle with 3 rectangles that together contain the circle in a hexagon. - anchors.fill: parent - - MouseArea { - width: parent.width - height: parent.width * loginDialog.tan30 - anchors { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - } - drag { - target: root - minimumX: -loginDialog.borderWidth - minimumY: -loginDialog.borderWidth - maximumX: root.parent ? root.maximumX + loginDialog.borderWidth : 0 - maximumY: root.parent ? root.maximumY + loginDialog.borderWidth : 0 - } - } - - MouseArea { - width: parent.width - height: parent.width * loginDialog.tan30 - anchors { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - } - transform: Rotation { - origin.x: width / 2 - origin.y: width * loginDialog.tan30 / 2 - angle: -60 - } - drag { - target: root - minimumX: -loginDialog.borderWidth - minimumY: -loginDialog.borderWidth - maximumX: root.parent ? root.maximumX + loginDialog.borderWidth : 0 - maximumY: root.parent ? root.maximumY + loginDialog.borderWidth : 0 - } - } - - MouseArea { - width: parent.width - height: parent.width * loginDialog.tan30 - anchors { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - } - transform: Rotation { - origin.x: width / 2 - origin.y: width * loginDialog.tan30 / 2 - angle: 60 - } - drag { - target: root - minimumX: -loginDialog.borderWidth - minimumY: -loginDialog.borderWidth - maximumX: root.parent ? root.maximumX + loginDialog.borderWidth : 0 - maximumY: root.parent ? root.maximumY + loginDialog.borderWidth : 0 - } - } - } - } - - Rectangle { - id: rectangularBackground - visible: !isCircular() + id: backgroundRectangle width: loginDialog.inputWidth + loginDialog.borderWidth * 2 height: loginDialog.inputHeight * 6 + loginDialog.closeMargin * 2 radius: loginDialog.closeMargin * 2 @@ -151,13 +72,12 @@ Dialog { Image { id: closeIcon - visible: !isCircular() source: "../images/login-close.svg" width: 20 height: 20 anchors { - top: rectangularBackground.top - right: rectangularBackground.right + top: backgroundRectangle.top + right: backgroundRectangle.right topMargin: loginDialog.closeMargin rightMargin: loginDialog.closeMargin } @@ -183,7 +103,7 @@ Dialog { Item { // Offset content down a little width: loginDialog.inputWidth - height: isCircular() ? loginDialog.inputHeight : loginDialog.closeMargin + height: loginDialog.closeMargin } Rectangle { @@ -404,28 +324,6 @@ Dialog { } } } - - Text { - id: closeText - visible: isCircular() - anchors { - horizontalCenter: parent.horizontalCenter - top: mainContent.bottom - topMargin: loginDialog.inputSpacing - } - - text: "Close" - font.pixelSize: hifi.fonts.pixelSize * 0.8 - color: "#175d74" - - MouseArea { - anchors.fill: parent - cursorShape: "PointingHandCursor" - onClicked: { - root.enabled = false - } - } - } } onOpacityChanged: { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index b2b9553ea5..6242318170 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -571,21 +571,6 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned); addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowHulls); - MenuWrapper* loginDialogFormatMenu = developerMenu->addMenu("Login Dialog"); - { - QActionGroup* dialogMenuFormatGroup = new QActionGroup(loginDialogFormatMenu); - - QAction* circularLoginDialog = addCheckableActionToQMenuAndActionHash(loginDialogFormatMenu, - MenuOption::LoginDialogCircular, 0, false, - dialogsManager.data(), SLOT(updateLoginDialogFormat())); - dialogMenuFormatGroup->addAction(circularLoginDialog); - - QAction* rectangularLoginDialog = addCheckableActionToQMenuAndActionHash(loginDialogFormatMenu, - MenuOption::LoginDialogRectangular, 0, true, - dialogsManager.data(), SLOT(updateLoginDialogFormat())); - dialogMenuFormatGroup->addAction(rectangularLoginDialog); - } - MenuWrapper* helpMenu = addMenu("Help"); addActionToQMenuAndActionHash(helpMenu, MenuOption::EditEntitiesHelp, 0, qApp, SLOT(showEditEntitiesHelp())); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index eb1bd94637..6107744abc 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -209,8 +209,6 @@ namespace MenuOption { const QString LoadRSSDKFile = "Load .rssdk file"; const QString LodTools = "LOD Tools"; const QString Login = "Login"; - const QString LoginDialogCircular = "Circular"; - const QString LoginDialogRectangular = "Rectangular"; const QString Log = "Log"; const QString LowVelocityFilter = "Low Velocity Filter"; const QString Mirror = "Mirror"; diff --git a/interface/src/ui/DialogsManager.cpp b/interface/src/ui/DialogsManager.cpp index 705f55586c..1170e3c3a6 100644 --- a/interface/src/ui/DialogsManager.cpp +++ b/interface/src/ui/DialogsManager.cpp @@ -50,10 +50,6 @@ void DialogsManager::showLoginDialog() { LoginDialog::show(); } -void DialogsManager::updateLoginDialogFormat() { - emit loginDialogFormatChanged(); -} - void DialogsManager::octreeStatsDetails() { if (!_octreeStatsDialog) { _octreeStatsDialog = new OctreeStatsDialog(qApp->getWindow(), qApp->getOcteeSceneStats()); diff --git a/interface/src/ui/DialogsManager.h b/interface/src/ui/DialogsManager.h index f7301f5444..fc2dad072b 100644 --- a/interface/src/ui/DialogsManager.h +++ b/interface/src/ui/DialogsManager.h @@ -47,15 +47,11 @@ public: QPointer getOctreeStatsDialog() const { return _octreeStatsDialog; } QPointer getPreferencesDialog() const { return _preferencesDialog; } -signals: - void loginDialogFormatChanged(); - public slots: void toggleAddressBar(); void toggleDiskCacheEditor(); void toggleLoginDialog(); void showLoginDialog(); - void updateLoginDialogFormat(); void octreeStatsDetails(); void cachesSizeDialog(); void editPreferences(); diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index 3de8b5adf1..eb6f3c0607 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -12,6 +12,7 @@ #include "LoginDialog.h" #include +#include #include "AccountManager.h" #include "DependencyManager.h" @@ -20,16 +21,12 @@ HIFI_QML_DEF(LoginDialog) LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent), - _dialogFormat("rectangular"), _rootUrl(NetworkingConstants::METAVERSE_SERVER_URL.toString()) { connect(&AccountManager::getInstance(), &AccountManager::loginComplete, this, &LoginDialog::handleLoginCompleted); connect(&AccountManager::getInstance(), &AccountManager::loginFailed, this, &LoginDialog::handleLoginFailed); - - connect(DependencyManager::get().data(), &DialogsManager::loginDialogFormatChanged, - this, &LoginDialog::updateDialogFormat); } void LoginDialog::toggleAction() { @@ -59,25 +56,6 @@ void LoginDialog::handleLoginFailed() { setStatusText("Invalid username or password"); } -void LoginDialog::setDialogFormat(const QString& dialogFormat) { - if (dialogFormat != _dialogFormat) { - _dialogFormat = dialogFormat; - emit dialogFormatChanged(); - } -} - -QString LoginDialog::dialogFormat() const { - return _dialogFormat; -} - -void LoginDialog::updateDialogFormat() { - if (Menu::getInstance()->isOptionChecked(MenuOption::LoginDialogCircular)) { - setDialogFormat("circular"); - } else { - setDialogFormat("rectangular"); - } -} - void LoginDialog::setStatusText(const QString& statusText) { if (statusText != _statusText) { _statusText = statusText; @@ -101,5 +79,5 @@ void LoginDialog::login(const QString& username, const QString& password) { void LoginDialog::openUrl(const QString& url) { qDebug() << url; - Application::getInstance()->openUrl(url); + QDesktopServices::openUrl(url); } diff --git a/interface/src/ui/LoginDialog.h b/interface/src/ui/LoginDialog.h index 5761914642..50c820aa07 100644 --- a/interface/src/ui/LoginDialog.h +++ b/interface/src/ui/LoginDialog.h @@ -14,8 +14,6 @@ #ifndef hifi_LoginDialog_h #define hifi_LoginDialog_h -#include "DialogsManager.h" // Need before OffscreenQmlDialog.h in order to get gl.h and glew.h includes in correct order. - #include class LoginDialog : public OffscreenQmlDialog @@ -23,7 +21,6 @@ class LoginDialog : public OffscreenQmlDialog Q_OBJECT HIFI_QML_DECL - Q_PROPERTY(QString dialogFormat READ dialogFormat WRITE setDialogFormat NOTIFY dialogFormatChanged) Q_PROPERTY(QString statusText READ statusText WRITE setStatusText NOTIFY statusTextChanged) Q_PROPERTY(QString rootUrl READ rootUrl) @@ -32,17 +29,12 @@ public: LoginDialog(QQuickItem* parent = nullptr); - void setDialogFormat(const QString& dialogFormat); - QString dialogFormat() const; - void updateDialogFormat(); // protected? - void setStatusText(const QString& statusText); QString statusText() const; QString rootUrl() const; signals: - void dialogFormatChanged(); void statusTextChanged(); protected: @@ -52,7 +44,6 @@ protected: Q_INVOKABLE void login(const QString& username, const QString& password); Q_INVOKABLE void openUrl(const QString& url); private: - QString _dialogFormat; QString _statusText; const QString _rootUrl; }; From 7fb434613ceb7eaf019b3a5a4afff1067a1e61fa Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 5 Jun 2015 15:57:09 -0700 Subject: [PATCH 19/21] Fix #include for Unix --- interface/src/ui/LoginDialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index eb6f3c0607..196ba5d29e 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -11,8 +11,9 @@ #include "LoginDialog.h" +#include + #include -#include #include "AccountManager.h" #include "DependencyManager.h" From bbde36738698eec41e11675d760af6610ac3b6d5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 6 Jun 2015 10:42:49 -0700 Subject: [PATCH 20/21] Rename new Dialog to DialogContainer --- interface/resources/qml/AddressBarDialog.qml | 2 +- interface/resources/qml/ErrorDialog.qml | 2 +- interface/resources/qml/LoginDialog.qml | 2 +- .../resources/qml/controls/{Dialog.qml => DialogContainer.qml} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename interface/resources/qml/controls/{Dialog.qml => DialogContainer.qml} (98%) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 7fa6bb3481..3377b20d87 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -13,7 +13,7 @@ import QtQuick 2.4 import "controls" import "styles" -Dialog { +DialogContainer { id: root HifiConstants { id: hifi } diff --git a/interface/resources/qml/ErrorDialog.qml b/interface/resources/qml/ErrorDialog.qml index 26b18f4ffd..76d9111d97 100644 --- a/interface/resources/qml/ErrorDialog.qml +++ b/interface/resources/qml/ErrorDialog.qml @@ -13,7 +13,7 @@ import QtQuick 2.4 import "controls" import "styles" -Dialog { +DialogContainer { id: root HifiConstants { id: hifi } diff --git a/interface/resources/qml/LoginDialog.qml b/interface/resources/qml/LoginDialog.qml index e552532cbd..8d5267f7f8 100644 --- a/interface/resources/qml/LoginDialog.qml +++ b/interface/resources/qml/LoginDialog.qml @@ -13,7 +13,7 @@ import QtQuick 2.4 import "controls" import "styles" -Dialog { +DialogContainer { id: root HifiConstants { id: hifi } diff --git a/interface/resources/qml/controls/Dialog.qml b/interface/resources/qml/controls/DialogContainer.qml similarity index 98% rename from interface/resources/qml/controls/Dialog.qml rename to interface/resources/qml/controls/DialogContainer.qml index 3cada90c3e..4aa4e45d67 100644 --- a/interface/resources/qml/controls/Dialog.qml +++ b/interface/resources/qml/controls/DialogContainer.qml @@ -1,5 +1,5 @@ // -// Dialog.qml +// DialogCommon.qml // // Created by David Rowe on 3 Jun 2015 // Copyright 2015 High Fidelity, Inc. From d7866d99819a93c36ca39feba782817cc4ed1290 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 6 Jun 2015 10:48:07 -0700 Subject: [PATCH 21/21] Rename previous Dialog to VrDialog --- interface/resources/qml/Browser.qml | 2 +- interface/resources/qml/InfoView.qml | 2 +- interface/resources/qml/MarketplaceDialog.qml | 2 +- interface/resources/qml/MessageDialog.qml | 2 +- interface/resources/qml/TestDialog.qml | 2 +- .../resources/qml/controls/{DialogOld.qml => VrDialog.qml} | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename interface/resources/qml/controls/{DialogOld.qml => VrDialog.qml} (100%) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index 3de616e05b..947bf739fc 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -4,7 +4,7 @@ import QtWebKit 3.0 import "controls" import "styles" -DialogOld { +VrDialog { id: root HifiConstants { id: hifi } title: "Browser" diff --git a/interface/resources/qml/InfoView.qml b/interface/resources/qml/InfoView.qml index e97ebdeaf3..012f04f1fd 100644 --- a/interface/resources/qml/InfoView.qml +++ b/interface/resources/qml/InfoView.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.3 import QtWebKit 3.0 import "controls" -DialogOld { +VrDialog { id: root width: 800 height: 800 diff --git a/interface/resources/qml/MarketplaceDialog.qml b/interface/resources/qml/MarketplaceDialog.qml index 4ad3c6515f..946f32e84a 100644 --- a/interface/resources/qml/MarketplaceDialog.qml +++ b/interface/resources/qml/MarketplaceDialog.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.3 import QtWebKit 3.0 import "controls" -DialogOld { +VrDialog { title: "Test Dlg" id: testDialog objectName: "Browser" diff --git a/interface/resources/qml/MessageDialog.qml b/interface/resources/qml/MessageDialog.qml index 5c699e1f1f..e8b01df9d0 100644 --- a/interface/resources/qml/MessageDialog.qml +++ b/interface/resources/qml/MessageDialog.qml @@ -5,7 +5,7 @@ import QtQuick.Dialogs 1.2 import "controls" import "styles" -DialogOld { +VrDialog { id: root HifiConstants { id: hifi } property real spacing: hifi.layout.spacing diff --git a/interface/resources/qml/TestDialog.qml b/interface/resources/qml/TestDialog.qml index 3ae61fa054..e6675b7282 100644 --- a/interface/resources/qml/TestDialog.qml +++ b/interface/resources/qml/TestDialog.qml @@ -3,7 +3,7 @@ import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.3 import "controls" -DialogOld { +VrDialog { title: "Test Dialog" id: testDialog objectName: "TestDialog" diff --git a/interface/resources/qml/controls/DialogOld.qml b/interface/resources/qml/controls/VrDialog.qml similarity index 100% rename from interface/resources/qml/controls/DialogOld.qml rename to interface/resources/qml/controls/VrDialog.qml