diff --git a/interface/resources/qml/AssetServer.qml b/interface/resources/qml/AssetServer.qml index 495d13d118..370bc92d81 100644 --- a/interface/resources/qml/AssetServer.qml +++ b/interface/resources/qml/AssetServer.qml @@ -24,7 +24,6 @@ Window { title: "Asset Browser" resizable: true destroyOnInvisible: true - x: 40; y: 40 implicitWidth: 384; implicitHeight: 640 minSize: Qt.vector2d(200, 300) diff --git a/interface/resources/qml/AvatarInputs.qml b/interface/resources/qml/AvatarInputs.qml index 75f379a425..4150979cd4 100644 --- a/interface/resources/qml/AvatarInputs.qml +++ b/interface/resources/qml/AvatarInputs.qml @@ -25,7 +25,7 @@ Hifi.AvatarInputs { readonly property int iconPadding: 5 readonly property bool shouldReposition: true - + Settings { category: "Overlay.AvatarInputs" property alias x: root.x diff --git a/interface/resources/qml/InfoView.qml b/interface/resources/qml/InfoView.qml index bc268baeb4..2e93c401d4 100644 --- a/interface/resources/qml/InfoView.qml +++ b/interface/resources/qml/InfoView.qml @@ -22,4 +22,19 @@ Windows.Window { url: infoView.url } } + + Component.onCompleted: { + centerWindow(root); + } + + onVisibleChanged: { + if (visible) { + centerWindow(root); + } + } + + function centerWindow() { + desktop.centerOnVisible(root); + } + } diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml index c0804a967d..62a72e3d8c 100644 --- a/interface/resources/qml/desktop/Desktop.qml +++ b/interface/resources/qml/desktop/Desktop.qml @@ -21,7 +21,9 @@ FocusScope { objectName: "desktop" anchors.fill: parent - property rect recommendedRect: rect(0,0,0,0); + readonly property int invalid_position: -9999; + property rect recommendedRect: Qt.rect(0,0,0,0); + property var expectedChildren; onHeightChanged: d.handleSizeChanged(); @@ -55,13 +57,18 @@ FocusScope { function handleSizeChanged() { var oldRecommendedRect = recommendedRect; - var newRecommendedRectJS = Controller.getRecommendedOverlayRect(); + var newRecommendedRectJS = (typeof Controller === "undefined") ? Qt.rect(0,0,0,0) : Controller.getRecommendedOverlayRect(); var newRecommendedRect = Qt.rect(newRecommendedRectJS.x, newRecommendedRectJS.y, newRecommendedRectJS.width, newRecommendedRectJS.height); - if (oldRecommendedRect != Qt.rect(0,0,0,0) - && oldRecommendedRect != newRecommendedRect) { + var oldChildren = expectedChildren; + var newChildren = d.getRepositionChildren(); + if (oldRecommendedRect != Qt.rect(0,0,0,0) + && (oldRecommendedRect != newRecommendedRect + || oldChildren != newChildren) + ) { + expectedChildren = newChildren; d.repositionAll(); } recommendedRect = newRecommendedRect; @@ -279,13 +286,56 @@ FocusScope { targetWindow.focus = true; } + showDesktop(); + } + + function centerOnVisible(item) { + var targetWindow = d.getDesktopWindow(item); + if (!targetWindow) { + console.warn("Could not find top level window for " + item); + return; + } + + if (typeof Controller === "undefined") { + console.warn("Controller not yet available... can't center"); + return; + } + + var newRecommendedRectJS = (typeof Controller === "undefined") ? Qt.rect(0,0,0,0) : Controller.getRecommendedOverlayRect(); + var newRecommendedRect = Qt.rect(newRecommendedRectJS.x, newRecommendedRectJS.y, + newRecommendedRectJS.width, + newRecommendedRectJS.height); + var newRecommendedDimmensions = { x: newRecommendedRect.width, y: newRecommendedRect.height }; + var newX = newRecommendedRect.x + ((newRecommendedRect.width - targetWindow.width) / 2); + var newY = newRecommendedRect.y + ((newRecommendedRect.height - targetWindow.height) / 2); + targetWindow.x = newX; + targetWindow.y = newY; + + // If we've noticed that our recommended desktop rect has changed, record that change here. + if (recommendedRect != newRecommendedRect) { + recommendedRect = newRecommendedRect; + } + + } + + function repositionOnVisible(item) { + var targetWindow = d.getDesktopWindow(item); + if (!targetWindow) { + console.warn("Could not find top level window for " + item); + return; + } + + if (typeof Controller === "undefined") { + console.warn("Controller not yet available... can't reposition targetWindow:" + targetWindow); + return; + } + + var oldRecommendedRect = recommendedRect; var oldRecommendedDimmensions = { x: oldRecommendedRect.width, y: oldRecommendedRect.height }; var newRecommendedRect = Controller.getRecommendedOverlayRect(); var newRecommendedDimmensions = { x: newRecommendedRect.width, y: newRecommendedRect.height }; repositionWindow(targetWindow, false, oldRecommendedRect, oldRecommendedDimmensions, newRecommendedRect, newRecommendedDimmensions); - - showDesktop(); } function repositionWindow(targetWindow, forceReposition, @@ -324,10 +374,8 @@ FocusScope { } var fractionX = Utils.clamp(originRelativeX / oldRecommendedDimmensions.x, 0, 1); var fractionY = Utils.clamp(originRelativeY / oldRecommendedDimmensions.y, 0, 1); - var newX = (fractionX * newRecommendedDimmensions.x) + newRecommendedRect.x; var newY = (fractionY * newRecommendedDimmensions.y) + newRecommendedRect.y; - newPosition = Qt.vector2d(newX, newY); } targetWindow.x = newPosition.x; diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 9b35d55f11..071789fe16 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -23,7 +23,6 @@ Window { title: "Running Scripts" resizable: true destroyOnInvisible: true - x: 40; y: 40 implicitWidth: 400 implicitHeight: isHMD ? 695 : 728 minSize: Qt.vector2d(200, 300) diff --git a/interface/resources/qml/windows-uit/Window.qml b/interface/resources/qml/windows-uit/Window.qml index dbbf2b3eb6..e9477f3c7e 100644 --- a/interface/resources/qml/windows-uit/Window.qml +++ b/interface/resources/qml/windows-uit/Window.qml @@ -31,7 +31,7 @@ Fadable { // decorations can extend outside it. implicitHeight: content ? content.height : 0 implicitWidth: content ? content.width : 0 - x: -1; y: -1 + x: desktop.invalid_position; y: desktop.invalid_position; enabled: visible signal windowDestroyed(); @@ -252,6 +252,7 @@ Fadable { window.parentChanged.connect(raise); raise(); setDefaultFocus(); + centerOrReposition(); } Component.onDestruction: { window.parentChanged.disconnect(raise); // Prevent warning on shutdown @@ -267,6 +268,18 @@ Fadable { raise(); } enabled = visible + + if (visible && parent) { + centerOrReposition(); + } + } + + function centerOrReposition() { + if (x == desktop.invalid_position && y == desktop.invalid_position) { + desktop.centerOnVisible(window); + } else { + desktop.repositionOnVisible(window); + } } function raise() { diff --git a/interface/resources/qml/windows/Window.qml b/interface/resources/qml/windows/Window.qml index 06be0cd9e7..3abdbacc64 100644 --- a/interface/resources/qml/windows/Window.qml +++ b/interface/resources/qml/windows/Window.qml @@ -19,7 +19,7 @@ Fadable { // decorations can extend outside it. implicitHeight: content ? content.height : 0 implicitWidth: content ? content.width : 0 - x: -1; y: -1 + x: desktop.invalid_position; y: desktop.invalid_position; enabled: visible signal windowDestroyed(); @@ -117,12 +117,21 @@ Fadable { Component.onCompleted: { window.parentChanged.connect(raise); raise(); + centerOrReposition(); } Component.onDestruction: { window.parentChanged.disconnect(raise); // Prevent warning on shutdown windowDestroyed(); } + function centerOrReposition() { + if (x == desktop.invalid_position && y == desktop.invalid_position) { + desktop.centerOnVisible(window); + } else { + desktop.repositionOnVisible(window); + } + } + onVisibleChanged: { if (!visible && destroyOnInvisible) { destroy(); @@ -132,6 +141,10 @@ Fadable { raise(); } enabled = visible + + if (visible && parent) { + centerOrReposition(); + } } function raise() { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fcf1425287..c2a4088dcc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4315,6 +4315,7 @@ void Application::nodeKilled(SharedNodePointer node) { } } } + void Application::trackIncomingOctreePacket(ReceivedMessage& message, SharedNodePointer sendingNode, bool wasStatsPacket) { // Attempt to identify the sender from its address. if (sendingNode) { diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 64a73ab12a..91dcf9398f 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -107,7 +107,8 @@ public: // The recommended bounds for primary overlay placement virtual QRect getRecommendedOverlayRect() const { - auto recommendedSize = getRecommendedUiSize(); + const int DESKTOP_SCREEN_PADDING = 50; + auto recommendedSize = getRecommendedUiSize() - glm::uvec2(DESKTOP_SCREEN_PADDING); return QRect(0, 0, recommendedSize.x, recommendedSize.y); }