From c6b12307aa006cdef0a8a89c916065d1b7b25cc4 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 26 Apr 2018 14:13:42 -0700 Subject: [PATCH 1/4] Added custom jsdoc tags to High Fidelity There are 4 new jsdoc tags: * @hifi-interface - indicates that this namespace or class is available in Interface Scripts. * @hifi-assignment-client - indicates that this namespace or class is available in Assignment Client Scripts. * @hifi-client-entity - indicates that this namespace or class is available in Client Entity Scripts. * @hifi-server-entity - indicates that this namespace or class is avaialbe in Server Entity Scripts. These tags should appear just after the @class or @namespace tag. For example: /**jsdoc * Your avatar is your in-world representation of you. The MyAvatar API is used to manipulate the avatar. * For example, you can customize the avatar's appearance, run custom avatar animations, * change the avatar's position within the domain, or manage the avatar's collisions with other objects. * * @namespace MyAvatar * * @hifi-interface * @hifi-client-entity * --- interface/src/avatar/MyAvatar.h | 4 ++ tools/jsdoc/plugins/hifi.js | 94 +++++++++++++++++++++++++++++---- 2 files changed, 87 insertions(+), 11 deletions(-) diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index a6d637d184..74f7a3c89f 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -60,6 +60,10 @@ class MyAvatar : public Avatar { * change the avatar's position within the domain, or manage the avatar's collisions with other objects. * * @namespace MyAvatar + * + * @hifi-interface + * @hifi-client-entity + * * @property {Vec3} qmlPosition - A synonym for position for use by QML. * @property {boolean} shouldRenderLocally=true - If true then your avatar is rendered for you in Interface, * otherwise it is not rendered for you (but it is still rendered for other users). diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index 5206edb0e2..7c643d398c 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -9,21 +9,25 @@ function endsWith(path, exts) { } exports.handlers = { + + // This event is triggered before parsing has even started. + // We use this event to scan the C++ files for jsdoc comments + // and reformat them into a form digestable by jsdoc. beforeParse: function(e) { - const pathTools = require('path'); + var pathTools = require('path'); var rootFolder = pathTools.dirname(e.filename); console.log("Scanning hifi source for jsdoc comments..."); // directories to scan for jsdoc comments var dirList = [ '../../interface/src', - '../../interface/src/assets', - '../../interface/src/audio', + '../../interface/src/assets', + '../../interface/src/audio', '../../interface/src/avatar', - '../../interface/src/commerce', - '../../interface/src/devices', - '../../interface/src/java', - '../../interface/src/networking', + '../../interface/src/commerce', + '../../interface/src/devices', + '../../interface/src/java', + '../../interface/src/networking', '../../interface/src/ui/', '../../interface/src/scripting', '../../interface/src/ui/overlays', @@ -50,25 +54,93 @@ exports.handlers = { '../../libraries/trackers/src/trackers', '../../libraries/ui/src/ui', '../../plugins/oculus/src', - '../../plugins/openvr/src', + '../../plugins/openvr/src' ]; + + // only files with this extension will be searched for jsdoc comments. var exts = ['.h', '.cpp']; - const fs = require('fs'); + var fs = require('fs'); dirList.forEach(function (dir) { var joinedDir = pathTools.join(rootFolder, dir); - var files = fs.readdirSync(joinedDir) + var files = fs.readdirSync(joinedDir); files.forEach(function (file) { var path = pathTools.join(joinedDir, file); if (fs.lstatSync(path).isFile() && endsWith(path, exts)) { + // load entire file into a string var data = fs.readFileSync(path, "utf8"); + + // this regex searches for blocks starting with /**jsdoc and end with */ var reg = /(\/\*\*jsdoc(.|[\r\n])*?\*\/)/gm; var matches = data.match(reg); if (matches) { - e.source += matches.map(function (s) { return s.replace('/**jsdoc', '/**'); }).join('\n'); + // add to source, but strip off c-comment asterisks + e.source += matches.map(function (s) { + return s.replace('/**jsdoc', '/**'); + }).join('\n'); } } }); }); + }, + + // This event is triggered when a new doclet has been created + // but before it is passed to the template for output + newDoclet: function (e) { + + // we only care about hifi custom tags on namespace and class doclets + if (e.doclet.kind === "namespace" || e.doclet.kind === "class") { + var rows = []; + if (e.doclet.hifiInterface) { + rows.push("Interface Scripts"); + } + if (e.doclet.hifiAssignmentClient) { + rows.push("Assignment Client Scripts"); + } + if (e.doclet.hifiClientEntity) { + rows.push("Client Entity Scripts"); + } + if (e.doclet.hifiServerEntity) { + rows.push("Server Entity Scripts"); + } + + // Append an Available In: table at the end of the namespace description. + if (rows.length > 0) { + var table = "

Available In:" + rows.join("") + "
"; + e.doclet.description = e.doclet.description + table; + } + } } }; + +// Define custom hifi tags here +exports.defineTags = function (dictionary) { + + // @hifi-interface + dictionary.defineTag("hifi-interface", { + onTagged: function (doclet, tag) { + doclet.hifiInterface = true; + } + }); + + // @hifi-assignment-client + dictionary.defineTag("hifi-assigment-client", { + onTagged: function (doclet, tag) { + doclet.hifiAssignmentClient = true; + } + }); + + // @hifi-client-entity + dictionary.defineTag("hifi-client-entity", { + onTagged: function (doclet, tag) { + doclet.hifiClientEntity = true; + } + }); + + // @hifi-server-entity + dictionary.defineTag("hifi-server-entity", { + onTagged: function (doclet, tag) { + doclet.hifiServerEntity = true; + } + }); +}; From fc324f67bd198500f1f445c37f15f8751e279708 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 26 Apr 2018 15:09:53 -0700 Subject: [PATCH 2/4] MS14559: Fix sometimes being unable to click on 'Nearby' orb when sending Gift/HFC --- .../commerce/common/sendAsset/SendAsset.qml | 2 +- scripts/system/commerce/wallet.js | 120 ++---------------- scripts/system/marketplaces/marketplaces.js | 120 ++---------------- 3 files changed, 21 insertions(+), 221 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml b/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml index 8bf3a22338..091c313291 100644 --- a/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml +++ b/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml @@ -1768,7 +1768,7 @@ Item { switch (message.method) { case 'selectRecipient': if (message.isSelected) { - chooseRecipientNearby.selectedRecipient = message.id[0]; + chooseRecipientNearby.selectedRecipient = message.id; sendAssetStep.selectedRecipientDisplayName = message.displayName; sendAssetStep.selectedRecipientUserName = message.userName; } else { diff --git a/scripts/system/commerce/wallet.js b/scripts/system/commerce/wallet.js index 9403a824e3..2fbeaec317 100644 --- a/scripts/system/commerce/wallet.js +++ b/scripts/system/commerce/wallet.js @@ -21,40 +21,16 @@ // BEGIN AVATAR SELECTOR LOGIC - var UNSELECTED_TEXTURES = { - "idle-D": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-idle.png"), - "idle-E": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-idle.png") - }; - var SELECTED_TEXTURES = { - "idle-D": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-selected.png"), - "idle-E": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-selected.png") - }; - var HOVER_TEXTURES = { - "idle-D": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-hover.png"), - "idle-E": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-hover.png") - }; - var UNSELECTED_COLOR = { red: 0x1F, green: 0xC6, blue: 0xA6 }; var SELECTED_COLOR = { red: 0xF3, green: 0x91, blue: 0x29 }; var HOVER_COLOR = { red: 0xD0, green: 0xD0, blue: 0xD0 }; - var conserveResources = true; var overlays = {}; // Keeps track of all our extended overlay data objects, keyed by target identifier. - function ExtendedOverlay(key, type, properties, selected, hasModel) { // A wrapper around overlays to store the key it is associated with. + function ExtendedOverlay(key, type, properties) { // A wrapper around overlays to store the key it is associated with. overlays[key] = this; - if (hasModel) { - var modelKey = key + "-m"; - this.model = new ExtendedOverlay(modelKey, "model", { - url: Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx"), - textures: textures(selected), - ignoreRayIntersection: true - }, false, false); - } else { - this.model = undefined; - } this.key = key; - this.selected = selected || false; // not undefined + this.selected = false; this.hovering = false; this.activeOverlay = Overlays.addOverlay(type, properties); // We could use different overlays for (un)selected... } @@ -76,10 +52,6 @@ } return { red: scale(base.red), green: scale(base.green), blue: scale(base.blue) }; } - - function textures(selected, hovering) { - return hovering ? HOVER_TEXTURES : selected ? SELECTED_TEXTURES : UNSELECTED_TEXTURES; - } // so we don't have to traverse the overlays to get the last one var lastHoveringId = 0; ExtendedOverlay.prototype.hover = function (hovering) { @@ -91,9 +63,6 @@ lastHoveringId = 0; } this.editOverlay({ color: color(this.selected, hovering) }); - if (this.model) { - this.model.editOverlay({ textures: textures(this.selected, hovering) }); - } if (hovering) { // un-hover the last hovering overlay if (lastHoveringId && lastHoveringId !== this.key) { @@ -108,15 +77,12 @@ } this.editOverlay({ color: color(selected, this.hovering) }); - if (this.model) { - this.model.editOverlay({ textures: textures(selected) }); - } this.selected = selected; }; // Class methods: - var selectedIds = []; + var selectedId = false; ExtendedOverlay.isSelected = function (id) { - return -1 !== selectedIds.indexOf(id); + return selectedId === id; }; ExtendedOverlay.get = function (key) { // answer the extended overlay data object associated with the given avatar identifier return overlays[key]; @@ -153,51 +119,14 @@ }); }; - function HighlightedEntity(id, entityProperties) { - this.id = id; - this.overlay = Overlays.addOverlay('cube', { - position: entityProperties.position, - rotation: entityProperties.rotation, - dimensions: entityProperties.dimensions, - solid: false, - color: { - red: 0xF3, - green: 0x91, - blue: 0x29 - }, - ignoreRayIntersection: true, - drawInFront: false // Arguable. For now, let's not distract with mysterious wires around the scene. - }); - HighlightedEntity.overlays.push(this); - } - HighlightedEntity.overlays = []; - HighlightedEntity.clearOverlays = function clearHighlightedEntities() { - HighlightedEntity.overlays.forEach(function (highlighted) { - Overlays.deleteOverlay(highlighted.overlay); - }); - HighlightedEntity.overlays = []; - }; - HighlightedEntity.updateOverlays = function updateHighlightedEntities() { - HighlightedEntity.overlays.forEach(function (highlighted) { - var properties = Entities.getEntityProperties(highlighted.id, ['position', 'rotation', 'dimensions']); - Overlays.editOverlay(highlighted.overlay, { - position: properties.position, - rotation: properties.rotation, - dimensions: properties.dimensions - }); - }); - }; - - function addAvatarNode(id) { - var selected = ExtendedOverlay.isSelected(id); return new ExtendedOverlay(id, "sphere", { drawInFront: true, solid: true, alpha: 0.8, - color: color(selected, false), + color: color(false, false), ignoreRayIntersection: false - }, selected, !conserveResources); + }); } var pingPong = true; @@ -236,14 +165,6 @@ position: target, dimensions: 0.032 * distance }); - if (overlay.model) { - overlay.model.ping = pingPong; - overlay.model.editOverlay({ - position: target, - scale: 0.2 * distance, // constant apparent size - rotation: Camera.orientation - }); - } }); pingPong = !pingPong; ExtendedOverlay.some(function (overlay) { // Remove any that weren't updated. (User is gone.) @@ -251,13 +172,10 @@ overlay.deleteOverlay(); } }); - // We could re-populateNearbyUserList if anything added or removed, but not for now. - HighlightedEntity.updateOverlays(); } function removeOverlays() { - selectedIds = []; + selectedId = false; lastHoveringId = 0; - HighlightedEntity.clearOverlays(); ExtendedOverlay.some(function (overlay) { overlay.deleteOverlay(); }); @@ -267,7 +185,7 @@ // Clicks. // function usernameFromIDReply(id, username, machineFingerprint, isAdmin) { - if (selectedIds[0] === id) { + if (selectedId === id) { var message = { method: 'updateSelectedRecipientUsername', userName: username === "" ? "unknown username" : username @@ -279,13 +197,13 @@ ExtendedOverlay.applyPickRay(pickRay, function (overlay) { var nextSelectedStatus = !overlay.selected; var avatarId = overlay.key; - selectedIds = nextSelectedStatus ? [avatarId] : []; + selectedId = nextSelectedStatus ? avatarId : false; if (nextSelectedStatus) { Users.requestUsernameFromID(avatarId); } var message = { method: 'selectRecipient', - id: [avatarId], + id: avatarId, isSelected: nextSelectedStatus, displayName: '"' + AvatarList.getAvatar(avatarId).sessionDisplayName + '"', userName: '' @@ -298,24 +216,6 @@ overlay.select(selected); }); - HighlightedEntity.clearOverlays(); - if (selectedIds.length) { - Entities.findEntitiesInFrustum(Camera.frustum).forEach(function (id) { - // Because lastEditedBy is per session, the vast majority of entities won't match, - // so it would probably be worth reducing marshalling costs by asking for just we need. - // However, providing property name(s) is advisory and some additional properties are - // included anyway. As it turns out, asking for 'lastEditedBy' gives 'position', 'rotation', - // and 'dimensions', too, so we might as well make use of them instead of making a second - // getEntityProperties call. - // It would be nice if we could harden this against future changes by specifying all - // and only these four in an array, but see - // https://highfidelity.fogbugz.com/f/cases/2728/Entities-getEntityProperties-id-lastEditedBy-name-lastEditedBy-doesn-t-work - var properties = Entities.getEntityProperties(id, 'lastEditedBy'); - if (ExtendedOverlay.isSelected(properties.lastEditedBy)) { - new HighlightedEntity(id, properties); - } - }); - } return true; }); } diff --git a/scripts/system/marketplaces/marketplaces.js b/scripts/system/marketplaces/marketplaces.js index 64ce73fad6..b128e100a1 100644 --- a/scripts/system/marketplaces/marketplaces.js +++ b/scripts/system/marketplaces/marketplaces.js @@ -153,40 +153,16 @@ var selectionDisplay = null; // for gridTool.js to ignore } // BEGIN AVATAR SELECTOR LOGIC - var UNSELECTED_TEXTURES = { - "idle-D": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-idle.png"), - "idle-E": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-idle.png") - }; - var SELECTED_TEXTURES = { - "idle-D": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-selected.png"), - "idle-E": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-selected.png") - }; - var HOVER_TEXTURES = { - "idle-D": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-hover.png"), - "idle-E": Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx/Avatar-Overlay-v1.fbm/avatar-overlay-hover.png") - }; - var UNSELECTED_COLOR = { red: 0x1F, green: 0xC6, blue: 0xA6 }; var SELECTED_COLOR = { red: 0xF3, green: 0x91, blue: 0x29 }; var HOVER_COLOR = { red: 0xD0, green: 0xD0, blue: 0xD0 }; - var conserveResources = true; var overlays = {}; // Keeps track of all our extended overlay data objects, keyed by target identifier. - function ExtendedOverlay(key, type, properties, selected, hasModel) { // A wrapper around overlays to store the key it is associated with. + function ExtendedOverlay(key, type, properties) { // A wrapper around overlays to store the key it is associated with. overlays[key] = this; - if (hasModel) { - var modelKey = key + "-m"; - this.model = new ExtendedOverlay(modelKey, "model", { - url: Script.resolvePath("./assets/models/Avatar-Overlay-v1.fbx"), - textures: textures(selected), - ignoreRayIntersection: true - }, false, false); - } else { - this.model = undefined; - } this.key = key; - this.selected = selected || false; // not undefined + this.selected = false; this.hovering = false; this.activeOverlay = Overlays.addOverlay(type, properties); // We could use different overlays for (un)selected... } @@ -208,10 +184,6 @@ var selectionDisplay = null; // for gridTool.js to ignore } return { red: scale(base.red), green: scale(base.green), blue: scale(base.blue) }; } - - function textures(selected, hovering) { - return hovering ? HOVER_TEXTURES : selected ? SELECTED_TEXTURES : UNSELECTED_TEXTURES; - } // so we don't have to traverse the overlays to get the last one var lastHoveringId = 0; ExtendedOverlay.prototype.hover = function (hovering) { @@ -223,9 +195,6 @@ var selectionDisplay = null; // for gridTool.js to ignore lastHoveringId = 0; } this.editOverlay({ color: color(this.selected, hovering) }); - if (this.model) { - this.model.editOverlay({ textures: textures(this.selected, hovering) }); - } if (hovering) { // un-hover the last hovering overlay if (lastHoveringId && lastHoveringId !== this.key) { @@ -240,15 +209,12 @@ var selectionDisplay = null; // for gridTool.js to ignore } this.editOverlay({ color: color(selected, this.hovering) }); - if (this.model) { - this.model.editOverlay({ textures: textures(selected) }); - } this.selected = selected; }; // Class methods: - var selectedIds = []; + var selectedId = false; ExtendedOverlay.isSelected = function (id) { - return -1 !== selectedIds.indexOf(id); + return selectedId === id; }; ExtendedOverlay.get = function (key) { // answer the extended overlay data object associated with the given avatar identifier return overlays[key]; @@ -285,51 +251,14 @@ var selectionDisplay = null; // for gridTool.js to ignore }); }; - function HighlightedEntity(id, entityProperties) { - this.id = id; - this.overlay = Overlays.addOverlay('cube', { - position: entityProperties.position, - rotation: entityProperties.rotation, - dimensions: entityProperties.dimensions, - solid: false, - color: { - red: 0xF3, - green: 0x91, - blue: 0x29 - }, - ignoreRayIntersection: true, - drawInFront: false // Arguable. For now, let's not distract with mysterious wires around the scene. - }); - HighlightedEntity.overlays.push(this); - } - HighlightedEntity.overlays = []; - HighlightedEntity.clearOverlays = function clearHighlightedEntities() { - HighlightedEntity.overlays.forEach(function (highlighted) { - Overlays.deleteOverlay(highlighted.overlay); - }); - HighlightedEntity.overlays = []; - }; - HighlightedEntity.updateOverlays = function updateHighlightedEntities() { - HighlightedEntity.overlays.forEach(function (highlighted) { - var properties = Entities.getEntityProperties(highlighted.id, ['position', 'rotation', 'dimensions']); - Overlays.editOverlay(highlighted.overlay, { - position: properties.position, - rotation: properties.rotation, - dimensions: properties.dimensions - }); - }); - }; - - function addAvatarNode(id) { - var selected = ExtendedOverlay.isSelected(id); return new ExtendedOverlay(id, "sphere", { drawInFront: true, solid: true, alpha: 0.8, - color: color(selected, false), + color: color(false, false), ignoreRayIntersection: false - }, selected, !conserveResources); + }); } var pingPong = true; @@ -368,14 +297,6 @@ var selectionDisplay = null; // for gridTool.js to ignore position: target, dimensions: 0.032 * distance }); - if (overlay.model) { - overlay.model.ping = pingPong; - overlay.model.editOverlay({ - position: target, - scale: 0.2 * distance, // constant apparent size - rotation: Camera.orientation - }); - } }); pingPong = !pingPong; ExtendedOverlay.some(function (overlay) { // Remove any that weren't updated. (User is gone.) @@ -383,13 +304,10 @@ var selectionDisplay = null; // for gridTool.js to ignore overlay.deleteOverlay(); } }); - // We could re-populateNearbyUserList if anything added or removed, but not for now. - HighlightedEntity.updateOverlays(); } function removeOverlays() { - selectedIds = []; + selectedId = false; lastHoveringId = 0; - HighlightedEntity.clearOverlays(); ExtendedOverlay.some(function (overlay) { overlay.deleteOverlay(); }); @@ -399,7 +317,7 @@ var selectionDisplay = null; // for gridTool.js to ignore // Clicks. // function usernameFromIDReply(id, username, machineFingerprint, isAdmin) { - if (selectedIds[0] === id) { + if (selectedId === id) { var message = { method: 'updateSelectedRecipientUsername', userName: username === "" ? "unknown username" : username @@ -411,13 +329,13 @@ var selectionDisplay = null; // for gridTool.js to ignore ExtendedOverlay.applyPickRay(pickRay, function (overlay) { var nextSelectedStatus = !overlay.selected; var avatarId = overlay.key; - selectedIds = nextSelectedStatus ? [avatarId] : []; + selectedId = nextSelectedStatus ? avatarId : false; if (nextSelectedStatus) { Users.requestUsernameFromID(avatarId); } var message = { method: 'selectRecipient', - id: [avatarId], + id: avatarId, isSelected: nextSelectedStatus, displayName: '"' + AvatarList.getAvatar(avatarId).sessionDisplayName + '"', userName: '' @@ -430,24 +348,6 @@ var selectionDisplay = null; // for gridTool.js to ignore overlay.select(selected); }); - HighlightedEntity.clearOverlays(); - if (selectedIds.length) { - Entities.findEntitiesInFrustum(Camera.frustum).forEach(function (id) { - // Because lastEditedBy is per session, the vast majority of entities won't match, - // so it would probably be worth reducing marshalling costs by asking for just we need. - // However, providing property name(s) is advisory and some additional properties are - // included anyway. As it turns out, asking for 'lastEditedBy' gives 'position', 'rotation', - // and 'dimensions', too, so we might as well make use of them instead of making a second - // getEntityProperties call. - // It would be nice if we could harden this against future changes by specifying all - // and only these four in an array, but see - // https://highfidelity.fogbugz.com/f/cases/2728/Entities-getEntityProperties-id-lastEditedBy-name-lastEditedBy-doesn-t-work - var properties = Entities.getEntityProperties(id, 'lastEditedBy'); - if (ExtendedOverlay.isSelected(properties.lastEditedBy)) { - new HighlightedEntity(id, properties); - } - }); - } return true; }); } From e3b14bf4786a5671d47cefc8109418b987439dcf Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 26 Apr 2018 15:57:37 -0700 Subject: [PATCH 3/4] MS14295: Fix lingering Gifts UI Bugs --- .../commerce/common/sendAsset/SendAsset.qml | 126 +++++++++++++++--- 1 file changed, 106 insertions(+), 20 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml b/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml index 8bf3a22338..567ccb57f8 100644 --- a/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml +++ b/interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml @@ -258,7 +258,9 @@ Item { anchors.topMargin: 26; anchors.left: parent.left; anchors.leftMargin: 20; - width: paintedWidth; + anchors.right: parent.right; + anchors.rightMargin: 20; + elide: Text.ElideRight; height: 30; // Text size size: 22; @@ -844,7 +846,7 @@ Item { property string selectedRecipientUserName; property string selectedRecipientProfilePic; - visible: root.currentActiveView === "sendAssetStep"; + visible: root.currentActiveView === "sendAssetStep" || paymentSuccess.visible || paymentFailure.visible; anchors.fill: parent; anchors.topMargin: root.parentAppTitleBarHeight; @@ -856,7 +858,9 @@ Item { anchors.topMargin: 26; anchors.left: parent.left; anchors.leftMargin: 20; - width: paintedWidth; + anchors.right: parent.right; + anchors.rightMargin: 20; + elide: Text.ElideRight; height: 30; // Text size size: 22; @@ -907,7 +911,7 @@ Item { // "CHANGE" button HifiControlsUit.Button { id: changeButton; - color: root.assetName === "" ? hifi.buttons.none : hifi.buttons.noneBorderlessGray; + color: root.assetName === "" ? hifi.buttons.none : hifi.buttons.white; colorScheme: hifi.colorSchemes.dark; anchors.right: parent.right; anchors.verticalCenter: parent.verticalCenter; @@ -1238,7 +1242,7 @@ Item { // Sending Asset Overlay START Rectangle { id: sendingAssetOverlay; - z: 998; + z: 999; visible: root.isCurrentlySendingAsset; anchors.fill: parent; @@ -1281,26 +1285,43 @@ Item { // Payment Success BEGIN Rectangle { id: paymentSuccess; + z: 998; visible: root.currentActiveView === "paymentSuccess"; anchors.fill: parent; color: Qt.rgba(0.0, 0.0, 0.0, 0.8); + // This object is always used in a popup or full-screen Wallet section. + // This MouseArea is used to prevent a user from being + // able to click on a button/mouseArea underneath the popup/section. + MouseArea { + anchors.fill: parent; + propagateComposedEvents: false; + hoverEnabled: true; + } + Rectangle { - anchors.centerIn: parent; - width: parent.width - 30; - height: parent.height - 30; + anchors.top: parent.top; + anchors.topMargin: root.assetName === "" ? 15 : 150; + anchors.left: parent.left; + anchors.leftMargin: root.assetName === "" ? 15 : 50; + anchors.right: parent.right; + anchors.rightMargin: root.assetName === "" ? 15 : 50; + anchors.bottom: parent.bottom; + anchors.bottomMargin: root.assetName === "" ? 15 : 300; color: "#FFFFFF"; RalewaySemiBold { id: paymentSentText; - text: root.assetName === "" ? "Payment Sent" : '"' + root.assetName + '"'; + text: root.assetName === "" ? "Payment Sent" : "Gift Sent"; // Anchors anchors.top: parent.top; anchors.topMargin: 26; anchors.left: parent.left; anchors.leftMargin: 20; - width: paintedWidth; + anchors.right: parent.right; + anchors.rightMargin: 20; + elide: Text.ElideRight; height: 30; // Text size size: 22; @@ -1310,6 +1331,7 @@ Item { HiFiGlyphs { id: closeGlyphButton_paymentSuccess; + visible: root.assetName === ""; text: hifi.glyphs.close; color: hifi.colors.lightGrayText; size: 26; @@ -1375,6 +1397,48 @@ Item { isDisplayingNearby: sendAssetStep.referrer === "nearby"; } } + + + Item { + id: giftContainer_paymentSuccess; + visible: root.assetName !== ""; + anchors.top: sendToContainer_paymentSuccess.bottom; + anchors.topMargin: 16; + anchors.left: parent.left; + anchors.leftMargin: 20; + anchors.right: parent.right; + anchors.rightMargin: 20; + height: 80; + + RalewaySemiBold { + id: gift_paymentSuccess; + text: "Gift:"; + // Anchors + anchors.top: parent.top; + anchors.left: parent.left; + anchors.bottom: parent.bottom; + width: 90; + // Text size + size: 18; + // Style + color: hifi.colors.baseGray; + verticalAlignment: Text.AlignVCenter; + } + + RalewaySemiBold { + text: root.assetName; + // Anchors + anchors.top: parent.top; + anchors.left: gift_paymentSuccess.right; + anchors.right: parent.right; + // Text size + size: 18; + // Style + elide: Text.ElideRight; + color: hifi.colors.baseGray; + verticalAlignment: Text.AlignVCenter; + } + } Item { id: amountContainer_paymentSuccess; @@ -1433,6 +1497,7 @@ Item { RalewaySemiBold { id: optionalMessage_paymentSuccess; + visible: root.assetName === ""; text: optionalMessage.text; // Anchors anchors.top: amountContainer_paymentSuccess.visible ? amountContainer_paymentSuccess.bottom : sendToContainer_paymentSuccess.bottom; @@ -1476,26 +1541,43 @@ Item { // Payment Failure BEGIN Rectangle { id: paymentFailure; + z: 998; visible: root.currentActiveView === "paymentFailure"; anchors.fill: parent; color: Qt.rgba(0.0, 0.0, 0.0, 0.8); + // This object is always used in a popup or full-screen Wallet section. + // This MouseArea is used to prevent a user from being + // able to click on a button/mouseArea underneath the popup/section. + MouseArea { + anchors.fill: parent; + propagateComposedEvents: false; + hoverEnabled: true; + } + Rectangle { - anchors.centerIn: parent; - width: parent.width - 30; - height: parent.height - 30; + anchors.top: parent.top; + anchors.topMargin: root.assetName === "" ? 15 : 150; + anchors.left: parent.left; + anchors.leftMargin: root.assetName === "" ? 15 : 50; + anchors.right: parent.right; + anchors.rightMargin: root.assetName === "" ? 15 : 50; + anchors.bottom: parent.bottom; + anchors.bottomMargin: root.assetName === "" ? 15 : 300; color: "#FFFFFF"; RalewaySemiBold { id: paymentFailureText; - text: root.assetName === "" ? "Payment Failed" : '"' + root.assetName + '"'; + text: root.assetName === "" ? "Payment Failed" : "Failed"; // Anchors anchors.top: parent.top; anchors.topMargin: 26; anchors.left: parent.left; anchors.leftMargin: 20; - width: paintedWidth; + anchors.right: parent.right; + anchors.rightMargin: 20; + elide: Text.ElideRight; height: 30; // Text size size: 22; @@ -1505,6 +1587,7 @@ Item { HiFiGlyphs { id: closeGlyphButton_paymentFailure; + visible: root.assetName === ""; text: hifi.glyphs.close; color: hifi.colors.lightGrayText; size: 26; @@ -1551,6 +1634,7 @@ Item { Item { id: sendToContainer_paymentFailure; + visible: root.assetName === ""; anchors.top: paymentFailureDetailText.bottom; anchors.topMargin: 8; anchors.left: parent.left; @@ -1645,7 +1729,8 @@ Item { } RalewaySemiBold { - id: optionalMessage_paymentFailuire; + id: optionalMessage_paymentFailure; + visible: root.assetName === ""; text: optionalMessage.text; // Anchors anchors.top: amountContainer_paymentFailure.visible ? amountContainer_paymentFailure.bottom : sendToContainer_paymentFailure.bottom; @@ -1663,14 +1748,15 @@ Item { verticalAlignment: Text.AlignTop; } - // "Close" button + // "Cancel" button HifiControlsUit.Button { id: closeButton_paymentFailure; color: hifi.buttons.noneBorderless; colorScheme: root.assetName === "" ? hifi.colorSchemes.dark : hifi.colorSchemes.light; - anchors.horizontalCenter: parent.horizontalCenter; + anchors.right: retryButton_paymentFailure.left; + anchors.rightMargin: 12; anchors.bottom: parent.bottom; - anchors.bottomMargin: 80; + anchors.bottomMargin: root.assetName === "" ? 80 : 30; height: 50; width: 120; text: "Cancel"; @@ -1691,7 +1777,7 @@ Item { anchors.right: parent.right; anchors.rightMargin: 12; anchors.bottom: parent.bottom; - anchors.bottomMargin: 80; + anchors.bottomMargin: root.assetName === "" ? 80 : 30; height: 50; width: 120; text: "Retry"; From e9ac581309d7d5e5ac146da2c9480dc0922cc3a8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Apr 2018 16:31:31 -0700 Subject: [PATCH 4/4] update RC67 serverless content to include default path --- cmake/externals/serverless-content/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/externals/serverless-content/CMakeLists.txt b/cmake/externals/serverless-content/CMakeLists.txt index 916421c68a..cad6d40b49 100644 --- a/cmake/externals/serverless-content/CMakeLists.txt +++ b/cmake/externals/serverless-content/CMakeLists.txt @@ -4,8 +4,8 @@ set(EXTERNAL_NAME serverless-content) ExternalProject_Add( ${EXTERNAL_NAME} - URL http://cdn.highfidelity.com/content-sets/serverless-tutorial-RC67-v3.zip - URL_MD5 327292eb87bc249cbb4d670d8a6ce746 + URL http://cdn.highfidelity.com/content-sets/serverless-tutorial-RC67-v4.zip + URL_MD5 ba32aed18bfeaac4ccaf5ebb8ea3e804 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND ""