From 91f4e59f6118a6b936fadda4f6dc68020d42bf93 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 29 Aug 2017 12:33:44 -0700 Subject: [PATCH 1/6] Misc fixes. Get started. --- .../src/ui/overlays/ContextOverlayInterface.cpp | 3 ++- scripts/system/html/js/marketplacesInject.js | 14 ++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/interface/src/ui/overlays/ContextOverlayInterface.cpp b/interface/src/ui/overlays/ContextOverlayInterface.cpp index 46fb2df007..6704e81706 100644 --- a/interface/src/ui/overlays/ContextOverlayInterface.cpp +++ b/interface/src/ui/overlays/ContextOverlayInterface.cpp @@ -13,6 +13,7 @@ #include "Application.h" #include +#include static const float CONTEXT_OVERLAY_TABLET_OFFSET = 30.0f; // Degrees static const float CONTEXT_OVERLAY_TABLET_ORIENTATION = 210.0f; // Degrees @@ -242,7 +243,7 @@ void ContextOverlayInterface::contextOverlays_hoverLeaveEntity(const EntityItemI } } -static const QString MARKETPLACE_BASE_URL = "https://metaverse.highfidelity.com/marketplace/items/"; +static const QString MARKETPLACE_BASE_URL = NetworkingConstants::METAVERSE_SERVER_URL.toString() + "/marketplace/items/"; void ContextOverlayInterface::openMarketplace() { // lets open the tablet and go to the current item in diff --git a/scripts/system/html/js/marketplacesInject.js b/scripts/system/html/js/marketplacesInject.js index 62a4dcf369..9c5439ec2f 100644 --- a/scripts/system/html/js/marketplacesInject.js +++ b/scripts/system/html/js/marketplacesInject.js @@ -127,9 +127,15 @@ $(this).attr('data-href', $(this).attr('href')); $(this).attr('href', '#'); cost = $(this).closest('.col-xs-3').find('.item-cost').text(); + + $(this).closest('.col-xs-3').prev().attr("class", 'col-xs-6'); + $(this).closest('.col-xs-3').attr("class", 'col-xs-6'); if (parseInt(cost) > 0) { - $(this).find('.price').text("BUY"); + var priceElement = $(this).find('.price') + priceElement.css({ "width": "auto", "padding": "3px 5px", "height": "26px" }); + priceElement.text(parseFloat(cost / 100).toFixed(2) + ' HFC'); + priceElement.css({ "min-width": priceElement.width() + 10 }); } }); @@ -160,7 +166,7 @@ // Try this here in case it works (it will if the user just pressed the "back" button, // since that doesn't trigger another AJAX request. - injectBuyButtonOnMainPage; + injectBuyButtonOnMainPage(); addPurchasesButton(); } } @@ -172,8 +178,8 @@ var cost = $('.item-cost').text(); - if (parseInt(cost) > 0) { - $('#side-info').find('.btn').html('Buy Item '); + if (parseInt(cost) > 0 && $('#side-info').find('#buyItemButton').size() === 0) { + $('#side-info').find('.btn').html('Buy Item: ' + (parseFloat(cost / 100).toFixed(2)) + ' HFC'); } $('#side-info').find('.btn').on('click', function () { From 50241078ae1ba7f093e33df50289308d02f45424 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 29 Aug 2017 14:30:00 -0700 Subject: [PATCH 2/6] Buncha punchlist items checked off --- .../qml/hifi/commerce/wallet/NotSetUp.qml | 2 +- .../commerce/wallet/PassphraseSelection.qml | 3 + .../wallet/PassphraseSelectionLightbox.qml | 37 ++++---- .../wallet/SecurityImageSelection.qml | 7 +- .../wallet/SecurityImageSelectionLightbox.qml | 8 ++ .../qml/hifi/commerce/wallet/Wallet.qml | 12 +++ .../qml/hifi/commerce/wallet/WalletHome.qml | 92 +------------------ .../commerce/wallet/WalletSetupLightbox.qml | 15 +++ scripts/system/commerce/wallet.js | 8 ++ scripts/system/html/js/marketplacesInject.js | 2 +- 10 files changed, 74 insertions(+), 112 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/NotSetUp.qml b/interface/resources/qml/hifi/commerce/wallet/NotSetUp.qml index 3efb592ba1..42b8526a8a 100644 --- a/interface/resources/qml/hifi/commerce/wallet/NotSetUp.qml +++ b/interface/resources/qml/hifi/commerce/wallet/NotSetUp.qml @@ -80,7 +80,7 @@ Item { // "Set Up" button HifiControlsUit.Button { - color: hifi.buttons.black; + color: hifi.buttons.blue; colorScheme: hifi.colorSchemes.dark; anchors.bottom: parent.bottom; anchors.bottomMargin: 150; diff --git a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml index 89ef851b06..70a627846b 100644 --- a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml +++ b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml @@ -48,6 +48,9 @@ Item { onVisibleChanged: { if (visible) { passphraseField.focus = true; + sendMessageToLightbox({method: 'disableHmdPreview'}); + } else { + sendMessageToLightbox({method: 'maybeEnableHmdPreview'}); } } diff --git a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelectionLightbox.qml b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelectionLightbox.qml index 862d1894db..a26bc01533 100644 --- a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelectionLightbox.qml +++ b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelectionLightbox.qml @@ -33,23 +33,6 @@ Rectangle { } } - Connections { - target: passphraseSelection; - onSendMessageToLightbox: { - if (msg.method === 'statusResult') { - if (msg.status) { - // Success submitting new passphrase - root.resetSubmitButton(); - root.visible = false; - } else { - // Error submitting new passphrase - root.resetSubmitButton(); - passphraseSelection.setErrorText("Backend error"); - } - } - } - } - // // SECURE PASSPHRASE SELECTION START // @@ -113,6 +96,24 @@ Rectangle { anchors.left: parent.left; anchors.right: parent.right; anchors.bottom: passphraseNavBar.top; + + Connections { + onSendMessageToLightbox: { + if (msg.method === 'statusResult') { + if (msg.status) { + // Success submitting new passphrase + root.resetSubmitButton(); + root.visible = false; + } else { + // Error submitting new passphrase + root.resetSubmitButton(); + passphraseSelection.setErrorText("Backend error"); + } + } else { + sendSignalToWallet(msg); + } + } + } } // Navigation Bar @@ -168,6 +169,8 @@ Rectangle { // SECURE PASSPHRASE SELECTION END // + signal sendSignalToWallet(var msg); + function resetSubmitButton() { passphraseSubmitButton.enabled = true; passphraseSubmitButton.text = "Submit"; diff --git a/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelection.qml b/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelection.qml index 7ab52b7551..2bf99ba615 100644 --- a/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelection.qml +++ b/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelection.qml @@ -27,13 +27,14 @@ Item { Hifi.QmlCommerce { id: commerce; - onSecurityImageResult: { - } } onVisibleChanged: { if (visible) { commerce.getSecurityImage(); + sendSignalToWallet({method: 'disableHmdPreview'}); + } else { + sendSignalToWallet({method: 'maybeEnableHmdPreview'}); } } @@ -83,7 +84,7 @@ Item { // // FUNCTION DEFINITIONS START // - signal sendToScript(var message); + signal sendSignalToWallet(var msg); function getImagePathFromImageID(imageID) { return (imageID ? gridModel.getImagePathFromImageID(imageID) : ""); diff --git a/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelectionLightbox.qml b/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelectionLightbox.qml index d4b0b82ed3..397c5c7788 100644 --- a/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelectionLightbox.qml +++ b/interface/resources/qml/hifi/commerce/wallet/SecurityImageSelectionLightbox.qml @@ -116,6 +116,12 @@ Rectangle { anchors.right: parent.right; anchors.rightMargin: 16; height: 280; + + Connections { + onSendSignalToWallet: { + sendSignalToWallet(msg); + } + } } // Text below security images @@ -193,6 +199,8 @@ Rectangle { // SECURITY IMAGE SELECTION END // + signal sendSignalToWallet(var msg); + function resetSubmitButton() { securityImageSubmitButton.enabled = true; securityImageSubmitButton.text = "Submit"; diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index ae2606c0f6..4fd085fafd 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -101,6 +101,12 @@ Rectangle { anchors.centerIn: walletSetupLightboxContainer; width: walletSetupLightboxContainer.width - 50; height: walletSetupLightboxContainer.height - 50; + + Connections { + onSendSignalToWallet: { + sendToScript(msg); + } + } } SecurityImageSelectionLightbox { id: securityImageSelectionLightbox; @@ -109,6 +115,12 @@ Rectangle { anchors.centerIn: walletSetupLightboxContainer; width: walletSetupLightboxContainer.width - 50; height: walletSetupLightboxContainer.height - 50; + + Connections { + onSendSignalToWallet: { + sendToScript(msg); + } + } } diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index 33faacd0ab..51e2187029 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -208,8 +208,7 @@ Item { anchors.topMargin: 8; anchors.left: parent.left; anchors.right: parent.right; - anchors.bottom: homeMessage.visible ? homeMessage.top : root.bottom; - anchors.bottomMargin: 10; + anchors.bottom: parent.bottom; RalewayRegular { id: recentActivityText; @@ -229,8 +228,7 @@ Item { id: transactionHistory; anchors.top: recentActivityText.bottom; anchors.topMargin: 4; - anchors.bottom: toggleFullHistoryButton.top; - anchors.bottomMargin: 8; + anchors.bottom: parent.bottom; anchors.left: parent.left; anchors.right: parent.right; @@ -245,92 +243,6 @@ Item { verticalAlignment: Text.AlignTop; } } - - HifiControlsUit.Button { - id: toggleFullHistoryButton; - color: hifi.buttons.black; - colorScheme: hifi.colorSchemes.dark; - anchors.bottom: parent.bottom; - anchors.right: parent.right; - width: 250; - height: 40; - text: homeMessage.visible ? "See Full Transaction History" : "Collapse Transaction History"; - onClicked: { - if (homeMessage.visible) { - homeMessage.visible = false; - } else { - homeMessage.visible = true; - } - } - } - } - - // Item for "messages" - like "Welcome" - Item { - id: homeMessage; - anchors.bottom: parent.bottom; - anchors.left: parent.left; - anchors.leftMargin: 20; - anchors.right: parent.right; - anchors.rightMargin: 20; - height: childrenRect.height; - - RalewayRegular { - id: messageText; - text: "Welcome! Let's get you some spending money.

" + - "Now that your account is all set up, click the button below to request your starter money. " + - "A robot will promptly review your request and put money into your account."; - // Text size - size: 16; - // Anchors - anchors.top: parent.top; - anchors.left: parent.left; - anchors.right: parent.right; - height: 130; - // Style - color: hifi.colors.faintGray; - wrapMode: Text.WordWrap; - // Alignment - horizontalAlignment: Text.AlignHLeft; - verticalAlignment: Text.AlignVCenter; - } - - Item { - id: homeMessageButtons; - anchors.top: messageText.bottom; - anchors.topMargin: 4; - anchors.left: parent.left; - anchors.right: parent.right; - height: 40; - HifiControlsUit.Button { - id: noThanksButton; - color: hifi.buttons.black; - colorScheme: hifi.colorSchemes.dark; - anchors.top: parent.top; - anchors.bottom: parent.bottom; - anchors.left: parent.left; - width: 100; - text: "No Thanks" - onClicked: { - messageText.text = "Okay...weird. Who doesn't like free money? If you change your mind, too bad. Sorry." - homeMessageButtons.visible = false; - } - } - HifiControlsUit.Button { - id: freeMoneyButton; - color: hifi.buttons.black; - colorScheme: hifi.colorSchemes.dark; - anchors.top: parent.top; - anchors.bottom: parent.bottom; - anchors.right: parent.right; - width: 210; - text: "Free Money Please" - onClicked: { - messageText.text = "Go, MoneyRobots, Go!" - homeMessageButtons.visible = false; - } - } - } } // diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml b/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml index bbeb77f6fa..d2ddb204fb 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml @@ -262,6 +262,12 @@ Rectangle { anchors.right: parent.right; anchors.rightMargin: 16; height: 280; + + Connections { + onSendSignalToWallet: { + sendSignalToWallet(msg); + } + } } // Text below security images @@ -407,6 +413,15 @@ Rectangle { anchors.left: parent.left; anchors.right: parent.right; anchors.bottom: passphraseNavBar.top; + + Connections { + onSendMessageToLightbox: { + if (msg.method === 'statusResult') { + } else { + sendSignalToWallet(msg); + } + } + } } // Navigation Bar diff --git a/scripts/system/commerce/wallet.js b/scripts/system/commerce/wallet.js index 4b758f0add..0f49b5cede 100644 --- a/scripts/system/commerce/wallet.js +++ b/scripts/system/commerce/wallet.js @@ -53,6 +53,7 @@ // Description: // -Called when a message is received from SpectatorCamera.qml. The "message" argument is what is sent from the QML // in the format "{method, params}", like json-rpc. See also sendToQml(). + var isHmdPreviewDisabled = true; function fromQml(message) { switch (message.method) { case 'walletSetup_cancelClicked': @@ -67,6 +68,13 @@ tablet.loadQMLOnTop("../../../dialogs/TabletLoginDialog.qml"); } break; + case 'disableHmdPreview': + isHmdPreviewDisabled = Menu.isOptionChecked("Disable Preview"); + Menu.setIsOptionChecked("Disable Preview", true); + break; + case 'maybeEnableHmdPreview': + Menu.setIsOptionChecked("Disable Preview", isHmdPreviewDisabled); + break; default: print('Unrecognized message from QML:', JSON.stringify(message)); } diff --git a/scripts/system/html/js/marketplacesInject.js b/scripts/system/html/js/marketplacesInject.js index 9c5439ec2f..2675bb97b6 100644 --- a/scripts/system/html/js/marketplacesInject.js +++ b/scripts/system/html/js/marketplacesInject.js @@ -179,7 +179,7 @@ var cost = $('.item-cost').text(); if (parseInt(cost) > 0 && $('#side-info').find('#buyItemButton').size() === 0) { - $('#side-info').find('.btn').html('Buy Item: ' + (parseFloat(cost / 100).toFixed(2)) + ' HFC'); + $('#side-info').find('.btn').html('Own Item: ' + (parseFloat(cost / 100).toFixed(2)) + ' HFC'); } $('#side-info').find('.btn').on('click', function () { From c7ad875485f813cc57e165bf1a9a47357265eee9 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 29 Aug 2017 15:27:53 -0700 Subject: [PATCH 3/6] Virtual keyboard and logic --- .../qml/hifi/commerce/checkout/Checkout.qml | 2 +- .../commerce/wallet/PassphraseSelection.qml | 40 ++++++ .../qml/hifi/commerce/wallet/Wallet.qml | 118 +++++++++++++----- .../commerce/wallet/images/lowerKeyboard.png | Bin 0 -> 721 bytes 4 files changed, 125 insertions(+), 35 deletions(-) create mode 100644 interface/resources/qml/hifi/commerce/wallet/images/lowerKeyboard.png diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml index 5329099df5..ce75c40458 100644 --- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml +++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml @@ -877,7 +877,7 @@ Rectangle { if (root.purchasesReceived && root.balanceReceived) { if (root.balanceAfterPurchase < 0) { if (root.alreadyOwned) { - buyText.text = "You do not have enough HFC to purchase this item again. Go to your Purchases to view the copy you own."; + buyText.text = "You do not have enough HFC to purchase this item again. Go to your Purchases to view the copy you own."; } else { buyText.text = "You do not have enough HFC to purchase this item."; } diff --git a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml index 70a627846b..23cf8c6ac2 100644 --- a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml +++ b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml @@ -74,6 +74,26 @@ Item { text = ""; } } + + onFocusChanged: { + if (focus) { + sendMessageToLightbox({method: 'walletSetup_raiseKeyboard'}); + } else if (!passphraseFieldAgain.focus) { + sendMessageToLightbox({method: 'walletSetup_lowerKeyboard'}); + } + } + + MouseArea { + anchors.fill: parent; + onClicked: { + parent.focus = true; + sendMessageToLightbox({method: 'walletSetup_raiseKeyboard'}); + } + } + + onAccepted: { + passphraseFieldAgain.focus = true; + } } HifiControlsUit.TextField { id: passphraseFieldAgain; @@ -90,6 +110,26 @@ Item { text = ""; } } + + onFocusChanged: { + if (focus) { + sendMessageToLightbox({method: 'walletSetup_raiseKeyboard'}); + } else if (!passphraseField.focus) { + sendMessageToLightbox({method: 'walletSetup_lowerKeyboard'}); + } + } + + MouseArea { + anchors.fill: parent; + onClicked: { + parent.focus = true; + sendMessageToLightbox({method: 'walletSetup_raiseKeyboard'}); + } + } + + onAccepted: { + focus = false; + } } // Security Image diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index 4fd085fafd..3a46082988 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -28,6 +28,7 @@ Rectangle { property string activeView: "initialize"; property bool securityImageResultReceived: false; property bool keyFilePathIfExistsResultReceived: false; + property bool keyboardRaised: false; // Style color: hifi.colors.baseGray; @@ -57,27 +58,6 @@ Rectangle { id: securityImageModel; } - Connections { - target: walletSetupLightbox; - onSendSignalToWallet: { - if (msg.method === 'walletSetup_cancelClicked') { - walletSetupLightbox.visible = false; - } else if (msg.method === 'walletSetup_finished') { - root.activeView = "walletHome"; - } else { - sendToScript(msg); - } - } - } - Connections { - target: notSetUp; - onSendSignalToWallet: { - if (msg.method === 'setUpClicked') { - walletSetupLightbox.visible = true; - } - } - } - Rectangle { id: walletSetupLightboxContainer; visible: walletSetupLightbox.visible || passphraseSelectionLightbox.visible || securityImageSelectionLightbox.visible; @@ -89,29 +69,51 @@ Rectangle { WalletSetupLightbox { id: walletSetupLightbox; visible: false; - z: 999; + z: 998; anchors.centerIn: walletSetupLightboxContainer; width: walletSetupLightboxContainer.width - 50; height: walletSetupLightboxContainer.height - 50; + + Connections { + onSendSignalToWallet: { + if (msg.method === 'walletSetup_cancelClicked') { + walletSetupLightbox.visible = false; + } else if (msg.method === 'walletSetup_finished') { + root.activeView = "walletHome"; + } else if (msg.method === 'walletSetup_raiseKeyboard') { + root.keyboardRaised = true; + } else if (msg.method === 'walletSetup_lowerKeyboard') { + root.keyboardRaised = false; + } else { + sendToScript(msg); + } + } + } } PassphraseSelectionLightbox { id: passphraseSelectionLightbox; visible: false; - z: 999; + z: 998; anchors.centerIn: walletSetupLightboxContainer; width: walletSetupLightboxContainer.width - 50; height: walletSetupLightboxContainer.height - 50; Connections { onSendSignalToWallet: { - sendToScript(msg); + if (msg.method === 'walletSetup_raiseKeyboard') { + root.keyboardRaised = true; + } else if (msg.method === 'walletSetup_lowerKeyboard') { + root.keyboardRaised = false; + } else { + sendToScript(msg); + } } } } SecurityImageSelectionLightbox { id: securityImageSelectionLightbox; visible: false; - z: 999; + z: 998; anchors.centerIn: walletSetupLightboxContainer; width: walletSetupLightboxContainer.width - 50; height: walletSetupLightboxContainer.height - 50; @@ -192,6 +194,14 @@ Rectangle { anchors.bottom: tabButtonsContainer.top; anchors.left: parent.left; anchors.right: parent.right; + + Connections { + onSendSignalToWallet: { + if (msg.method === 'setUpClicked') { + walletSetupLightbox.visible = true; + } + } + } } WalletHome { @@ -231,14 +241,14 @@ Rectangle { anchors.leftMargin: 16; anchors.right: parent.right; anchors.rightMargin: 16; - } - Connections { - target: security; - onSendSignalToWallet: { - if (msg.method === 'walletSecurity_changePassphrase') { - passphraseSelectionLightbox.visible = true; - } else if (msg.method === 'walletSecurity_changeSecurityImage') { - securityImageSelectionLightbox.visible = true; + + Connections { + onSendSignalToWallet: { + if (msg.method === 'walletSecurity_changePassphrase') { + passphraseSelectionLightbox.visible = true; + } else if (msg.method === 'walletSecurity_changeSecurityImage') { + securityImageSelectionLightbox.visible = true; + } } } } @@ -467,7 +477,47 @@ Rectangle { } // // TAB BUTTONS END - // + // + + Item { + id: keyboardContainer; + z: 999; + visible: keyboard.raised; + anchors { + bottom: parent.bottom; + left: parent.left; + right: parent.right; + } + + Image { + id: lowerKeyboardButton; + source: "images/lowerKeyboard.png"; + anchors.horizontalCenter: parent.horizontalCenter; + anchors.bottom: keyboard.top; + height: 30; + width: 120; + + MouseArea { + anchors.fill: parent; + + onClicked: { + root.keyboardRaised = false; + } + } + } + + HifiControlsUit.Keyboard { + id: keyboard; + property bool punctuationMode: false; + raised: HMD.mounted && root.keyboardRaised; + numeric: keyboard.punctuationMode; + anchors { + bottom: parent.bottom; + left: parent.left; + right: parent.right; + } + } + } // // FUNCTION DEFINITIONS START diff --git a/interface/resources/qml/hifi/commerce/wallet/images/lowerKeyboard.png b/interface/resources/qml/hifi/commerce/wallet/images/lowerKeyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc88262dbc869891f0cad5cc39b031f632206df GIT binary patch literal 721 zcmV;?0xtcDP)m0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#9M@d9MRA}Dq+PkXaKo|$`nOroYQ83~K!OjFlEEF$j zBR1OD31Vg81NjKPfR$L-r%;5Ty@fUwB5FvCsN`~r1Ix0zoZZ8kWCHm=z+~o^Zzk|% zU^<-!Zp;tn61dPVv>O-Ng?6FcSQ5gNK?x!l43Z=%isJM6bOZ#B;~tOa^?GTVX3F>s z!@OOYW!Y}G+iJDq@%Z_CRusiB43voziA1GR$!4>vs*0j$#%$jYP1AIz(-{l~xm>PT zEOHzN0FWf>ynC;wO5X-W>SS-fl@pL*BMbV6>L-U$Sf83rBLQT_dx0{uR2?{fT zW_R!GT_id$8(PyQwSK|q5L*gu<>FBzwgK8~2sDXpgEj*NWn!D5-vxv|F%r=KgXI)r zgrL6*2LNyoF>=uV$j$RSK@hcCtxza9f*4WgzjCXp3Lzv(5&+-`Vx*zJ=Kj%Ck!2Zu zVh2F~&Rr^%0)fD1Aq#>qnM}|pHmiI0_85jC%kp-+6$D|o+fft+0N{CkG#V|JOG%PY z{(a-5ivFd#qtR$25;+_Wm&?ULGl%ZoJ8R-zH?Sxl(Ri1E<~snK00000NkvXXu0mjf DnHD~- literal 0 HcmV?d00001 From a9c99854f9da5a300a9c1daeeb0022c411895cbd Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 29 Aug 2017 15:39:07 -0700 Subject: [PATCH 4/6] Haven't purchased anything yet UI --- .../qml/hifi/commerce/purchases/Purchases.qml | 49 +++++++++++++++++++ scripts/system/marketplaces/marketplaces.js | 3 ++ 2 files changed, 52 insertions(+) diff --git a/interface/resources/qml/hifi/commerce/purchases/Purchases.qml b/interface/resources/qml/hifi/commerce/purchases/Purchases.qml index 5060b65e0b..7486e41a24 100644 --- a/interface/resources/qml/hifi/commerce/purchases/Purchases.qml +++ b/interface/resources/qml/hifi/commerce/purchases/Purchases.qml @@ -258,7 +258,9 @@ Rectangle { height: 40; // Anchors anchors.left: parent.left; + anchors.leftMargin: 8; anchors.right: parent.right; + anchors.rightMargin: 8; anchors.top: parent.top; anchors.topMargin: 4; @@ -304,6 +306,7 @@ Rectangle { ListView { id: purchasesContentsList; + visible: purchasesModel.count !== 0; clip: true; model: filteredPurchasesModel; // Anchors @@ -329,6 +332,52 @@ Rectangle { } } } + + Item { + id: noPurchasesAlertContainer; + visible: !purchasesContentsList.visible; + anchors.top: filterBarContainer.bottom; + anchors.topMargin: 12; + anchors.left: parent.left; + anchors.bottom: parent.bottom; + width: parent.width; + + // Explanitory text + RalewayRegular { + id: haventPurchasedYet; + text: "You haven't purchased anything yet!

Get an item from Marketplace to add it to your Purchases."; + // Text size + size: 22; + // Anchors + anchors.top: parent.top; + anchors.topMargin: 150; + anchors.left: parent.left; + anchors.leftMargin: 24; + anchors.right: parent.right; + anchors.rightMargin: 24; + height: paintedHeight; + // Style + color: hifi.colors.faintGray; + wrapMode: Text.WordWrap; + // Alignment + horizontalAlignment: Text.AlignHCenter; + } + + // "Set Up" button + HifiControlsUit.Button { + color: hifi.buttons.blue; + colorScheme: hifi.colorSchemes.dark; + anchors.top: haventPurchasedYet.bottom; + anchors.topMargin: 20; + anchors.horizontalCenter: parent.horizontalCenter; + width: parent.width * 2 / 3; + height: 50; + text: "Visit Marketplace"; + onClicked: { + sendToScript({method: 'purchases_goToMarketplaceClicked'}); + } + } + } } // // PURCHASES CONTENTS END diff --git a/scripts/system/marketplaces/marketplaces.js b/scripts/system/marketplaces/marketplaces.js index 7b479cdcad..3b97a4c142 100644 --- a/scripts/system/marketplaces/marketplaces.js +++ b/scripts/system/marketplaces/marketplaces.js @@ -228,6 +228,9 @@ case 'purchases_backClicked': tablet.gotoWebScreen(message.referrerURL, MARKETPLACES_INJECT_SCRIPT_URL); break; + case 'purchases_goToMarketplaceClicked': + tablet.gotoWebScreen(MARKETPLACE_URL_INITIAL, MARKETPLACES_INJECT_SCRIPT_URL); + break; default: print('Unrecognized message from Checkout.qml or Purchases.qml: ' + JSON.stringify(message)); } From 5d1170c5d604b2ec1956afc67bcb727a51465905 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 29 Aug 2017 16:17:59 -0700 Subject: [PATCH 5/6] Only make message appear after inventory received --- interface/resources/qml/hifi/commerce/purchases/Purchases.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/commerce/purchases/Purchases.qml b/interface/resources/qml/hifi/commerce/purchases/Purchases.qml index 7486e41a24..b4ea498b31 100644 --- a/interface/resources/qml/hifi/commerce/purchases/Purchases.qml +++ b/interface/resources/qml/hifi/commerce/purchases/Purchases.qml @@ -29,6 +29,7 @@ Rectangle { property string referrerURL: ""; property bool securityImageResultReceived: false; property bool keyFilePathIfExistsResultReceived: false; + property bool inventoryReceived: false; property bool punctuationMode: false; // Style color: hifi.colors.baseGray; @@ -58,6 +59,7 @@ Rectangle { } onInventoryResult: { + inventoryReceived = true; if (result.status !== 'success') { console.log("Failed to get purchases", result.message); } else { @@ -335,7 +337,7 @@ Rectangle { Item { id: noPurchasesAlertContainer; - visible: !purchasesContentsList.visible; + visible: !purchasesContentsList.visible && root.inventoryReceived; anchors.top: filterBarContainer.bottom; anchors.topMargin: 12; anchors.left: parent.left; From 6ee634b90ae43295388512abea9273a157b46cb4 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 29 Aug 2017 17:19:34 -0700 Subject: [PATCH 6/6] Lock overlay on top of security image --- .../qml/hifi/commerce/checkout/Checkout.qml | 10 +++++++ .../qml/hifi/commerce/purchases/Purchases.qml | 10 +++++++ .../commerce/wallet/PassphraseSelection.qml | 14 ++++++++-- .../qml/hifi/commerce/wallet/Security.qml | 25 ++++++++++++++---- .../qml/hifi/commerce/wallet/WalletHome.qml | 14 ++++++++-- .../commerce/wallet/images/lockOverlay.png | Bin 0 -> 10087 bytes 6 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 interface/resources/qml/hifi/commerce/wallet/images/lockOverlay.png diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml index ce75c40458..cdd692dd17 100644 --- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml +++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml @@ -147,6 +147,16 @@ Rectangle { cache: false; source: "image://security/securityImage"; } + Image { + id: securityImageOverlay; + source: "../wallet/images/lockOverlay.png"; + width: securityImage.width * 0.45; + height: securityImage.height * 0.45; + anchors.bottom: securityImage.bottom; + anchors.right: securityImage.right; + mipmap: true; + opacity: 0.9; + } // Separator HifiControlsUit.Separator { diff --git a/interface/resources/qml/hifi/commerce/purchases/Purchases.qml b/interface/resources/qml/hifi/commerce/purchases/Purchases.qml index b4ea498b31..a88633344f 100644 --- a/interface/resources/qml/hifi/commerce/purchases/Purchases.qml +++ b/interface/resources/qml/hifi/commerce/purchases/Purchases.qml @@ -118,6 +118,16 @@ Rectangle { cache: false; source: "image://security/securityImage"; } + Image { + id: securityImageOverlay; + source: "../wallet/images/lockOverlay.png"; + width: securityImage.width * 0.45; + height: securityImage.height * 0.45; + anchors.bottom: securityImage.bottom; + anchors.right: securityImage.right; + mipmap: true; + opacity: 0.9; + } // Separator HifiControlsUit.Separator { diff --git a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml index 23cf8c6ac2..84c9393b06 100644 --- a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml +++ b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml @@ -154,9 +154,19 @@ Item { commerce.getSecurityImage(); } } - // "Security picture" text below pic + Image { + id: topSecurityImageOverlay; + source: "images/lockOverlay.png"; + width: passphrasePageSecurityImage.width * 0.45; + height: passphrasePageSecurityImage.height * 0.45; + anchors.bottom: passphrasePageSecurityImage.bottom; + anchors.right: passphrasePageSecurityImage.right; + mipmap: true; + opacity: 0.9; + } + // "Security image" text below pic RalewayRegular { - text: "security picture"; + text: "security image"; // Text size size: 12; // Anchors diff --git a/interface/resources/qml/hifi/commerce/wallet/Security.qml b/interface/resources/qml/hifi/commerce/wallet/Security.qml index d0a96db3f2..b5d52d57e2 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Security.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Security.qml @@ -13,6 +13,7 @@ import Hifi 1.0 as Hifi import QtQuick 2.5 +import QtGraphicalEffects 1.0 import QtQuick.Controls 1.4 import "../../../styles-uit" import "../../../controls-uit" as HifiControlsUit @@ -35,8 +36,6 @@ Item { topSecurityImage.source = path; changeSecurityImageImage.source = ""; changeSecurityImageImage.source = path; - changePassphraseImage.source = ""; - changePassphraseImage.source = path; } } @@ -92,9 +91,19 @@ Item { source: "image://security/securityImage"; cache: false; } - // "Security picture" text below pic + Image { + id: topSecurityImageMask; + source: "images/lockOverlay.png"; + width: topSecurityImage.width * 0.45; + height: topSecurityImage.height * 0.45; + anchors.bottom: topSecurityImage.bottom; + anchors.right: topSecurityImage.right; + mipmap: true; + opacity: 0.9; + } + // "Security image" text below pic RalewayRegular { - text: "security picture"; + text: "security image"; // Text size size: 12; // Anchors @@ -148,10 +157,16 @@ Item { anchors.left: parent.left; height: parent.height; width: height; - source: "image://security/securityImage"; + source: "images/lockOverlay.png"; fillMode: Image.PreserveAspectFit; mipmap: true; cache: false; + visible: false; + } + ColorOverlay { + anchors.fill: changePassphraseImage; + source: changePassphraseImage; + color: "white" } // "Change Passphrase" button HifiControlsUit.Button { diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index 51e2187029..c69610d494 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -182,9 +182,19 @@ Item { cache: false; source: "image://security/securityImage"; } - // "Security picture" text below pic + Image { + id: securityImageOverlay; + source: "images/lockOverlay.png"; + width: securityImage.width * 0.45; + height: securityImage.height * 0.45; + anchors.bottom: securityImage.bottom; + anchors.right: securityImage.right; + mipmap: true; + opacity: 0.9; + } + // "Security image" text below pic RalewayRegular { - text: "security picture"; + text: "security image"; // Text size size: 12; // Anchors diff --git a/interface/resources/qml/hifi/commerce/wallet/images/lockOverlay.png b/interface/resources/qml/hifi/commerce/wallet/images/lockOverlay.png new file mode 100644 index 0000000000000000000000000000000000000000..09b2011e58817e9a9f120ef4303c6ea02e597cd6 GIT binary patch literal 10087 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 q&hUiK62U|0qx&3YYF%@F8