1041 lines · 47.1 KB · C++
RawDownload
////  Menu.cpp//  interface/src////  Created by Stephen Birarda on 8/12/13.//  Copyright 2013 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 <QFileDialog>#include <QMenuBar>#include <QShortcut> #include <AddressManager.h>#include <AudioClient.h>#include <DependencyManager.h>#include <PathUtils.h>#include <SettingHandle.h>#include <UserActivityLogger.h>#include <VrMenu.h> #include "Application.h"#include "AccountManager.h"#include "audio/AudioScope.h"#include "avatar/AvatarManager.h"#include "devices/DdeFaceTracker.h"#include "devices/Faceshift.h"#include "devices/RealSense.h"#include <input-plugins/SixenseManager.h> // TODO: should be able to remove this once input plugin architecture is finished#include "MainWindow.h"#include "scripting/MenuScriptingInterface.h"#if defined(Q_OS_MAC) || defined(Q_OS_WIN)#include "SpeechRecognizer.h"#endif#include "ui/DialogsManager.h"#include "ui/StandAloneJSConsole.h"#include "InterfaceLogging.h" #include "Menu.h" Menu* Menu::_instance = NULL; Menu* Menu::getInstance() {    static QMutex menuInstanceMutex;     // lock the menu instance mutex to make sure we don't race and create two menus and crash    menuInstanceMutex.lock();     if (!_instance) {        qCDebug(interfaceapp, "First call to Menu::getInstance() - initing menu.");        _instance = new Menu();    }     menuInstanceMutex.unlock();     return _instance;} Menu::Menu() {    MenuWrapper * fileMenu = addMenu("File");#ifdef Q_OS_MAC    addActionToQMenuAndActionHash(fileMenu, MenuOption::AboutApp, 0, qApp, SLOT(aboutApp()), QAction::AboutRole);#endif    auto dialogsManager = DependencyManager::get<DialogsManager>();    AccountManager& accountManager = AccountManager::getInstance();     {        addActionToQMenuAndActionHash(fileMenu, MenuOption::Login);         // connect to the appropriate signal of the AccountManager so that we can change the Login/Logout menu item        connect(&accountManager, &AccountManager::profileChanged,                dialogsManager.data(), &DialogsManager::toggleLoginDialog);        connect(&accountManager, &AccountManager::logoutComplete,                dialogsManager.data(), &DialogsManager::toggleLoginDialog);    }     addDisabledActionAndSeparator(fileMenu, "Scripts");    addActionToQMenuAndActionHash(fileMenu, MenuOption::LoadScript, Qt::CTRL | Qt::Key_O,                                  qApp, SLOT(loadDialog()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::LoadScriptURL,                                    Qt::CTRL | Qt::SHIFT | Qt::Key_O, qApp, SLOT(loadScriptURLDialog()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::StopAllScripts, 0, qApp, SLOT(stopAllScripts()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::ReloadAllScripts, Qt::CTRL | Qt::Key_R,                                  qApp, SLOT(reloadAllScripts()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::RunningScripts, Qt::CTRL | Qt::Key_J,                                  qApp, SLOT(toggleRunningScriptsWidget()));     auto addressManager = DependencyManager::get<AddressManager>();     addDisabledActionAndSeparator(fileMenu, "History");     QAction* backAction = addActionToQMenuAndActionHash(fileMenu,                                                        MenuOption::Back,                                                        0,                                                        addressManager.data(),                                                        SLOT(goBack()));     QAction* forwardAction = addActionToQMenuAndActionHash(fileMenu,                                                           MenuOption::Forward,                                                           0,                                                           addressManager.data(),                                                           SLOT(goForward()));     // connect to the AddressManager signal to enable and disable the back and forward menu items    connect(addressManager.data(), &AddressManager::goBackPossible, backAction, &QAction::setEnabled);    connect(addressManager.data(), &AddressManager::goForwardPossible, forwardAction, &QAction::setEnabled);     // set the two actions to start disabled since the stacks are clear on startup    backAction->setDisabled(true);    forwardAction->setDisabled(true);     addDisabledActionAndSeparator(fileMenu, "Location");    qApp->getBookmarks()->setupMenus(this, fileMenu);     addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::AddressBar,                                  Qt::CTRL | Qt::Key_L,                                  dialogsManager.data(),                                  SLOT(toggleAddressBar()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::CopyAddress, 0,                                  addressManager.data(), SLOT(copyAddress()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::CopyPath, 0,                                  addressManager.data(), SLOT(copyPath()));     addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::Quit,                                  Qt::CTRL | Qt::Key_Q,                                  qApp,                                  SLOT(quit()),                                  QAction::QuitRole);      MenuWrapper* editMenu = addMenu("Edit");     QUndoStack* undoStack = qApp->getUndoStack();    QAction* undoAction = undoStack->createUndoAction(editMenu);    undoAction->setShortcut(Qt::CTRL | Qt::Key_Z);    addActionToQMenuAndActionHash(editMenu, undoAction);     QAction* redoAction = undoStack->createRedoAction(editMenu);    redoAction->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_Z);    addActionToQMenuAndActionHash(editMenu, redoAction);     addActionToQMenuAndActionHash(editMenu,                                  MenuOption::Preferences,                                  Qt::CTRL | Qt::Key_Comma,                                  dialogsManager.data(),                                  SLOT(editPreferences()),                                  QAction::PreferencesRole);     addActionToQMenuAndActionHash(editMenu, MenuOption::Attachments, 0,                                  dialogsManager.data(), SLOT(editAttachments()));    addActionToQMenuAndActionHash(editMenu, MenuOption::Animations, 0,                                  dialogsManager.data(), SLOT(editAnimations()));     MenuWrapper* toolsMenu = addMenu("Tools");    addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor,  Qt::ALT | Qt::Key_S,                                  dialogsManager.data(), SLOT(showScriptEditor())); #if defined(Q_OS_MAC) || defined(Q_OS_WIN)    auto speechRecognizer = DependencyManager::get<SpeechRecognizer>();    QAction* speechRecognizerAction = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::ControlWithSpeech,                                                                             Qt::CTRL | Qt::SHIFT | Qt::Key_C,                                                                             speechRecognizer->getEnabled(),                                                                             speechRecognizer.data(),                                                                             SLOT(setEnabled(bool)));    connect(speechRecognizer.data(), SIGNAL(enabledUpdated(bool)), speechRecognizerAction, SLOT(setChecked(bool)));#endif     addActionToQMenuAndActionHash(toolsMenu, MenuOption::Chat,                                  0, // QML Qt::Key_Backslash,                                  dialogsManager.data(), SLOT(showIRCLink()));    addActionToQMenuAndActionHash(toolsMenu, MenuOption::AddRemoveFriends, 0,                                  qApp, SLOT(showFriendsWindow()));     MenuWrapper* 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,            discoverabilityManager.data(), SLOT(setVisibility()));        visibilityGroup->addAction(visibleToEveryone);         QAction* visibleToFriends = addCheckableActionToQMenuAndActionHash(visibilityMenu, MenuOption::VisibleToFriends,            0, discoverabilityManager->getDiscoverabilityMode() == Discoverability::Friends,            discoverabilityManager.data(), SLOT(setVisibility()));        visibilityGroup->addAction(visibleToFriends);         QAction* visibleToNoOne = addCheckableActionToQMenuAndActionHash(visibilityMenu, MenuOption::VisibleToNoOne,            0, discoverabilityManager->getDiscoverabilityMode() == Discoverability::None,            discoverabilityManager.data(), SLOT(setVisibility()));        visibilityGroup->addAction(visibleToNoOne);         connect(discoverabilityManager.data(), &DiscoverabilityManager::discoverabilityModeChanged,            discoverabilityManager.data(), &DiscoverabilityManager::visibilityChanged);    }     addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::ToolWindow,                                  Qt::CTRL | Qt::ALT | Qt::Key_T,                                  dialogsManager.data(),                                  SLOT(toggleToolWindow()));     addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::Console,                                  Qt::CTRL | Qt::ALT | Qt::Key_J,                                  DependencyManager::get<StandAloneJSConsole>().data(),                                  SLOT(toggleConsole()));     addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::ResetSensors,                                  0, // QML Qt::Key_Apostrophe,                                  qApp,                                  SLOT(resetSensors()));     addActionToQMenuAndActionHash(toolsMenu, MenuOption::PackageModel, 0,                                  qApp, SLOT(packageModel()));     MenuWrapper* avatarMenu = addMenu("Avatar");    QObject* avatar = DependencyManager::get<AvatarManager>()->getMyAvatar();     MenuWrapper* inputModeMenu = addMenu(MenuOption::InputMenu);    QActionGroup* inputModeGroup = new QActionGroup(inputModeMenu);    inputModeGroup->setExclusive(false);        MenuWrapper* avatarSizeMenu = avatarMenu->addMenu("Size");    addActionToQMenuAndActionHash(avatarSizeMenu,                                  MenuOption::IncreaseAvatarSize,                                  0, // QML Qt::Key_Plus,                                  avatar,                                  SLOT(increaseSize()));    addActionToQMenuAndActionHash(avatarSizeMenu,                                  MenuOption::DecreaseAvatarSize,                                  0, // QML Qt::Key_Minus,                                  avatar,                                  SLOT(decreaseSize()));    addActionToQMenuAndActionHash(avatarSizeMenu,                                  MenuOption::ResetAvatarSize,                                  0, // QML Qt::Key_Equal,                                  avatar,                                  SLOT(resetSize()));     addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::KeyboardMotorControl,            Qt::CTRL | Qt::SHIFT | Qt::Key_K, true, avatar, SLOT(updateMotionBehaviorFromMenu()));    addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::ScriptedMotorControl, 0, true,            avatar, SLOT(updateMotionBehaviorFromMenu()));    addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::NamesAboveHeads, 0, true);    addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::BlueSpeechSphere, 0, true);    addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::EnableCharacterController, 0, true,            avatar, SLOT(updateMotionBehaviorFromMenu()));    addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::ShiftHipsForIdleAnimations, 0, false,            avatar, SLOT(updateMotionBehaviorFromMenu()));     MenuWrapper* viewMenu = addMenu("View");    {        MenuWrapper* displayModeMenu = addMenu(MenuOption::OutputMenu);        QActionGroup* displayModeGroup = new QActionGroup(displayModeMenu);        displayModeGroup->setExclusive(true);    }     addActionToQMenuAndActionHash(viewMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()));     MenuWrapper* cameraModeMenu = viewMenu->addMenu("Camera Mode");    QActionGroup* cameraModeGroup = new QActionGroup(cameraModeMenu);    cameraModeGroup->setExclusive(true);    cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu,                                                                      MenuOption::FirstPerson, 0, // QML Qt:: Key_P                                                                      false, qApp, SLOT(cameraMenuChanged())));    cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu,                                                                      MenuOption::ThirdPerson, 0,                                                                      true, qApp, SLOT(cameraMenuChanged())));    cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu,                                                                      MenuOption::IndependentMode, 0,                                                                      false, qApp, SLOT(cameraMenuChanged())));    cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(cameraModeMenu,                                                                      MenuOption::FullscreenMirror, 0, // QML Qt::Key_H,                                                                      false, qApp, SLOT(cameraMenuChanged())));     addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Mirror,        0, //QML Qt::SHIFT | Qt::Key_H,        true);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FullscreenMirror,        0, // QML Qt::Key_H,        false, qApp, SLOT(cameraMenuChanged()));        addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::CenterPlayerInView,                                           0, false, qApp, SLOT(rotationModeChanged()));      addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::TurnWithHead, 0, false);     addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::StandingHMDSensorMode, 0, false,                                           avatar, SLOT(updateStandingHMDModeFromMenu()));     addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats);    addActionToQMenuAndActionHash(viewMenu, MenuOption::Log,        Qt::CTRL | Qt::SHIFT | Qt::Key_L,        qApp, SLOT(toggleLogDialog()));    addActionToQMenuAndActionHash(viewMenu, MenuOption::AudioNetworkStats, 0,                                  dialogsManager.data(), SLOT(audioStatsDetails()));    addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0,                                  dialogsManager.data(), SLOT(bandwidthDetails()));    addActionToQMenuAndActionHash(viewMenu, MenuOption::OctreeStats, 0,                                  dialogsManager.data(), SLOT(octreeStatsDetails()));      MenuWrapper* developerMenu = addMenu("Developer");     MenuWrapper* renderOptionsMenu = developerMenu->addMenu("Render");    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Atmosphere,        0, // QML Qt::SHIFT | Qt::Key_A,        true);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::AmbientOcclusion);     MenuWrapper* ambientLightMenu = renderOptionsMenu->addMenu(MenuOption::RenderAmbientLight);    QActionGroup* ambientLightGroup = new QActionGroup(ambientLightMenu);    ambientLightGroup->setExclusive(true);    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLightGlobal, 0, true));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight0, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight1, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight2, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight3, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight4, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight5, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight6, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight7, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight8, 0, false));    ambientLightGroup->addAction(addCheckableActionToQMenuAndActionHash(ambientLightMenu, MenuOption::RenderAmbientLight9, 0, false));     MenuWrapper* shadowMenu = renderOptionsMenu->addMenu("Shadows");    QActionGroup* shadowGroup = new QActionGroup(shadowMenu);    shadowGroup->addAction(addCheckableActionToQMenuAndActionHash(shadowMenu, "None", 0, true));    shadowGroup->addAction(addCheckableActionToQMenuAndActionHash(shadowMenu, MenuOption::SimpleShadows, 0, false));    shadowGroup->addAction(addCheckableActionToQMenuAndActionHash(shadowMenu, MenuOption::CascadedShadows, 0, false));     {        MenuWrapper* framerateMenu = renderOptionsMenu->addMenu(MenuOption::RenderTargetFramerate);        QActionGroup* framerateGroup = new QActionGroup(framerateMenu);        framerateGroup->setExclusive(true);        framerateGroup->addAction(addCheckableActionToQMenuAndActionHash(framerateMenu, MenuOption::RenderTargetFramerateUnlimited, 0, true));        framerateGroup->addAction(addCheckableActionToQMenuAndActionHash(framerateMenu, MenuOption::RenderTargetFramerate60, 0, false));        framerateGroup->addAction(addCheckableActionToQMenuAndActionHash(framerateMenu, MenuOption::RenderTargetFramerate50, 0, false));        framerateGroup->addAction(addCheckableActionToQMenuAndActionHash(framerateMenu, MenuOption::RenderTargetFramerate40, 0, false));        framerateGroup->addAction(addCheckableActionToQMenuAndActionHash(framerateMenu, MenuOption::RenderTargetFramerate30, 0, false)); #if defined(Q_OS_MAC)#else        addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::RenderTargetFramerateVSyncOn, 0, true,                                               qApp, SLOT(setVSyncEnabled()));#endif        addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ThrottleFPSIfNotFocus, 0, false,            qApp, SLOT(setThrottleFPSEnabled()));    }      MenuWrapper* resolutionMenu = renderOptionsMenu->addMenu(MenuOption::RenderResolution);    QActionGroup* resolutionGroup = new QActionGroup(resolutionMenu);    resolutionGroup->setExclusive(true);    resolutionGroup->addAction(addCheckableActionToQMenuAndActionHash(resolutionMenu, MenuOption::RenderResolutionOne, 0, true));    resolutionGroup->addAction(addCheckableActionToQMenuAndActionHash(resolutionMenu, MenuOption::RenderResolutionTwoThird, 0, false));    resolutionGroup->addAction(addCheckableActionToQMenuAndActionHash(resolutionMenu, MenuOption::RenderResolutionHalf, 0, false));    resolutionGroup->addAction(addCheckableActionToQMenuAndActionHash(resolutionMenu, MenuOption::RenderResolutionThird, 0, false));    resolutionGroup->addAction(addCheckableActionToQMenuAndActionHash(resolutionMenu, MenuOption::RenderResolutionQuarter, 0, false));     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Stars,        0, // QML Qt::Key_Asterisk,        true);     addActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::LodTools,        0, // QML Qt::SHIFT | Qt::Key_L,        dialogsManager.data(), SLOT(lodTools()));     MenuWrapper* avatarDebugMenu = developerMenu->addMenu("Avatar");     MenuWrapper* faceTrackingMenu = avatarDebugMenu->addMenu("Face Tracking");    {        QActionGroup* faceTrackerGroup = new QActionGroup(avatarDebugMenu);         bool defaultNoFaceTracking = true;#ifdef HAVE_DDE        defaultNoFaceTracking = false;#endif        QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking,            0, defaultNoFaceTracking,            qApp, SLOT(setActiveFaceTracker()));        faceTrackerGroup->addAction(noFaceTracker); #ifdef HAVE_FACESHIFT        QAction* faceshiftFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Faceshift,            0, false,            qApp, SLOT(setActiveFaceTracker()));        faceTrackerGroup->addAction(faceshiftFaceTracker);#endif#ifdef HAVE_DDE        QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseCamera,            0, true,            qApp, SLOT(setActiveFaceTracker()));        faceTrackerGroup->addAction(ddeFaceTracker);#endif    }#ifdef HAVE_DDE    faceTrackingMenu->addSeparator();    QAction* binaryEyelidControl = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::BinaryEyelidControl, 0, true);    binaryEyelidControl->setVisible(true);  // DDE face tracking is on by default    QAction* useAudioForMouth = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseAudioForMouth, 0, true);    useAudioForMouth->setVisible(true);  // DDE face tracking is on by default    QAction* ddeFiltering = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::VelocityFilter, 0, true);    ddeFiltering->setVisible(true);  // DDE face tracking is on by default    QAction* ddeCalibrate = addActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::CalibrateCamera, 0,        DependencyManager::get<DdeFaceTracker>().data(), SLOT(calibrate()));    ddeCalibrate->setVisible(true);  // DDE face tracking is on by default#endif#if defined(HAVE_FACESHIFT) || defined(HAVE_DDE)    faceTrackingMenu->addSeparator();    addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking,        Qt::CTRL | Qt::SHIFT | Qt::Key_F, true);  // DDE face tracking is on by default    addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::AutoMuteAudio, 0, false);#endif     auto avatarManager = DependencyManager::get<AvatarManager>();    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AvatarReceiveStats, 0, false,                                           avatarManager.data(), SLOT(setShouldShowReceiveStats(bool)));     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSkeletonCollisionShapes);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderHeadCollisionShapes);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderBoundingCollisionShapes);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderLookAtVectors, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderFocusIndicator, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowWhosLookingAtMe, 0, false);     MenuWrapper* handOptionsMenu = developerMenu->addMenu("Hands");    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::AlignForearmsWithWrists, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::AlternateIK, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHands, 0, true);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::HandMouseInput, 0, true);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::HandLasers, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::LowVelocityFilter, 0, true,                                           qApp, SLOT(setLowVelocityFilter(bool)));    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::ShowIKConstraints, 0, false);     MenuWrapper* sixenseOptionsMenu = handOptionsMenu->addMenu("Sixense");    addCheckableActionToQMenuAndActionHash(sixenseOptionsMenu,                                           MenuOption::FilterSixense,                                           0,                                           true,                                           &SixenseManager::getInstance(),                                           SLOT(setFilter(bool)));     MenuWrapper* leapOptionsMenu = handOptionsMenu->addMenu("Leap Motion");    addCheckableActionToQMenuAndActionHash(leapOptionsMenu, MenuOption::LeapMotionOnHMD, 0, false); #ifdef HAVE_RSSDK    MenuWrapper* realSenseOptionsMenu = handOptionsMenu->addMenu("RealSense");    addActionToQMenuAndActionHash(realSenseOptionsMenu, MenuOption::LoadRSSDKFile, 0,                                  RealSense::getInstance(), SLOT(loadRSSDKFile()));#endif     MenuWrapper* networkMenu = developerMenu->addMenu("Network");    addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, false);    addCheckableActionToQMenuAndActionHash(networkMenu,                                           MenuOption::DisableActivityLogger,                                           0,                                           false,                                           &UserActivityLogger::getInstance(),                                           SLOT(disable(bool)));    addActionToQMenuAndActionHash(networkMenu, MenuOption::CachesSize, 0,                                  dialogsManager.data(), SLOT(cachesSizeDialog()));    addActionToQMenuAndActionHash(networkMenu, MenuOption::DiskCacheEditor, 0,                                  dialogsManager.data(), SLOT(toggleDiskCacheEditor()));     addActionToQMenuAndActionHash(networkMenu, MenuOption::ShowDSConnectTable, 0,                                  dialogsManager.data(), SLOT(showDomainConnectionDialog()));     MenuWrapper* timingMenu = developerMenu->addMenu("Timing and Stats");     MenuWrapper* perfTimerMenu = timingMenu->addMenu("Performance Timer");    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::DisplayDebugTimingDetails, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::OnlyDisplayTopTen, 0, true);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandUpdateTiming, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandMyAvatarTiming, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandMyAvatarSimulateTiming, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandOtherAvatarTiming, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandPaintGLTiming, 0, false);     addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::TestPing, 0, true);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::FrameTimer);    addActionToQMenuAndActionHash(timingMenu, MenuOption::RunTimingTests, 0, qApp, SLOT(runTests()));    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::PipelineWarnings);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::LogExtraTimings);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::SuppressShortTimings);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::ShowRealtimeEntityStats);     auto audioIO = DependencyManager::get<AudioClient>();    MenuWrapper* audioDebugMenu = developerMenu->addMenu("Audio");    addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioNoiseReduction,

Lines 1–500 of 1041.