import QtQuick 2.1; import QtQuick.Window 2.1; MouseArea { id: base; opacity: 0.65; // anchors.fill: parent; width: 400; height: 300; drag.target: list; onWheel: { } onClicked: { object = null } property var object: null onObjectChanged: { visible = (object != null) } property var properties: [] onPropertiesChanged: { console.debug('properties: ', JSON.stringify(properties, 4, 0)) } function getPropertiesList(obj) { var props = []; var propertiesObject = obj; if(properties.length !== 0) { propertiesObject = {}; for(var i = 0; i < properties.length; ++i) { propertiesObject[properties[i]] = properties[i]; } } for(var prop in propertiesObject) { var info = {'name' : prop}; var value = obj[prop]; var typeOfValue = typeof(value); if(typeof(value) === 'string') { info['type'] = 'string' } else if(typeof(value) === 'number') { if(Number.isInteger(value)) info['type'] = 'int' else info['type'] = 'float' } else if(typeof(value) === 'boolean') { info['type'] = 'boolean' } else if(typeof(value) === 'function') { continue; } /* if(prop !== 'parent' && prop !== 'data' && prop !== 'children') console.debug('typeof(value): ', typeof(value), JSON.stringify(value, null, 4)); */ info['subName'] = '' props.push(info); } return props; } Rectangle { color: "lightgray"; anchors.fill: list; anchors.margins: -50; } ListView { id: list; x: 50; y: 50; width: 400; height: 300; spacing: 5; model: object !== null ? getPropertiesList(object) : []; header: Text { text: object !== null ? object.toString () : ''; font.bold: true; font.pixelSize: 20; } delegate: Row { spacing: 20; Column { width: 180; Text { text: (modelData ["subName"] !== "" ? (modelData ["name"] + "." + modelData ["subName"]) : modelData ["name"]); font.pixelSize: 16; } } Column { width: 200; Text { text: { return modelData ["type"] } font.pixelSize: 10; } TextInput { id: input; text: display; width: parent.width; font.pixelSize: 16; font.underline: (text !== display); Keys.onReturnPressed: { save (); } Keys.onEnterPressed: { save (); } Keys.onEscapePressed: { cancel (); } property string display : ""; function save () { var tmp; switch (modelData ["type"]) { case 'boolean': tmp = (text === "true" || text === "1"); break; case 'float': tmp = parseFloat (text); break; case 'int': tmp = parseInt (text); break; case 'string': tmp = text; break; default: break; } if (modelData ["subName"] !== "") { object [modelData ["name"]][modelData ["subName"]] = tmp; } else { object [modelData ["name"]] = tmp; } text = display; } function cancel () { text = display; } Binding on text { value: input.display; } Binding on display { value: { var ret = (modelData ["subName"] !== "" ? object [modelData ["name"]][modelData ["subName"]] : object [modelData ["name"]]); return ret.toString (); } } Rectangle { z: -1; color: "white"; anchors.fill: parent; } } } } } }