From 317dee1b235c12ddbdb316d3c36ef229e456d4a7 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 15 Jul 2016 16:15:53 -0700 Subject: [PATCH] Fix decoration inflation --- .../resources/qml/windows/Decoration.qml | 22 +++++++++++++++++-- .../src/display-plugins/CompositorHelper.cpp | 9 ++++++++ .../src/display-plugins/CompositorHelper.h | 6 ++--- .../controllers/handControllerPointer.js | 9 +++++++- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/windows/Decoration.qml b/interface/resources/qml/windows/Decoration.qml index 0048c556eb..843ae25596 100644 --- a/interface/resources/qml/windows/Decoration.qml +++ b/interface/resources/qml/windows/Decoration.qml @@ -48,7 +48,23 @@ Rectangle { drag.target: window hoverEnabled: true onEntered: window.mouseEntered(); - onExited: window.mouseExited(); + onExited: { + if (!containsMouseGlobal()) { + window.mouseExited(); + } + } + + function containsMouseGlobal() { + var reticlePos = Reticle.position; + var globalPosition = decorationMouseArea.mapToItem(desktop, 0, 0); + var localPosition = { + x: reticlePos.x - globalPosition.x, + y: reticlePos.y - globalPosition.y, + }; + return localPosition.x >= 0 && localPosition.x <= width && + localPosition.y >= 0 && localPosition.y <= height; + } + } Connections { target: window @@ -57,7 +73,9 @@ Rectangle { root.inflateDecorations() } } - onMouseExited: root.deflateDecorations(); + onMouseExited: { + root.deflateDecorations(); + } } Connections { target: desktop diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index 89ff2e0c8d..56be8e1cf9 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -442,3 +442,12 @@ glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const } return result; } + + +QVariant ReticleInterface::getPosition() const { + return vec2toVariant(_compositor->getReticlePosition()); +} + +void ReticleInterface::setPosition(QVariant position) { + _compositor->setReticlePosition(vec2FromVariant(position)); +} diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 2a3dd0c852..b0b96d86be 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -174,7 +174,7 @@ private: // Scripting interface available to control the Reticle class ReticleInterface : public QObject { Q_OBJECT - Q_PROPERTY(glm::vec2 position READ getPosition WRITE setPosition) + Q_PROPERTY(QVariant position READ getPosition WRITE setPosition) Q_PROPERTY(bool visible READ getVisible WRITE setVisible) Q_PROPERTY(float depth READ getDepth WRITE setDepth) Q_PROPERTY(glm::vec2 maximumPosition READ getMaximumPosition) @@ -198,8 +198,8 @@ public: Q_INVOKABLE float getDepth() { return _compositor->getReticleDepth(); } Q_INVOKABLE void setDepth(float depth) { _compositor->setReticleDepth(depth); } - Q_INVOKABLE glm::vec2 getPosition() { return _compositor->getReticlePosition(); } - Q_INVOKABLE void setPosition(glm::vec2 position) { _compositor->setReticlePosition(position); } + Q_INVOKABLE QVariant getPosition() const; + Q_INVOKABLE void setPosition(QVariant position); Q_INVOKABLE glm::vec2 getMaximumPosition() { return _compositor->getReticleMaximumPosition(); } diff --git a/scripts/system/controllers/handControllerPointer.js b/scripts/system/controllers/handControllerPointer.js index 9ff82b3767..dab6438efa 100644 --- a/scripts/system/controllers/handControllerPointer.js +++ b/scripts/system/controllers/handControllerPointer.js @@ -32,6 +32,7 @@ function setupHandler(event, handler) { event.disconnect(handler); }); } + // If some capability is not available until expiration milliseconds after the last update. function TimeLock(expiration) { var last = 0; @@ -42,6 +43,7 @@ function TimeLock(expiration) { return ((optionalNow || Date.now()) - last) > expiration; }; } + var handControllerLockOut = new TimeLock(2000); function Trigger(label) { @@ -118,6 +120,10 @@ function ignoreMouseActivity() { if (!Reticle.allowMouseCapture) { return true; } + var pos = Reticle.position; + if (pos.x == -1 && pos.y == -1) { + return true; + } // Only we know if we moved it, which is why this script has to replace depthReticle.js if (!weMovedReticle) { return false; @@ -433,11 +439,12 @@ function clearSystemLaser() { } HMD.disableHandLasers(BOTH_HUD_LASERS); systemLaserOn = false; + weMovedReticle = true; + Reticle.position = { x: -1, y: -1 }; } function setColoredLaser() { // answer trigger state if lasers supported, else falsey. var color = (activeTrigger.state === 'full') ? LASER_TRIGGER_COLOR_XYZW : LASER_SEARCH_COLOR_XYZW; return HMD.setHandLasers(activeHudLaser, true, color, SYSTEM_LASER_DIRECTION) && activeTrigger.state; - } // MAIN OPERATIONS -----------