1149 lines · 52.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 <display-plugins/DisplayPlugin.h>#include <PathUtils.h>#include <SettingHandle.h>#include <UserActivityLogger.h>#include <VrMenu.h> #include "Application.h"#include "AccountManager.h"#include "assets/ATPAssetMigrator.h"#include "audio/AudioScope.h"#include "avatar/AvatarManager.h"#include "devices/DdeFaceTracker.h"#include "devices/Faceshift.h"#include "input-plugins/SpacemouseManager.h"#include "MainWindow.h"#include "scripting/MenuScriptingInterface.h"#include "ui/AssetUploadDialogFactory.h"#include "ui/DialogsManager.h"#include "ui/StandAloneJSConsole.h"#include "InterfaceLogging.h" #if defined(Q_OS_MAC) || defined(Q_OS_WIN)#include "SpeechRecognizer.h"#endif #include "Menu.h" static const char* const MENU_PROPERTY_NAME = "com.highfidelity.Menu"; Menu* Menu::getInstance() {    static Menu* instance = globalInstance<Menu>(MENU_PROPERTY_NAME);    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);    }     // File Menu > Scripts section -- "Advanced" grouping    addDisabledActionAndSeparator(fileMenu, "Scripts", UNSPECIFIED_POSITION, "Advanced");    addActionToQMenuAndActionHash(fileMenu, MenuOption::LoadScript, Qt::CTRL | Qt::Key_O,                                  qApp, SLOT(loadDialog()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");    addActionToQMenuAndActionHash(fileMenu, MenuOption::LoadScriptURL,                                    Qt::CTRL | Qt::SHIFT | Qt::Key_O, qApp, SLOT(loadScriptURLDialog()),                                    QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");    addActionToQMenuAndActionHash(fileMenu, MenuOption::StopAllScripts, 0, qApp, SLOT(stopAllScripts()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");    addActionToQMenuAndActionHash(fileMenu, MenuOption::ReloadAllScripts, Qt::CTRL | Qt::Key_R,                                  qApp, SLOT(reloadAllScripts()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");    addActionToQMenuAndActionHash(fileMenu, MenuOption::RunningScripts, Qt::CTRL | Qt::Key_J,                                  qApp, SLOT(toggleRunningScriptsWidget()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     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()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");    addActionToQMenuAndActionHash(fileMenu, MenuOption::CopyPath, 0,                                  addressManager.data(), SLOT(copyPath()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     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()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     MenuWrapper* toolsMenu = addMenu("Tools");    addActionToQMenuAndActionHash(toolsMenu, MenuOption::ScriptEditor,  Qt::ALT | Qt::Key_S,                                  dialogsManager.data(), SLOT(showScriptEditor()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced"); #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)),                                                                             UNSPECIFIED_POSITION, "Advanced");    connect(speechRecognizer.data(), SIGNAL(enabledUpdated(bool)), speechRecognizerAction, SLOT(setChecked(bool)));#endif     addActionToQMenuAndActionHash(toolsMenu, MenuOption::Chat,                                  0, // QML Qt::Key_Backslash,                                  dialogsManager.data(), SLOT(showIRCLink()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     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()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::Console,                                  Qt::CTRL | Qt::ALT | Qt::Key_J,                                  DependencyManager::get<StandAloneJSConsole>().data(),                                  SLOT(toggleConsole()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::ResetSensors,                                  0, // QML Qt::Key_Apostrophe,                                  qApp,                                  SLOT(resetSensors()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     addActionToQMenuAndActionHash(toolsMenu, MenuOption::PackageModel, 0,                                  qApp, SLOT(packageModel()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     addMenu(DisplayPlugin::MENU_PATH());    {        MenuWrapper* displayModeMenu = addMenu(MenuOption::OutputMenu);        QActionGroup* displayModeGroup = new QActionGroup(displayModeMenu);        displayModeGroup->setExclusive(true);    }     MenuWrapper* avatarMenu = addMenu("Avatar");    QObject* avatar = DependencyManager::get<AvatarManager>()->getMyAvatar();     MenuWrapper* inputModeMenu = addMenu(MenuOption::InputMenu, "Advanced");    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::NamesAboveHeads, 0, true,                 NULL, NULL, UNSPECIFIED_POSITION, "Advanced");     MenuWrapper* viewMenu = addMenu("View");    addActionToQMenuAndActionHash(viewMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()),                 QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");     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::CameraEntityMode, 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::CenterPlayerInView,                                           0, false, qApp, SLOT(rotationModeChanged()),                                           UNSPECIFIED_POSITION, "Advanced");     addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::WorldAxes, 0, false, NULL, NULL, UNSPECIFIED_POSITION, "Developer");    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, 0, false, NULL, NULL, UNSPECIFIED_POSITION, "Developer");    addActionToQMenuAndActionHash(viewMenu, MenuOption::Log,                Qt::CTRL | Qt::SHIFT | Qt::Key_L,                 qApp, SLOT(toggleLogDialog()), QAction::NoRole, UNSPECIFIED_POSITION, "Developer");     addActionToQMenuAndActionHash(viewMenu, MenuOption::AudioNetworkStats, 0,                dialogsManager.data(), SLOT(audioStatsDetails()), QAction::NoRole, UNSPECIFIED_POSITION, "Developer");     addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0,                dialogsManager.data(), SLOT(bandwidthDetails()), QAction::NoRole, UNSPECIFIED_POSITION, "Developer");    addActionToQMenuAndActionHash(viewMenu, MenuOption::OctreeStats, 0,                dialogsManager.data(), SLOT(octreeStatsDetails()), QAction::NoRole, UNSPECIFIED_POSITION, "Developer");     addCheckableActionToQMenuAndActionHash(viewMenu, "Advanced Menus", 0, false, this, SLOT(toggleAdvancedMenus()));    addCheckableActionToQMenuAndActionHash(viewMenu, "Developer Menus", 0, false, this, SLOT(toggleDeveloperMenus()));     MenuWrapper* developerMenu = addMenu("Developer", "Developer");     MenuWrapper* renderOptionsMenu = developerMenu->addMenu("Render");    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Atmosphere,        0, // QML Qt::SHIFT | Qt::Key_A,        true);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::DebugAmbientOcclusion);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Antialiasing);     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));     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ThrottleFPSIfNotFocus, 0, true);     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* assetDeveloperMenu = developerMenu->addMenu("Assets");        auto& assetDialogFactory = AssetUploadDialogFactory::getInstance();    assetDialogFactory.setDialogParent(this);        QAction* assetUpload = addActionToQMenuAndActionHash(assetDeveloperMenu,                                                         MenuOption::UploadAsset,                                                         0,                                                         &assetDialogFactory,                                                         SLOT(showDialog()));        // disable the asset upload action by default - it gets enabled only if asset server becomes present    assetUpload->setEnabled(false);        auto& atpMigrator = ATPAssetMigrator::getInstance();    atpMigrator.setDialogParent(this);        addActionToQMenuAndActionHash(assetDeveloperMenu, MenuOption::AssetMigration,                                                            0, &atpMigrator,                                                            SLOT(loadEntityServerFile()));        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* coupleEyelids = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::CoupleEyelids, 0, true);    coupleEyelids->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 #ifdef HAVE_IVIEWHMD    MenuWrapper* eyeTrackingMenu = avatarDebugMenu->addMenu("Eye Tracking");    addCheckableActionToQMenuAndActionHash(eyeTrackingMenu, MenuOption::SMIEyeTracking, 0, false,        qApp, SLOT(setActiveEyeTracker()));    {        MenuWrapper* calibrateEyeTrackingMenu = eyeTrackingMenu->addMenu("Calibrate");        addActionToQMenuAndActionHash(calibrateEyeTrackingMenu, MenuOption::OnePointCalibration, 0,            qApp, SLOT(calibrateEyeTracker1Point()));        addActionToQMenuAndActionHash(calibrateEyeTrackingMenu, MenuOption::ThreePointCalibration, 0,            qApp, SLOT(calibrateEyeTracker3Points()));        addActionToQMenuAndActionHash(calibrateEyeTrackingMenu, MenuOption::FivePointCalibration, 0,            qApp, SLOT(calibrateEyeTracker5Points()));    }    addCheckableActionToQMenuAndActionHash(eyeTrackingMenu, MenuOption::SimulateEyeTracking, 0, false,        qApp, SLOT(setActiveEyeTracker()));#endif     auto avatarManager = DependencyManager::get<AvatarManager>();    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AvatarReceiveStats, 0, false,                                           avatarManager.data(), SLOT(setShouldShowReceiveStats(bool)));     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderBoundingCollisionShapes);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderLookAtVectors, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderLookAtTargets, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderFocusIndicator, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowWhosLookingAtMe, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::FixGaze, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawDefaultPose, 0, false,                                           avatar, SLOT(setEnableDebugDrawDefaultPose(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawAnimPose, 0, false,                                           avatar, SLOT(setEnableDebugDrawAnimPose(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawPosition, 0, false,                                           avatar, SLOT(setEnableDebugDrawPosition(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::MeshVisible, 0, true,                                           avatar, SLOT(setEnableMeshVisible(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::TurnWithHead, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ComfortMode, 0, true);     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::KeyboardMotorControl,        Qt::CTRL | Qt::SHIFT | Qt::Key_K, true, avatar, SLOT(updateMotionBehaviorFromMenu()),        UNSPECIFIED_POSITION, "Developer");     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ScriptedMotorControl, 0, true,        avatar, SLOT(updateMotionBehaviorFromMenu()),        UNSPECIFIED_POSITION, "Developer");     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableCharacterController, 0, true,        avatar, SLOT(updateMotionBehaviorFromMenu()),        UNSPECIFIED_POSITION, "Developer");       MenuWrapper* handOptionsMenu = developerMenu->addMenu("Hands");    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::LowVelocityFilter, 0, true,                                           qApp, SLOT(setLowVelocityFilter(bool)));     MenuWrapper* leapOptionsMenu = handOptionsMenu->addMenu("Leap Motion");    addCheckableActionToQMenuAndActionHash(leapOptionsMenu, MenuOption::LeapMotionOnHMD, 0, false);     MenuWrapper* networkMenu = developerMenu->addMenu("Network");    addActionToQMenuAndActionHash(networkMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()));    addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, false,                                           qApp->getEntityEditPacketSender(),                                           SLOT(toggleNackPackets()));    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()));

Lines 1–500 of 1149.