diff --git a/interface/resources/qml/hifi/tablet/ControllerSettings.qml b/interface/resources/qml/hifi/tablet/ControllerSettings.qml index 28fea649c0..492ec265d4 100644 --- a/interface/resources/qml/hifi/tablet/ControllerSettings.qml +++ b/interface/resources/qml/hifi/tablet/ControllerSettings.qml @@ -335,7 +335,7 @@ Item { anchors.fill: stackView id: controllerPrefereneces objectName: "TabletControllerPreferences" - showCategories: ["VR Movement", "Game Controller", "Sixense Controllers", "Perception Neuron", "Leap Motion", "Open Sound Control (OSC)"] + showCategories: ["Desktop Movement", "VR Movement", "Game Controller", "Sixense Controllers", "Perception Neuron", "Leap Motion", "Open Sound Control (OSC)"] categoryProperties: { "VR Movement" : { "User real-world height (meters)" : { "anchors.right" : "undefined" }, diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index dcd9ccb409..9340f59391 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -343,6 +343,13 @@ void setupPreferences() { preferences->addPreference(preference); } + static const QString DESKTOP_MOVEMENT{ "Desktop Movement" }; + { + auto getter = []()->bool { return qApp->getCamera().getMouseLook(); }; + auto setter = [](bool value) { qApp->getCamera().setMouseLook(value); }; + auto preference = new CheckPreference(DESKTOP_MOVEMENT, "Mouse look (toggle with M key)", getter, setter); + preferences->addPreference(preference); + } static const QString VR_MOVEMENT{ "VR Movement" }; { auto getter = [myAvatar]()->bool { return myAvatar->getAllowTeleporting(); }; diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index 55ee69d08a..287db4e752 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -189,6 +189,13 @@ QString Camera::getModeString() const { return modeToString(_mode); } +void Camera::setMouseLook(bool mouseLook) { Setting::Handle{"MouseLookAllowed", false }.set(mouseLook); + if (!mouseLook) { + setCaptureMouse(false); + } + emit mouseLookChanged(mouseLook); +} + void Camera::lookAt(const glm::vec3& lookAt) { glm::vec3 up = IDENTITY_UP; glm::mat4 lookAtMatrix = glm::lookAt(_position, lookAt, up); diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h index 7247eb16a6..1c3de2b8e9 100644 --- a/libraries/shared/src/shared/Camera.h +++ b/libraries/shared/src/shared/Camera.h @@ -15,6 +15,7 @@ #include "../GLMHelpers.h" #include "../RegisteredMetaTypes.h" #include "../ViewFrustum.h" +#include "../SettingHandle.h" enum CameraMode { @@ -130,6 +131,23 @@ public slots: */ void setCaptureMouse(bool captureMouse) { _captureMouse = captureMouse; emit captureMouseChanged(captureMouse); } + /*@jsdoc + * Gets the current mouse look setting state. + * @function Camera.getMouseLook + * @returns {boolean} true if the mouse look setting is enabled (mouse look can be toggled with M key in this + * mode), false if the mouse look setting is disabled. + */ + bool getMouseLook() const { return Setting::Handle{"MouseLookAllowed", false }.get(); } + + /*@jsdoc + * Sets the mouse look setting state. When true, the mouse look setting is enabled (mouse look can be toggled + * with M key in this mode). When false, the mouse behaves normally. + * @function Camera.setMouseLook + * @param {boolean} mouseLook - true to enable mouse look setting, false to disable mouse look + * setting. + */ + void setMouseLook(bool mouseLook); + /*@jsdoc * Gets the current camera sensitivity. * @function Camera.getSensitivity @@ -229,6 +247,20 @@ signals: */ void captureMouseChanged(bool newCaptureMouse); + /*@jsdoc + * Triggered when mouse look setting changes. + * @function Camera.mouseLookChanged + * @param {boolean} mouseLookChanged - The new mouse look state. + * @returns {Signal} + * @example Report mouse look state changes. + * function onMouseLookChanged(newMouseLook) { + * print("The mouse look has changed to " + newMouseLook); + * } + * + * Camera.mouseLookChanged.connect(onMouseLookChanged); + */ + void mouseLookChanged(bool newMouseLook); + private: void recompose(); void decompose();