From d25d3bc6abe25c9db6a9d90ec6dc0b99716e4bf8 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 9 Mar 2015 19:34:46 -0700 Subject: [PATCH 01/17] Get users online from Web API --- examples/users.js | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 examples/users.js diff --git a/examples/users.js b/examples/users.js new file mode 100644 index 0000000000..4b56fce505 --- /dev/null +++ b/examples/users.js @@ -0,0 +1,60 @@ +// +// users.js +// examples +// +// Created by David Rowe on 9 Mar 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 +// + +var usersWindow = (function () { + + var API_URL = "https://metaverse.highfidelity.io/api/v1/users?status=online", + HTTP_GET_TIMEOUT = 60000, // ms = 1 minute + usersRequest, + processUsers, + usersTimedOut, + usersTimer, + UPDATE_TIMEOUT = 1000; // ms = 1s + + function requestUsers() { + usersRequest = new XMLHttpRequest(); + usersRequest.open("GET", API_URL, true); + usersRequest.timeout = HTTP_GET_TIMEOUT * 1000; + usersRequest.ontimeout = usersTimedOut; + usersRequest.onreadystatechange = processUsers; + usersRequest.send(); + } + + processUsers = function () { + if (usersRequest.readyState === usersRequest.DONE) { + if (usersRequest.status === 200) { + // TODO: Process users data + } else { + print("Error: Request for users status returned " + usersRequest.status + " " + usersRequest.statusText); + } + + usersTimer = Script.setTimeout(requestUsers, UPDATE_TIMEOUT); // Update while after finished processing. + } + }; + + usersTimedOut = function () { + print("Error: Request for users status timed out"); + usersTimer = Script.setTimeout(requestUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay. + }; + + function setUp() { + + requestUsers(); + } + + function tearDown() { + Script.clearTimeout(usersTimer); + + } + + setUp(); + Script.scriptEnding.connect(tearDown); +}()); From 63d8da0233ad634fc908723601cfd692a988b8e0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 9 Mar 2015 22:29:24 -0700 Subject: [PATCH 02/17] Display user names in 2D window --- examples/users.js | 103 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/examples/users.js b/examples/users.js index 4b56fce505..1ee5a59115 100644 --- a/examples/users.js +++ b/examples/users.js @@ -11,13 +11,77 @@ var usersWindow = (function () { - var API_URL = "https://metaverse.highfidelity.io/api/v1/users?status=online", + var WINDOW_BOUNDS_2D = { x: 100, y: 100, width: 300, height: 200 }, + WINDOW_MARGIN_2D = 12, + WINDOW_FOREGROUND_COLOR_2D = { red: 240, green: 240, blue: 240 }, + WINDOW_FOREGROUND_ALPHA_2D = 0.9, + WINDOW_BACKGROUND_COLOR_2D = { red: 120, green: 120, blue: 120 }, + WINDOW_BACKGROUND_ALPHA_2D = 0.7, + usersPane2D, + USERS_PANE_TEXT_WIDTH_2D = WINDOW_BOUNDS_2D.width - 2 * WINDOW_MARGIN_2D, + USERS_FONT_2D = { size: 14 }, + USERNAME_SPACER = "\u00a0\u00a0\u00a0\u00a0", // Nonbreaking spaces + usernameSpacerWidth2D, + + usersOnline, + usersInLines = [], // 2D array of lines of users + + API_URL = "https://metaverse.highfidelity.io/api/v1/users?status=online", HTTP_GET_TIMEOUT = 60000, // ms = 1 minute usersRequest, processUsers, usersTimedOut, usersTimer, - UPDATE_TIMEOUT = 1000; // ms = 1s + UPDATE_TIMEOUT = 5000; // ms = 5s + + function updateWindow() { + var displayText = "", + numUsersDisplayed = 0, + lineText = "", + lineWidth = 0, + myUsername = GlobalServices.myUsername, + usernameWidth, + user, + i; + + usersInLines = []; + + for (i = 0; i < usersOnline.length; i += 1) { + user = usersOnline[i]; + if (user.username !== myUsername && user.online) { + usernameWidth = Overlays.textSize(usersPane2D, user.username).width; + + if (usersInLines.length === 0 || lineWidth + usernameSpacerWidth2D + usernameWidth > USERS_PANE_TEXT_WIDTH_2D) { + displayText += "\n" + lineText; + + // New line + usersInLines.push([i]); // New array in new line or userLines array + usersOnline[i].leftX = 0; // Augment usersOnline data + usersOnline[i].rightX = usernameWidth; + + lineText = user.username; + lineWidth = usernameWidth; + + } else { + // Append + usersInLines[usersInLines.length - 1].push(i); + + usersOnline[i].leftX = lineWidth + usernameSpacerWidth2D; + usersOnline[i].rightX = lineWidth + usernameSpacerWidth2D + usernameWidth; + + lineText += USERNAME_SPACER + user.username; + lineWidth = usersOnline[i].rightX; + } + + numUsersDisplayed += 1; + } + } + + displayText += "\n" + lineText; + displayText = displayText.slice(2); // Remove leading "\n"s. + + Overlays.editOverlay(usersPane2D, { text: numUsersDisplayed > 0 ? displayText : "No users online" }); + } function requestUsers() { usersRequest = new XMLHttpRequest(); @@ -29,14 +93,29 @@ var usersWindow = (function () { } processUsers = function () { + var response; + if (usersRequest.readyState === usersRequest.DONE) { if (usersRequest.status === 200) { - // TODO: Process users data + response = JSON.parse(usersRequest.responseText); + if (response.status !== "success") { + print("Error: Request for users status returned status = " + response.status); + usersTimer = Script.setTimeout(requestUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay. + return; + } + if (!response.hasOwnProperty("data") || !response.data.hasOwnProperty("users")) { + print("Error: Request for users status returned invalid data"); + usersTimer = Script.setTimeout(requestUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay. + return; + } + + usersOnline = response.data.users; + updateWindow(); } else { print("Error: Request for users status returned " + usersRequest.status + " " + usersRequest.statusText); } - usersTimer = Script.setTimeout(requestUsers, UPDATE_TIMEOUT); // Update while after finished processing. + usersTimer = Script.setTimeout(requestUsers, UPDATE_TIMEOUT); // Update after finished processing. } }; @@ -46,13 +125,27 @@ var usersWindow = (function () { }; function setUp() { + usersPane2D = Overlays.addOverlay("text", { + bounds: WINDOW_BOUNDS_2D, + topMargin: WINDOW_MARGIN_2D, + leftMargin: WINDOW_MARGIN_2D, + color: WINDOW_FOREGROUND_COLOR_2D, + alpha: WINDOW_FOREGROUND_ALPHA_2D, + backgroundColor: WINDOW_BACKGROUND_COLOR_2D, + backgroundAlpha: WINDOW_BACKGROUND_ALPHA_2D, + text: "", + font: USERS_FONT_2D, + visible: true + }); + + usernameSpacerWidth2D = Overlays.textSize(usersPane2D, USERNAME_SPACER).width; requestUsers(); } function tearDown() { Script.clearTimeout(usersTimer); - + Overlays.deleteOverlay(usersPane2D); } setUp(); From abb62fd8f974537dbd0e195d1852797ae749cb4d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 9 Mar 2015 22:29:54 -0700 Subject: [PATCH 03/17] Fix typo found in passing --- interface/src/ui/overlays/TextOverlay.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index 6387b42bc3..aea8487fd3 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -55,7 +55,7 @@ public: virtual TextOverlay* createClone() const; virtual QScriptValue getProperty(const QString& property); - QSizeF textSize(const QString& test) const; // Pixels + QSizeF textSize(const QString& text) const; // Pixels private: QString _text; From a4fe9c1a12e9a7d3983e129210d836d134fc47ed Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 10 Mar 2015 12:32:48 -0700 Subject: [PATCH 04/17] Click on username to TP to them --- examples/users.js | 70 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/examples/users.js b/examples/users.js index 1ee5a59115..edc9b0f28e 100644 --- a/examples/users.js +++ b/examples/users.js @@ -20,11 +20,13 @@ var usersWindow = (function () { usersPane2D, USERS_PANE_TEXT_WIDTH_2D = WINDOW_BOUNDS_2D.width - 2 * WINDOW_MARGIN_2D, USERS_FONT_2D = { size: 14 }, + usersLineHeight, + usersLineSpacing, USERNAME_SPACER = "\u00a0\u00a0\u00a0\u00a0", // Nonbreaking spaces usernameSpacerWidth2D, usersOnline, - usersInLines = [], // 2D array of lines of users + linesOfUserIndexes = [], // 2D array of lines of indexes into usersOnline API_URL = "https://metaverse.highfidelity.io/api/v1/users?status=online", HTTP_GET_TIMEOUT = 60000, // ms = 1 minute @@ -34,29 +36,75 @@ var usersWindow = (function () { usersTimer, UPDATE_TIMEOUT = 5000; // ms = 5s + function onMousePressEvent(event) { + var clickedOverlay, + numLinesBefore, + overlayX, + overlayY, + minY, + maxY, + lineClicked, + i, + userIndex, + foundUser; + + clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); + if (clickedOverlay === usersPane2D) { + overlayX = event.x - WINDOW_BOUNDS_2D.x - WINDOW_MARGIN_2D; + overlayY = event.y - WINDOW_BOUNDS_2D.y - WINDOW_MARGIN_2D; + + numLinesBefore = Math.floor(overlayY / (usersLineHeight + usersLineSpacing)); + minY = numLinesBefore * (usersLineHeight + usersLineSpacing); + maxY = minY + usersLineHeight; + + lineClicked = -1; + if (minY <= overlayY && overlayY <= maxY) { + lineClicked = numLinesBefore; + } + + if (0 <= lineClicked && lineClicked < linesOfUserIndexes.length) { + foundUser = false; + i = 0; + while (!foundUser && i < linesOfUserIndexes[lineClicked].length) { + userIndex = linesOfUserIndexes[lineClicked][i]; + foundUser = usersOnline[userIndex].leftX <= overlayX && overlayX <= usersOnline[userIndex].rightX; + i += 1; + } + + if (foundUser) { + location.goToUser(usersOnline[userIndex].username); + } + } + } + } + function updateWindow() { var displayText = "", numUsersDisplayed = 0, lineText = "", lineWidth = 0, - myUsername = GlobalServices.myUsername, + myUsername = GlobalServices.username, usernameWidth, user, i; - usersInLines = []; - + // Create 2D array of lines x IDs into usersOnline. + // Augment usersOnline entries with x-coordinates of left and right of displayed username. + linesOfUserIndexes = []; for (i = 0; i < usersOnline.length; i += 1) { user = usersOnline[i]; if (user.username !== myUsername && user.online) { + usernameWidth = Overlays.textSize(usersPane2D, user.username).width; - if (usersInLines.length === 0 || lineWidth + usernameSpacerWidth2D + usernameWidth > USERS_PANE_TEXT_WIDTH_2D) { + if (linesOfUserIndexes.length === 0 + || lineWidth + usernameSpacerWidth2D + usernameWidth > USERS_PANE_TEXT_WIDTH_2D) { + displayText += "\n" + lineText; // New line - usersInLines.push([i]); // New array in new line or userLines array - usersOnline[i].leftX = 0; // Augment usersOnline data + linesOfUserIndexes.push([i]); + usersOnline[i].leftX = 0; usersOnline[i].rightX = usernameWidth; lineText = user.username; @@ -64,8 +112,7 @@ var usersWindow = (function () { } else { // Append - usersInLines[usersInLines.length - 1].push(i); - + linesOfUserIndexes[linesOfUserIndexes.length - 1].push(i); usersOnline[i].leftX = lineWidth + usernameSpacerWidth2D; usersOnline[i].rightX = lineWidth + usernameSpacerWidth2D + usernameWidth; @@ -138,8 +185,13 @@ var usersWindow = (function () { visible: true }); + usersLineHeight = Math.floor(Overlays.textSize(usersPane2D, "1").height); + usersLineSpacing = Math.floor(Overlays.textSize(usersPane2D, "1\n2").height - 2 * usersLineHeight); + usernameSpacerWidth2D = Overlays.textSize(usersPane2D, USERNAME_SPACER).width; + Controller.mousePressEvent.connect(onMousePressEvent); + requestUsers(); } From 59762175e4f0e8b53ae8e28506b05d3305aa3a6f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 10 Mar 2015 12:44:34 -0700 Subject: [PATCH 05/17] Grow/shrink window as size of users list changes --- examples/users.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/users.js b/examples/users.js index edc9b0f28e..03ded27c6a 100644 --- a/examples/users.js +++ b/examples/users.js @@ -11,7 +11,7 @@ var usersWindow = (function () { - var WINDOW_BOUNDS_2D = { x: 100, y: 100, width: 300, height: 200 }, + var WINDOW_BOUNDS_2D = { x: 100, y: 100, width: 300, height: 0 }, WINDOW_MARGIN_2D = 12, WINDOW_FOREGROUND_COLOR_2D = { red: 240, green: 240, blue: 240 }, WINDOW_FOREGROUND_ALPHA_2D = 0.9, @@ -127,7 +127,11 @@ var usersWindow = (function () { displayText += "\n" + lineText; displayText = displayText.slice(2); // Remove leading "\n"s. - Overlays.editOverlay(usersPane2D, { text: numUsersDisplayed > 0 ? displayText : "No users online" }); + Overlays.editOverlay(usersPane2D, { + text: numUsersDisplayed > 0 ? displayText : "No users online", + height: (numUsersDisplayed > 0 ? linesOfUserIndexes.length : 1) * (usersLineHeight + usersLineSpacing) + - usersLineSpacing + 2 * WINDOW_MARGIN_2D + }); } function requestUsers() { From 4e8fcd47c0857aa2c59552c3d7e2527260d3edc0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 10 Mar 2015 13:51:25 -0700 Subject: [PATCH 06/17] Show/hide users window with menu item --- examples/users.js | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/examples/users.js b/examples/users.js index 03ded27c6a..7004805996 100644 --- a/examples/users.js +++ b/examples/users.js @@ -33,9 +33,15 @@ var usersWindow = (function () { usersRequest, processUsers, usersTimedOut, - usersTimer, + usersTimer = null, UPDATE_TIMEOUT = 5000; // ms = 5s + MENU_NAME = "Tools", + MENU_ITEM = "Users Online", + MENI_ITEM_AFTER = "Chat...", + + isVisible = false; + function onMousePressEvent(event) { var clickedOverlay, numLinesBefore, @@ -48,6 +54,10 @@ var usersWindow = (function () { userIndex, foundUser; + if (!isVisible) { + return; + } + clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); if (clickedOverlay === usersPane2D) { overlayX = event.x - WINDOW_BOUNDS_2D.x - WINDOW_MARGIN_2D; @@ -175,6 +185,27 @@ var usersWindow = (function () { usersTimer = Script.setTimeout(requestUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay. }; + function setVisible(visible) { + isVisible = visible; + + if (isVisible) { + if (usersTimer === null) { + requestUsers(); + } + } else { + Script.clearTimeout(usersTimer); + usersTimer = null; + } + + Overlays.editOverlay(usersPane2D, { visible: isVisible }); + } + + function onMenuItemEvent(event) { + if (event === MENU_ITEM) { + setVisible(Menu.isOptionChecked(MENU_ITEM)); + } + } + function setUp() { usersPane2D = Overlays.addOverlay("text", { bounds: WINDOW_BOUNDS_2D, @@ -186,7 +217,7 @@ var usersWindow = (function () { backgroundAlpha: WINDOW_BACKGROUND_ALPHA_2D, text: "", font: USERS_FONT_2D, - visible: true + visible: isVisible }); usersLineHeight = Math.floor(Overlays.textSize(usersPane2D, "1").height); @@ -196,10 +227,21 @@ var usersWindow = (function () { Controller.mousePressEvent.connect(onMousePressEvent); + Menu.addMenuItem({ + menuName: MENU_NAME, + menuItemName: MENU_ITEM, + afterItem: MENI_ITEM_AFTER, + isCheckable: true, + isChecked: isVisible + }); + Menu.menuItemEvent.connect(onMenuItemEvent); + requestUsers(); } function tearDown() { + Menu.removeMenuItem(MENU_NAME, MENU_ITEM); + Script.clearTimeout(usersTimer); Overlays.deleteOverlay(usersPane2D); } From d071bc50a48437bfa6431d6567dc2e63c3e40878 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 10 Mar 2015 17:20:08 -0700 Subject: [PATCH 07/17] Change from paragraph of usernames to single column of usernames --- examples/users.js | 78 ++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 59 deletions(-) diff --git a/examples/users.js b/examples/users.js index 7004805996..20693c220e 100644 --- a/examples/users.js +++ b/examples/users.js @@ -11,22 +11,21 @@ var usersWindow = (function () { - var WINDOW_BOUNDS_2D = { x: 100, y: 100, width: 300, height: 0 }, + var WINDOW_BOUNDS_2D = { x: 100, y: 100, width: 150, height: 0 }, WINDOW_MARGIN_2D = 12, WINDOW_FOREGROUND_COLOR_2D = { red: 240, green: 240, blue: 240 }, WINDOW_FOREGROUND_ALPHA_2D = 0.9, WINDOW_BACKGROUND_COLOR_2D = { red: 120, green: 120, blue: 120 }, WINDOW_BACKGROUND_ALPHA_2D = 0.7, usersPane2D, - USERS_PANE_TEXT_WIDTH_2D = WINDOW_BOUNDS_2D.width - 2 * WINDOW_MARGIN_2D, USERS_FONT_2D = { size: 14 }, usersLineHeight, usersLineSpacing, USERNAME_SPACER = "\u00a0\u00a0\u00a0\u00a0", // Nonbreaking spaces usernameSpacerWidth2D, - usersOnline, - linesOfUserIndexes = [], // 2D array of lines of indexes into usersOnline + usersOnline, // Raw data + linesOfUsers, // Array of indexes pointing into usersOnline API_URL = "https://metaverse.highfidelity.io/api/v1/users?status=online", HTTP_GET_TIMEOUT = 60000, // ms = 1 minute @@ -34,7 +33,7 @@ var usersWindow = (function () { processUsers, usersTimedOut, usersTimer = null, - UPDATE_TIMEOUT = 5000; // ms = 5s + UPDATE_TIMEOUT = 5000, // ms = 5s MENU_NAME = "Tools", MENU_ITEM = "Users Online", @@ -49,10 +48,7 @@ var usersWindow = (function () { overlayY, minY, maxY, - lineClicked, - i, - userIndex, - foundUser; + lineClicked; if (!isVisible) { return; @@ -72,74 +68,38 @@ var usersWindow = (function () { lineClicked = numLinesBefore; } - if (0 <= lineClicked && lineClicked < linesOfUserIndexes.length) { - foundUser = false; - i = 0; - while (!foundUser && i < linesOfUserIndexes[lineClicked].length) { - userIndex = linesOfUserIndexes[lineClicked][i]; - foundUser = usersOnline[userIndex].leftX <= overlayX && overlayX <= usersOnline[userIndex].rightX; - i += 1; - } + if (0 <= lineClicked && lineClicked < linesOfUsers.length + && overlayX <= usersOnline[linesOfUsers[lineClicked]].usernameWidth) { - if (foundUser) { - location.goToUser(usersOnline[userIndex].username); - } + print("Go to " + usersOnline[linesOfUsers[lineClicked]].username); + // DJRTODO + //location.goToUser(usersOnline[userIndex].username); } } } function updateWindow() { var displayText = "", - numUsersDisplayed = 0, - lineText = "", - lineWidth = 0, - myUsername = GlobalServices.username, - usernameWidth, + myUsername, user, i; - // Create 2D array of lines x IDs into usersOnline. - // Augment usersOnline entries with x-coordinates of left and right of displayed username. - linesOfUserIndexes = []; + myUsername = GlobalServices.username; + linesOfUsers = []; for (i = 0; i < usersOnline.length; i += 1) { user = usersOnline[i]; if (user.username !== myUsername && user.online) { - - usernameWidth = Overlays.textSize(usersPane2D, user.username).width; - - if (linesOfUserIndexes.length === 0 - || lineWidth + usernameSpacerWidth2D + usernameWidth > USERS_PANE_TEXT_WIDTH_2D) { - - displayText += "\n" + lineText; - - // New line - linesOfUserIndexes.push([i]); - usersOnline[i].leftX = 0; - usersOnline[i].rightX = usernameWidth; - - lineText = user.username; - lineWidth = usernameWidth; - - } else { - // Append - linesOfUserIndexes[linesOfUserIndexes.length - 1].push(i); - usersOnline[i].leftX = lineWidth + usernameSpacerWidth2D; - usersOnline[i].rightX = lineWidth + usernameSpacerWidth2D + usernameWidth; - - lineText += USERNAME_SPACER + user.username; - lineWidth = usersOnline[i].rightX; - } - - numUsersDisplayed += 1; + usersOnline[i].usernameWidth = Overlays.textSize(usersPane2D, user.username).width; + linesOfUsers.push(i); + displayText += "\n" + user.username; } } - displayText += "\n" + lineText; - displayText = displayText.slice(2); // Remove leading "\n"s. + displayText = displayText.slice(1); // Remove leading "\n". Overlays.editOverlay(usersPane2D, { - text: numUsersDisplayed > 0 ? displayText : "No users online", - height: (numUsersDisplayed > 0 ? linesOfUserIndexes.length : 1) * (usersLineHeight + usersLineSpacing) + text: linesOfUsers.length > 0 ? displayText : "No users online", + height: (linesOfUsers.length > 0 ? linesOfUsers.length : 1) * (usersLineHeight + usersLineSpacing) - usersLineSpacing + 2 * WINDOW_MARGIN_2D }); } From a3c4429e0beb6a2e8d4fe8ea04ac507cee24a1ce Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 09:36:26 -0700 Subject: [PATCH 08/17] Longer wait until requesting status again after request error --- examples/users.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/users.js b/examples/users.js index 20693c220e..c78f48df02 100644 --- a/examples/users.js +++ b/examples/users.js @@ -134,6 +134,8 @@ var usersWindow = (function () { updateWindow(); } else { print("Error: Request for users status returned " + usersRequest.status + " " + usersRequest.statusText); + usersTimer = Script.setTimeout(requestUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay. + return; } usersTimer = Script.setTimeout(requestUsers, UPDATE_TIMEOUT); // Update after finished processing. From ad08a7dde2734654d8fc706b37caf731ca4fc09d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 09:37:18 -0700 Subject: [PATCH 09/17] Position window at bottom left of screen --- examples/users.js | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/examples/users.js b/examples/users.js index c78f48df02..ee64514562 100644 --- a/examples/users.js +++ b/examples/users.js @@ -11,12 +11,13 @@ var usersWindow = (function () { - var WINDOW_BOUNDS_2D = { x: 100, y: 100, width: 150, height: 0 }, + var WINDOW_WIDTH_2D = 150, WINDOW_MARGIN_2D = 12, WINDOW_FOREGROUND_COLOR_2D = { red: 240, green: 240, blue: 240 }, WINDOW_FOREGROUND_ALPHA_2D = 0.9, WINDOW_BACKGROUND_COLOR_2D = { red: 120, green: 120, blue: 120 }, WINDOW_BACKGROUND_ALPHA_2D = 0.7, + windowHeight = 0, usersPane2D, USERS_FONT_2D = { size: 14 }, usersLineHeight, @@ -39,7 +40,9 @@ var usersWindow = (function () { MENU_ITEM = "Users Online", MENI_ITEM_AFTER = "Chat...", - isVisible = false; + isVisible = false, + + viewportHeight; function onMousePressEvent(event) { var clickedOverlay, @@ -56,8 +59,9 @@ var usersWindow = (function () { clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); if (clickedOverlay === usersPane2D) { - overlayX = event.x - WINDOW_BOUNDS_2D.x - WINDOW_MARGIN_2D; - overlayY = event.y - WINDOW_BOUNDS_2D.y - WINDOW_MARGIN_2D; + + overlayX = event.x - WINDOW_MARGIN_2D; + overlayY = event.y - viewportHeight + windowHeight - WINDOW_MARGIN_2D; numLinesBefore = Math.floor(overlayY / (usersLineHeight + usersLineSpacing)); minY = numLinesBefore * (usersLineHeight + usersLineSpacing); @@ -70,10 +74,8 @@ var usersWindow = (function () { if (0 <= lineClicked && lineClicked < linesOfUsers.length && overlayX <= usersOnline[linesOfUsers[lineClicked]].usernameWidth) { - - print("Go to " + usersOnline[linesOfUsers[lineClicked]].username); - // DJRTODO - //location.goToUser(usersOnline[userIndex].username); + //print("Go to " + usersOnline[linesOfUsers[lineClicked]].username); + location.goToUser(usersOnline[userIndex].username); } } } @@ -96,11 +98,13 @@ var usersWindow = (function () { } displayText = displayText.slice(1); // Remove leading "\n". + windowHeight = (linesOfUsers.length > 0 ? linesOfUsers.length : 1) * (usersLineHeight + usersLineSpacing) + - usersLineSpacing + 2 * WINDOW_MARGIN_2D; Overlays.editOverlay(usersPane2D, { - text: linesOfUsers.length > 0 ? displayText : "No users online", - height: (linesOfUsers.length > 0 ? linesOfUsers.length : 1) * (usersLineHeight + usersLineSpacing) - - usersLineSpacing + 2 * WINDOW_MARGIN_2D + y: viewportHeight - windowHeight, + height: windowHeight, + text: linesOfUsers.length > 0 ? displayText : "No users online" }); } @@ -168,9 +172,16 @@ var usersWindow = (function () { } } + function update() { + viewportHeight = Controller.getViewportDimensions().y; + Overlays.editOverlay(usersPane2D, { + y: viewportHeight - windowHeight + }); + } + function setUp() { usersPane2D = Overlays.addOverlay("text", { - bounds: WINDOW_BOUNDS_2D, + bounds: { x: 0, y: 0, width: WINDOW_WIDTH_2D, height: 0 }, topMargin: WINDOW_MARGIN_2D, leftMargin: WINDOW_MARGIN_2D, color: WINDOW_FOREGROUND_COLOR_2D, @@ -182,6 +193,7 @@ var usersWindow = (function () { visible: isVisible }); + viewportHeight = Controller.getViewportDimensions().y; usersLineHeight = Math.floor(Overlays.textSize(usersPane2D, "1").height); usersLineSpacing = Math.floor(Overlays.textSize(usersPane2D, "1\n2").height - 2 * usersLineHeight); @@ -198,6 +210,8 @@ var usersWindow = (function () { }); Menu.menuItemEvent.connect(onMenuItemEvent); + Script.update.connect(update); + requestUsers(); } From e4f7e35587c5f1a0aca057e802be8535790dfc9b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 11 Mar 2015 10:10:11 -0700 Subject: [PATCH 10/17] Hide edit tools when inactive --- examples/editEntities.js | 24 +++++++++++++++++------- examples/libraries/toolBars.js | 4 ++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index 9568f4207f..faef875d9b 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -125,7 +125,7 @@ var toolBar = (function () { width: toolWidth, height: toolHeight, alpha: 0.9, - visible: true + visible: false }); browseModelsButton = toolBar.addTool({ @@ -133,7 +133,7 @@ var toolBar = (function () { width: toolWidth, height: toolHeight, alpha: 0.9, - visible: true + visible: false }); newCubeButton = toolBar.addTool({ @@ -142,7 +142,7 @@ var toolBar = (function () { width: toolWidth, height: toolHeight, alpha: 0.9, - visible: true + visible: false }); newSphereButton = toolBar.addTool({ @@ -151,7 +151,7 @@ var toolBar = (function () { width: toolWidth, height: toolHeight, alpha: 0.9, - visible: true + visible: false }); newLightButton = toolBar.addTool({ @@ -160,7 +160,7 @@ var toolBar = (function () { width: toolWidth, height: toolHeight, alpha: 0.9, - visible: true + visible: false }); newTextButton = toolBar.addTool({ @@ -169,9 +169,8 @@ var toolBar = (function () { width: toolWidth, height: toolHeight, alpha: 0.9, - visible: true + visible: false }); - } that.setActive = function(active) { @@ -196,11 +195,22 @@ var toolBar = (function () { propertiesTool.setVisible(true); Window.setFocus(); } + that.showTools(isActive); } } toolBar.selectTool(activeButton, isActive); }; + // Sets visibility of tool buttons, excluding the power button + that.showTools = function(doShow) { + toolBar.showTool(newModelButton, doShow); + toolBar.showTool(browseModelsButton, doShow); + toolBar.showTool(newCubeButton, doShow); + toolBar.showTool(newSphereButton, doShow); + toolBar.showTool(newLightButton, doShow); + toolBar.showTool(newTextButton, doShow); + }; + var RESIZE_INTERVAL = 50; var RESIZE_TIMEOUT = 120000; // 2 minutes var RESIZE_MAX_CHECKS = RESIZE_TIMEOUT / RESIZE_INTERVAL; diff --git a/examples/libraries/toolBars.js b/examples/libraries/toolBars.js index 5802625d7b..951b6704ec 100644 --- a/examples/libraries/toolBars.js +++ b/examples/libraries/toolBars.js @@ -271,6 +271,10 @@ ToolBar = function(x, y, direction) { }); } } + + this.showTool = function(tool, doShow) { + this.tools[tool].show(doShow); + } this.show = function(doShow) { for(var tool in this.tools) { From c30bf5667ff03f8b1833a2d9eb1834977f969fa4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 10:15:34 -0700 Subject: [PATCH 11/17] Fix teleporting to user --- examples/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/users.js b/examples/users.js index ee64514562..5f6d9e0854 100644 --- a/examples/users.js +++ b/examples/users.js @@ -75,7 +75,7 @@ var usersWindow = (function () { if (0 <= lineClicked && lineClicked < linesOfUsers.length && overlayX <= usersOnline[linesOfUsers[lineClicked]].usernameWidth) { //print("Go to " + usersOnline[linesOfUsers[lineClicked]].username); - location.goToUser(usersOnline[userIndex].username); + location.goToUser(usersOnline[linesOfUsers[lineClicked]].username); } } } From d36399c65d845c8355e811b85a47859e2df0531d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 10:21:49 -0700 Subject: [PATCH 12/17] Add heading --- examples/users.js | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/examples/users.js b/examples/users.js index 5f6d9e0854..2340039618 100644 --- a/examples/users.js +++ b/examples/users.js @@ -15,10 +15,13 @@ var usersWindow = (function () { WINDOW_MARGIN_2D = 12, WINDOW_FOREGROUND_COLOR_2D = { red: 240, green: 240, blue: 240 }, WINDOW_FOREGROUND_ALPHA_2D = 0.9, - WINDOW_BACKGROUND_COLOR_2D = { red: 120, green: 120, blue: 120 }, + WINDOW_HEADING_COLOR_2D = { red: 180, green: 180, blue: 180 }, + WINDOW_HEADING_ALPHA_2D = 0.9, + WINDOW_BACKGROUND_COLOR_2D = { red: 80, green: 80, blue: 80 }, WINDOW_BACKGROUND_ALPHA_2D = 0.7, windowHeight = 0, usersPane2D, + usersHeading2D, USERS_FONT_2D = { size: 14 }, usersLineHeight, usersLineSpacing, @@ -61,7 +64,7 @@ var usersWindow = (function () { if (clickedOverlay === usersPane2D) { overlayX = event.x - WINDOW_MARGIN_2D; - overlayY = event.y - viewportHeight + windowHeight - WINDOW_MARGIN_2D; + overlayY = event.y - viewportHeight + windowHeight - WINDOW_MARGIN_2D - (usersLineHeight + usersLineSpacing); numLinesBefore = Math.floor(overlayY / (usersLineHeight + usersLineSpacing)); minY = numLinesBefore * (usersLineHeight + usersLineSpacing); @@ -97,14 +100,18 @@ var usersWindow = (function () { } } - displayText = displayText.slice(1); // Remove leading "\n". - windowHeight = (linesOfUsers.length > 0 ? linesOfUsers.length : 1) * (usersLineHeight + usersLineSpacing) - - usersLineSpacing + 2 * WINDOW_MARGIN_2D; + windowHeight = (linesOfUsers.length > 0 ? linesOfUsers.length + 1 : 1) * (usersLineHeight + usersLineSpacing) + - usersLineSpacing + 2 * WINDOW_MARGIN_2D; // First or only line is for heading Overlays.editOverlay(usersPane2D, { y: viewportHeight - windowHeight, height: windowHeight, - text: linesOfUsers.length > 0 ? displayText : "No users online" + text: displayText + }); + + Overlays.editOverlay(usersHeading2D, { + y: viewportHeight - windowHeight + WINDOW_MARGIN_2D, + text: linesOfUsers.length > 0 ? "Online" : "No users online" }); } @@ -164,6 +171,7 @@ var usersWindow = (function () { } Overlays.editOverlay(usersPane2D, { visible: isVisible }); + Overlays.editOverlay(usersHeading2D, { visible: isVisible }); } function onMenuItemEvent(event) { @@ -177,6 +185,9 @@ var usersWindow = (function () { Overlays.editOverlay(usersPane2D, { y: viewportHeight - windowHeight }); + Overlays.editOverlay(usersHeading2D, { + y: viewportHeight - windowHeight + WINDOW_MARGIN_2D + }) } function setUp() { @@ -193,6 +204,20 @@ var usersWindow = (function () { visible: isVisible }); + usersHeading2D = Overlays.addOverlay("text", { + x: WINDOW_MARGIN_2D, + width: WINDOW_WIDTH_2D - 2 * WINDOW_MARGIN_2D, + height: USERS_FONT_2D.size, + topMargin: 0, + leftMargin: 0, + color: WINDOW_HEADING_COLOR_2D, + alpha: WINDOW_HEADING_ALPHA_2D, + backgroundAlpha: 0.0, + text: "No users online", + font: USERS_FONT_2D, + visible: isVisible + }); + viewportHeight = Controller.getViewportDimensions().y; usersLineHeight = Math.floor(Overlays.textSize(usersPane2D, "1").height); usersLineSpacing = Math.floor(Overlays.textSize(usersPane2D, "1\n2").height - 2 * usersLineHeight); @@ -219,6 +244,7 @@ var usersWindow = (function () { Menu.removeMenuItem(MENU_NAME, MENU_ITEM); Script.clearTimeout(usersTimer); + Overlays.deleteOverlay(usersHeading2D); Overlays.deleteOverlay(usersPane2D); } From 22ff97fd276d8c9c41bf96606af605627e5aebb0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 10:25:24 -0700 Subject: [PATCH 13/17] Make visible by default --- examples/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/users.js b/examples/users.js index 2340039618..8919ab08b4 100644 --- a/examples/users.js +++ b/examples/users.js @@ -43,7 +43,7 @@ var usersWindow = (function () { MENU_ITEM = "Users Online", MENI_ITEM_AFTER = "Chat...", - isVisible = false, + isVisible = true, viewportHeight; From 532e4feebb627fa7a8646e26604c8bd6ad21d84d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 10:30:09 -0700 Subject: [PATCH 14/17] Remove dead code and fix typos --- examples/users.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/users.js b/examples/users.js index 8919ab08b4..e40c3878ce 100644 --- a/examples/users.js +++ b/examples/users.js @@ -25,8 +25,6 @@ var usersWindow = (function () { USERS_FONT_2D = { size: 14 }, usersLineHeight, usersLineSpacing, - USERNAME_SPACER = "\u00a0\u00a0\u00a0\u00a0", // Nonbreaking spaces - usernameSpacerWidth2D, usersOnline, // Raw data linesOfUsers, // Array of indexes pointing into usersOnline @@ -187,7 +185,7 @@ var usersWindow = (function () { }); Overlays.editOverlay(usersHeading2D, { y: viewportHeight - windowHeight + WINDOW_MARGIN_2D - }) + }); } function setUp() { @@ -219,11 +217,10 @@ var usersWindow = (function () { }); viewportHeight = Controller.getViewportDimensions().y; + usersLineHeight = Math.floor(Overlays.textSize(usersPane2D, "1").height); usersLineSpacing = Math.floor(Overlays.textSize(usersPane2D, "1\n2").height - 2 * usersLineHeight); - usernameSpacerWidth2D = Overlays.textSize(usersPane2D, USERNAME_SPACER).width; - Controller.mousePressEvent.connect(onMousePressEvent); Menu.addMenuItem({ From bbffa6474bc5a777eaf3e132c04912023a37404b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 10:32:14 -0700 Subject: [PATCH 15/17] Add users.js to default scripts --- examples/defaultScripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/defaultScripts.js b/examples/defaultScripts.js index 65682deb74..d4efad9ee5 100644 --- a/examples/defaultScripts.js +++ b/examples/defaultScripts.js @@ -17,4 +17,5 @@ Script.load("headMove.js"); Script.load("inspect.js"); Script.load("lobby.js"); Script.load("notifications.js"); -Script.load("lookWithMouse.js") +Script.load("lookWithMouse.js"); +Script.load("users.js"); From 1a18decc6d003f4e224897afe17511eabf83bb6b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 10:49:36 -0700 Subject: [PATCH 16/17] Fix typo --- examples/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/users.js b/examples/users.js index e40c3878ce..e2b0e7f053 100644 --- a/examples/users.js +++ b/examples/users.js @@ -39,7 +39,7 @@ var usersWindow = (function () { MENU_NAME = "Tools", MENU_ITEM = "Users Online", - MENI_ITEM_AFTER = "Chat...", + MENU_ITEM_AFTER = "Chat...", isVisible = true, @@ -226,7 +226,7 @@ var usersWindow = (function () { Menu.addMenuItem({ menuName: MENU_NAME, menuItemName: MENU_ITEM, - afterItem: MENI_ITEM_AFTER, + afterItem: MENU_ITEM_AFTER, isCheckable: true, isChecked: isVisible }); From fd423e5019c72745ec756da0a0d9975875133744 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 11 Mar 2015 11:07:02 -0700 Subject: [PATCH 17/17] Fix units --- examples/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/users.js b/examples/users.js index e2b0e7f053..0274cd7321 100644 --- a/examples/users.js +++ b/examples/users.js @@ -116,7 +116,7 @@ var usersWindow = (function () { function requestUsers() { usersRequest = new XMLHttpRequest(); usersRequest.open("GET", API_URL, true); - usersRequest.timeout = HTTP_GET_TIMEOUT * 1000; + usersRequest.timeout = HTTP_GET_TIMEOUT; usersRequest.ontimeout = usersTimedOut; usersRequest.onreadystatechange = processUsers; usersRequest.send();