From 4e6dcf0d8eb099895562f87e27fe29905fe5131d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 26 Mar 2015 19:45:39 -0700 Subject: [PATCH 01/12] Add friends add/remove button --- examples/users.js | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/examples/users.js b/examples/users.js index ebd59886aa..c728a1291e 100644 --- a/examples/users.js +++ b/examples/users.js @@ -11,7 +11,9 @@ var usersWindow = (function () { - var WINDOW_WIDTH_2D = 160, + var HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/", + + WINDOW_WIDTH_2D = 160, WINDOW_MARGIN_2D = 12, WINDOW_FONT_2D = { size: 12 }, WINDOW_FOREGROUND_COLOR_2D = { red: 240, green: 240, blue: 240 }, @@ -33,7 +35,16 @@ var usersWindow = (function () { scrollbarBar2D, scrollbarBackgroundHeight, scrollbarBarHeight, - VISIBILITY_SPACER_2D = 12, // Space between list of users and visibility controls + FRIENDS_BUTTON_SPACER_2D = 12, // Space before add/remove friends button + FRIENDS_BUTTON_SVG = HIFI_PUBLIC_BUCKET + "images/tools/add-remove-friends.svg", + FRIENDS_BUTTON_SVG_WIDTH = 107, + FRIENDS_BUTTON_SVG_HEIGHT = 27, + FRIENDS_BUTTON_WIDTH_2D = FRIENDS_BUTTON_SVG_WIDTH, + FRIENDS_BUTTON_HEIGHT_2D = FRIENDS_BUTTON_SVG_HEIGHT, + FRIENDS_BUTTON_COLOR_2D = { red: 255, green: 255, blue: 255 }, + FRIENDS_BUTTON_ALPHA_2D = 0.9, + friendsButton2D, + VISIBILITY_SPACER_2D = 12, // Space between before visibility controls visibilityHeading2D, VISIBILITY_RADIO_SPACE = 16, visibilityControls2D, @@ -77,7 +88,6 @@ var usersWindow = (function () { scrollbarBarClickedAt, // 0.0 .. 1.0 scrollbarValue = 0.0, // 0.0 .. 1.0 - HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/", RADIO_BUTTON_SVG = HIFI_PUBLIC_BUCKET + "images/radio-button.svg", RADIO_BUTTON_SVG_DIAMETER = 14, RADIO_BUTTON_DISPLAY_SCALE = 0.7, // 1.0 = windowTextHeight @@ -91,10 +101,12 @@ var usersWindow = (function () { // Reserve 5 lines for window heading plus visibility heading and controls // Subtract windowLineSpacing for both end of user list and end of controls - nonUsersHeight = 5 * windowLineHeight - 2 * windowLineSpacing + VISIBILITY_SPACER_2D + 2 * WINDOW_MARGIN_2D; + nonUsersHeight = 5 * windowLineHeight - 2 * windowLineSpacing + + FRIENDS_BUTTON_SPACER_2D + FRIENDS_BUTTON_HEIGHT_2D + + VISIBILITY_SPACER_2D + 2 * WINDOW_MARGIN_2D; // Limit window to height of viewport minus VU meter and mirror if displayed - windowHeight = linesOfUsers.length * windowLineHeight + nonUsersHeight; + windowHeight = linesOfUsers.length * windowLineHeight - windowLineSpacing + nonUsersHeight; maxWindowHeight = viewportHeight - AUDIO_METER_HEIGHT; if (isMirrorDisplay && !isFullscreenMirror) { maxWindowHeight -= MIRROR_HEIGHT; @@ -132,6 +144,12 @@ var usersWindow = (function () { Overlays.editOverlay(scrollbarBar2D, { y: scrollbarBarPosition.y }); + + Overlays.editOverlay(friendsButton2D, { + y: viewportHeight - FRIENDS_BUTTON_HEIGHT_2D - VISIBILITY_SPACER_2D + - 4 * windowLineHeight + windowLineSpacing - WINDOW_MARGIN_2D + }); + Overlays.editOverlay(visibilityHeading2D, { y: viewportHeight - 4 * windowLineHeight + windowLineSpacing - WINDOW_MARGIN_2D }); @@ -307,6 +325,7 @@ var usersWindow = (function () { Overlays.editOverlay(windowHeading2D, { visible: isVisible }); Overlays.editOverlay(scrollbarBackground2D, { visible: isVisible && isUsingScrollbars }); Overlays.editOverlay(scrollbarBar2D, { visible: isVisible && isUsingScrollbars }); + Overlays.editOverlay(friendsButton2D, { visible: isVisible }); Overlays.editOverlay(visibilityHeading2D, { visible: isVisible }); for (i = 0; i < visibilityControls2D.length; i += 1) { Overlays.editOverlay(visibilityControls2D[i].radioOverlay, { visible: isVisible }); @@ -525,6 +544,17 @@ var usersWindow = (function () { visible: isVisible && isUsingScrollbars }); + friendsButton2D = Overlays.addOverlay("image", { + x: WINDOW_MARGIN_2D, + y: viewportHeight, + width: FRIENDS_BUTTON_WIDTH_2D, + height: FRIENDS_BUTTON_HEIGHT_2D, + imageURL: FRIENDS_BUTTON_SVG, + subImage: { x: 0, y: 0, width: FRIENDS_BUTTON_SVG_WIDTH, height: FRIENDS_BUTTON_SVG_HEIGHT }, + color: FRIENDS_BUTTON_COLOR_2D, + alpha: FRIENDS_BUTTON_ALPHA_2D + }); + visibilityHeading2D = Overlays.addOverlay("text", { x: WINDOW_MARGIN_2D, y: viewportHeight, @@ -636,6 +666,7 @@ var usersWindow = (function () { Overlays.deleteOverlay(windowHeading2D); Overlays.deleteOverlay(scrollbarBackground2D); Overlays.deleteOverlay(scrollbarBar2D); + Overlays.deleteOverlay(friendsButton2D); Overlays.deleteOverlay(visibilityHeading2D); for (i = 0; i <= visibilityControls2D.length; i += 1) { Overlays.deleteOverlay(visibilityControls2D[i].textOverlay); From 418ff5929ea6acf92835d607c915b37712a17167 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 27 Mar 2015 14:22:47 -0700 Subject: [PATCH 02/12] Make friends add/remove button open WebWindow dialog --- examples/users.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/users.js b/examples/users.js index c728a1291e..7ee5d4a570 100644 --- a/examples/users.js +++ b/examples/users.js @@ -88,6 +88,12 @@ var usersWindow = (function () { scrollbarBarClickedAt, // 0.0 .. 1.0 scrollbarValue = 0.0, // 0.0 .. 1.0 + FRIENDS_DIALOG_TITLE = "Add/Remove Friends", + FRIENDS_DIALOG_URL = "https://metaverse.highfidelity.com/user/friends", + FRIENDS_DIALOG_WIDTH = 900, + FRIENDS_DIALOG_HEIGHT = 700, + friendsDialog, + RADIO_BUTTON_SVG = HIFI_PUBLIC_BUCKET + "images/radio-button.svg", RADIO_BUTTON_SVG_DIAMETER = 14, RADIO_BUTTON_DISPLAY_SCALE = 0.7, // 1.0 = windowTextHeight @@ -418,6 +424,11 @@ var usersWindow = (function () { updateOverlayPositions(); updateUsersDisplay(); } + + if (clickedOverlay === friendsButton2D) { + friendsDialog.setVisible(true); + friendsDialog.raise(); + } } function onMouseMoveEvent(event) { @@ -576,6 +587,10 @@ var usersWindow = (function () { myVisibility = ""; } + friendsDialog = new WebWindow(FRIENDS_DIALOG_TITLE, FRIENDS_DIALOG_URL, FRIENDS_DIALOG_WIDTH, FRIENDS_DIALOG_HEIGHT, + false); + friendsDialog.setVisible(false); + optionText = "everyone"; visibilityControls2D = [{ radioOverlay: Overlays.addOverlay("image", { // Create first so that it is under textOverlay. From be69c0b58f717abc8d8dad1bb42861988659b683 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 28 Mar 2015 13:05:23 -0700 Subject: [PATCH 03/12] Add add/remove friends menu item This must display the dialog whether or not users.js is running. Both C++ and JavaScript need to open or restore the same dialog, hence a new dialog rather than using WebWindow with its JavaScript baggage. --- examples/users.js | 13 +------- interface/src/Application.cpp | 32 ++++++++++++++++++- interface/src/Application.h | 5 ++- interface/src/Menu.cpp | 2 ++ interface/src/Menu.h | 1 + .../GlobalServicesScriptingInterface.cpp | 4 +++ .../GlobalServicesScriptingInterface.h | 1 + 7 files changed, 44 insertions(+), 14 deletions(-) diff --git a/examples/users.js b/examples/users.js index 7ee5d4a570..23a67c55d6 100644 --- a/examples/users.js +++ b/examples/users.js @@ -88,12 +88,6 @@ var usersWindow = (function () { scrollbarBarClickedAt, // 0.0 .. 1.0 scrollbarValue = 0.0, // 0.0 .. 1.0 - FRIENDS_DIALOG_TITLE = "Add/Remove Friends", - FRIENDS_DIALOG_URL = "https://metaverse.highfidelity.com/user/friends", - FRIENDS_DIALOG_WIDTH = 900, - FRIENDS_DIALOG_HEIGHT = 700, - friendsDialog, - RADIO_BUTTON_SVG = HIFI_PUBLIC_BUCKET + "images/radio-button.svg", RADIO_BUTTON_SVG_DIAMETER = 14, RADIO_BUTTON_DISPLAY_SCALE = 0.7, // 1.0 = windowTextHeight @@ -426,8 +420,7 @@ var usersWindow = (function () { } if (clickedOverlay === friendsButton2D) { - friendsDialog.setVisible(true); - friendsDialog.raise(); + GlobalServices.editFriends(); } } @@ -587,10 +580,6 @@ var usersWindow = (function () { myVisibility = ""; } - friendsDialog = new WebWindow(FRIENDS_DIALOG_TITLE, FRIENDS_DIALOG_URL, FRIENDS_DIALOG_WIDTH, FRIENDS_DIALOG_HEIGHT, - false); - friendsDialog.setVisible(false); - optionText = "everyone"; visibilityControls2D = [{ radioOverlay: Overlays.addOverlay("image", { // Create first so that it is under textOverlay. diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 99777d22bf..d571bfab15 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -129,6 +129,7 @@ #endif #include "ui/DataWebDialog.h" +#include "ui/DataWebPage.h" #include "ui/DialogsManager.h" #include "ui/InfoView.h" #include "ui/LoginDialog.h" @@ -156,6 +157,8 @@ const QString SKIP_FILENAME = QStandardPaths::writableLocation(QStandardPaths::D const QString DEFAULT_SCRIPTS_JS_URL = "http://s3.amazonaws.com/hifi-public/scripts/defaultScripts.js"; +const QString EDIT_FRIENDS_DIALOG_URL = "https://metaverse.highfidelity.com/user/friends"; + #ifdef Q_OS_WIN class MyNativeEventFilter : public QAbstractNativeEventFilter { public: @@ -297,7 +300,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _lastSendDownstreamAudioStats(usecTimestampNow()), _isVSyncOn(true), _aboutToQuit(false), - _notifiedPacketVersionMismatchThisDomain(false) + _notifiedPacketVersionMismatchThisDomain(false), + _editFriendsDialog(nullptr) { #ifdef Q_OS_WIN installNativeEventFilter(&MyNativeEventFilter::getInstance()); @@ -3936,6 +3940,32 @@ void Application::loadScriptURLDialog() { } } +void Application::showEditFriendsDialog() { + if (!_editFriendsDialog) { + _editFriendsDialog = new QWidget(Application::getInstance()->getWindow(), Qt::Window); + _editFriendsDialog->setWindowTitle("Add/Remove Friends"); + _editFriendsDialog->setAttribute(Qt::WA_DeleteOnClose); + + auto layout = new QVBoxLayout(_editFriendsDialog); + layout->setContentsMargins(0, 0, 0, 0); + _editFriendsDialog->setLayout(layout); + + QWebView* webView = new QWebView(_editFriendsDialog); + layout->addWidget(webView); + webView->setPage(new DataWebPage()); + webView->setUrl(EDIT_FRIENDS_DIALOG_URL); + + connect(_editFriendsDialog, &QWidget::destroyed, this, &Application::editFriendsDialogDestroyed); + } + + QMetaObject::invokeMethod(_editFriendsDialog, "setVisible", Qt::AutoConnection, Q_ARG(bool, true)); + QMetaObject::invokeMethod(_editFriendsDialog, "showNormal", Qt::AutoConnection); +} + +void Application::editFriendsDialogDestroyed() { + _editFriendsDialog = nullptr; +} + QString Application::getScriptsLocation() { return _scriptsLocationHandle.get(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 7764f297d3..5f4ec328a1 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -361,7 +361,9 @@ public slots: void loadDefaultScripts(); void toggleRunningScriptsWidget(); void saveScripts(); - + void showEditFriendsDialog(); + void editFriendsDialogDestroyed(); + void packageModel(); void openUrl(const QUrl& url); @@ -565,6 +567,7 @@ private: ControllerScriptingInterface _controllerScriptingInterface; QPointer _logDialog; QPointer _snapshotShareDialog; + QWidget*_editFriendsDialog; FileLogger* _logger; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 5867dd29e2..e5f1f26168 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -152,6 +152,8 @@ Menu::Menu() { addActionToQMenuAndActionHash(toolsMenu, MenuOption::Chat, Qt::Key_Backslash, dialogsManager.data(), SLOT(showIRCLink())); + addActionToQMenuAndActionHash(toolsMenu, MenuOption::AddRemoveFriends, 0, + qApp, SLOT(showEditFriendsDialog())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::ToolWindow, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index a4e644f20f..ef81b45afd 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -100,6 +100,7 @@ private: namespace MenuOption { const QString AboutApp = "About Interface"; + const QString AddRemoveFriends = "Add/Remove Friends..."; const QString AddressBar = "Show Address Bar"; const QString AlignForearmsWithWrists = "Align Forearms with Wrists"; const QString AlternateIK = "Alternate IK"; diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.cpp b/interface/src/scripting/GlobalServicesScriptingInterface.cpp index d39da47e78..d8c65d6871 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.cpp +++ b/interface/src/scripting/GlobalServicesScriptingInterface.cpp @@ -123,3 +123,7 @@ void GlobalServicesScriptingInterface::checkDownloadInfo() { void GlobalServicesScriptingInterface::updateDownloadInfo() { emit downloadInfoChanged(getDownloadInfo()); } + +void GlobalServicesScriptingInterface::editFriends() { + QMetaObject::invokeMethod(Application::getInstance(), "showEditFriendsDialog"); +} diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.h b/interface/src/scripting/GlobalServicesScriptingInterface.h index a39219ba40..4b42f0b528 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.h +++ b/interface/src/scripting/GlobalServicesScriptingInterface.h @@ -45,6 +45,7 @@ public: public slots: DownloadInfoResult getDownloadInfo(); void updateDownloadInfo(); + void editFriends(); private slots: void loggedOut(); From cbf2012bf5d2c89c48ffc5b344ce37b9ba714179 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 29 Mar 2015 18:35:56 -0700 Subject: [PATCH 04/12] Add menu items that set visibility And synchronize visibility settings between Interface and users.js. --- examples/users.js | 36 +++++-------- interface/src/DiscoverabilityManager.cpp | 4 +- interface/src/DiscoverabilityManager.h | 5 +- interface/src/Menu.cpp | 50 +++++++++++++++++++ interface/src/Menu.h | 9 ++++ .../GlobalServicesScriptingInterface.cpp | 32 +++++++++--- .../GlobalServicesScriptingInterface.h | 4 ++ 7 files changed, 106 insertions(+), 34 deletions(-) diff --git a/examples/users.js b/examples/users.js index 23a67c55d6..fd6daed293 100644 --- a/examples/users.js +++ b/examples/users.js @@ -68,8 +68,6 @@ var usersWindow = (function () { myVisibility, VISIBILITY_VALUES = ["all", "friends", "none"], - visibilityInterval, - VISIBILITY_POLL_INTERVAL = 5000, // ms = 5s MENU_NAME = "Tools", MENU_ITEM = "Users Online", @@ -298,15 +296,6 @@ var usersWindow = (function () { usersTimer = Script.setTimeout(pollUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay. }; - function pollVisibility() { - var currentVisibility = myVisibility; - - myVisibility = GlobalServices.findableBy; - if (myVisibility !== currentVisibility) { - updateVisibilityControls(); - } - } - function setVisible(visible) { var i; @@ -339,6 +328,16 @@ var usersWindow = (function () { } } + function onFindableByChanged(event) { + var i; + + for (i = 0; i < visibilityControls2D.length; i += 1) { + visibilityControls2D[i].selected = event === VISIBILITY_VALUES[i]; + } + + updateVisibilityControls(); + } + function onMousePressEvent(event) { var clickedOverlay, numLinesBefore, @@ -349,7 +348,6 @@ var usersWindow = (function () { lineClicked, userClicked, i, - visibilityChanged, delta; if (!isVisible) { @@ -381,21 +379,12 @@ var usersWindow = (function () { } } - visibilityChanged = false; for (i = 0; i < visibilityControls2D.length; i += 1) { // Don't need to test radioOverlay if it us under textOverlay. if (clickedOverlay === visibilityControls2D[i].textOverlay && event.x <= visibilityControls2D[i].optionWidth) { GlobalServices.findableBy = VISIBILITY_VALUES[i]; - visibilityChanged = true; } } - if (visibilityChanged) { - for (i = 0; i < visibilityControls2D.length; i += 1) { - // Don't need to handle radioOverlay if it us under textOverlay. - visibilityControls2D[i].selected = clickedOverlay === visibilityControls2D[i].textOverlay; - } - updateVisibilityControls(); - } if (clickedOverlay === scrollbarBar2D) { scrollbarBarClickedAt = (event.y - scrollbarBarPosition.y) / scrollbarBarHeight; @@ -651,9 +640,9 @@ var usersWindow = (function () { }); Menu.menuItemEvent.connect(onMenuItemEvent); - Script.update.connect(onScriptUpdate); + GlobalServices.findableByChanged.connect(onFindableByChanged); - visibilityInterval = Script.setInterval(pollVisibility, VISIBILITY_POLL_INTERVAL); + Script.update.connect(onScriptUpdate); pollUsers(); @@ -664,7 +653,6 @@ var usersWindow = (function () { Menu.removeMenuItem(MENU_NAME, MENU_ITEM); - Script.clearInterval(visibilityInterval); Script.clearTimeout(usersTimer); Overlays.deleteOverlay(windowPane2D); Overlays.deleteOverlay(windowHeading2D); diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 13697ff8be..6622a27145 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -24,7 +24,7 @@ const Discoverability::Mode DEFAULT_DISCOVERABILITY_MODE = Discoverability::All; DiscoverabilityManager::DiscoverabilityManager() : _mode("discoverabilityMode", DEFAULT_DISCOVERABILITY_MODE) { - + qRegisterMetaType("Discoverability::Mode"); } const QString API_USER_LOCATION_PATH = "/api/v1/user/location"; @@ -93,5 +93,7 @@ void DiscoverabilityManager::setDiscoverabilityMode(Discoverability::Mode discov // if we just got set to no discoverability, make sure that we delete our location in DB removeLocation(); } + + emit discoverabilityModeChanged(discoverabilityMode); } } \ No newline at end of file diff --git a/interface/src/DiscoverabilityManager.h b/interface/src/DiscoverabilityManager.h index 1dac7d63eb..9daa9408f8 100644 --- a/interface/src/DiscoverabilityManager.h +++ b/interface/src/DiscoverabilityManager.h @@ -35,7 +35,10 @@ public slots: Discoverability::Mode getDiscoverabilityMode() { return static_cast(_mode.get()); } void setDiscoverabilityMode(Discoverability::Mode discoverabilityMode); - + +signals: + void discoverabilityModeChanged(Discoverability::Mode discoverabilityMode); + private: DiscoverabilityManager(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index e5f1f26168..b917964efc 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -155,6 +155,30 @@ Menu::Menu() { addActionToQMenuAndActionHash(toolsMenu, MenuOption::AddRemoveFriends, 0, qApp, SLOT(showEditFriendsDialog())); + QMenu* visibilityMenu = toolsMenu->addMenu("I Am Visible To"); + { + QActionGroup* visibilityGroup = new QActionGroup(toolsMenu); + auto discoverabilityManager = DependencyManager::get(); + + QAction* visibleToEveryone = addCheckableActionToQMenuAndActionHash(visibilityMenu, MenuOption::VisibleToEveryone, + 0, discoverabilityManager->getDiscoverabilityMode() == Discoverability::All, + this, SLOT(setVisibility())); + visibilityGroup->addAction(visibleToEveryone); + + QAction* visibleToFriends = addCheckableActionToQMenuAndActionHash(visibilityMenu, MenuOption::VisibleToFriends, + 0, discoverabilityManager->getDiscoverabilityMode() == Discoverability::Friends, + this, SLOT(setVisibility())); + visibilityGroup->addAction(visibleToFriends); + + QAction* visibleToNoOne = addCheckableActionToQMenuAndActionHash(visibilityMenu, MenuOption::VisibleToNoOne, + 0, discoverabilityManager->getDiscoverabilityMode() == Discoverability::None, + this, SLOT(setVisibility())); + visibilityGroup->addAction(visibleToNoOne); + + connect(discoverabilityManager.data(), &DiscoverabilityManager::discoverabilityModeChanged, + this, &Menu::visibilityChanged); + } + addActionToQMenuAndActionHash(toolsMenu, MenuOption::ToolWindow, Qt::CTRL | Qt::ALT | Qt::Key_T, @@ -954,3 +978,29 @@ bool Menu::menuItemExists(const QString& menu, const QString& menuitem) { } return false; }; + +void Menu::setVisibility() { + auto discoverabilityManager = DependencyManager::get(); + + if (Menu::getInstance()->isOptionChecked(MenuOption::VisibleToEveryone)) { + discoverabilityManager->setDiscoverabilityMode(Discoverability::All); + } else if (Menu::getInstance()->isOptionChecked(MenuOption::VisibleToFriends)) { + discoverabilityManager->setDiscoverabilityMode(Discoverability::Friends); + } else if (Menu::getInstance()->isOptionChecked(MenuOption::VisibleToNoOne)) { + discoverabilityManager->setDiscoverabilityMode(Discoverability::None); + } else { + qDebug() << "ERROR Menu::setVisibility() called with unrecognized value."; + } +} + +void Menu::visibilityChanged(Discoverability::Mode discoverabilityMode) { + if (discoverabilityMode == Discoverability::All) { + setIsOptionChecked(MenuOption::VisibleToEveryone, true); + } else if (discoverabilityMode == Discoverability::Friends) { + setIsOptionChecked(MenuOption::VisibleToFriends, true); + } else if (discoverabilityMode == Discoverability::None) { + setIsOptionChecked(MenuOption::VisibleToNoOne, true); + } else { + qDebug() << "ERROR Menu::visibilityChanged() called with unrecognized value."; + } +} diff --git a/interface/src/Menu.h b/interface/src/Menu.h index ef81b45afd..98c2c868d6 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -21,6 +21,8 @@ #include +#include "DiscoverabilityManager.h" + class Settings; class Menu : public QMenuBar { @@ -64,6 +66,9 @@ public slots: bool isOptionChecked(const QString& menuOption) const; void setIsOptionChecked(const QString& menuOption, bool isChecked); +private slots: + void setVisibility(); + private: static Menu* _instance; Menu(); @@ -94,6 +99,7 @@ private: int findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem); int positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition); + void visibilityChanged(Discoverability::Mode discoverabilityMode); QHash _actionHash; }; @@ -249,6 +255,9 @@ namespace MenuOption { const QString TurnWithHead = "Turn using Head"; const QString PackageModel = "Package Model"; const QString Visage = "Visage"; + const QString VisibleToEveryone = "Everyone"; + const QString VisibleToFriends = "Friends"; + const QString VisibleToNoOne = "No one"; const QString Wireframe = "Wireframe"; } diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.cpp b/interface/src/scripting/GlobalServicesScriptingInterface.cpp index d8c65d6871..ab486f2896 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.cpp +++ b/interface/src/scripting/GlobalServicesScriptingInterface.cpp @@ -24,6 +24,10 @@ GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() { _downloading = false; connect(Application::getInstance(), &Application::renderingInWorldInterface, this, &GlobalServicesScriptingInterface::checkDownloadInfo); + + auto discoverabilityManager = DependencyManager::get(); + connect(discoverabilityManager.data(), &DiscoverabilityManager::discoverabilityModeChanged, + this, &GlobalServicesScriptingInterface::discoverabilityModeChanged); } GlobalServicesScriptingInterface::~GlobalServicesScriptingInterface() { @@ -45,16 +49,24 @@ void GlobalServicesScriptingInterface::loggedOut() { emit GlobalServicesScriptingInterface::disconnected(QString("logout")); } + +QString GlobalServicesScriptingInterface::findableByString(Discoverability::Mode discoverabilityMode) const { + if (discoverabilityMode == Discoverability::None) { + return "none"; + } else if (discoverabilityMode == Discoverability::Friends) { + return "friends"; + } else if (discoverabilityMode == Discoverability::All) { + return "all"; + } else { + qDebug() << "GlobalServices findableByString called with an unrecognized value."; + return ""; + } +} + + QString GlobalServicesScriptingInterface::getFindableBy() const { auto discoverabilityManager = DependencyManager::get(); - - if (discoverabilityManager->getDiscoverabilityMode() == Discoverability::None) { - return "none"; - } else if (discoverabilityManager->getDiscoverabilityMode() == Discoverability::Friends) { - return "friends"; - } else { - return "all"; - } + return findableByString(discoverabilityManager->getDiscoverabilityMode()); } void GlobalServicesScriptingInterface::setFindableBy(const QString& discoverabilityMode) { @@ -71,6 +83,10 @@ void GlobalServicesScriptingInterface::setFindableBy(const QString& discoverabil } } +void GlobalServicesScriptingInterface::discoverabilityModeChanged(Discoverability::Mode discoverabilityMode) { + emit findableByChanged(findableByString(discoverabilityMode)); +} + DownloadInfoResult::DownloadInfoResult() : downloading(QList()), pending(0.0f) diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.h b/interface/src/scripting/GlobalServicesScriptingInterface.h index 4b42f0b528..e38bfc0eb6 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.h +++ b/interface/src/scripting/GlobalServicesScriptingInterface.h @@ -53,17 +53,21 @@ private slots: QString getFindableBy() const; void setFindableBy(const QString& discoverabilityMode); + void discoverabilityModeChanged(Discoverability::Mode discoverabilityMode); signals: void connected(); void disconnected(const QString& reason); void myUsernameChanged(const QString& username); void downloadInfoChanged(DownloadInfoResult info); + void findableByChanged(const QString& discoverabilityMode); private: GlobalServicesScriptingInterface(); ~GlobalServicesScriptingInterface(); + QString findableByString(Discoverability::Mode discoverabilityMode) const; + bool _downloading; }; From e51992832047af6f1749a14db11b2caa34143118 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 1 Apr 2015 11:38:32 -0700 Subject: [PATCH 05/12] Move friends window to own class --- interface/src/Application.cpp | 33 ++----------------- interface/src/Application.h | 3 -- interface/src/Menu.cpp | 2 +- .../GlobalServicesScriptingInterface.cpp | 4 ++- interface/src/ui/DialogsManager.cpp | 7 ++++ interface/src/ui/DialogsManager.h | 3 ++ interface/src/ui/FriendsWindow.cpp | 32 ++++++++++++++++++ interface/src/ui/FriendsWindow.h | 24 ++++++++++++++ 8 files changed, 72 insertions(+), 36 deletions(-) create mode 100644 interface/src/ui/FriendsWindow.cpp create mode 100644 interface/src/ui/FriendsWindow.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a8952f52f8..875b0ef8c6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -130,7 +130,6 @@ #endif #include "ui/DataWebDialog.h" -#include "ui/DataWebPage.h" #include "ui/DialogsManager.h" #include "ui/InfoView.h" #include "ui/LoginDialog.h" @@ -165,8 +164,6 @@ const QString SKIP_FILENAME = QStandardPaths::writableLocation(QStandardPaths::D const QString DEFAULT_SCRIPTS_JS_URL = "http://s3.amazonaws.com/hifi-public/scripts/defaultScripts.js"; -const QString EDIT_FRIENDS_DIALOG_URL = "https://metaverse.highfidelity.com/user/friends"; - #ifdef Q_OS_WIN class MyNativeEventFilter : public QAbstractNativeEventFilter { public: @@ -309,8 +306,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _isVSyncOn(true), _aboutToQuit(false), _notifiedPacketVersionMismatchThisDomain(false), - _domainConnectionRefusals(QList()), - _editFriendsDialog(nullptr) + _domainConnectionRefusals(QList()) + //_editFriendsDialog(nullptr) { #ifdef Q_OS_WIN installNativeEventFilter(&MyNativeEventFilter::getInstance()); @@ -4017,32 +4014,6 @@ void Application::loadScriptURLDialog() { } } -void Application::showEditFriendsDialog() { - if (!_editFriendsDialog) { - _editFriendsDialog = new QWidget(Application::getInstance()->getWindow(), Qt::Window); - _editFriendsDialog->setWindowTitle("Add/Remove Friends"); - _editFriendsDialog->setAttribute(Qt::WA_DeleteOnClose); - - auto layout = new QVBoxLayout(_editFriendsDialog); - layout->setContentsMargins(0, 0, 0, 0); - _editFriendsDialog->setLayout(layout); - - QWebView* webView = new QWebView(_editFriendsDialog); - layout->addWidget(webView); - webView->setPage(new DataWebPage()); - webView->setUrl(EDIT_FRIENDS_DIALOG_URL); - - connect(_editFriendsDialog, &QWidget::destroyed, this, &Application::editFriendsDialogDestroyed); - } - - QMetaObject::invokeMethod(_editFriendsDialog, "setVisible", Qt::AutoConnection, Q_ARG(bool, true)); - QMetaObject::invokeMethod(_editFriendsDialog, "showNormal", Qt::AutoConnection); -} - -void Application::editFriendsDialogDestroyed() { - _editFriendsDialog = nullptr; -} - QString Application::getScriptsLocation() { return _scriptsLocationHandle.get(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 08e8b2efa1..1c281a6a13 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -364,8 +364,6 @@ public slots: void loadDefaultScripts(); void toggleRunningScriptsWidget(); void saveScripts(); - void showEditFriendsDialog(); - void editFriendsDialogDestroyed(); void packageModel(); @@ -572,7 +570,6 @@ private: ControllerScriptingInterface _controllerScriptingInterface; QPointer _logDialog; QPointer _snapshotShareDialog; - QWidget*_editFriendsDialog; FileLogger* _logger; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index b917964efc..3a25156e15 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -153,7 +153,7 @@ Menu::Menu() { addActionToQMenuAndActionHash(toolsMenu, MenuOption::Chat, Qt::Key_Backslash, dialogsManager.data(), SLOT(showIRCLink())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::AddRemoveFriends, 0, - qApp, SLOT(showEditFriendsDialog())); + dialogsManager.data(), SLOT(showFriendsWindow())); QMenu* visibilityMenu = toolsMenu->addMenu("I Am Visible To"); { diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.cpp b/interface/src/scripting/GlobalServicesScriptingInterface.cpp index ab486f2896..ee890a4e54 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.cpp +++ b/interface/src/scripting/GlobalServicesScriptingInterface.cpp @@ -11,6 +11,7 @@ #include "AccountManager.h" #include "Application.h" +#include "ui/DialogsManager.h" #include "DiscoverabilityManager.h" #include "ResourceCache.h" @@ -141,5 +142,6 @@ void GlobalServicesScriptingInterface::updateDownloadInfo() { } void GlobalServicesScriptingInterface::editFriends() { - QMetaObject::invokeMethod(Application::getInstance(), "showEditFriendsDialog"); + auto dialogsManager = DependencyManager::get(); + QMetaObject::invokeMethod(dialogsManager.data(), "showFriendsWindow"); } diff --git a/interface/src/ui/DialogsManager.cpp b/interface/src/ui/DialogsManager.cpp index 701ceb0189..062dbf1dc1 100644 --- a/interface/src/ui/DialogsManager.cpp +++ b/interface/src/ui/DialogsManager.cpp @@ -21,6 +21,7 @@ #include "BandwidthDialog.h" #include "CachesSizeDialog.h" #include "DiskCacheEditor.h" +#include "FriendsWindow.h" #include "HMDToolsDialog.h" #include "LodToolsDialog.h" #include "LoginDialog.h" @@ -170,3 +171,9 @@ void DialogsManager::showIRCLink() { _ircInfoBox->raise(); } + +void DialogsManager::showFriendsWindow() { + maybeCreateDialog(_friendsWindow); + _friendsWindow->show(); + _friendsWindow->raise(); +} \ No newline at end of file diff --git a/interface/src/ui/DialogsManager.h b/interface/src/ui/DialogsManager.h index 897215cbff..efa978e109 100644 --- a/interface/src/ui/DialogsManager.h +++ b/interface/src/ui/DialogsManager.h @@ -27,6 +27,7 @@ class AttachmentsDialog; class BandwidthDialog; class CachesSizeDialog; class DiskCacheEditor; +class FriendsWindow; class LodToolsDialog; class LoginDialog; class OctreeStatsDialog; @@ -59,6 +60,7 @@ public slots: void hmdTools(bool showTools); void showScriptEditor(); void showIRCLink(); + void showFriendsWindow(); private slots: void toggleToolWindow(); @@ -87,6 +89,7 @@ private: QPointer _bandwidthDialog; QPointer _cachesSizeDialog; QPointer _diskCacheEditor; + QPointer _friendsWindow; QPointer _ircInfoBox; QPointer _hmdToolsDialog; QPointer _lodToolsDialog; diff --git a/interface/src/ui/FriendsWindow.cpp b/interface/src/ui/FriendsWindow.cpp new file mode 100644 index 0000000000..ee7c7ad4eb --- /dev/null +++ b/interface/src/ui/FriendsWindow.cpp @@ -0,0 +1,32 @@ +// +// FriendsWindow.cpp +// interface/src/ui +// +// Created by David Rowe on 1 Apr 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 +// + +#include +#include + +#include "DataWebPage.h" +#include "FriendsWindow.h" + +const QString EDIT_FRIENDS_DIALOG_URL = "https://metaverse.highfidelity.com/user/friends"; + +FriendsWindow::FriendsWindow(QWidget* parent) { + this->setWindowTitle("Add/Remove Friends"); + this->setAttribute(Qt::WA_DeleteOnClose); + + auto layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + this->setLayout(layout); + + QWebView* webView = new QWebView(this); + layout->addWidget(webView); + webView->setPage(new DataWebPage()); + webView->setUrl(EDIT_FRIENDS_DIALOG_URL); +} diff --git a/interface/src/ui/FriendsWindow.h b/interface/src/ui/FriendsWindow.h new file mode 100644 index 0000000000..0c47f037c0 --- /dev/null +++ b/interface/src/ui/FriendsWindow.h @@ -0,0 +1,24 @@ +// +// FriendsWindow.h +// interface/src/ui +// +// Created by David Rowe on 1 Apr 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 +// + +#ifndef hifi_FriendsWindow_h +#define hifi_FriendsWindow_h + +#include + +class FriendsWindow : public QWidget { + Q_OBJECT + +public: + FriendsWindow(QWidget* parent = nullptr); +}; + +#endif // hifi_FriendsWindow_h From 49de54de48cc14deba078758c10bd2ddff396564 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 1 Apr 2015 18:58:59 -0700 Subject: [PATCH 06/12] Use improved WebWindowClass for friends window --- interface/src/Application.cpp | 22 +++++++++++-- interface/src/Application.h | 6 ++-- interface/src/Menu.cpp | 2 +- .../GlobalServicesScriptingInterface.cpp | 4 +-- interface/src/scripting/WebWindowClass.cpp | 21 +++++++----- interface/src/scripting/WebWindowClass.h | 6 ++++ interface/src/ui/DialogsManager.cpp | 7 ---- interface/src/ui/DialogsManager.h | 3 -- interface/src/ui/FriendsWindow.cpp | 32 ------------------- interface/src/ui/FriendsWindow.h | 24 -------------- 10 files changed, 45 insertions(+), 82 deletions(-) delete mode 100644 interface/src/ui/FriendsWindow.cpp delete mode 100644 interface/src/ui/FriendsWindow.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3a835d4f9e..2feb269f73 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -307,8 +307,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _isVSyncOn(true), _aboutToQuit(false), _notifiedPacketVersionMismatchThisDomain(false), - _domainConnectionRefusals(QList()) - //_editFriendsDialog(nullptr) + _domainConnectionRefusals(QList()), + _friendsWindow(NULL) { #ifdef Q_OS_WIN installNativeEventFilter(&MyNativeEventFilter::getInstance()); @@ -4283,3 +4283,21 @@ void Application::checkSkeleton() { _physicsEngine.setCharacterController(_myAvatar->getCharacterController()); } } + +void Application::showFriendsWindow() { + const QString FRIENDS_WINDOW_TITLE = "Add/Remove Friends"; + const QString FRIENDS_WINDOW_URL = "https://metaverse.highfidelity.com/user/friends"; + const int FRIENDS_WINDOW_WIDTH = 290; + const int FRIENDS_WINDOW_HEIGHT = 500; + if (!_friendsWindow) { + _friendsWindow = new WebWindowClass(FRIENDS_WINDOW_TITLE, FRIENDS_WINDOW_URL, FRIENDS_WINDOW_WIDTH, + FRIENDS_WINDOW_HEIGHT, false); + connect(_friendsWindow, &WebWindowClass::closed, this, &Application::friendsWindowClosed); + } + _friendsWindow->setVisible(true); +} + +void Application::friendsWindowClosed() { + delete _friendsWindow; + _friendsWindow = NULL; +} diff --git a/interface/src/Application.h b/interface/src/Application.h index a92031d570..e9b8deff55 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -52,6 +52,7 @@ #include "avatar/MyAvatar.h" #include "devices/SixenseManager.h" #include "scripting/ControllerScriptingInterface.h" +#include "scripting/WebWindowClass.h" #include "ui/BandwidthDialog.h" #include "ui/HMDToolsDialog.h" #include "ui/ModelsBrowser.h" @@ -68,8 +69,6 @@ #include "ui/ToolWindow.h" #include "octree/OctreeFade.h" #include "octree/OctreePacketProcessor.h" - - #include "UndoStackScriptingInterface.h" @@ -367,6 +366,8 @@ public slots: void loadDefaultScripts(); void toggleRunningScriptsWidget(); void saveScripts(); + void showFriendsWindow(); + void friendsWindowClosed(); void packageModel(); @@ -471,6 +472,7 @@ private: MainWindow* _window; ToolWindow* _toolWindow; + WebWindowClass* _friendsWindow; DatagramProcessor* _datagramProcessor; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 3a25156e15..9ac1673b37 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -153,7 +153,7 @@ Menu::Menu() { addActionToQMenuAndActionHash(toolsMenu, MenuOption::Chat, Qt::Key_Backslash, dialogsManager.data(), SLOT(showIRCLink())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::AddRemoveFriends, 0, - dialogsManager.data(), SLOT(showFriendsWindow())); + qApp, SLOT(showFriendsWindow())); QMenu* visibilityMenu = toolsMenu->addMenu("I Am Visible To"); { diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.cpp b/interface/src/scripting/GlobalServicesScriptingInterface.cpp index ee890a4e54..26bee34d75 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.cpp +++ b/interface/src/scripting/GlobalServicesScriptingInterface.cpp @@ -11,7 +11,6 @@ #include "AccountManager.h" #include "Application.h" -#include "ui/DialogsManager.h" #include "DiscoverabilityManager.h" #include "ResourceCache.h" @@ -142,6 +141,5 @@ void GlobalServicesScriptingInterface::updateDownloadInfo() { } void GlobalServicesScriptingInterface::editFriends() { - auto dialogsManager = DependencyManager::get(); - QMetaObject::invokeMethod(dialogsManager.data(), "showFriendsWindow"); + QMetaObject::invokeMethod(Application::getInstance(), "showFriendsWindow"); } diff --git a/interface/src/scripting/WebWindowClass.cpp b/interface/src/scripting/WebWindowClass.cpp index 31bd4029ac..ccd38df734 100644 --- a/interface/src/scripting/WebWindowClass.cpp +++ b/interface/src/scripting/WebWindowClass.cpp @@ -54,26 +54,27 @@ WebWindowClass::WebWindowClass(const QString& title, const QString& url, int wid _windowWidget = dockWidget; } else { + auto dialogWidget = new QDialog(Application::getInstance()->getWindow(), Qt::Window); + dialogWidget->setWindowTitle(title); + dialogWidget->setMinimumSize(width, height); + connect(dialogWidget, &QDialog::finished, this, &WebWindowClass::hasClosed); - _windowWidget = new QWidget(Application::getInstance()->getWindow(), Qt::Window); - _windowWidget->setWindowTitle(title); - _windowWidget->setMinimumSize(width, height); - - auto layout = new QVBoxLayout(_windowWidget); + auto layout = new QVBoxLayout(dialogWidget); layout->setContentsMargins(0, 0, 0, 0); - _windowWidget->setLayout(layout); + dialogWidget->setLayout(layout); - _webView = new QWebView(_windowWidget); + _webView = new QWebView(dialogWidget); layout->addWidget(_webView); addEventBridgeToWindowObject(); + + _windowWidget = dialogWidget; } _webView->setPage(new DataWebPage()); _webView->setUrl(url); - connect(this, &WebWindowClass::destroyed, _windowWidget, &QWidget::deleteLater); connect(_webView->page()->mainFrame(), &QWebFrame::javaScriptWindowObjectCleared, this, &WebWindowClass::addEventBridgeToWindowObject); @@ -82,6 +83,10 @@ WebWindowClass::WebWindowClass(const QString& title, const QString& url, int wid WebWindowClass::~WebWindowClass() { } +void WebWindowClass::hasClosed() { + emit closed(); +} + void WebWindowClass::addEventBridgeToWindowObject() { _webView->page()->mainFrame()->addToJavaScriptWindowObject("EventBridge", _eventBridge); } diff --git a/interface/src/scripting/WebWindowClass.h b/interface/src/scripting/WebWindowClass.h index 429b054966..f5a292874c 100644 --- a/interface/src/scripting/WebWindowClass.h +++ b/interface/src/scripting/WebWindowClass.h @@ -49,6 +49,12 @@ public slots: ScriptEventBridge* getEventBridge() const { return _eventBridge; } void addEventBridgeToWindowObject(); +signals: + void closed(); + +private slots: + void hasClosed(); + private: QWidget* _windowWidget; QWebView* _webView; diff --git a/interface/src/ui/DialogsManager.cpp b/interface/src/ui/DialogsManager.cpp index 062dbf1dc1..701ceb0189 100644 --- a/interface/src/ui/DialogsManager.cpp +++ b/interface/src/ui/DialogsManager.cpp @@ -21,7 +21,6 @@ #include "BandwidthDialog.h" #include "CachesSizeDialog.h" #include "DiskCacheEditor.h" -#include "FriendsWindow.h" #include "HMDToolsDialog.h" #include "LodToolsDialog.h" #include "LoginDialog.h" @@ -171,9 +170,3 @@ void DialogsManager::showIRCLink() { _ircInfoBox->raise(); } - -void DialogsManager::showFriendsWindow() { - maybeCreateDialog(_friendsWindow); - _friendsWindow->show(); - _friendsWindow->raise(); -} \ No newline at end of file diff --git a/interface/src/ui/DialogsManager.h b/interface/src/ui/DialogsManager.h index efa978e109..897215cbff 100644 --- a/interface/src/ui/DialogsManager.h +++ b/interface/src/ui/DialogsManager.h @@ -27,7 +27,6 @@ class AttachmentsDialog; class BandwidthDialog; class CachesSizeDialog; class DiskCacheEditor; -class FriendsWindow; class LodToolsDialog; class LoginDialog; class OctreeStatsDialog; @@ -60,7 +59,6 @@ public slots: void hmdTools(bool showTools); void showScriptEditor(); void showIRCLink(); - void showFriendsWindow(); private slots: void toggleToolWindow(); @@ -89,7 +87,6 @@ private: QPointer _bandwidthDialog; QPointer _cachesSizeDialog; QPointer _diskCacheEditor; - QPointer _friendsWindow; QPointer _ircInfoBox; QPointer _hmdToolsDialog; QPointer _lodToolsDialog; diff --git a/interface/src/ui/FriendsWindow.cpp b/interface/src/ui/FriendsWindow.cpp deleted file mode 100644 index ee7c7ad4eb..0000000000 --- a/interface/src/ui/FriendsWindow.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// -// FriendsWindow.cpp -// interface/src/ui -// -// Created by David Rowe on 1 Apr 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 -// - -#include -#include - -#include "DataWebPage.h" -#include "FriendsWindow.h" - -const QString EDIT_FRIENDS_DIALOG_URL = "https://metaverse.highfidelity.com/user/friends"; - -FriendsWindow::FriendsWindow(QWidget* parent) { - this->setWindowTitle("Add/Remove Friends"); - this->setAttribute(Qt::WA_DeleteOnClose); - - auto layout = new QVBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - this->setLayout(layout); - - QWebView* webView = new QWebView(this); - layout->addWidget(webView); - webView->setPage(new DataWebPage()); - webView->setUrl(EDIT_FRIENDS_DIALOG_URL); -} diff --git a/interface/src/ui/FriendsWindow.h b/interface/src/ui/FriendsWindow.h deleted file mode 100644 index 0c47f037c0..0000000000 --- a/interface/src/ui/FriendsWindow.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// FriendsWindow.h -// interface/src/ui -// -// Created by David Rowe on 1 Apr 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 -// - -#ifndef hifi_FriendsWindow_h -#define hifi_FriendsWindow_h - -#include - -class FriendsWindow : public QWidget { - Q_OBJECT - -public: - FriendsWindow(QWidget* parent = nullptr); -}; - -#endif // hifi_FriendsWindow_h From 349cc3241da2eedc0a43770088cb203fb8418bc1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 1 Apr 2015 18:59:34 -0700 Subject: [PATCH 07/12] Restore minimized windows to view --- interface/src/scripting/WebWindowClass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/scripting/WebWindowClass.cpp b/interface/src/scripting/WebWindowClass.cpp index ccd38df734..1c9fced619 100644 --- a/interface/src/scripting/WebWindowClass.cpp +++ b/interface/src/scripting/WebWindowClass.cpp @@ -97,6 +97,7 @@ void WebWindowClass::setVisible(bool visible) { QMetaObject::invokeMethod( Application::getInstance()->getToolWindow(), "setVisible", Qt::AutoConnection, Q_ARG(bool, visible)); } else { + QMetaObject::invokeMethod(_windowWidget, "showNormal", Qt::AutoConnection); QMetaObject::invokeMethod(_windowWidget, "raise", Qt::AutoConnection); } } @@ -112,6 +113,7 @@ void WebWindowClass::setURL(const QString& url) { } void WebWindowClass::raise() { + QMetaObject::invokeMethod(_windowWidget, "showNormal", Qt::AutoConnection); QMetaObject::invokeMethod(_windowWidget, "raise", Qt::AutoConnection); } From df5a03b447ffb7d404a64c776591b9004ea411d5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 2 Apr 2015 09:10:47 -0700 Subject: [PATCH 08/12] Update script editor to set icons programatically --- interface/src/ui/ScriptEditorWindow.cpp | 7 +++++++ interface/ui/scriptEditorWindow.ui | 28 +++++++++---------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 858f26f843..424b649b02 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -30,6 +30,7 @@ #include "Application.h" #include "FlowLayout.h" #include "JSConsole.h" +#include "PathUtils.h" ScriptEditorWindow::ScriptEditorWindow(QWidget* parent) : QWidget(parent), @@ -40,6 +41,7 @@ ScriptEditorWindow::ScriptEditorWindow(QWidget* parent) : setAttribute(Qt::WA_DeleteOnClose); _ScriptEditorWindowUI->setupUi(this); + this->setWindowFlags(Qt::Tool); addScriptEditorWidget("New script"); connect(_loadMenu, &QMenu::aboutToShow, this, &ScriptEditorWindow::loadMenuAboutToShow); @@ -54,6 +56,11 @@ ScriptEditorWindow::ScriptEditorWindow(QWidget* parent) : connect(new QShortcut(QKeySequence("Ctrl+O"), this), &QShortcut::activated, this, &ScriptEditorWindow::loadScriptClicked); connect(new QShortcut(QKeySequence("F5"), this), &QShortcut::activated, this, &ScriptEditorWindow::toggleRunScriptClicked); + _ScriptEditorWindowUI->loadButton->setIcon(QIcon(QPixmap(PathUtils::resourcesPath() + "icons/load-script.svg"))); + _ScriptEditorWindowUI->newButton->setIcon(QIcon(QPixmap(PathUtils::resourcesPath() + "icons/new-script.svg"))); + _ScriptEditorWindowUI->saveButton->setIcon(QIcon(QPixmap(PathUtils::resourcesPath() + "icons/save-script.svg"))); + _ScriptEditorWindowUI->toggleRunButton->setIcon(QIcon(QPixmap(PathUtils::resourcesPath() + "icons/start-script.svg"))); + QWidget* console = new JSConsole(this); console->setFixedHeight(CONSOLE_HEIGHT); this->layout()->addWidget(console); diff --git a/interface/ui/scriptEditorWindow.ui b/interface/ui/scriptEditorWindow.ui index 0379f51e97..1e50aaef0b 100644 --- a/interface/ui/scriptEditorWindow.ui +++ b/interface/ui/scriptEditorWindow.ui @@ -29,7 +29,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -54,11 +63,6 @@ New - - - ../resources/icons/new-script.svg - ../resources/icons/new-script.svg../resources/icons/new-script.svg - 32 @@ -87,10 +91,6 @@ Load - - - ../resources/icons/load-script.svg../resources/icons/load-script.svg - 32 @@ -134,10 +134,6 @@ Save - - - ../resources/icons/save-script.svg../resources/icons/save-script.svg - 32 @@ -160,10 +156,6 @@ Run/Stop - - - ../resources/icons/start-script.svg../resources/icons/start-script.svg - 32 From 84940d8e43bc3cee6c9dc559e28069673331512e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Apr 2015 14:13:19 -0700 Subject: [PATCH 09/12] fix SVO import --- libraries/entities/src/EntityTree.cpp | 12 ++++++++++++ libraries/octree/src/Octree.cpp | 14 +++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index c4b12f2059..16ece64a4d 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -662,11 +662,23 @@ int EntityTree::processEditPacketData(PacketType packetType, const unsigned char if (senderNode->getCanRez()) { // this is a new entity... assign a new entityID entityItemID = assignEntityID(entityItemID); + if (wantEditLogging()) { + qDebug() << "User [" << senderNode->getUUID() << "] adding entity."; + qDebug() << " properties:" << properties; + } EntityItem* newEntity = addEntity(entityItemID, properties); if (newEntity) { newEntity->markAsChangedOnServer(); notifyNewlyCreatedEntity(*newEntity, senderNode); + if (wantEditLogging()) { + qDebug() << "User [" << senderNode->getUUID() << "] added entity. ID:" + << newEntity->getEntityItemID(); + qDebug() << " properties:" << properties; + } + } + } else { + qDebug() << "User without 'rez rights' [" << senderNode->getUUID() << "] attempted to add an entity."; } } } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 85ea09b5ef..e07d62fe83 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1916,8 +1916,10 @@ bool Octree::readFromStream(unsigned long streamLength, QDataStream& inputStream device->ungetChar(firstChar); if (firstChar == (char) PacketTypeEntityData) { + qDebug() << "Reading from SVO Stream length:" << streamLength; return readSVOFromStream(streamLength, inputStream); } else { + qDebug() << "Reading from JSON Stream length:" << streamLength; return readJSONFromStream(streamLength, inputStream); } } @@ -2053,12 +2055,14 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr } bool Octree::readJSONFromStream(unsigned long streamLength, QDataStream& inputStream) { - char *rawData = new char[streamLength]; + char* rawData = new char[streamLength + 1]; // allocate enough room to null terminate inputStream.readRawData(rawData, streamLength); - QJsonDocument d = QJsonDocument::fromJson(rawData); - QVariant v = d.toVariant(); - QVariantMap m = v.toMap(); - readFromMap(m); + rawData[streamLength] = 0; // make sure we null terminate this string + + QJsonDocument asDocument = QJsonDocument::fromJson(rawData); + QVariant asVariant = asDocument.toVariant(); + QVariantMap asMap = asVariant.toMap(); + readFromMap(asMap); delete rawData; return true; } From 44c9d4a742a9868a962ce786ef9c47a0f1e9c840 Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Thu, 2 Apr 2015 16:12:44 -0700 Subject: [PATCH 10/12] Working on removing some of the warnings in the xcode build --- interface/src/Application.cpp | 4 ++-- interface/src/devices/OculusManager.cpp | 3 +-- libraries/networking/src/DataServerAccountInfo.cpp | 1 + libraries/networking/src/RSAKeypairGenerator.cpp | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a8f9efd672..f0324b7361 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -268,6 +268,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _dependencyManagerIsSetup(setupEssentials(argc, argv)), _window(new MainWindow(desktop())), _toolWindow(NULL), + _friendsWindow(NULL), _datagramProcessor(), _undoStack(), _undoStackScriptingInterface(&_undoStack), @@ -309,8 +310,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _isVSyncOn(true), _aboutToQuit(false), _notifiedPacketVersionMismatchThisDomain(false), - _domainConnectionRefusals(QList()), - _friendsWindow(NULL) + _domainConnectionRefusals(QList()) { #ifdef Q_OS_WIN installNativeEventFilter(&MyNativeEventFilter::getInstance()); diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index db10298583..5fbd0b6a0b 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -443,7 +443,6 @@ void OculusManager::configureCamera(Camera& camera, int screenWidth, int screenH camera.setFieldOfView(atan(_eyeFov[0].UpTan) * DEGREES_PER_RADIAN * 2.0f); } -static bool timerActive = false; //Displays everything for the oculus, frame timing must be active void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &position, Camera& whichCamera) { auto glCanvas = Application::getInstance()->getGLWidget(); @@ -463,6 +462,7 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p // (does not seem to work on OSX with SDK based distortion) // FIXME can't use a static object here, because it will cause a crash when the // query attempts deconstruct after the GL context is gone. + static bool timerActive = false; static QOpenGLTimerQuery timerQuery; if (!timerQuery.isCreated()) { timerQuery.create(); @@ -671,7 +671,6 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p #endif // No DK2, no message. - char latency2Text[128] = ""; { float latencies[5] = {}; if (debugFrame && ovrHmd_GetFloatArray(_ovrHmd, "DK2Latency", latencies, 5) == 5) diff --git a/libraries/networking/src/DataServerAccountInfo.cpp b/libraries/networking/src/DataServerAccountInfo.cpp index 9b513c96f1..00ef0f9e1d 100644 --- a/libraries/networking/src/DataServerAccountInfo.cpp +++ b/libraries/networking/src/DataServerAccountInfo.cpp @@ -15,6 +15,7 @@ #include #include "DataServerAccountInfo.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" DataServerAccountInfo::DataServerAccountInfo() : _accessToken(), diff --git a/libraries/networking/src/RSAKeypairGenerator.cpp b/libraries/networking/src/RSAKeypairGenerator.cpp index a51a17c0ca..bfe16cc9b8 100644 --- a/libraries/networking/src/RSAKeypairGenerator.cpp +++ b/libraries/networking/src/RSAKeypairGenerator.cpp @@ -16,6 +16,7 @@ #include #include "RSAKeypairGenerator.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" RSAKeypairGenerator::RSAKeypairGenerator(QObject* parent) : QObject(parent) From 45ab4383393d5a2527ef911193897b61febb99e3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Apr 2015 16:44:04 -0700 Subject: [PATCH 11/12] add logging for delete operations in the server --- libraries/entities/src/EntityTree.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 16ece64a4d..446c5ab22f 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -920,6 +920,11 @@ int EntityTree::processEraseMessage(const QByteArray& dataByteArray, const Share EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; + + if (wantEditLogging()) { + qDebug() << "User [" << sourceNode->getUUID() << "] deleting entity. ID:" << entityItemID; + } + } deleteEntities(entityItemIDsToDelete, true, true); } @@ -959,6 +964,11 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; + + if (wantEditLogging()) { + qDebug() << "User [" << sourceNode->getUUID() << "] deleting entity. ID:" << entityItemID; + } + } deleteEntities(entityItemIDsToDelete, true, true); } From 0434b1fd28229857ee33dfd829765c6e1bfe1922 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 3 Apr 2015 16:09:23 +0200 Subject: [PATCH 12/12] Remove unload callback --- examples/entityScripts/lightController.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/entityScripts/lightController.js b/examples/entityScripts/lightController.js index 31e07c4602..6d6c0a59bd 100644 --- a/examples/entityScripts/lightController.js +++ b/examples/entityScripts/lightController.js @@ -212,12 +212,8 @@ this.preload = function(entityID) { this.preOperation(entityID); - }; - this.unload = function(){ - Entities.deleteEntity(this.lightID); } - this.clickReleaseOnEntity = function(entityID, mouseEvent) { this.preOperation(entityID);