mirror of
https://github.com/overte-org/overte.git
synced 2025-04-27 20:15:54 +02:00
176 lines
8 KiB
QML
176 lines
8 KiB
QML
//
|
|
// PropGroup.qml
|
|
//
|
|
// Created by Sam Gateau on 3/2/2019
|
|
// Copyright 2019 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
import QtQuick 2.7
|
|
|
|
// PropGroup is mostly reusing the look and feel of the PropFolderPanel
|
|
// It is populated by calling "updatePropItems"
|
|
// or adding manually new Items to the "propItemsPanel"
|
|
PropFolderPanel {
|
|
Global { id: global }
|
|
id: root
|
|
|
|
property var rootObject: {}
|
|
|
|
property alias propItemsPanel: root.panelFrameContent
|
|
|
|
// Prop Group is designed to author an array of ProItems, they are defined with an array of the tuplets describing each individual item:
|
|
// [ ..., PropItemInfo, ...]
|
|
// PropItemInfo {
|
|
// type: "PropXXXX", object: JSobject, property: "propName"
|
|
// }
|
|
//
|
|
function updatePropItems(propItemsContainer, propItemsModel) {
|
|
root.hasContent = false
|
|
for (var i = 0; i < propItemsModel.length; i++) {
|
|
var proItem = propItemsModel[i];
|
|
// valid object
|
|
if (proItem['object'] !== undefined && proItem['object'] !== null ) {
|
|
// valid property
|
|
if (proItem['property'] !== undefined && proItem.object[proItem.property] !== undefined) {
|
|
// check type
|
|
if (proItem['type'] === undefined) {
|
|
proItem['type'] = typeof(proItem.object[proItem.property])
|
|
}
|
|
switch(proItem.type) {
|
|
case 'string':
|
|
case 'PropString': {
|
|
var component = Qt.createComponent("PropString.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": proItem.property,
|
|
"object": proItem.object,
|
|
"property": proItem.property
|
|
})
|
|
} break;
|
|
case 'boolean':
|
|
case 'PropBool': {
|
|
var component = Qt.createComponent("PropBool.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": proItem.property,
|
|
"object": proItem.object,
|
|
"property": proItem.property
|
|
})
|
|
} break;
|
|
case 'number':
|
|
case 'PropScalar': {
|
|
var component = Qt.createComponent("PropScalar.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": proItem.property,
|
|
"object": proItem.object,
|
|
"property": proItem.property,
|
|
"min": (proItem["min"] !== undefined ? proItem.min : 0.0),
|
|
"max": (proItem["max"] !== undefined ? proItem.max : 1.0),
|
|
"integer": (proItem["integral"] !== undefined ? proItem.integral : false),
|
|
"readOnly": (proItem["readOnly"] !== undefined ? proItem["readOnly"] : true),
|
|
})
|
|
} break;
|
|
case 'PropEnum': {
|
|
var component = Qt.createComponent("PropEnum.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": proItem.property,
|
|
"object": proItem.object,
|
|
"property": proItem.property,
|
|
"enums": (proItem["enums"] !== undefined ? proItem.enums : ["Undefined Enums !!!"]),
|
|
})
|
|
} break;
|
|
case 'object': {
|
|
console.log('Item is an object, create PropGroup: ' + JSON.stringify(proItem.object[proItem.property]));
|
|
var itemRootObject = proItem.object[proItem.property];
|
|
var itemLabel = proItem.property;
|
|
var itemDepth = root.indentDepth + 1;
|
|
if (Array.isArray(itemRootObject)) {
|
|
itemLabel = proItem.property + "[] / " + itemRootObject.length
|
|
if (itemRootObject.length == 0) {
|
|
var component = Qt.createComponent("PropItem.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": itemLabel
|
|
})
|
|
} else {
|
|
var component = Qt.createComponent("PropGroup.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": itemLabel,
|
|
"rootObject":itemRootObject,
|
|
"indentDepth": itemDepth,
|
|
"isUnfold": true,
|
|
})
|
|
}
|
|
} else {
|
|
var component = Qt.createComponent("PropGroup.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": itemLabel,
|
|
"rootObject":itemRootObject,
|
|
"indentDepth": itemDepth,
|
|
"isUnfold": true,
|
|
})
|
|
}
|
|
} break;
|
|
case 'printLabel': {
|
|
var component = Qt.createComponent("PropItem.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": proItem.property
|
|
})
|
|
} break;
|
|
}
|
|
root.hasContent = true
|
|
} else {
|
|
console.log('Invalid property: ' + JSON.stringify(proItem));
|
|
}
|
|
} else if (proItem['type'] === 'printLabel') {
|
|
var component = Qt.createComponent("PropItem.qml");
|
|
component.createObject(propItemsContainer, {
|
|
"label": proItem.label
|
|
})
|
|
} else {
|
|
console.log('Invalid object: ' + JSON.stringify(proItem));
|
|
}
|
|
}
|
|
}
|
|
|
|
function populateFromObjectProps(object) {
|
|
var propsModel = []
|
|
|
|
if (object !== undefined) {
|
|
var props = Object.keys(object);
|
|
for (var p in props) {
|
|
var o = {};
|
|
o["object"] = object
|
|
o["property"] = props[p];
|
|
// o["readOnly"] = true;
|
|
|
|
var thePropThing = object[props[p]];
|
|
if ((thePropThing !== undefined) && (thePropThing !== null)) {
|
|
var theType = typeof(thePropThing)
|
|
switch(theType) {
|
|
case 'object': {
|
|
o["type"] = "object";
|
|
propsModel.push(o)
|
|
} break;
|
|
default: {
|
|
o["type"] = "string";
|
|
propsModel.push(o)
|
|
} break;
|
|
}
|
|
|
|
} else {
|
|
o["type"] = "string";
|
|
propsModel.push(o)
|
|
}
|
|
}
|
|
}
|
|
|
|
root.updatePropItems(root.propItemsPanel, propsModel);
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
if (root.rootObject !== null) {
|
|
populateFromObjectProps(root.rootObject)
|
|
}
|
|
}
|
|
}
|