From 7c92ad5ced50629060b80f844c84c401302dbae2 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Tue, 13 Dec 2016 09:15:28 -0800 Subject: [PATCH] checkpoint --- interface/resources/qml/hifi/NameCard.qml | 7 +- scripts/system/pal.js | 108 +++++++++++++++++++--- 2 files changed, 97 insertions(+), 18 deletions(-) diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml index 2c25f871b3..ffb42d2fff 100644 --- a/interface/resources/qml/hifi/NameCard.qml +++ b/interface/resources/qml/hifi/NameCard.qml @@ -15,9 +15,8 @@ import "../styles-uit" Column { - visible: !isCheckBox; - property string displayName: styleData.value; - property string userName: model.userName; + property string displayName: ""; + property string userName: ""; property int displayTextHeight: 18; property int usernameTextHeight: 12; @@ -28,7 +27,7 @@ Column { width: parent.width; } RalewayLight { - visible: styleData.value; + visible: parent.displayName; text: parent.userName; size: parent.usernameTextHeight; elide: Text.ElideRight; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 87ca7ac61a..d2527d8434 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -1,3 +1,6 @@ +"use strict"; +/*jslint vars: true, plusplus: true, forin: true*/ +/*globals Script, AvatarList, Camera, Overlays, OverlayWindow, Toolbars, Vec3, Controller, print */ // // pal.js // @@ -10,22 +13,74 @@ // FIXME: (function() { // BEGIN LOCAL_SCOPE +// Overlays +var overlays = {}; // Keeps track of all our extended overlay data objects, keyed by target identifier. +function ExtendedOverlay(key, type, properties) { // A wrapper around overlays to store the key it is associated with. + overlays[key] = this; + this.key = key; + this.unselectedOverlay = Overlays.addOverlay(type, properties); +} +// Instance methods: +ExtendedOverlay.prototype.deleteOverlay = function () { // remove display and data of this overlay + Overlays.deleteOverlay(this.unselectedOverlay); + if (this.selected) { + Overlays.deleteOverlay(this.selectedOverlay); + } + delete overlays[this.key]; +}; +ExtendedOverlay.prototype.editOverlay = function (properties) { // change display of this overlay + Overlays.editOverlay(this.selected ? this.selectedOverlay : this.unselectedOverlay, properties); +}; +ExtendedOverlay.prototype.select = function (selected, type, initialProperties) { + if (selected && !this.selectedOverlay) { + this.selectedOverlay = Overlays.addOverlay(type, initialProperties); + } + this.selected = selected; + Overlays.editOverlay(this.unselectedOverlay, {visible: !selected}); + Overlays.editOverlay(this.selectedOverlay, {visible: selected}); +}; +// Class methods: +ExtendedOverlay.get = function (key) { // answer the extended overlay data object associated with the given avatar identifier + return overlays[key]; +}; +ExtendedOverlay.some = function (iterator) { // Bails early as soon as iterator returns truthy. + var key; + for (key in overlays) { + if (iterator(ExtendedOverlay.get(key))) { + return; + } + } +}; +ExtendedOverlay.applyPickRay = function (pickRay, cb) { // cb(overlay) on the one overlay intersected by pickRay, if any. + var pickedOverlay = Overlays.findRayIntersection(pickRay); // Depends on nearer coverOverlays to extend closer to us than farther ones. + if (!pickedOverlay.intersects) { + return; + } + ExtendedOverlay.some(function (overlay) { // See if pickedOverlay is one of ours. + if ((overlay.selected ? overlay.selectedOverlay : overlay.unselectedOverlay) === pickedOverlay.overlayID) { + cb(overlay); + return true; + } + }); +}; + + var pal = new OverlayWindow({ - title: 'People Action List', - source: Script.resolvePath('../../resources/qml/hifi/Pal.qml'), + title: 'People Action List', + source: Script.resolvePath('../../qml/hifi/Pal.qml'), width: 480, - height: 640, + height: 640, visible: false }); +var AVATAR_OVERLAY = Script.resolvePath("assets/images/grabsprite-3.png"); function populateUserList() { - var data = [ - { - displayName: "Dummy Debugging User", - userName: "foo.bar", - sessionId: 'XXX' - } - ]; + var data = []; + /*data.push({ // Create an extra user for debugging. + displayName: "Dummy Debugging User", + userName: "foo.bar", + sessionId: 'XXX' + })*/ var counter = 1; AvatarList.getAvatarIdentifiers().forEach(function (id) { var avatar = AvatarList.getAvatar(id); @@ -34,13 +89,36 @@ function populateUserList() { userName: "fakeAcct" + (id || "Me"), sessionId: id }); + if (id) { // No overlay for us + new ExtendedOverlay(id, "image3d", { // 3d so we don't go cross-eyed looking at it, but on top of everything + imageURL: AVATAR_OVERLAY, + drawInFront: true + }); + } }); pal.sendToQml(data); } +function updateOverlays() { + //var eye = Camera.position; + AvatarList.getAvatarIdentifiers().forEach(function (id) { + if (!id) { + return; // don't update ourself + } + var avatar = AvatarList.getAvatar(id); + var target = avatar.position; + //var distance = Vec3.distance(target, eye); + ExtendedOverlay.get(id).editOverlay({ + position: target + }); + }); +} +function removeOverlays() { + ExtendedOverlay.some(function (overlay) { overlay.deleteOverlay(); }); +} - +// Manage the connection between the button and the window. var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); -var buttonName = "pal"; +var buttonName = "pal"; var button = toolBar.addButton({ objectName: buttonName, imageURL: Script.resolvePath("assets/images/tools/ignore.svg"), @@ -50,11 +128,14 @@ var button = toolBar.addButton({ buttonState: 1, alpha: 0.9 }); - function onClicked() { if (!pal.visible) { populateUserList(); pal.raise(); + Script.update.connect(updateOverlays); + } else { + Script.update.disconnect(updateOverlays); + removeOverlays(); } pal.setVisible(!pal.visible); } @@ -63,7 +144,6 @@ function onVisibileChanged() { button.writeProperty('defaultState', pal.visible ? 0 : 1); button.writeProperty('hoverState', pal.visible ? 2 : 3); } - button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibileChanged);