Add menu items that set visibility

And synchronize visibility settings between Interface and users.js.
This commit is contained in:
David Rowe 2015-03-29 18:35:56 -07:00
parent be69c0b58f
commit cbf2012bf5
7 changed files with 106 additions and 34 deletions

View file

@ -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);

View file

@ -24,7 +24,7 @@ const Discoverability::Mode DEFAULT_DISCOVERABILITY_MODE = Discoverability::All;
DiscoverabilityManager::DiscoverabilityManager() :
_mode("discoverabilityMode", DEFAULT_DISCOVERABILITY_MODE)
{
qRegisterMetaType<Discoverability::Mode>("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);
}
}

View file

@ -35,7 +35,10 @@ public slots:
Discoverability::Mode getDiscoverabilityMode() { return static_cast<Discoverability::Mode>(_mode.get()); }
void setDiscoverabilityMode(Discoverability::Mode discoverabilityMode);
signals:
void discoverabilityModeChanged(Discoverability::Mode discoverabilityMode);
private:
DiscoverabilityManager();

View file

@ -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<DiscoverabilityManager>();
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<DiscoverabilityManager>();
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.";
}
}

View file

@ -21,6 +21,8 @@
#include <MenuItemProperties.h>
#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<QString, QAction*> _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";
}

View file

@ -24,6 +24,10 @@ GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() {
_downloading = false;
connect(Application::getInstance(), &Application::renderingInWorldInterface,
this, &GlobalServicesScriptingInterface::checkDownloadInfo);
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
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<DiscoverabilityManager>();
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<float>()),
pending(0.0f)

View file

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