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; };