176 lines · 8.0 KB · Text
RawDownload
////  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)        }    }}