Merge pull request #7762 from ZappoMan/qmlWindowFixes

fix a bunch of bugs in qml window placement
This commit is contained in:
Howard Stearns 2016-04-26 17:00:54 -07:00
commit 70552b2455
9 changed files with 103 additions and 14 deletions

View file

@ -24,7 +24,6 @@ Window {
title: "Asset Browser" title: "Asset Browser"
resizable: true resizable: true
destroyOnInvisible: true destroyOnInvisible: true
x: 40; y: 40
implicitWidth: 384; implicitHeight: 640 implicitWidth: 384; implicitHeight: 640
minSize: Qt.vector2d(200, 300) minSize: Qt.vector2d(200, 300)

View file

@ -25,7 +25,7 @@ Hifi.AvatarInputs {
readonly property int iconPadding: 5 readonly property int iconPadding: 5
readonly property bool shouldReposition: true readonly property bool shouldReposition: true
Settings { Settings {
category: "Overlay.AvatarInputs" category: "Overlay.AvatarInputs"
property alias x: root.x property alias x: root.x

View file

@ -22,4 +22,19 @@ Windows.Window {
url: infoView.url url: infoView.url
} }
} }
Component.onCompleted: {
centerWindow(root);
}
onVisibleChanged: {
if (visible) {
centerWindow(root);
}
}
function centerWindow() {
desktop.centerOnVisible(root);
}
} }

View file

@ -21,7 +21,9 @@ FocusScope {
objectName: "desktop" objectName: "desktop"
anchors.fill: parent 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(); onHeightChanged: d.handleSizeChanged();
@ -55,13 +57,18 @@ FocusScope {
function handleSizeChanged() { function handleSizeChanged() {
var oldRecommendedRect = recommendedRect; 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, var newRecommendedRect = Qt.rect(newRecommendedRectJS.x, newRecommendedRectJS.y,
newRecommendedRectJS.width, newRecommendedRectJS.width,
newRecommendedRectJS.height); newRecommendedRectJS.height);
if (oldRecommendedRect != Qt.rect(0,0,0,0) var oldChildren = expectedChildren;
&& oldRecommendedRect != newRecommendedRect) { var newChildren = d.getRepositionChildren();
if (oldRecommendedRect != Qt.rect(0,0,0,0)
&& (oldRecommendedRect != newRecommendedRect
|| oldChildren != newChildren)
) {
expectedChildren = newChildren;
d.repositionAll(); d.repositionAll();
} }
recommendedRect = newRecommendedRect; recommendedRect = newRecommendedRect;
@ -279,13 +286,56 @@ FocusScope {
targetWindow.focus = true; 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 oldRecommendedRect = recommendedRect;
var oldRecommendedDimmensions = { x: oldRecommendedRect.width, y: oldRecommendedRect.height }; var oldRecommendedDimmensions = { x: oldRecommendedRect.width, y: oldRecommendedRect.height };
var newRecommendedRect = Controller.getRecommendedOverlayRect(); var newRecommendedRect = Controller.getRecommendedOverlayRect();
var newRecommendedDimmensions = { x: newRecommendedRect.width, y: newRecommendedRect.height }; var newRecommendedDimmensions = { x: newRecommendedRect.width, y: newRecommendedRect.height };
repositionWindow(targetWindow, false, oldRecommendedRect, oldRecommendedDimmensions, newRecommendedRect, newRecommendedDimmensions); repositionWindow(targetWindow, false, oldRecommendedRect, oldRecommendedDimmensions, newRecommendedRect, newRecommendedDimmensions);
showDesktop();
} }
function repositionWindow(targetWindow, forceReposition, function repositionWindow(targetWindow, forceReposition,
@ -324,10 +374,8 @@ FocusScope {
} }
var fractionX = Utils.clamp(originRelativeX / oldRecommendedDimmensions.x, 0, 1); var fractionX = Utils.clamp(originRelativeX / oldRecommendedDimmensions.x, 0, 1);
var fractionY = Utils.clamp(originRelativeY / oldRecommendedDimmensions.y, 0, 1); var fractionY = Utils.clamp(originRelativeY / oldRecommendedDimmensions.y, 0, 1);
var newX = (fractionX * newRecommendedDimmensions.x) + newRecommendedRect.x; var newX = (fractionX * newRecommendedDimmensions.x) + newRecommendedRect.x;
var newY = (fractionY * newRecommendedDimmensions.y) + newRecommendedRect.y; var newY = (fractionY * newRecommendedDimmensions.y) + newRecommendedRect.y;
newPosition = Qt.vector2d(newX, newY); newPosition = Qt.vector2d(newX, newY);
} }
targetWindow.x = newPosition.x; targetWindow.x = newPosition.x;

View file

@ -23,7 +23,6 @@ Window {
title: "Running Scripts" title: "Running Scripts"
resizable: true resizable: true
destroyOnInvisible: true destroyOnInvisible: true
x: 40; y: 40
implicitWidth: 400 implicitWidth: 400
implicitHeight: isHMD ? 695 : 728 implicitHeight: isHMD ? 695 : 728
minSize: Qt.vector2d(200, 300) minSize: Qt.vector2d(200, 300)

View file

@ -31,7 +31,7 @@ Fadable {
// decorations can extend outside it. // decorations can extend outside it.
implicitHeight: content ? content.height : 0 implicitHeight: content ? content.height : 0
implicitWidth: content ? content.width : 0 implicitWidth: content ? content.width : 0
x: -1; y: -1 x: desktop.invalid_position; y: desktop.invalid_position;
enabled: visible enabled: visible
signal windowDestroyed(); signal windowDestroyed();
@ -252,6 +252,7 @@ Fadable {
window.parentChanged.connect(raise); window.parentChanged.connect(raise);
raise(); raise();
setDefaultFocus(); setDefaultFocus();
centerOrReposition();
} }
Component.onDestruction: { Component.onDestruction: {
window.parentChanged.disconnect(raise); // Prevent warning on shutdown window.parentChanged.disconnect(raise); // Prevent warning on shutdown
@ -267,6 +268,18 @@ Fadable {
raise(); raise();
} }
enabled = visible 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() { function raise() {

View file

@ -19,7 +19,7 @@ Fadable {
// decorations can extend outside it. // decorations can extend outside it.
implicitHeight: content ? content.height : 0 implicitHeight: content ? content.height : 0
implicitWidth: content ? content.width : 0 implicitWidth: content ? content.width : 0
x: -1; y: -1 x: desktop.invalid_position; y: desktop.invalid_position;
enabled: visible enabled: visible
signal windowDestroyed(); signal windowDestroyed();
@ -117,12 +117,21 @@ Fadable {
Component.onCompleted: { Component.onCompleted: {
window.parentChanged.connect(raise); window.parentChanged.connect(raise);
raise(); raise();
centerOrReposition();
} }
Component.onDestruction: { Component.onDestruction: {
window.parentChanged.disconnect(raise); // Prevent warning on shutdown window.parentChanged.disconnect(raise); // Prevent warning on shutdown
windowDestroyed(); windowDestroyed();
} }
function centerOrReposition() {
if (x == desktop.invalid_position && y == desktop.invalid_position) {
desktop.centerOnVisible(window);
} else {
desktop.repositionOnVisible(window);
}
}
onVisibleChanged: { onVisibleChanged: {
if (!visible && destroyOnInvisible) { if (!visible && destroyOnInvisible) {
destroy(); destroy();
@ -132,6 +141,10 @@ Fadable {
raise(); raise();
} }
enabled = visible enabled = visible
if (visible && parent) {
centerOrReposition();
}
} }
function raise() { function raise() {

View file

@ -4315,6 +4315,7 @@ void Application::nodeKilled(SharedNodePointer node) {
} }
} }
} }
void Application::trackIncomingOctreePacket(ReceivedMessage& message, SharedNodePointer sendingNode, bool wasStatsPacket) { void Application::trackIncomingOctreePacket(ReceivedMessage& message, SharedNodePointer sendingNode, bool wasStatsPacket) {
// Attempt to identify the sender from its address. // Attempt to identify the sender from its address.
if (sendingNode) { if (sendingNode) {

View file

@ -107,7 +107,8 @@ public:
// The recommended bounds for primary overlay placement // The recommended bounds for primary overlay placement
virtual QRect getRecommendedOverlayRect() const { 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); return QRect(0, 0, recommendedSize.x, recommendedSize.y);
} }