This commit is contained in:
howard-stearns 2018-07-16 16:28:44 -07:00
parent f1fed37763
commit 2c92b02b95
2 changed files with 71 additions and 70 deletions

View file

@ -1,3 +1,5 @@
"use strict";
/*global Tablet, Script*/
//
// libraries/appUi.js
//
@ -25,7 +27,6 @@ function AppUi(properties) {
and use isOpen, open(), and close() as needed.)
7. lint!
*/
var that = this;
function defaultButton(name, suffix) {
var base = that[name] || (that.buttonPrefix + suffix);
@ -38,7 +39,7 @@ function AppUi(properties) {
that.graphicsDirectory = "icons/tablet-icons/"; // Where to look for button svgs. See below.
that.checkIsOpen = function checkIsOpen(type, tabletUrl) { // Are we active? Value used to set isOpen.
return (type === that.type) && (tabletUrl.indexOf(that.home) >= 0); // Actual url may have prefix or suffix.
}
};
that.open = function open() { // How to open the app.
if (that.isQML()) {
that.tablet.loadQMLSource(that.home);
@ -62,7 +63,7 @@ function AppUi(properties) {
};
that.isQML = function isQML() { // We set type property in onClick.
return that.type === 'QML';
}
};
that.eventSignal = function eventSignal() { // What signal to hook onMessage to.
return that.isQML() ? that.tablet.fromQml : that.tablet.webEventReceived;
};
@ -90,58 +91,58 @@ function AppUi(properties) {
that.onScreenChanged = function onScreenChanged(type, url) {
// Set isOpen, wireEventBridge, set buttonActive as appropriate,
// and finally call onOpened() or onClosed() IFF defined.
console.debug(that.buttonName, 'onScreenChanged', type, url, that.isOpen);
console.debug(that.buttonName, 'onScreenChanged', type, url, that.isOpen);
if (that.checkIsOpen(type, url)) {
if (!that.isOpen) {
that.wireEventBridge(true);
that.buttonActive(true);
if (that.onOpened) {
that.onOpened();
}
that.isOpen = true;
}
if (!that.isOpen) {
that.wireEventBridge(true);
that.buttonActive(true);
if (that.onOpened) {
that.onOpened();
}
that.isOpen = true;
}
} else { // Not us. Should we do something for type Home, Menu, and particularly Closed (meaning tablet hidden?
if (that.isOpen) {
that.wireEventBridge(false);
that.buttonActive(false);
if (that.onClosed) {
that.onClosed();
}
that.isOpen = false;
}
if (that.isOpen) {
that.wireEventBridge(false);
that.buttonActive(false);
if (that.onClosed) {
that.onClosed();
}
that.isOpen = false;
}
}
};
that.hasEventBridge = false;
// HTML event bridge uses strings, not objects. Here we abstract over that.
// (Although injected javascript still has to use JSON.stringify/JSON.parse.)
that.sendToHtml = function (messageObject) { that.tablet.emitScriptEvent(JSON.stringify(messageObject)); };
that.fromHtml = function (messageString) { that.onMessage(JSON.parse(messageString)); }
that.fromHtml = function (messageString) { that.onMessage(JSON.parse(messageString)); };
that.wireEventBridge = function wireEventBridge(on) {
// Uniquivocally sets that.sendMessage(messageObject) to do the right thing.
// Sets hasEventBridge and wires onMessage to eventSignal as appropriate, IFF onMessage defined.
var isQml = that.isQML();
console.debug(that.buttonName, 'wireEventBridge', on, that.hasEventBridge);
// Outbound (always, regardless of whether there is an inbound handler).
if (on) {
that.sendMessage = isQml ? that.tablet.sendToQml : that.sendToHtml;
} else {
that.sendMessage = that.ignore;
}
// Uniquivocally sets that.sendMessage(messageObject) to do the right thing.
// Sets hasEventBridge and wires onMessage to eventSignal as appropriate, IFF onMessage defined.
var handler, isQml = that.isQML();
console.debug(that.buttonName, 'wireEventBridge', on, that.hasEventBridge);
// Outbound (always, regardless of whether there is an inbound handler).
if (on) {
that.sendMessage = isQml ? that.tablet.sendToQml : that.sendToHtml;
} else {
that.sendMessage = that.ignore;
}
if (!that.onMessage) { return; }
if (!that.onMessage) { return; }
// Inbound
var handler = isQml ? that.onMessage : that.fromHtml;
// Inbound
handler = isQml ? that.onMessage : that.fromHtml;
if (on) {
if (!that.hasEventBridge) {
console.debug(that.buttonName, 'connecting', that.eventSignal());
console.debug(that.buttonName, 'connecting', that.eventSignal());
that.eventSignal().connect(handler);
that.hasEventBridge = true;
}
} else {
if (that.hasEventBridge) {
console.debug(that.buttonName, 'disconnecting', that.eventSignal());
console.debug(that.buttonName, 'disconnecting', that.eventSignal());
that.eventSignal().disconnect(handler);
that.hasEventBridge = false;
}
@ -150,31 +151,31 @@ function AppUi(properties) {
that.isOpen = false;
// To facilitate incremental development, only wire onClicked to do something when "home" is defined in properties.
that.onClicked = that.home
? function onClicked() {
// Call open() or close(), and reset type based on current home property.
? function onClicked() {
// Call open() or close(), and reset type based on current home property.
if (that.isOpen) {
that.close();
that.close();
} else {
that.type = /.qml$/.test(that.home) ? 'QML' : 'Web'
that.open();
that.type = /.qml$/.test(that.home) ? 'QML' : 'Web';
that.open();
}
} : that.ignore;
} : that.ignore;
that.onScriptEnding = function onScriptEnding() {
// Close if necessary, clean up any remaining handlers, and remove the button.
if (that.isOpen) {
that.close();
}
that.tablet.screenChanged.disconnect(that.onScreenChanged);
if (that.button) {
// Close if necessary, clean up any remaining handlers, and remove the button.
if (that.isOpen) {
that.close();
}
that.tablet.screenChanged.disconnect(that.onScreenChanged);
if (that.button) {
if (that.onClicked) {
that.button.clicked.disconnect(that.onClicked);
}
that.button.clicked.disconnect(that.onClicked);
}
that.tablet.removeButton(that.button);
}
}
};
// Set up the handlers.
that.tablet.screenChanged.connect(that.onScreenChanged);
that.tablet.screenChanged.connect(that.onScreenChanged);
that.button.clicked.connect(that.onClicked);
Script.scriptEnding.connect(that.onScriptEnding);
};
}
module.exports = AppUi;

View file

@ -12,10 +12,10 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
(function() { // BEGIN LOCAL_SCOPE
(function () { // BEGIN LOCAL_SCOPE
var request = Script.require('request').request;
var AppUi = Script.require('appUi');
var request = Script.require('request').request;
var AppUi = Script.require('appUi');
var populateNearbyUserList, color, textures, removeOverlays,
controllerComputePickRay, off,
@ -41,6 +41,7 @@ var HOVER_TEXTURES = {
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}; // almost white for now
var METAVERSE_BASE = Account.metaverseServerURL;
Script.include("/~/system/libraries/controllers.js");
@ -222,7 +223,7 @@ function convertDbToLinear(decibels) {
return Math.pow(2, decibels / 10.0);
}
function fromQml(message) { // messages are {method, params}, like json-rpc. See also sendToQml.
var data;
var data, connectionUserName, friendUserName;
switch (message.method) {
case 'selected':
selectedIds = message.params;
@ -282,7 +283,7 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
}
getConnectionData(false);
});
break
break;
case 'removeFriend':
friendUserName = message.params;
@ -297,7 +298,7 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
}
getConnectionData(friendUserName);
});
break
break;
case 'addFriend':
friendUserName = message.params;
print("Adding " + friendUserName + " to friends.");
@ -308,17 +309,17 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
body: {
username: friendUserName,
}
}, function (error, response) {
if (error || (response.status !== 'success')) {
print("Error: unable to friend " + friendUserName, error || response.status);
return;
}
getConnectionData(friendUserName);
}, function (error, response) {
if (error || (response.status !== 'success')) {
print("Error: unable to friend " + friendUserName, error || response.status);
return;
}
);
getConnectionData(friendUserName);
}
);
break;
case 'http.request':
break; // Handled by request-service.
break; // Handled by request-service.
default:
print('Unrecognized message from Pal.qml:', JSON.stringify(message));
}
@ -335,7 +336,6 @@ function updateUser(data) {
// User management services
//
// These are prototype versions that will be changed when the back end changes.
var METAVERSE_BASE = Account.metaverseServerURL;
function requestJSON(url, callback) { // callback(data) if successfull. Logs otherwise.
request({
@ -363,7 +363,7 @@ function getProfilePicture(username, callback) { // callback(url) if successfull
});
}
function getAvailableConnections(domain, callback) { // callback([{usename, location}...]) if successfull. (Logs otherwise)
url = METAVERSE_BASE + '/api/v1/users?per_page=400&'
var url = METAVERSE_BASE + '/api/v1/users?per_page=400&';
if (domain) {
url += 'status=' + domain.slice(1, -1); // without curly braces
} else {
@ -374,7 +374,7 @@ function getAvailableConnections(domain, callback) { // callback([{usename, loca
});
}
function getInfoAboutUser(specificUsername, callback) {
url = METAVERSE_BASE + '/api/v1/users?filter=connections'
var url = METAVERSE_BASE + '/api/v1/users?filter=connections';
requestJSON(url, function (connectionsData) {
for (user in connectionsData.users) {
if (connectionsData.users[user].username === specificUsername) {