diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b142b6cb71..2fdd778339 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5062,8 +5062,23 @@ const DisplayPlugin* Application::getActiveDisplayPlugin() const { static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool active = false) { auto menu = Menu::getInstance(); QString name = displayPlugin->getName(); + auto grouping = displayPlugin->getGrouping(); + QString groupingMenu { "" }; Q_ASSERT(!menu->menuItemExists(MenuOption::OutputMenu, name)); + // assign the meny grouping based on plugin grouping + switch (grouping) { + case Plugin::ADVANCED: + groupingMenu = "Advanced"; + break; + case Plugin::DEVELOPER: + groupingMenu = "Developer"; + break; + default: + groupingMenu = "Standard"; + break; + } + static QActionGroup* displayPluginGroup = nullptr; if (!displayPluginGroup) { displayPluginGroup = new QActionGroup(menu); @@ -5072,7 +5087,9 @@ static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool acti auto parent = menu->getMenu(MenuOption::OutputMenu); auto action = menu->addActionToQMenuAndActionHash(parent, name, 0, qApp, - SLOT(updateDisplayMode())); + SLOT(updateDisplayMode()), + QAction::NoRole, UNSPECIFIED_POSITION, groupingMenu); + action->setCheckable(true); action->setChecked(active); displayPluginGroup->addAction(action); @@ -5086,7 +5103,31 @@ void Application::updateDisplayMode() { static std::once_flag once; std::call_once(once, [&] { bool first = true; + + // first sort the plugins into groupings: standard, advanced, developer + DisplayPluginList standard; + DisplayPluginList advanced; + DisplayPluginList developer; foreach(auto displayPlugin, displayPlugins) { + auto grouping = displayPlugin->getGrouping(); + switch (grouping) { + case Plugin::ADVANCED: + advanced.push_back(displayPlugin); + break; + case Plugin::DEVELOPER: + developer.push_back(displayPlugin); + break; + default: + standard.push_back(displayPlugin); + break; + } + } + + // concactonate the groupings into a single list in the order: standard, advanced, developer + standard.insert(std::end(standard), std::begin(advanced), std::end(advanced)); + standard.insert(std::end(standard), std::begin(developer), std::end(developer)); + + foreach(auto displayPlugin, standard) { addDisplayPluginToMenu(displayPlugin, first); // This must be a queued connection to avoid a deadlock QObject::connect(displayPlugin.get(), &DisplayPlugin::requestRender, @@ -5098,6 +5139,11 @@ void Application::updateDisplayMode() { first = false; } + + // after all plugins have been added to the menu, add a seperator to the menu + auto menu = Menu::getInstance(); + auto parent = menu->getMenu(MenuOption::OutputMenu); + parent->addSeparator(); }); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 085b349b8f..6a544f31c9 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -243,7 +243,7 @@ namespace MenuOption { const QString OctreeStats = "Entity Statistics"; const QString OnePointCalibration = "1 Point Calibration"; const QString OnlyDisplayTopTen = "Only Display Top Ten"; - const QString OutputMenu = "Display>Mode"; + const QString OutputMenu = "Display"; const QString PackageModel = "Package Model..."; const QString Pair = "Pair"; const QString PhysicsShowOwned = "Highlight Simulation Ownership"; diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 290e2e4f79..fb6e9c3b65 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -15,14 +15,10 @@ #include -const QString Basic2DWindowOpenGLDisplayPlugin::NAME("2D Display"); +const QString Basic2DWindowOpenGLDisplayPlugin::NAME("Desktop"); static const QString FULLSCREEN = "Fullscreen"; -const QString& Basic2DWindowOpenGLDisplayPlugin::getName() const { - return NAME; -} - void Basic2DWindowOpenGLDisplayPlugin::activate() { WindowOpenGLDisplayPlugin::activate(); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index e3633b5fe8..6523b58914 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -18,7 +18,7 @@ class Basic2DWindowOpenGLDisplayPlugin : public WindowOpenGLDisplayPlugin { Q_OBJECT public: - virtual const QString & getName() const override; + virtual const QString& getName() const override { return NAME; } virtual float getTargetFrameRate() override { return _framerateTarget ? (float) _framerateTarget : TARGET_FRAMERATE_Basic2DWindowOpenGL; } diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp index f780534bc9..e8145db900 100644 --- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp @@ -14,10 +14,6 @@ const QString NullDisplayPlugin::NAME("NullDisplayPlugin"); -const QString & NullDisplayPlugin::getName() const { - return NAME; -} - glm::uvec2 NullDisplayPlugin::getRecommendedRenderSize() const { return glm::uvec2(100, 100); } diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h index 23e23e2c4e..14b5529a29 100644 --- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h @@ -13,7 +13,8 @@ class NullDisplayPlugin : public DisplayPlugin { public: virtual ~NullDisplayPlugin() final {} - virtual const QString & getName() const override; + virtual const QString& getName() const override { return NAME; } + virtual grouping getGrouping() const override { return DEVELOPER; } void stop() override; diff --git a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp index ffaf005533..40c6e6306b 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp @@ -44,11 +44,7 @@ void main() { )FS"; -const QString InterleavedStereoDisplayPlugin::NAME("Interleaved Stereo Display"); - -const QString & InterleavedStereoDisplayPlugin::getName() const { - return NAME; -} +const QString InterleavedStereoDisplayPlugin::NAME("3D TV - Interleaved"); InterleavedStereoDisplayPlugin::InterleavedStereoDisplayPlugin() { } diff --git a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h index 7116363e44..df2a9f4800 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.h @@ -13,7 +13,9 @@ class InterleavedStereoDisplayPlugin : public StereoDisplayPlugin { Q_OBJECT public: InterleavedStereoDisplayPlugin(); - virtual const QString & getName() const override; + + virtual const QString& getName() const override { return NAME; } + virtual grouping getGrouping() const override { return ADVANCED; } // initialize OpenGL context settings needed by the plugin virtual void customizeContext() override; diff --git a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp index 12865cf4cd..e8a83d2b08 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp @@ -11,10 +11,6 @@ const QString SideBySideStereoDisplayPlugin::NAME("3D TV - Side by Side Stereo"); -const QString & SideBySideStereoDisplayPlugin::getName() const { - return NAME; -} - SideBySideStereoDisplayPlugin::SideBySideStereoDisplayPlugin() { } diff --git a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h index 9f8440227f..70f69ba4cb 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h @@ -15,7 +15,8 @@ class SideBySideStereoDisplayPlugin : public StereoDisplayPlugin { Q_OBJECT public: SideBySideStereoDisplayPlugin(); - virtual const QString& getName() const override; + virtual const QString& getName() const override { return NAME; } + virtual grouping getGrouping() const override { return ADVANCED; } virtual glm::uvec2 getRecommendedRenderSize() const override; private: static const QString NAME; diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index b31c59d11a..6acb2bf041 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -67,7 +67,7 @@ public: // Plugin functions virtual bool isSupported() const override { return true; } virtual bool isJointController() const override { return false; } - const QString& getName() const override { return NAME; } + virtual const QString& getName() const override { return NAME; } virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index c030b1073f..ee10ce331c 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -19,6 +19,11 @@ public: /// \return human-readable name virtual const QString& getName() const = 0; + typedef enum { STANDARD, ADVANCED, DEVELOPER } grouping; + + /// \return human-readable grouping for the plugin, STANDARD, ADVANCED, or DEVELOPER + virtual grouping getGrouping() const { return STANDARD; } + /// \return string ID (not necessarily human-readable) virtual const QString& getID() const { assert(false); return UNKNOWN_PLUGIN_ID; } diff --git a/plugins/hifiNeuron/src/NeuronPlugin.h b/plugins/hifiNeuron/src/NeuronPlugin.h index c85a5dd383..33c6879f5b 100644 --- a/plugins/hifiNeuron/src/NeuronPlugin.h +++ b/plugins/hifiNeuron/src/NeuronPlugin.h @@ -28,7 +28,7 @@ public: // Plugin functions virtual bool isSupported() const override; virtual bool isJointController() const override { return true; } - const QString& getName() const override { return NAME; } + virtual const QString& getName() const override { return NAME; } const QString& getID() const override { return NEURON_ID_STRING; } virtual void activate() override; diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index 61e2d37fd5..6506cdccb6 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -29,7 +29,7 @@ public: // Plugin functions virtual bool isSupported() const override; virtual bool isJointController() const override { return false; } - const QString& getName() const override { return NAME; } + virtual const QString& getName() const override { return NAME; } virtual void init() override; virtual void deinit() override; diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h index 753974e996..bbb9774368 100644 --- a/plugins/hifiSixense/src/SixenseManager.h +++ b/plugins/hifiSixense/src/SixenseManager.h @@ -29,8 +29,8 @@ public: // Plugin functions virtual bool isSupported() const override; virtual bool isJointController() const override { return true; } - const QString& getName() const override { return NAME; } - const QString& getID() const override { return HYDRA_ID_STRING; } + virtual const QString& getName() const override { return NAME; } + virtual const QString& getID() const override { return HYDRA_ID_STRING; } virtual void activate() override; virtual void deactivate() override; diff --git a/plugins/oculus/src/OculusDebugDisplayPlugin.cpp b/plugins/oculus/src/OculusDebugDisplayPlugin.cpp index 26bb3cf9b2..94a3670e4b 100644 --- a/plugins/oculus/src/OculusDebugDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDebugDisplayPlugin.cpp @@ -10,10 +10,6 @@ const QString OculusDebugDisplayPlugin::NAME("Oculus Rift (Simulator)"); -const QString & OculusDebugDisplayPlugin::getName() const { - return NAME; -} - static const QString DEBUG_FLAG("HIFI_DEBUG_OCULUS"); static bool enableDebugOculus = QProcessEnvironment::systemEnvironment().contains("HIFI_DEBUG_OCULUS"); diff --git a/plugins/oculus/src/OculusDebugDisplayPlugin.h b/plugins/oculus/src/OculusDebugDisplayPlugin.h index 04b68704cc..c62fe12c73 100644 --- a/plugins/oculus/src/OculusDebugDisplayPlugin.h +++ b/plugins/oculus/src/OculusDebugDisplayPlugin.h @@ -11,7 +11,8 @@ class OculusDebugDisplayPlugin : public OculusBaseDisplayPlugin { public: - virtual const QString & getName() const override; + virtual const QString& getName() const override { return NAME; } + virtual grouping getGrouping() const override { return DEVELOPER; } virtual bool isSupported() const override; protected: diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index c8fb0ba080..3002c746a2 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -138,10 +138,6 @@ private: const QString OculusDisplayPlugin::NAME("Oculus Rift"); -const QString & OculusDisplayPlugin::getName() const { - return NAME; -} - static const QString MONO_PREVIEW = "Mono Preview"; static const QString FRAMERATE = DisplayPlugin::MENU_PATH() + ">Framerate"; diff --git a/plugins/oculus/src/OculusDisplayPlugin.h b/plugins/oculus/src/OculusDisplayPlugin.h index 03c9ba7511..98535a1790 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.h +++ b/plugins/oculus/src/OculusDisplayPlugin.h @@ -17,7 +17,7 @@ const float TARGET_RATE_Oculus = 75.0f; class OculusDisplayPlugin : public OculusBaseDisplayPlugin { public: virtual void activate() override; - virtual const QString & getName() const override; + virtual const QString& getName() const override { return NAME; } virtual void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; virtual float getTargetFrameRate() override { return TARGET_RATE_Oculus; } diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index f0f200fe1a..4bded4e58f 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -26,11 +26,7 @@ using namespace oglplus; -const QString OculusLegacyDisplayPlugin::NAME("Oculus Rift (0.5) (Simulated)"); - -const QString & OculusLegacyDisplayPlugin::getName() const { - return NAME; -} +const QString OculusLegacyDisplayPlugin::NAME("Oculus Rift (0.5) (Legacy)"); OculusLegacyDisplayPlugin::OculusLegacyDisplayPlugin() { } diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index cd1177b581..1ba288cc65 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -19,7 +19,7 @@ class OculusLegacyDisplayPlugin : public WindowOpenGLDisplayPlugin { public: OculusLegacyDisplayPlugin(); virtual bool isSupported() const override; - virtual const QString & getName() const override; + virtual const QString& getName() const override { return NAME; } virtual void activate() override; virtual void deactivate() override; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 58f7536856..7fb70180c4 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -31,10 +31,6 @@ const QString OpenVrDisplayPlugin::NAME("OpenVR (Vive)"); const QString StandingHMDSensorMode = "Standing HMD Sensor Mode"; // this probably shouldn't be hardcoded here -const QString & OpenVrDisplayPlugin::getName() const { - return NAME; -} - static vr::IVRCompositor* _compositor{ nullptr }; vr::TrackedDevicePose_t _trackedDevicePose[vr::k_unMaxTrackedDeviceCount]; mat4 _trackedDevicePoseMat4[vr::k_unMaxTrackedDeviceCount]; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 8186e59936..e290368de0 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -18,7 +18,7 @@ const float TARGET_RATE_OpenVr = 90.0f; // FIXME: get from sdk tracked device p class OpenVrDisplayPlugin : public WindowOpenGLDisplayPlugin { public: virtual bool isSupported() const override; - virtual const QString & getName() const override; + virtual const QString& getName() const override { return NAME; } virtual bool isHmd() const override { return true; } virtual float getTargetFrameRate() override { return TARGET_RATE_OpenVr; }