mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-15 11:56:56 +02:00
261 lines
7.7 KiB
QML
261 lines
7.7 KiB
QML
import QtQuick 2.5
|
|
import QtQuick.Controls 1.4
|
|
import QtQuick.Dialogs 1.2 as OriginalDialogs;
|
|
|
|
import "dialogs"
|
|
|
|
// This is our primary 'desktop' object to which all VR dialogs and
|
|
// windows will be childed.
|
|
Item {
|
|
id: desktop
|
|
anchors.fill: parent;
|
|
|
|
// Debugging help for figuring out focus issues
|
|
property var offscreenWindow;
|
|
onOffscreenWindowChanged: offscreenWindow.activeFocusItemChanged.connect(onWindowFocusChanged);
|
|
function onWindowFocusChanged() { console.log("Focus item is " + offscreenWindow.activeFocusItem); }
|
|
|
|
// Allows QML/JS to find the desktop through the parent chain
|
|
property bool desktopRoot: true
|
|
|
|
// The VR version of the primary menu
|
|
property var rootMenu: Menu { objectName: "rootMenu" }
|
|
|
|
// The tool window, one instance
|
|
property alias toolWindow: toolWindow
|
|
ToolWindow { id: toolWindow }
|
|
|
|
// FIXME support always on top flags
|
|
function raise(item) {
|
|
d.raiseWindow(item);
|
|
}
|
|
|
|
Component {
|
|
id: messageDialogBuilder
|
|
MessageDialog { }
|
|
}
|
|
|
|
Component {
|
|
id: nativeMessageDialogBuilder
|
|
OriginalDialogs.MessageDialog { }
|
|
}
|
|
|
|
function messageBox(properties) {
|
|
// Debugging: native message dialog for comparison
|
|
// nativeMessageDialogBuilder.createObject(desktop, properties);
|
|
return messageDialogBuilder.createObject(desktop, properties);
|
|
}
|
|
|
|
QtObject {
|
|
id: d
|
|
|
|
readonly property int zBasisNormal: 0
|
|
readonly property int zBasisAlwaysOnTop: 4096
|
|
readonly property int zBasisModal: 8192
|
|
|
|
|
|
function findChild(item, name) {
|
|
for (var i = 0; i < item.children.length; ++i) {
|
|
if (item.children[i].objectName === name) {
|
|
return item.children[i];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function findParentMatching(item, predicate) {
|
|
while (item) {
|
|
if (predicate(item)) {
|
|
break;
|
|
}
|
|
item = item.parent;
|
|
}
|
|
return item;
|
|
}
|
|
|
|
function isDesktop(item) {
|
|
return item.desktopRoot;
|
|
}
|
|
|
|
function isTopLevelWindow(item) {
|
|
return item.topLevelWindow;
|
|
}
|
|
|
|
function isAlwaysOnTopWindow(window) {
|
|
return window.alwaysOnTop;
|
|
}
|
|
|
|
function isModalWindow(window) {
|
|
return window.modality !== Qt.NonModal;
|
|
}
|
|
|
|
function getTopLevelWindows(predicate) {
|
|
var currentWindows = [];
|
|
if (!desktop) {
|
|
console.log("Could not find desktop for " + item)
|
|
return currentWindows;
|
|
}
|
|
|
|
for (var i = 0; i < desktop.children.length; ++i) {
|
|
var child = desktop.children[i];
|
|
if (isTopLevelWindow(child) && (!predicate || predicate(child))) {
|
|
currentWindows.push(child)
|
|
}
|
|
}
|
|
return currentWindows;
|
|
}
|
|
|
|
|
|
function getDesktopWindow(item) {
|
|
return findParentMatching(item, isTopLevelWindow)
|
|
}
|
|
|
|
function fixupZOrder(windows, basis, topWindow) {
|
|
windows.sort(function(a, b){
|
|
return a.z - b.z;
|
|
});
|
|
|
|
if ((topWindow.z >= basis) && (windows[windows.length - 1] === topWindow)) {
|
|
return;
|
|
}
|
|
|
|
var lastZ = -1;
|
|
var lastTargetZ = basis - 1;
|
|
for (var i = 0; i < windows.length; ++i) {
|
|
var window = windows[i];
|
|
if (!window.visible) {
|
|
continue
|
|
}
|
|
|
|
if (topWindow && (topWindow === window)) {
|
|
continue
|
|
}
|
|
|
|
if (window.z > lastZ) {
|
|
lastZ = window.z;
|
|
++lastTargetZ;
|
|
}
|
|
if (DebugQML) {
|
|
console.log("Assigning z order " + lastTargetZ + " to " + window)
|
|
}
|
|
|
|
window.z = lastTargetZ;
|
|
}
|
|
if (topWindow) {
|
|
++lastTargetZ;
|
|
if (DebugQML) {
|
|
console.log("Assigning z order " + lastTargetZ + " to " + topWindow)
|
|
}
|
|
topWindow.z = lastTargetZ;
|
|
}
|
|
|
|
return lastTargetZ;
|
|
}
|
|
|
|
function raiseWindow(item) {
|
|
var targetWindow = getDesktopWindow(item);
|
|
if (!targetWindow) {
|
|
console.warn("Could not find top level window for " + item);
|
|
return;
|
|
}
|
|
|
|
if (!desktop) {
|
|
console.warn("Could not find desktop for window " + targetWindow);
|
|
return;
|
|
}
|
|
|
|
var predicate;
|
|
var zBasis;
|
|
if (isModalWindow(targetWindow)) {
|
|
predicate = isModalWindow;
|
|
zBasis = zBasisModal
|
|
} else if (isAlwaysOnTopWindow(targetWindow)) {
|
|
predicate = function(window) {
|
|
return (isAlwaysOnTopWindow(window) && !isModalWindow(window));
|
|
}
|
|
zBasis = zBasisAlwaysOnTop
|
|
} else {
|
|
predicate = function(window) {
|
|
return (!isAlwaysOnTopWindow(window) && !isModalWindow(window));
|
|
}
|
|
zBasis = zBasisNormal
|
|
}
|
|
|
|
var windows = getTopLevelWindows(predicate);
|
|
fixupZOrder(windows, zBasis, targetWindow);
|
|
}
|
|
|
|
|
|
|
|
//function findMenuChild(menu, childName) {
|
|
// if (!menu) {
|
|
// return null;
|
|
// }
|
|
|
|
// if (menu.type !== 2) {
|
|
// console.warn("Tried to find child of a non-menu");
|
|
// return null;
|
|
// }
|
|
|
|
// var items = menu.items;
|
|
// var count = items.length;
|
|
// for (var i = 0; i < count; ++i) {
|
|
// var child = items[i];
|
|
// var name;
|
|
// switch (child.type) {
|
|
// case 2:
|
|
// name = child.title;
|
|
// break;
|
|
// case 1:
|
|
// name = child.text;
|
|
// break;
|
|
// default:
|
|
// break;
|
|
// }
|
|
|
|
// if (name && name === childName) {
|
|
// return child;
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
//function findMenu(rootMenu, path) {
|
|
// if ('string' === typeof(path)) {
|
|
// path = [ path ]
|
|
// }
|
|
|
|
// var currentMenu = rootMenu;
|
|
// for (var i = 0; currentMenu && i < path.length; ++i) {
|
|
// currentMenu = findMenuChild(currentMenu, path[i]);
|
|
// }
|
|
|
|
// return currentMenu;
|
|
//}
|
|
|
|
//function findInRootMenu(item, path) {
|
|
// return findMenu(findRootMenu(item), path);
|
|
//}
|
|
|
|
//function menuItemsToListModel(parent, items) {
|
|
// var newListModel = Qt.createQmlObject('import QtQuick 2.5; ListModel {}', parent);
|
|
// for (var i = 0; i < items.length; ++i) {
|
|
// var item = items[i];
|
|
// switch (item.type) {
|
|
// case 2:
|
|
// newListModel.append({"type":item.type, "name": item.title, "item": item})
|
|
// break;
|
|
// case 1:
|
|
// newListModel.append({"type":item.type, "name": item.text, "item": item})
|
|
// break;
|
|
// case 0:
|
|
// newListModel.append({"type":item.type, "name": "-----", "item": item})
|
|
// break;
|
|
// }
|
|
// }
|
|
// return newListModel;
|
|
//}
|
|
}
|
|
}
|
|
|
|
|
|
|