905 lines · 46.1 KB · C++
RawDownload
    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    faceTrackingMenu->addSeparator();    addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking,        [](bool mute) { FaceTracker::setIsMuted(mute); },        Qt::CTRL | Qt::SHIFT | Qt::Key_F, FaceTracker::isMuted());    addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::AutoMuteAudio, 0, false);#endif #ifdef HAVE_IVIEWHMD    // Developer > Avatar > Eye Tracking    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     action = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AvatarReceiveStats, 0, false);    connect(action, &QAction::triggered, [this]{ Avatar::setShowReceiveStats(isOptionChecked(MenuOption::AvatarReceiveStats)); });    action = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowBoundingCollisionShapes, 0, false);    connect(action, &QAction::triggered, [this]{ Avatar::setShowCollisionShapes(isOptionChecked(MenuOption::ShowBoundingCollisionShapes)); });    action = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowMyLookAtVectors, 0, false);    connect(action, &QAction::triggered, [this]{ Avatar::setShowMyLookAtVectors(isOptionChecked(MenuOption::ShowMyLookAtVectors)); });    action = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowOtherLookAtVectors, 0, false);    connect(action, &QAction::triggered, [this]{ Avatar::setShowOtherLookAtVectors(isOptionChecked(MenuOption::ShowOtherLookAtVectors)); });     auto avatarManager = DependencyManager::get<AvatarManager>();    auto avatar = avatarManager->getMyAvatar();     action = addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableLookAtSnapping, 0, true);    connect(action, &QAction::triggered, [this, avatar]{            avatar->setProperty("lookAtSnappingEnabled", isOptionChecked(MenuOption::EnableLookAtSnapping));        });     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::FixGaze, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ToggleHipsFollowing, 0, false,        avatar.get(), SLOT(setToggleHips(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawBaseOfSupport, 0, false,        avatar.get(), SLOT(setEnableDebugDrawBaseOfSupport(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawDefaultPose, 0, false,        avatar.get(), SLOT(setEnableDebugDrawDefaultPose(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawAnimPose, 0, false,        avatar.get(), SLOT(setEnableDebugDrawAnimPose(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawPosition, 0, false,        avatar.get(), SLOT(setEnableDebugDrawPosition(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::MeshVisible, 0, true,        avatar.get(), SLOT(setEnableMeshVisible(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::TurnWithHead, 0, false);    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableInverseKinematics, 0, true,        avatar.get(), SLOT(setEnableInverseKinematics(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSensorToWorldMatrix, 0, false,        avatar.get(), SLOT(setEnableDebugDrawSensorToWorldMatrix(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderIKTargets, 0, false,        avatar.get(), SLOT(setEnableDebugDrawIKTargets(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderIKConstraints, 0, false,        avatar.get(), SLOT(setEnableDebugDrawIKConstraints(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderIKChains, 0, false,        avatar.get(), SLOT(setEnableDebugDrawIKChains(bool)));    addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderDetailedCollision, 0, false,        avatar.get(), SLOT(setEnableDebugDrawDetailedCollision(bool)));     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ActionMotorControl, 0, true,        avatar.get(), SLOT(updateMotionBehaviorFromMenu()),        UNSPECIFIED_POSITION, "Developer");     addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ScriptedMotorControl, 0, true,        avatar.get(), SLOT(updateMotionBehaviorFromMenu()),        UNSPECIFIED_POSITION, "Developer");     // Developer > Hands >>>    MenuWrapper* handOptionsMenu = developerMenu->addMenu("Hands");    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false,        avatar.get(), SLOT(setEnableDebugDrawHandControllers(bool)));     // Developer > Entities >>>    MenuWrapper* entitiesOptionsMenu = developerMenu->addMenu("Entities");     addActionToQMenuAndActionHash(entitiesOptionsMenu, MenuOption::OctreeStats, 0,        qApp, SLOT(loadEntityStatisticsDialog()));     addCheckableActionToQMenuAndActionHash(entitiesOptionsMenu, MenuOption::ShowRealtimeEntityStats);     // Developer > Network >>>    MenuWrapper* networkMenu = developerMenu->addMenu("Network");    action = addActionToQMenuAndActionHash(networkMenu, MenuOption::Networking);    connect(action, &QAction::triggered, [] {        qApp->showDialog(QString("hifi/dialogs/NetworkingPreferencesDialog.qml"),            QString("hifi/tablet/TabletNetworkingPreferences.qml"), "NetworkingPreferencesDialog");    });    addActionToQMenuAndActionHash(networkMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()));    addActionToQMenuAndActionHash(networkMenu, MenuOption::ClearDiskCache, 0,        DependencyManager::get<AssetClient>().data(), SLOT(clearCache()));    addCheckableActionToQMenuAndActionHash(networkMenu,        MenuOption::DisableActivityLogger,        0,        false,        &UserActivityLogger::getInstance(),        SLOT(disable(bool)));    addActionToQMenuAndActionHash(networkMenu, MenuOption::ShowDSConnectTable, 0,        qApp, SLOT(loadDomainConnectionDialog()));     #if (PR_BUILD || DEV_BUILD)    addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false,                qApp, SLOT(sendWrongProtocolVersionsSignature(bool)));     {        auto nodeList = DependencyManager::get<NodeList>();        addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongDSConnectVersion, 0, false,            nodeList.data(), SLOT(toggleSendNewerDSConnectVersion(bool)));    }    #endif      // Developer >> Tests >>>    MenuWrapper* testMenu = developerMenu->addMenu("Tests");    addActionToQMenuAndActionHash(testMenu, MenuOption::RunClientScriptTests, 0, dialogsManager.data(), SLOT(showTestingResults()));     // Developer > Timing >>>    MenuWrapper* timingMenu = developerMenu->addMenu("Timing");    MenuWrapper* perfTimerMenu = timingMenu->addMenu("Performance Timer");    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::DisplayDebugTimingDetails, 0, false,            qApp, SLOT(enablePerfStats(bool)));    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::OnlyDisplayTopTen, 0, true);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandUpdateTiming, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandSimulationTiming, 0, false);    addCheckableActionToQMenuAndActionHash(perfTimerMenu, MenuOption::ExpandPhysicsTiming, 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::FrameTimer);    addActionToQMenuAndActionHash(timingMenu, MenuOption::RunTimingTests, 0, qApp, SLOT(runTests()));    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::PipelineWarnings);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::LogExtraTimings);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::SuppressShortTimings);      // Developer > Audio >>>    MenuWrapper* audioDebugMenu = developerMenu->addMenu("Audio");     action = addActionToQMenuAndActionHash(audioDebugMenu, "Stats...");    connect(action, &QAction::triggered, [] {        QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation();        defaultScriptsLoc.setPath(defaultScriptsLoc.path() + "developer/utilities/audio/stats.js");        DependencyManager::get<ScriptEngines>()->loadScript(defaultScriptsLoc.toString());    });     action = addActionToQMenuAndActionHash(audioDebugMenu, "Buffers...");    connect(action, &QAction::triggered, [] {        qApp->showDialog(QString("hifi/dialogs/AudioBuffers.qml"),            QString("hifi/tablet/TabletAudioBuffers.qml"), "AudioBuffersDialog");    });     addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::MuteEnvironment, 0,        DependencyManager::get<AudioClient>().data(), SLOT(sendMuteEnvironmentPacket()));     action = addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioScope);    connect(action, &QAction::triggered, [] {        QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation();        defaultScriptsLoc.setPath(defaultScriptsLoc.path() + "developer/utilities/audio/audioScope.js");        DependencyManager::get<ScriptEngines>()->loadScript(defaultScriptsLoc.toString());    });     // Developer > Physics >>>    MenuWrapper* physicsOptionsMenu = developerMenu->addMenu("Physics");    {        auto drawStatusConfig = qApp->getRenderEngine()->getConfiguration()->getConfig<render::DrawStatus>("RenderMainView.DrawStatus");        addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned,            0, false, drawStatusConfig, SLOT(setShowNetwork(bool)));    }     addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletWireframe, 0, false, qApp, SLOT(setShowBulletWireframe(bool)));    addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletAABBs, 0, false, qApp, SLOT(setShowBulletAABBs(bool)));    addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletContactPoints, 0, false, qApp, SLOT(setShowBulletContactPoints(bool)));    addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletConstraints, 0, false, qApp, SLOT(setShowBulletConstraints(bool)));    addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowBulletConstraintLimits, 0, false, qApp, SLOT(setShowBulletConstraintLimits(bool)));     // Developer > Picking >>>    MenuWrapper* pickingOptionsMenu = developerMenu->addMenu("Picking");    addCheckableActionToQMenuAndActionHash(pickingOptionsMenu, MenuOption::ForceCoarsePicking, 0, false,        DependencyManager::get<PickManager>().data(), SLOT(setForceCoarsePicking(bool)));     // Developer > Display Crash Options    addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DisplayCrashOptions, 0, true);    // Developer > Crash >>>    MenuWrapper* crashMenu = developerMenu->addMenu("Crash");     addActionToQMenuAndActionHash(crashMenu, MenuOption::DeadlockInterface, 0, qApp, SLOT(deadlockApplication()));    addActionToQMenuAndActionHash(crashMenu, MenuOption::UnresponsiveInterface, 0, qApp, SLOT(unresponsiveApplication()));     action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashPureVirtualFunction);    connect(action, &QAction::triggered, qApp, []() { crash::pureVirtualCall(); });    action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashPureVirtualFunctionThreaded);    connect(action, &QAction::triggered, qApp, []() { std::thread(crash::pureVirtualCall).join(); });     action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashDoubleFree);    connect(action, &QAction::triggered, qApp, []() { crash::doubleFree(); });    action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashDoubleFreeThreaded);    connect(action, &QAction::triggered, qApp, []() { std::thread(crash::doubleFree).join(); });     action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashAbort);    connect(action, &QAction::triggered, qApp, []() { crash::doAbort(); });    action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashAbortThreaded);    connect(action, &QAction::triggered, qApp, []() { std::thread(crash::doAbort).join(); });     action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNullDereference);    connect(action, &QAction::triggered, qApp, []() { crash::nullDeref(); });    action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNullDereferenceThreaded);    connect(action, &QAction::triggered, qApp, []() { std::thread(crash::nullDeref).join(); });     action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashOutOfBoundsVectorAccess);    connect(action, &QAction::triggered, qApp, []() { crash::outOfBoundsVectorCrash(); });    action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashOutOfBoundsVectorAccessThreaded);    connect(action, &QAction::triggered, qApp, []() { std::thread(crash::outOfBoundsVectorCrash).join(); });     action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNewFault);    connect(action, &QAction::triggered, qApp, []() { crash::newFault(); });    action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNewFaultThreaded);    connect(action, &QAction::triggered, qApp, []() { std::thread(crash::newFault).join(); });     // Developer > Stats    addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Stats);    addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::AnimStats);     // Settings > Enable Speech Control API#if defined(Q_OS_MAC) || defined(Q_OS_WIN)    auto speechRecognizer = DependencyManager::get<SpeechRecognizer>();    QAction* speechRecognizerAction = addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::ControlWithSpeech,        Qt::CTRL | Qt::SHIFT | Qt::Key_C,        speechRecognizer->getEnabled(),        speechRecognizer.data(),        SLOT(setEnabled(bool)),        UNSPECIFIED_POSITION);    connect(speechRecognizer.data(), SIGNAL(enabledUpdated(bool)), speechRecognizerAction, SLOT(setChecked(bool)));#endif     // console    addActionToQMenuAndActionHash(developerMenu, MenuOption::Console, Qt::CTRL | Qt::ALT | Qt::Key_J,                                  DependencyManager::get<StandAloneJSConsole>().data(),                                  SLOT(toggleConsole()),                                  QAction::NoRole,                                  UNSPECIFIED_POSITION);      // Developer > API Debugger    action = addActionToQMenuAndActionHash(developerMenu, "API Debugger");    connect(action, &QAction::triggered, [] {        QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation();        defaultScriptsLoc.setPath(defaultScriptsLoc.path() + "developer/utilities/tools/currentAPI.js");        DependencyManager::get<ScriptEngines>()->loadScript(defaultScriptsLoc.toString());    });     // Developer > Log...    addActionToQMenuAndActionHash(developerMenu, MenuOption::Log, Qt::CTRL | Qt::SHIFT | Qt::Key_L,                                  qApp, SLOT(toggleLogDialog()));    auto essLogAction = addActionToQMenuAndActionHash(developerMenu, MenuOption::EntityScriptServerLog, 0,                                                      qApp, SLOT(toggleEntityScriptServerLogDialog()));    {        auto nodeList = DependencyManager::get<NodeList>();        QObject::connect(nodeList.data(), &NodeList::canRezChanged, essLogAction, [essLogAction] {            auto nodeList = DependencyManager::get<NodeList>();            essLogAction->setEnabled(nodeList->getThisNodeCanRez());        });        essLogAction->setEnabled(nodeList->getThisNodeCanRez());    }     addActionToQMenuAndActionHash(developerMenu, "Script Log (HMD friendly)...", Qt::NoButton,                                           qApp, SLOT(showScriptLogs()));     addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::VerboseLogging, 0, false,                                           qApp, SLOT(updateVerboseLogging()));     // Developer > Show Overlays    addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Overlays, 0, true); #if 0 ///  -------------- REMOVED FOR NOW --------------    addDisabledActionAndSeparator(navigateMenu, "History");    QAction* backAction = addActionToQMenuAndActionHash(navigateMenu, MenuOption::Back, 0, addressManager.data(), SLOT(goBack()));    QAction* forwardAction = addActionToQMenuAndActionHash(navigateMenu, 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);     MenuWrapper* toolsMenu = addMenu("Tools");    addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::ToolWindow,                                  Qt::CTRL | Qt::ALT | Qt::Key_T,                                  dialogsManager.data(),                                  SLOT(toggleToolWindow()),                                  QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");      addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::NamesAboveHeads, 0, true,                NULL, NULL, UNSPECIFIED_POSITION, "Advanced");#endif     // Help/Application menu ----------------------------------    MenuWrapper * helpMenu = addMenu("Help");     // Help > About High Fidelity    action = addActionToQMenuAndActionHash(helpMenu, "About High Fidelity");    connect(action, &QAction::triggered, [] {        qApp->showDialog(QString("hifi/dialogs/AboutDialog.qml"),            QString("hifi/dialogs/TabletAboutDialog.qml"), "AboutDialog");    });    helpMenu->addSeparator();     // Help > HiFi Docs    action = addActionToQMenuAndActionHash(helpMenu, "Online Documentation");    connect(action, &QAction::triggered, qApp, [] {        QDesktopServices::openUrl(QUrl("https://docs.highfidelity.com/"));    });     // Help > HiFi Forum    action = addActionToQMenuAndActionHash(helpMenu, "Online Forums");    connect(action, &QAction::triggered, qApp, [] {        QDesktopServices::openUrl(QUrl("https://forums.highfidelity.com/"));    });     // Help > Scripting Reference    action = addActionToQMenuAndActionHash(helpMenu, "Online Script Reference");    connect(action, &QAction::triggered, qApp, [] {        QDesktopServices::openUrl(QUrl("https://docs.highfidelity.com/api-reference"));    });     addActionToQMenuAndActionHash(helpMenu, "Controls Reference", 0, qApp, SLOT(showHelp()));     helpMenu->addSeparator();     // Help > Release Notes    action = addActionToQMenuAndActionHash(helpMenu, "Release Notes");    connect(action, &QAction::triggered, qApp, [] {        QDesktopServices::openUrl(QUrl("http://steamcommunity.com/games/390540/announcements/"));    });     // Help > Report a Bug!    action = addActionToQMenuAndActionHash(helpMenu, "Report a Bug!");    connect(action, &QAction::triggered, qApp, [] {        QDesktopServices::openUrl(QUrl("mailto:support@highfidelity.com"));    });} void Menu::addMenuItem(const MenuItemProperties& properties) {    MenuWrapper* menuObj = getMenu(properties.menuName);    if (menuObj) {        QShortcut* shortcut = NULL;        if (!properties.shortcutKeySequence.isEmpty()) {            shortcut = new QShortcut(properties.shortcutKeySequence, this);            shortcut->setContext(Qt::WidgetWithChildrenShortcut);        }         // check for positioning requests        int requestedPosition = properties.position;        if (requestedPosition == UNSPECIFIED_POSITION && !properties.beforeItem.isEmpty()) {            requestedPosition = findPositionOfMenuItem(menuObj, properties.beforeItem);            // double check that the requested location wasn't a separator label            requestedPosition = positionBeforeSeparatorIfNeeded(menuObj, requestedPosition);        }        if (requestedPosition == UNSPECIFIED_POSITION && !properties.afterItem.isEmpty()) {            int afterPosition = findPositionOfMenuItem(menuObj, properties.afterItem);            if (afterPosition != UNSPECIFIED_POSITION) {                requestedPosition = afterPosition + 1;            }        }         QAction* menuItemAction = NULL;        if (properties.isSeparator) {            addDisabledActionAndSeparator(menuObj, properties.menuItemName, requestedPosition, properties.grouping);        } else if (properties.isCheckable) {            menuItemAction = addCheckableActionToQMenuAndActionHash(menuObj, properties.menuItemName,                                                                    properties.shortcutKeySequence, properties.isChecked,                                                                    MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()),                                                                    requestedPosition, properties.grouping);        } else {            menuItemAction = addActionToQMenuAndActionHash(menuObj, properties.menuItemName, properties.shortcutKeySequence,                                                           MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()),                                                           QAction::NoRole, requestedPosition, properties.grouping);        }        if (shortcut && menuItemAction) {            connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger()));        }        QMenuBar::repaint();    }}

Lines 501–905 of 905. Previous lines

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t