From e2a3903def092d2169e1f507747312892da063d9 Mon Sep 17 00:00:00 2001
From: Brad Hefta-Gaub <brad@highfidelity.io>
Date: Fri, 8 Jan 2016 16:58:25 -0800
Subject: [PATCH] add support for advanced/developer plugins and change diplay
 modes to match spec

---
 interface/src/Application.cpp                 | 29 ++++++++++++++++++-
 interface/src/Menu.h                          |  2 +-
 .../Basic2DWindowOpenGLDisplayPlugin.cpp      |  7 ++---
 .../Basic2DWindowOpenGLDisplayPlugin.h        |  4 ++-
 .../src/display-plugins/NullDisplayPlugin.cpp |  1 +
 .../src/display-plugins/NullDisplayPlugin.h   |  1 +
 .../stereo/InterleavedStereoDisplayPlugin.cpp |  7 ++---
 .../stereo/InterleavedStereoDisplayPlugin.h   |  5 +++-
 .../stereo/SideBySideStereoDisplayPlugin.cpp  |  5 +---
 .../stereo/SideBySideStereoDisplayPlugin.h    |  4 ++-
 .../src/input-plugins/KeyboardMouseDevice.cpp |  1 +
 .../src/input-plugins/KeyboardMouseDevice.h   |  4 ++-
 libraries/plugins/src/plugins/Plugin.h        |  3 ++
 plugins/hifiNeuron/src/NeuronPlugin.cpp       |  1 +
 plugins/hifiNeuron/src/NeuronPlugin.h         |  4 ++-
 plugins/hifiSdl2/src/SDL2Manager.cpp          |  1 +
 plugins/hifiSdl2/src/SDL2Manager.h            |  4 ++-
 plugins/hifiSixense/src/SixenseManager.cpp    |  1 +
 plugins/hifiSixense/src/SixenseManager.h      |  6 ++--
 .../oculus/src/OculusDebugDisplayPlugin.cpp   |  4 +--
 plugins/oculus/src/OculusDebugDisplayPlugin.h |  4 ++-
 plugins/oculus/src/OculusDisplayPlugin.cpp    |  5 +---
 plugins/oculus/src/OculusDisplayPlugin.h      |  6 ++--
 plugins/openvr/src/OpenVrDisplayPlugin.cpp    |  4 +--
 plugins/openvr/src/OpenVrDisplayPlugin.h      |  4 ++-
 25 files changed, 79 insertions(+), 38 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index b142b6cb71..7be74e717e 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -5062,6 +5062,7 @@ const DisplayPlugin* Application::getActiveDisplayPlugin() const {
 static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool active = false) {
     auto menu = Menu::getInstance();
     QString name = displayPlugin->getName();
+    QString grouping = displayPlugin->getGrouping();
     Q_ASSERT(!menu->menuItemExists(MenuOption::OutputMenu, name));
 
     static QActionGroup* displayPluginGroup = nullptr;
@@ -5072,7 +5073,8 @@ 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, grouping);
     action->setCheckable(true);
     action->setChecked(active);
     displayPluginGroup->addAction(action);
@@ -5086,7 +5088,27 @@ 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) {
+            QString grouping = displayPlugin->getGrouping();
+            if (grouping == "Advanced") {
+                advanced.push_back(displayPlugin);
+            } else if (grouping == "Developer") {
+                developer.push_back(displayPlugin);
+            } else {
+                standard.push_back(displayPlugin);
+            }
+        }
+
+        // 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 +5120,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..11bed0e0af 100644
--- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
@@ -15,14 +15,11 @@
 
 #include <plugins/PluginContainer.h>
 
-const QString Basic2DWindowOpenGLDisplayPlugin::NAME("2D Display");
+const QString Basic2DWindowOpenGLDisplayPlugin::NAME("Desktop");
+const QString Basic2DWindowOpenGLDisplayPlugin::GROUPING("Standard");
 
 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..29e26c1f28 100644
--- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h
@@ -18,7 +18,8 @@ class Basic2DWindowOpenGLDisplayPlugin : public WindowOpenGLDisplayPlugin {
     Q_OBJECT
 
 public:
-    virtual const QString & getName() const override;
+    virtual const QString& getName() const override { return NAME; }
+    virtual const QString& getGrouping() const override { return GROUPING; }
 
     virtual float getTargetFrameRate() override { return  _framerateTarget ? (float) _framerateTarget : TARGET_FRAMERATE_Basic2DWindowOpenGL; }
 
@@ -37,6 +38,7 @@ protected:
 private:
     void updateFramerate();
     static const QString NAME;
+    static const QString GROUPING;
     QScreen* getFullscreenTarget();
     std::vector<QAction*> _framerateActions;
     QAction* _vsyncAction { nullptr };
diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp
index f780534bc9..54cf13fccd 100644
--- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp
@@ -13,6 +13,7 @@
 #include <plugins/PluginContainer.h>
 
 const QString NullDisplayPlugin::NAME("NullDisplayPlugin");
+const QString NullDisplayPlugin::GROUPING("Developer");
 
 const QString & NullDisplayPlugin::getName() const {
     return NAME;
diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h
index 23e23e2c4e..d574324472 100644
--- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h
@@ -24,4 +24,5 @@ public:
     virtual QImage getScreenshot() const override;
 private:
     static const QString NAME;
+    static const QString GROUPING;
 };
diff --git a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp
index ffaf005533..7aacebbcea 100644
--- a/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/stereo/InterleavedStereoDisplayPlugin.cpp
@@ -44,11 +44,8 @@ void main() {
 
 )FS";
 
-const QString InterleavedStereoDisplayPlugin::NAME("Interleaved Stereo Display");
-
-const QString & InterleavedStereoDisplayPlugin::getName() const {
-    return NAME;
-}
+const QString InterleavedStereoDisplayPlugin::NAME("3D TV - Interleaved");
+const QString InterleavedStereoDisplayPlugin::GROUPING("Advanced");
 
 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..33b6397788 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 const QString& getGrouping() const override { return GROUPING; }
 
     // initialize OpenGL context settings needed by the plugin
     virtual void customizeContext() override;
@@ -23,4 +25,5 @@ public:
 
 private:
     static const QString NAME;
+    static const QString GROUPING;
 };
diff --git a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp
index 12865cf4cd..d542838d2f 100644
--- a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.cpp
@@ -10,10 +10,7 @@
 #include <GLMHelpers.h>
 
 const QString SideBySideStereoDisplayPlugin::NAME("3D TV - Side by Side Stereo");
-
-const QString & SideBySideStereoDisplayPlugin::getName() const {
-    return NAME;
-}
+const QString SideBySideStereoDisplayPlugin::GROUPING("Advanced");
 
 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..daca9cd474 100644
--- a/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/stereo/SideBySideStereoDisplayPlugin.h
@@ -15,8 +15,10 @@ class SideBySideStereoDisplayPlugin : public StereoDisplayPlugin {
     Q_OBJECT
 public:
     SideBySideStereoDisplayPlugin();
-    virtual const QString& getName() const override;
+    virtual const QString& getName() const override { return NAME; }
+    virtual const QString& getGrouping() const override { return GROUPING; }
     virtual glm::uvec2 getRecommendedRenderSize() const override;
 private:
     static const QString NAME;
+    static const QString GROUPING;
 };
diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp
index 1d7fbbec67..45a1adb386 100755
--- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp
+++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.cpp
@@ -19,6 +19,7 @@
 #include <NumericalConstants.h>
 
 const QString KeyboardMouseDevice::NAME = "Keyboard/Mouse";
+const QString KeyboardMouseDevice::GROUPING = "Standard";
 
 void KeyboardMouseDevice::pluginUpdate(float deltaTime, bool jointsCaptured) { 
     _inputDevice->update(deltaTime, jointsCaptured); 
diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h
index b31c59d11a..654041ac35 100644
--- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h
+++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h
@@ -67,7 +67,8 @@ 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 const QString& getGrouping() const override { return GROUPING; }
 
     virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
     virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override;
@@ -87,6 +88,7 @@ public:
     void wheelEvent(QWheelEvent* event);
     
     static const QString NAME;
+    static const QString GROUPING;
 
 protected:
 
diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h
index c030b1073f..6928416f88 100644
--- a/libraries/plugins/src/plugins/Plugin.h
+++ b/libraries/plugins/src/plugins/Plugin.h
@@ -19,6 +19,9 @@ public:
     /// \return human-readable name
     virtual const QString& getName() const = 0;
 
+    /// \return human-readable grouping for the plugin, Standard, Advanced, or Developer
+    virtual const QString& getGrouping() const = 0;
+
     /// \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.cpp b/plugins/hifiNeuron/src/NeuronPlugin.cpp
index a175ce8e06..b9372967d1 100644
--- a/plugins/hifiNeuron/src/NeuronPlugin.cpp
+++ b/plugins/hifiNeuron/src/NeuronPlugin.cpp
@@ -30,6 +30,7 @@ Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins")
 #endif
 
 const QString NeuronPlugin::NAME = "Neuron";
+const QString NeuronPlugin::GROUPING = "Standard";
 const QString NeuronPlugin::NEURON_ID_STRING = "Perception Neuron";
 
 // indices of joints of the Neuron standard skeleton.
diff --git a/plugins/hifiNeuron/src/NeuronPlugin.h b/plugins/hifiNeuron/src/NeuronPlugin.h
index c85a5dd383..85ed3a3ecd 100644
--- a/plugins/hifiNeuron/src/NeuronPlugin.h
+++ b/plugins/hifiNeuron/src/NeuronPlugin.h
@@ -28,7 +28,8 @@ 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; }
+    virtual const QString& getGrouping() const override { return GROUPING; }
     const QString& getID() const override { return NEURON_ID_STRING; }
 
     virtual void activate() override;
@@ -65,6 +66,7 @@ protected:
     std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>() };
 
     static const QString NAME;
+    static const QString GROUPING;
     static const QString NEURON_ID_STRING;
 
     std::string _serverAddress;
diff --git a/plugins/hifiSdl2/src/SDL2Manager.cpp b/plugins/hifiSdl2/src/SDL2Manager.cpp
index 7ca49bbd75..554a8659c0 100644
--- a/plugins/hifiSdl2/src/SDL2Manager.cpp
+++ b/plugins/hifiSdl2/src/SDL2Manager.cpp
@@ -44,6 +44,7 @@ static_assert(
 
 
 const QString SDL2Manager::NAME = "SDL2";
+const QString SDL2Manager::GROUPING = "Standard";
 
 #ifdef HAVE_SDL2
 SDL_JoystickID SDL2Manager::getInstanceId(SDL_GameController* controller) {
diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h
index 61e2d37fd5..cb4d5cb744 100644
--- a/plugins/hifiSdl2/src/SDL2Manager.h
+++ b/plugins/hifiSdl2/src/SDL2Manager.h
@@ -29,7 +29,8 @@ 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 const QString& getGrouping() const override { return GROUPING; }
 
     virtual void init() override;
     virtual void deinit() override;
@@ -84,6 +85,7 @@ private:
 #endif
     bool _isInitialized;
     static const QString NAME;
+    static const QString GROUPING;
 };
 
 #endif // hifi__SDL2Manager_h
diff --git a/plugins/hifiSixense/src/SixenseManager.cpp b/plugins/hifiSixense/src/SixenseManager.cpp
index 3377aac14c..5ef73d3646 100644
--- a/plugins/hifiSixense/src/SixenseManager.cpp
+++ b/plugins/hifiSixense/src/SixenseManager.cpp
@@ -56,6 +56,7 @@ bool SixenseManager::_sixenseLoaded = false;
 
 
 const QString SixenseManager::NAME = "Sixense";
+const QString SixenseManager::GROUPING = "Standard";
 const QString SixenseManager::HYDRA_ID_STRING = "Razer Hydra";
 
 const QString MENU_PARENT = "Developer";
diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h
index 753974e996..4eb07c974f 100644
--- a/plugins/hifiSixense/src/SixenseManager.h
+++ b/plugins/hifiSixense/src/SixenseManager.h
@@ -29,8 +29,9 @@ 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& getGrouping() const override { return GROUPING; }
+    virtual const QString& getID() const override { return HYDRA_ID_STRING; }
 
     virtual void activate() override;
     virtual void deactivate() override;
@@ -97,6 +98,7 @@ private:
     std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>() };
 
     static const QString NAME;
+    static const QString GROUPING;
     static const QString HYDRA_ID_STRING;
 
     static bool _sixenseLoaded;
diff --git a/plugins/oculus/src/OculusDebugDisplayPlugin.cpp b/plugins/oculus/src/OculusDebugDisplayPlugin.cpp
index 26bb3cf9b2..9ef2cda514 100644
--- a/plugins/oculus/src/OculusDebugDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusDebugDisplayPlugin.cpp
@@ -9,10 +9,8 @@
 #include <QtCore/QProcessEnvironment>
 
 const QString OculusDebugDisplayPlugin::NAME("Oculus Rift (Simulator)");
+const QString OculusDebugDisplayPlugin::GROUPING("Developer");
 
-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..cc0d5c2065 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 const QString& getGrouping() const override { return GROUPING; }
     virtual bool isSupported() const override;
 
 protected:
@@ -19,5 +20,6 @@ protected:
 
 private:
     static const QString NAME;
+    static const QString GROUPING;
 };
 
diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp
index c8fb0ba080..0b81f661df 100644
--- a/plugins/oculus/src/OculusDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusDisplayPlugin.cpp
@@ -137,10 +137,7 @@ private:
 #endif
 
 const QString OculusDisplayPlugin::NAME("Oculus Rift");
-
-const QString & OculusDisplayPlugin::getName() const {
-    return NAME;
-}
+const QString OculusDisplayPlugin::GROUPING("Standard");
 
 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..4633e434e1 100644
--- a/plugins/oculus/src/OculusDisplayPlugin.h
+++ b/plugins/oculus/src/OculusDisplayPlugin.h
@@ -17,7 +17,8 @@ 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 const QString& getGrouping() const override { return GROUPING; }
     virtual void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final;
 
     virtual float getTargetFrameRate() override { return TARGET_RATE_Oculus; }
@@ -30,7 +31,8 @@ protected:
 private:
     using EyePoses = std::pair<ovrPosef, ovrPosef>;
     static const QString NAME;
-    bool _enablePreview { false };
+    static const QString GROUPING;
+    bool _enablePreview{ false };
     bool _monoPreview { true };
     QMap<uint32_t, EyePoses> _frameEyePoses;
 
diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp
index 58f7536856..6860245fb0 100644
--- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp
+++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp
@@ -28,12 +28,10 @@ Q_DECLARE_LOGGING_CATEGORY(displayplugins)
 Q_LOGGING_CATEGORY(displayplugins, "hifi.displayplugins")
 
 const QString OpenVrDisplayPlugin::NAME("OpenVR (Vive)");
+const QString OpenVrDisplayPlugin::GROUPING("Standard");
 
 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];
diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h
index 8186e59936..5983129572 100644
--- a/plugins/openvr/src/OpenVrDisplayPlugin.h
+++ b/plugins/openvr/src/OpenVrDisplayPlugin.h
@@ -18,7 +18,8 @@ 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 const QString& getGrouping() const override { return GROUPING; }
     virtual bool isHmd() const override { return true; }
 
     virtual float getTargetFrameRate() override { return TARGET_RATE_OpenVr; }
@@ -45,5 +46,6 @@ protected:
 private:
     vr::IVRSystem* _hmd { nullptr };
     static const QString NAME;
+    static const QString GROUPING;
 };