diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml index 579b4e7fd6..6bf832865f 100644 --- a/interface/resources/qml/desktop/Desktop.qml +++ b/interface/resources/qml/desktop/Desktop.qml @@ -223,7 +223,7 @@ FocusScope { //offscreenWindow.activeFocusItemChanged.connect(onWindowFocusChanged); focusHack.start(); } - + function onWindowFocusChanged() { //console.log("Focus item is " + offscreenWindow.activeFocusItem); @@ -298,6 +298,23 @@ FocusScope { pinned = !pinned } + function isPointOnWindow(point) { + for (var i = 0; i < desktop.visibleChildren.length; i++) { + var child = desktop.visibleChildren[i]; + if (child.visible) { + if (child.hasOwnProperty("modality")) { + var mappedPoint = child.mapFromGlobal(point.x, point.y); + console.log(mappedPoint); + if (child.contains(mappedPoint)) { + return true; + console.log(child); + } + } + } + } + return false; + } + function setPinned(newPinned) { pinned = newPinned } diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 4b981207f1..c99e190d12 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -171,6 +171,11 @@ void WindowScriptingInterface::setPreviousBrowseAssetLocation(const QString& loc Setting::Handle(LAST_BROWSE_ASSETS_LOCATION_SETTING).set(location); } +bool WindowScriptingInterface::isPointOnDesktopWindow(QVariant point) { + auto offscreenUi = DependencyManager::get(); + return offscreenUi->isPointOnDesktopWindow(point); +} + /// Makes sure that the reticle is visible, use this in blocking forms that require a reticle and /// might be in same thread as a script that sets the reticle to invisible void WindowScriptingInterface::ensureReticleVisible() const { diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 0d58e6162d..61aaec7bea 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -72,6 +72,7 @@ public slots: void shareSnapshot(const QString& path, const QUrl& href = QUrl("")); bool isPhysicsEnabled(); bool setDisplayTexture(const QString& name); + bool isPointOnDesktopWindow(QVariant point); int openMessageBox(QString title, QString text, int buttons, int defaultButton); void updateMessageBox(int id, QString title, QString text, int buttons, int defaultButton); diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 9dfe831081..1cd30132ae 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -136,6 +136,15 @@ void OffscreenUi::toggle(const QUrl& url, const QString& name, std::function invoke method isPointOnWindow <------"; + return result.toBool(); +} + void OffscreenUi::hide(const QString& name) { QQuickItem* item = getRootItem()->findChild(name); if (item) { diff --git a/libraries/ui/src/OffscreenUi.h b/libraries/ui/src/OffscreenUi.h index 391d7da6c7..93c55d06f7 100644 --- a/libraries/ui/src/OffscreenUi.h +++ b/libraries/ui/src/OffscreenUi.h @@ -78,6 +78,7 @@ public: bool eventFilter(QObject* originalDestination, QEvent* event) override; void addMenuInitializer(std::function f); QObject* getFlags(); + Q_INVOKABLE bool isPointOnDesktopWindow(QVariant point); QQuickItem* getDesktop(); QQuickItem* getToolWindow(); QObject* getRootMenu(); diff --git a/scripts/system/controllers/controllerModules/hudOverlayPointer.js b/scripts/system/controllers/controllerModules/hudOverlayPointer.js index 487e491201..d286f26108 100644 --- a/scripts/system/controllers/controllerModules/hudOverlayPointer.js +++ b/scripts/system/controllers/controllerModules/hudOverlayPointer.js @@ -178,11 +178,11 @@ } var hudRayPick = controllerData.hudRayPicks[this.hand]; var point2d = this.calculateNewReticlePosition(hudRayPick.intersection); - this.setReticlePosition(point2d); - if (!Reticle.isPointingAtSystemOverlay(point2d)) { + if (!Window.isPointOnDesktopWindow(point2d)) { this.exitModule(); return false; } + this.setReticlePosition(point2d); Reticle.visible = false; this.movedAway = false; this.triggerClicked = controllerData.triggerClicks[this.hand];