"use strict"; // Copyright 2012 United States Government, as represented by the Secretary of Defense, Under // Secretary of Defense (Personnel & Readiness). // // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distributed under the License // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express // or implied. See the License for the specific language governing permissions and limitations under // the License. /// vwf/view/editor creates a view interface for editor functions. /// /// @module vwf/view/editor /// @requires version /// @requires vwf/view /// @requires vwf/utility define([ "module", "version", "vwf/view", "vwf/utility", "vwf/view/lib/ace/ace", "vwf/view/lib/colorpicker/colorpicker.min", "vwf/view/widgets" ], function (module, version, view, utility, ace, colorpicker, widgets) { var self; return view.load(module, { // == Module Definition ==================================================================== initialize: function () { self = this; this.ace = window.ace; this.widgets = widgets; this.nodes = {}; this.scenes = {}; this.allScripts = {}; //$(document.head).append(''); document.querySelector('head').innerHTML += ''; document.querySelector('head').innerHTML += ''; //document.querySelector('head').innerHTML += ''); this.removeProps = (obj) => { Object.keys(obj).forEach(key => (key === 'id' || key === 'patches' || key === 'random' || key === 'sequence') && delete obj[key] || (obj[key] && typeof obj[key] === 'object') && this.removeProps(obj[key]) ); return obj; }; this.getNodeDef = function (nodeID) { let node = vwf.getNode(nodeID, true); let nodeDef = self.removeProps(node); return nodeDef } this.GUID = function () { var S4 = function () { return Math.floor( Math.random() * 0x10000 /* 65536 */ ).toString(16); }; return ( S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4() ); } this.getRoot = function () { var app = window.location.pathname; var pathSplit = app.split('/'); if (pathSplit[0] == "") { pathSplit.shift(); } if (pathSplit[pathSplit.length - 1] == "") { pathSplit.pop(); } var instIndex = pathSplit.length - 1; if (pathSplit.length > 2) { if (pathSplit[pathSplit.length - 2] == "load") { instIndex = pathSplit.length - 3; } } if (pathSplit.length > 3) { if (pathSplit[pathSplit.length - 3] == "load") { instIndex = pathSplit.length - 4; } } var root = ""; for (var i = 0; i < instIndex; i++) { if (root != "") { root = root + "/"; } root = root + pathSplit[i]; } if (root.indexOf('.vwf') != -1) root = root.substring(0, root.lastIndexOf('/')); return root }; this.getRandomInt = function (min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive }; ["drawer", "toolbar", "sideBar", "propWindow", "clientsWindow", "codeEditorWindow", "propEditorWindow", "viewSceneProps"].forEach(item => { let el = document.createElement("div"); el.setAttribute("id", item); document.body.appendChild(el); } ); this.avatarCardDef = function (src, desc, onclickfunc) { return { $cell: true, $type: "div", class: "mdc-card avatar-card", $init: function () { this.style.backgroundImage = 'linear-gradient(0deg, rgba(0, 0, 0, 0.0), rgba(0, 0, 0, 0.0) ), url(' + src + ')' }, onclick: onclickfunc, $components: [ { $type: "section", class: "mdc-card__primary", $components: [ { $type: "h1", class: "mdc-card__title mdc-card__title--large", $text: desc.subtitle }, { $type: "h2", class: "mdc-card__subtitle", $text: desc.title } ] }, { $type: "section", class: "mdc-card__actions", $components: [ { $type: "button", class: "mdc-button mdc-button--compact mdc-card__action", //$text: "Use it", onclick: onclickfunc } ] } ] } } let avatarSettings = { $cell: true, $type: "div", class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Go forward", onclick: function (e) { function getMovementVector(el) { var directionVector = new THREE.Vector3(0, 0, 0); var rotationEuler = new THREE.Euler(0, 0, 0, 'YXZ'); var rotation = el.getAttribute('rotation'); var velocity = new THREE.Vector3(0, 0, -0.5); var xRotation; directionVector.copy(velocity); directionVector.multiplyScalar(1.0); // Absolute. if (!rotation) { return directionVector; } xRotation = 0; // Transform direction relative to heading. rotationEuler.set(THREE.Math.degToRad(xRotation), THREE.Math.degToRad(rotation.y), 0); directionVector.applyEuler(rotationEuler); return directionVector; } let el = document.querySelector('#avatarControl'); let currentPosition = el.getAttribute('position'); let movementVector = getMovementVector(el); let position = {}; position.x = currentPosition.x + movementVector.x; position.y = currentPosition.y + movementVector.y; position.z = currentPosition.z + movementVector.z; el.setAttribute('position', position); } }, ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Reset camera view", onclick: function (e) { //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden'; let controlEl = document.querySelector('#avatarControl'); controlEl.setAttribute('camera', 'active', true); } }, { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Hide cursor", onclick: function (e) { //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden'; let avatarID = 'avatar-' + self.kernel.moniker(); let cursorID = 'myCursor-' + avatarID; let controlEl = document.querySelector("[id='" + cursorID + "']"); let vis = controlEl.getAttribute('visible'); this.$text = vis ? 'Show cursor' : 'Hide cursor'; vwf_view.kernel.callMethod(avatarID, "showHideCursor", [!vis]); //controlEl.setAttribute('visible', !vis); } } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $type: "div", class: "mdc-layout-grid", $components: [ { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ self.avatarCardDef("/../assets/avatars/ico/simple.jpg", { title: "Simple", subtitle: "Cube" }, function (e) { let avatarID = 'avatar-' + self.kernel.moniker(); vwf_view.kernel.callMethod(avatarID, "createSimpleAvatar"); } ) ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ self.avatarCardDef("/../assets/avatars/ico/female.jpg", { title: "Human", subtitle: "Female" }, function (e) { let avatarID = 'avatar-' + self.kernel.moniker(); vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/../assets/avatars/female/avatar1.gltf"]); } )] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ self.avatarCardDef("/../assets/avatars/ico/male.jpg", { title: "Human", subtitle: "Male" }, function (e) { let avatarID = 'avatar-' + self.kernel.moniker(); vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/../assets/avatars/male/avatar1.gltf"]); } )] } ] } ] } ] } ] } ] } let viewSettings = { $cell: true, $type: "div", class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "OSC Settings", onclick: function (e) { let sideBar = document.querySelector('#sideBar'); sideBar._sideBarComponent = oscSettings; //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden'; } } ] } ] } ] } let savedStateEl = function (item) { return { $type: "li", class: "mdc-list-item", role: "option", $components: [ { $text: "Saved world" } ] } } let stateListElement = function (item) { let liEl = { $type: "li", class: "mdc-list-item", role: "option", id: "", applicationpath: "", $components: [ { $text: "no saves" } ] } let applicationName = item.applicationpath.split("/"); if (applicationName == "") { return liEl } if (applicationName.length > 0) { applicationName = applicationName[applicationName.length - 1]; } if (applicationName.length > 0) { applicationName = applicationName.charAt(0).toUpperCase() + applicationName.slice(1); } if (item.latestsave) { liEl = { $type: "li", class: "mdc-list-item", role: "option", id: item.savename, applicationpath: item.applicationpath, $components: [ { $text: applicationName + ": " + item.savename } ] } } else { liEl = { $type: "li", class: "mdc-list-item", role: "option", id: item.savename, revision: item.revision, applicationpath: item.applicationpath, $components: [ { $text: applicationName + ": " + item.savename + " Rev(" + item.revision + ")" } ] } } return liEl } let oscSettings = { $cell: true, $type: "div", id: "oscSettings", class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left", _oscHost: '', _oscPort: '', _oscStatus: '', _updateStatus: function () { this._oscStatus = window._OSCManager.getStatus() }, $init: function () { if (window._OSCManager) { this._oscHost = window._OSCManager.hostValue; this._oscPort = window._OSCManager.portValue; this._oscStatus = window._OSCManager.getStatus(); // var t = this; // setInterval(function () { // t._updateStatus(); // }, 1000); } }, $update: function () { let that = this var buttonText = "Connect"; var buttonFunc = function (e) { } if (this._oscStatus == 1) { buttonText = "Disconnect"; buttonFunc = function (e) { window._OSCManager.disconnect(); } } else { var buttonFunc = function (e) { window._OSCManager.connect(); window._OSCManager.port.on("open", function () { that._oscStatus = window._OSCManager.getStatus(); console.log("connected"); }); window._OSCManager.port.on("close", function () { that._oscStatus = window._OSCManager.getStatus(); console.log("disconnected"); }); } } this.$components = [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $type: "span", $text: "Host: " }, { class: "mdc-textfield", $cell: true, $type: "span", $components: [ { class: "mdc-textfield__input", id: "oscHost", $cell: true, $type: "input", type: "text", value: this._oscHost, onchange: function (e) { this._oscHost = this.value; window._OSCManager.setOSCHostAndPort(this._oscHost, this._oscPort); } } ] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $type: "span", $text: "Port: " }, { class: "mdc-textfield", $cell: true, $type: "span", $components: [ { class: "mdc-textfield__input", id: "oscPort", $cell: true, $type: "input", type: "text", value: this._oscPort, onchange: function (e) { this._oscPort = this.value; window._OSCManager.setOSCHostAndPort(this._oscHost, this._oscPort); } } ] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: buttonText, onclick: buttonFunc } ] } ] } ] } } let loadSaveSettings = { $cell: true, $type: "div", id: "loadSaveSettings", class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left", _saveStates: [], _getStates: async function () { let response = await fetch("/" + self.getRoot() + "/listallsaves"); let data = await response.json(); //this._saveStates = data; //let appName = self.getRoot(); //console.log(data.filter(item => item.applicationpath.split("/")[1] == appName)); let filterData = data.filter(item => item.applicationpath.split("/")[1] == self.getRoot()); if (filterData.length !== 0) { this._saveStates = filterData //return filterData } else { this._saveStates = [{ savename: "", latestsave: "", revision: "", applicationpath: "", url: "" }] } // this._saveStates.filter(item => item.applicationpath.split("/")[1] == self.getRoot()).map(stateListElement) //return data //console.log(data); return this._saveStates }, $init: function () { this._getStates(); }, $update: function () { this.$components = [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { class: "mdc-textfield", $cell: true, $type: "span", $components: [ { class: "mdc-textfield__input", id: "fileName", $cell: true, $type: "input", type: "text", value: self.getRoot() }] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Save", onclick: function (e) { let fileName = document.querySelector('#fileName') saveStateAsFile.call(self, fileName.value); document.querySelector("#fileName").value = ''; //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden'; } } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "div", class: "mdc-select", $init: function () { var MDCSelect = mdc.select.MDCSelect; const select = new MDCSelect(document.querySelector('.mdc-select')); select.listen('MDCSelect:change', () => { //this._selectedState = select.value; document.querySelector('#loadStateButton')._selectedState = select.selectedOptions[0]; //console.log(select.value); //.selectedOptions[0] }); }, role: "listbox", $components: [ { $type: "span", class: "mdc-select__selected-text", $text: "Select saved state" }, { $type: "div", class: "mdc-simple-menu mdc-select__menu", $components: [ { $type: "ul", class: "mdc-list mdc-simple-menu__items", $components: this._saveStates.map(stateListElement) } ] } ] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", _selectedState: {}, id: "loadStateButton", class: "mdc-button mdc-button--raised", $text: "Load", onclick: function (e) { loadSavedState.call(self, this._selectedState.getAttribute('id'), this._selectedState.getAttribute('applicationpath'), this._selectedState.getAttribute('revision')); //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden'; } } ] } ] } ] } } let protoPropertiesCell = function (m) { return { $type: "div", class: "mdc-layout-grid__inner", _prop: {}, $init: function () { let prop = m[1].prop; if (prop.value == undefined && this._currentNode !== undefined) { prop.value = JSON.stringify(utility.transform(vwf.getProperty(this._currentNode, prop.name, []), utility.transforms.transit)); } this._prop = prop }, $update: function () { this.$components = [ { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3", $components: [ { $text: this._prop.name } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-7", $components: [ { class: "mdc-textfield", $cell: true, $type: "div", $components: [{ class: "mdc-textfield__input", $cell: true, $type: "input", type: "text", value: this._prop.value, onchange: function (e) { let propValue = this.value; try { propValue = JSON.parse(propValue); self.kernel.setProperty(this._currentNode, this._prop.name, propValue); } catch (e) { // restore the original value on error this.value = propValue; } } }] } ] } ] } } } let propertiesCell = function (m) { var editComponents = [{}, {}] if (m.name.indexOf("semantics") > -1) { } else if (m.name.indexOf("grammar") > -1) { } else if (m.name.indexOf("ohm") > -1) { editComponents = [ { $type: "div", $cell: true, class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-6", $components: [ { $cell: true, $type: "button", class: "mdc-button", $text: "Edit", //edit grammar onclick: function (e) { var currentNode = document.querySelector('#currentNode')._currentNode; if (currentNode == '') { currentNode = vwf_view.kernel.find("", "/")[0]; } let editor = document.querySelector('#livePropEditor'); editor._setNode(currentNode); editor._propName = m.name; editor._prop = { body: m.rawValue, type: 'complex' } document.querySelector('#propEditorWindow').style.visibility = 'visible'; } } ] }, { $type: "div", $cell: true, class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1", $components: [] } ] } else { editComponents = [ { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-6", $components: [ { class: "mdc-textfield", $cell: true, $type: "span", $components: [ { class: "mdc-textfield__input", id: "prop-" + m.name, $cell: true, $type: "input", type: "text", value: m.getValue(), onchange: function (e) { let propValue = this.value; try { propValue = JSON.parse(propValue); self.kernel.setProperty(this._currentNode, m.name, propValue); } catch (e) { // restore the original value on error this.value = propValue; } } } ] } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1", $components: [ { $cell: true, $type: "button", class: "mdc-button", $text: "^", //edit grammar onclick: function (e) { var currentNode = document.querySelector('#currentNode')._currentNode; if (currentNode == '') { currentNode = vwf_view.kernel.find("", "/")[0]; } let editor = document.querySelector('#livePropEditor'); editor._setNode(currentNode); editor._propName = m.name; editor._prop = { body: m.getValue(), type: 'simple' } document.querySelector('#propEditorWindow').style.visibility = 'visible'; } } ] } ]; } return { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3", $components: [ { $text: m.name } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", }, editComponents[0], editComponents[1] ] } } let nodeLink = function (m) { var myClass = "nodeItem"; let myAvatarName = 'avatar-' + self.kernel.moniker(); (myAvatarName == m.name) ? (myClass = "avatarName mdc-typography--subheading2") : myClass = "nodeItem" return { $type: "li", class: "mdc-list-item", $components: [{ $type: "a", class: "mdc-list-item", $href: "#", $components: [{ $type: 'span', class: myClass, $text: m.name } ], onclick: function (e) { //self.currentNodeID = m.ID; document.querySelector('#currentNode')._setNode(m.ID); // document.querySelector('#liveCodeEditor')._editorNode = m.ID; // createAceEditor(self, m.ID); } }] } }; let listDivider = { $cell: true, $type: "hr", class: "mdc-list-divider", } let webrtcGUI = { $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $components: [ { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "span", $text: "ON", } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ widgets.switch({ 'id': "webrtcswitch", 'init': function(){ let driver = vwf.views["vwf/view/webrtc"]; if (!driver) this.setAttribute('disabled', ''); }, "onchange": function(e){ let driver = vwf.views["vwf/view/webrtc"]; let avatarID = 'avatar-' + self.kernel.moniker(); let chkAttr = this.checked; if (chkAttr) { driver.startWebRTC(avatarID); console.log("on") } else { driver.stopWebRTC(avatarID); console.log("off") } } }) ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "span", $text: "Mic: ", } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ widgets.switch({ 'id': "webrtcaudio", 'init': function(){ let driver = vwf.views["vwf/view/webrtc"]; if (!driver) this.setAttribute('disabled', ''); }, "onchange": function(e){ let driver = vwf.views["vwf/view/webrtc"]; let chkAttr = this.checked; if (chkAttr) { driver.muteAudio([chkAttr]); console.log("on") } else { driver.muteAudio([chkAttr]); console.log("off") } } }) ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "span", $text: "Cam: ", } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ widgets.switch({ 'id': "webrtcvideo", 'init': function(){ let driver = vwf.views["vwf/view/webrtc"]; if (!driver) this.setAttribute('disabled', ''); }, "onchange": function(e){ let driver = vwf.views["vwf/view/webrtc"]; let chkAttr = this.checked; if (chkAttr) { driver.muteVideo([chkAttr]); console.log("on") } else { driver.muteVideo([chkAttr]); console.log("off") } } }) ] } ] } ] } let gizmoEdit = { $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $components: [ { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "span", $text: "Edit: ", } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-7", $components: [ widgets.switch({ 'id': 'editnode', 'init': function(){ vwf_view.kernel.getProperty(this._currentNode, 'edit'); }, 'onchange': function(e){ var nodeID = document.querySelector('#currentNode')._currentNode; let chkAttr = this.getAttribute('checked'); if (chkAttr == "") { self.kernel.setProperty(this._currentNode, 'edit', false); } else { self.kernel.setProperty(this._currentNode, 'edit', true); } vwf_view.kernel.callMethod(nodeID, "showCloseGizmo"); } } ) ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1", $components: [ { $cell: true, $type: "a", class: "gizmomode", $text: "T", onclick: function (e) { vwf_view.kernel.callMethod(this._currentNode, "setGizmoMode", ['translate']) } } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1", $components: [ { $cell: true, $type: "a", class: "gizmomode", $text: "R", onclick: function (e) { vwf_view.kernel.callMethod(this._currentNode, "setGizmoMode", ['rotate']) } } ] }, { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-1", $components: [ { $cell: true, $type: "a", class: "gizmomode", $text: "S", onclick: function (e) { vwf_view.kernel.callMethod(this._currentNode, "setGizmoMode", ['scale']) } } ] } ] } ] } let nodesCell = { $cell: true, $type: "div", id: "currentNode", _childNodes: [], _currentNode: '', _displayedProperties: {}, _setNode: function (aNode) { this._currentNode = aNode; document.querySelector('#sideBar')._sideCurrentNode = this._currentNode }, $init: function () { this._currentNode = document.querySelector('#sideBar')._sideCurrentNode //this._currentNode = vwf_view.kernel.find("", "/")[0]; //this._currentNode = '3333'; }, _getChildNodes: function () { this._childNodes = self.nodes[this._currentNode]; if (this._childNodes !== undefined) { return this._childNodes.children } else { return [] } //let nodeIDAlpha = he.encode(this._currentNode); }, // _getNodeComplexProperties: function () { // let node = self.nodes[this._currentNode]; // let props = this._getNodeProperties(); // let filterFunction = function (prop) { // return (prop.name == 'ohmLang') // }; // let complexProps = props.filter(filterFunction.bind(this)); // return complexProps // }, _getNodeProperties: function () { let node = self.nodes[this._currentNode]; this._displayedProperties = {}; let filterFunction = function (prop) { return (!this._displayedProperties[prop.name] && prop.name.indexOf('$') === -1) ? (this._displayedProperties[prop.name] = "instance", true) : (false); }; let props = node.properties.filter(filterFunction.bind(this)); return props }, _getNodeProtoProperties: function () { let node = self.nodes[this._currentNode]; let filterFunction = function (prop) { return (!this._displayedProperties[prop[1].prop.name]) ? (this._displayedProperties[prop[1].prop.name] = prop[1].prototype, true) : (false); }; let props = Object.entries(getProperties.call(self, self.kernel, node.extendsID)).filter(filterFunction.bind(this)); return props }, $update: function () { //this.$text = this._currentNode; let node = self.nodes[this._currentNode]; let nodeProtos = getPrototypes(self.kernel, node.extendsID); var viewerProps = {}; var viewerPropsCell = {}; var gizmoCell = {}; if (this._currentNode !== self.kernel.application()) { if (nodeProtos.includes('http://vwf.example.com/aframe/componentNode.vwf')) { //gizmoCell = {}; } else { gizmoCell = gizmoEdit } } if (node !== undefined) { if (node.extendsID == "http://vwf.example.com/aframe/acamera.vwf") { viewerProps = { $type: "li", class: "mdc-list-item", $components: [ { $text: "Viewer properties", $type: "span", class: "mdc-list-item__text mdc-typography--button" } ] } viewerPropsCell = { $cell: true, $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Active", onclick: function (e) { let camera = document.querySelector('#' + this._currentNode); camera.setAttribute('camera', 'active', true); } } ] } ] } ] //$components: this._getNodeProtoProperties().map(protoPropertiesCell) } } else { viewerProps = {}; viewerPropsCell = {}; } } this.$components = [ { $cell: true, $type: "ul", class: "mdc-list", $components: [ { $cell: true, $type: "button", class: "mdc-list-item mdc-button mdc-button--raised", $text: "<--", onclick: function (e) { let node = self.nodes[this._currentNode]; if (node.parentID !== 0) { //self.currentNodeID = node.parentID, document.querySelector('#currentNode')._setNode(node.parentID) } } }, { $type: "li", class: "mdc-list-item", $components: [ { $text: "name", $type: "span", $init: function () { let node = self.nodes[this._currentNode]; if (node) this.$text = node.name }, class: "mdc-list-item__text mdc-typography--headline" //

Big header

}] }, listDivider, { // $cell: true, // $type: "ul", // class: "mdc-list", $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $components: [ { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Methods browser", onclick: function (e) { var currentNode = document.querySelector('#currentNode')._currentNode; if (currentNode == '') { currentNode = vwf_view.kernel.find("", "/")[0]; } document.querySelector('#liveCodeEditor')._setNode(currentNode); //createAceEditor(self, currentNode); document.querySelector('#codeEditorWindow').style.visibility = 'visible'; } } ] } ] } ] }, gizmoCell, listDivider, { $type: "li", class: "mdc-list-item", $components: [ { $text: "Children", $type: "span", class: "mdc-list-item__text mdc-typography--button" }] }, { $cell: true, $type: "ul", class: "mdc-list", $components: this._getChildNodes().map(nodeLink) }, listDivider, { $type: "li", class: "mdc-list-item", $components: [ { $text: "Properties", $type: "span", class: "mdc-list-item__text mdc-typography--button" //

Big header

}] }, { // $cell: true, // $type: "ul", // class: "mdc-list", $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $components: this._getNodeProperties().map(propertiesCell) }, listDivider, { $type: "li", class: "mdc-list-item", $components: [ { $text: "Proto properties", $type: "span", class: "mdc-list-item__text mdc-typography--button" }] }, { $cell: true, $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $components: this._getNodeProtoProperties().map(protoPropertiesCell) }, listDivider, viewerProps, viewerPropsCell ] } ] } } let colorPickerComponent = { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-4", $init: function () { let myEl = this; let cp = ColorPicker( document.getElementById('slide'), document.getElementById('picker'), function (hex, hsv, rgb, mousePicker, mouseSlide) { ColorPicker.positionIndicators( document.getElementById('slide-indicator'), document.getElementById('picker-indicator'), mouseSlide, mousePicker ); if (myEl._propName == 'color') { // console.log(hex); document.querySelector('#propAceEditor').env.editor.setValue(JSON.stringify(hex)); self.kernel.setProperty(myEl._editorNode, myEl._propName, hex); } }); if (myEl._propName == 'color') { cp.setHex(JSON.parse(myEl._prop.body)); } }, $components: [ { $cell: true, $type: "div", id: "color-picker", class: "cp-default", $components: [ { $cell: true, $type: "div", class: "picker-wrapper", $components: [ { $cell: true, $type: "div", id: "picker", class: "picker", style: "width: 130px; height: 130px" }, { $cell: true, $type: "div", id: "picker-indicator", class: "picker-indicator" } ] }, { $cell: true, $type: "div", class: "slide-wrapper", $components: [ { $cell: true, $type: "div", id: "slide", class: "slide", style: "width: 30px; height: 130px" }, { $cell: true, $type: "div", id: "slide-indicator", class: "slide-indicator" } ] } ] } // { // $cell: true, // $type: "div", // id: "color-picker", // $init: function () { // } // } ] } let propEditorWindow = { $cell: true, $type: "div", _editorNode: '', _prop: { body: '', type: 'simple' }, _propName: '', id: "livePropEditor", _setNode: function (node) { this._editorNode = node; this._prop.body = '' }, class: "propEditorGrid mdc-layout-grid max-width mdc-layout-grid--align-left", $update: function () { var editorClass = "mdc-layout-grid__cell mdc-layout-grid__cell--span-8" var livePropertyComponent = {} if (this._prop.type == 'simple') { if (this._propName == 'color') { livePropertyComponent = colorPickerComponent } } else { editorClass = "mdc-layout-grid__cell mdc-layout-grid__cell--span-12" } this.$components = [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Update", onclick: function (e) { let editor = document.querySelector("#propAceEditor").env.editor; let value = editor.getValue(); try { let propValue = (this._prop.type == 'simple') ? (JSON.parse(value)) : (value) //propValue = JSON.parse(value); self.kernel.setProperty(this._editorNode, this._propName, propValue); } catch (e) { // restore the original value on error this.value = propValue; } } }] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-5", $components: [ { $type: "h3", class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--subheading1", $text: this._editorNode } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-5", $components: [ { $type: "h3", class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--subheading1", $text: this._propName } ] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: editorClass, $components: [ { $cell: true, class: "aceEditor", id: "propAceEditor", $type: "div", $text: this._prop.body, $init: function () { createAceEditor(self, this._editorNode, "propAceEditor"); this.env.editor.$blockScrolling = Infinity } } ] }, livePropertyComponent // { // $cell: true, // $type: "div", // class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", // $components: [] // }, ] } ] //$components: } } let codeEditorWindow = { $cell: true, $type: "div", _editorNode: '', _method: { body: '' }, _methodName: '', _getNodeMethods: function () { let node = self.nodes[this._editorNode]; return node.methods }, _getProtoNodeMethods: function () { let node = self.nodes[this._editorNode]; let prototypeMethods = getMethods.call(self, self.kernel, node.extendsID); return prototypeMethods }, id: "liveCodeEditor", _setNode: function (node) { this._editorNode = node; this._method.body = '' }, class: "codeEditorGrid mdc-layout-grid max-width mdc-layout-grid--align-left", // _getComplexProps: function(){ // let node = self.nodes[this._editorNode]; // let currentNode = document.querySelector('#currentNode'); // var props = {} // if (currentNode !== null) { // props = currentNode._getNodeComplexProperties(); // } // return props // }, // _listPropertyElement: function (m) { // return { // $type: "li", // class: "mdc-list-item", // $components: [{ // $type: "a", // class: "mdc-list-item", // $href: "#", // $text: m[1].name, // onclick: function (e) { // this._method = {}; // this._methodName = m[1].name; // this._method.body = m[1].rawValue // this._method.type = "complexProperty" // } // }] // } // }, _listElement: function (m) { return { $type: "li", class: "mdc-list-item", $components: [{ $type: "a", class: "mdc-list-item", $href: "#", $text: m[0], onclick: function (e) { let method = vwf.getMethod(this._editorNode, m[0]); //document.querySelector('#aceEditor'). this._method = method; this._methodName = m[0]; //self.currentNodeID = m.ID; //document.querySelector('#currentNode')._setNode(m.ID); } }] } }, $update: function () { this.$components = [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3", $components: [ { $type: "h3", class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--subheading1", $text: this._editorNode } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Update", onclick: function (e) { let editor = document.querySelector("#aceEditor").env.editor; let evalText = editor.getValue(); // if (this._method.type == 'complexProperty') { // let propValue = evalText; // try { // //propValue = JSON.parse(propValue); // self.kernel.setProperty(this._editorNode, this._methodName, propValue); // } catch (e) { // // restore the original value on error // this.value = propValue; // } // } else { // } self.kernel.setMethod(this._editorNode, this._methodName, { body: evalText, type: "application/javascript", parameters: this._method.parameters }); } }] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Call", onclick: function (e) { var params = []; if (this._method.parameters) { let paramsLength = this._method.parameters.length if (paramsLength >= 1) { let paramsVal = document.querySelector("#methodParams").value; try { params = JSON.parse(paramsVal); //params.push(prmtr); } catch (e) { self.logger.error('Invalid Value'); } } }; self.kernel.callMethod(this._editorNode, this._methodName, params); } }] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Do It", onclick: function (e) { let editor = document.querySelector("#aceEditor").env.editor; codeEditorDoit.call(self, editor, this._editorNode); } }] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Print It", onclick: function (e) { let editor = document.querySelector("#aceEditor").env.editor; codeEditorPrintit.call(self, editor, this._editorNode); } }] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3", style: "overflow-y: scroll; max-height: 400px;", $components: [ { $cell: true, $type: "div", class: "mdc-list-group", $components: [ { $type: "h3", class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--button", $text: "Node methods" }, { $cell: true, $type: "ul", class: "mdc-list", $components: Object.entries(this._getNodeMethods()).map(this._listElement) }, listDivider, { $type: "h3", class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--button", $text: "Proto methods" }, { $cell: true, $type: "ul", class: "mdc-list", $components: Object.entries(this._getProtoNodeMethods()).map(this._listElement) }, listDivider, { $type: "h3", class: "mdc-list-group__subheader mdc-list-item__text mdc-typography--button", $text: "Events" } // { // $cell: true, // $type: "ul", // class: "mdc-list", // $components: Object.entries(this._getComplexProps()).map(this._listPropertyElement) // } ] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-9", $components: [ { $cell: true, class: "aceEditor", id: "aceEditor", $type: "div", $text: this._method.body, $init: function () { createAceEditor(self, this._editorNode, "aceEditor"); } } ] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $type: "span", $text: "*" } ] } ] }, { //params input $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-3", $components: [ { class: "mdc-textfield", $cell: true, $type: "div", $components: [{ class: "mdc-textfield__input", id: "methodName", $cell: true, $type: "input", type: "text", value: "newMethodName", onchange: function (e) { let propValue = this.value; try { } catch (e) { // restore the original value on error } } }] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-7", $components: [ { class: "mdc-textfield params-textfield-input", $cell: true, $type: "div", $components: [{ class: "mdc-textfield__input", id: "methodParams", $cell: true, $type: "input", type: "text", value: JSON.stringify(this._method.parameters), onchange: function (e) { let propValue = this.value; try { } catch (e) { // restore the original value on error } } }] } ] }, { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-2", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--raised", $text: "Create", onclick: function (e) { let methodName = document.querySelector('#methodName').value; //let methodParams = document.querySelector('#methodParams'); var params = []; let body = ''; let paramsVal = document.querySelector("#methodParams").value; if (paramsVal !== '') { try { params = JSON.parse(paramsVal); //params.push(prmtr); } catch (e) { self.logger.error('Invalid Value'); } } self.kernel.createMethod(this._editorNode, methodName, params, body); this._setNode(this._editorNode); // let editor = document.querySelector("#aceEditor").env.editor; // codeEditorDoit.call(self, editor, this._editorNode); } } ] } ] } ] //$components: } } let propWindow = { $cell: true, $type: "div", class: "propGrid mdc-layout-grid max-width mdc-layout-grid--align-left", style: "overflow-y: scroll; max-height: 800px;", $components: [ { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ nodesCell ] } ] } // ] } let clientListCell = { $cell: true, $type: "div", class: "mdc-list", id: "clientsList", _watchNodes: [], _listElement: function (m) { return { $type: "a", class: "mdc-list-item", $href: "#", $text: m.name, onclick: function (e) { //self.currentNodeID = m.ID; //document.querySelector('#currentNode')._setNode(m.ID); } } }, $init: function () { var t = this; setInterval(function () { t._updateMe(); }, 1000); }, _updateMe: function () { this._watchNodes = self.nodes["http://vwf.example.com/clients.vwf"].children.slice() }, $update: function () { //this._clientNodes this.$components = this._watchNodes.map(this._listElement) } } //createCellWindow("clientsWindow", clientListCell, "Clients"); //createCellWindow("propWindow", propWindow, "Scene"); createCellWindow("codeEditorWindow", codeEditorWindow, "Code editor"); createCellWindow("propEditorWindow", propEditorWindow, "Prop editor"); let viewSceneProps = { $cell: true, $type: "div", class: "propGrid mdc-layout-grid mdc-layout-grid--align-left", //style: "overflow-y: scroll; max-height: 500px; overflow-x: hidden;", $components: [ { $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ nodesCell ] } ] } ] } let sideBar = { $cell: true, $type: "div", id: 'sideBar', class: "sideBar mdc-toolbar-fixed-adjust", _sideBarComponent: {}, _sideCurrentNode: '', $init: function () { this.style.visibility = 'hidden'; this._importScript("/" + self.getRoot() + "/appui.js"); }, _importScript: function (sSrc, fOnload) { var oScript = document.createElement("script"); oScript.type = "text\/javascript"; oScript.async = false; //oScript.onerror = loadError; if (fOnload) { oScript.onload = fOnload; } oScript.src = sSrc; //let sideBar = document.querySelector('#sideBar'); this.appendChild(oScript); }, _getAppDef: async function () { let response = await fetch("/" + self.getRoot() + "/appui.js"); let data = await response.text(); //console.log(data) return data }, $update: function () { this.$components = [ { $cell: true, $type: "button", class: "mdc-button mdc-button--compact", $text: "X", onclick: function (e) { document.querySelector('#sideBar').style.visibility = 'hidden'; } }, this._sideBarComponent ] } //$components: [this._sideComponents] } document.querySelector('#' + 'sideBar').$cell(sideBar) let defaultApp = function () { return { $cell: true, $type: "div", class: "propGrid max-width mdc-layout-grid mdc-layout-grid--align-left", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__inner", $components: [ { $cell: true, $type: "div", class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12", $components: [ { $cell: true, $type: "h3", class: "mdc-typography--headline", $text: "Application", } ] } ] } ] } } let drawerCell = { $cell: true, $type: "nav", class: "mdc-temporary-drawer__drawer", $components: [ { $cell: true, $type: "header", class: "mdc-temporary-drawer__header", $components: [ { $cell: true, $type: "div", class: "mdc-temporary-drawer__header-content mdc-theme--primary-bg mdc-theme--text-primary-on-primary", $text: "Home" } ] }, { $cell: true, $type: "nav", class: "mdc-temporary-drawer__content mdc-list-group", $components: [ { $cell: true, $type: "div", class: "mdc-list", $components: [ { $cell: true, $type: "a", class: "mdc-list-item", $href: "#", onclick: function (e) { let sideBar = document.querySelector('#sideBar'); try { sideBar._sideBarComponent = createApp.call(self); } catch (e) { sideBar._sideBarComponent = defaultApp(); } drawer.open = !drawer.open document.querySelector('#sideBar').style.visibility = 'visible'; }, $components: [{ $type: "i", class: "material-icons mdc-list-item__start-detail", 'aria-hidden': "true", $text: "play_arrow" }, { $text: "App" }] }, { $cell: true, $type: "a", class: "mdc-list-item", $href: "#", onclick: function (e) { let sideBar = document.querySelector('#sideBar'); sideBar._sideBarComponent = viewSceneProps; let currentNode = document.querySelector('#sideBar')._sideCurrentNode; currentNode == '' ? document.querySelector('#sideBar')._sideCurrentNode = (vwf_view.kernel.find("", "/")[0]) : document.querySelector('#sideBar')._sideCurrentNode = currentNode; document.querySelector('#sideBar').style.visibility = 'visible'; drawer.open = !drawer.open // let currentNode = document.querySelector('#currentNode')._currentNode; // currentNode == '' ? document.querySelector('#currentNode')._setNode(vwf_view.kernel.find("", "/")[0]) : // document.querySelector('#currentNode')._setNode(currentNode); }, $components: [{ $cell: true, $type: "i", class: "material-icons mdc-list-item__start-detail", $text: "description" }, { $text: "Scene" } ] }, { $cell: true, $type: "a", class: "mdc-list-item", $href: "#", onclick: function (e) { // var currentNode = document.querySelector('#currentNode')._currentNode; // if (currentNode == '') { // currentNode = vwf_view.kernel.find("", "/")[0]; // } document.querySelector('#liveCodeEditor')._setNode(vwf_view.kernel.find("", "/")[0]); //createAceEditor(self, currentNode); document.querySelector('#codeEditorWindow').style.visibility = 'visible'; }, $components: [{ $type: "i", class: "material-icons mdc-list-item__start-detail", 'aria-hidden': "true", $text: "code" }, { $text: "Code editor" }] }, { $cell: true, $type: "a", class: "mdc-list-item", $href: "#", onclick: function (e) { //self.currentNodeID = m.ID; // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]); // document.querySelector('#clientsWindow').style.visibility = 'visible'; let sideBar = document.querySelector('#sideBar'); sideBar._sideBarComponent = avatarSettings; drawer.open = !drawer.open document.querySelector('#sideBar').style.visibility = 'visible'; }, $components: [{ $type: "i", class: "material-icons mdc-list-item__start-detail", 'aria-hidden': "true", $text: "account_circle" }, { $text: "My Avatar" }] }, { $cell: true, $type: "a", class: "mdc-list-item", $href: "#", onclick: function (e) { //self.currentNodeID = m.ID; // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]); let sideBar = document.querySelector('#sideBar'); sideBar._sideBarComponent = viewSettings; drawer.open = !drawer.open document.querySelector('#sideBar').style.visibility = 'visible'; }, $components: [{ $type: "i", class: "material-icons mdc-list-item__start-detail", 'aria-hidden': "true", $text: "settings" }, { $text: "Settings" }] }, { $cell: true, $type: "a", class: "mdc-list-item", $href: "#", onclick: function (e) { //self.currentNodeID = m.ID; // document.querySelector('#clientsList')._setClientNodes(self.nodes["http://vwf.example.com/clients.vwf"]); let sideBar = document.querySelector('#sideBar'); sideBar._sideBarComponent = loadSaveSettings; if (document.querySelector('#loadSaveSettings')) { document.querySelector('#loadSaveSettings')._getStates(); } //sideBar._sideBarComponent._getStates(); drawer.open = !drawer.open document.querySelector('#sideBar').style.visibility = 'visible'; }, $components: [{ $type: "i", class: "material-icons mdc-list-item__start-detail", 'aria-hidden': "true", $text: "save" }, { $text: "Load/Save" }] } ] }, widgets.divider, widgets.headerH3("h3", "Users online", "userList mdc-list-group__subheader"), clientListCell, widgets.divider, widgets.headerH3("h3", "WebRTC", "userList mdc-list-group__subheader"), webrtcGUI ] } // { // $cell: true, // $type: "div", // class: "mdc-persistent-drawer__toolbar-spacer", // }, // { // $cell: true, // $type: "div", // class: "mdc-list-group", // $components: [{ // $cell: true, // $type: "nav", // class: "mdc-list", // $components: [ // ] // }] // } ] }; //
// // //
document.querySelector("#drawer").$cell({ $cell: true, $type: "aside", class: "mdc-temporary-drawer", $components: [drawerCell] } ); let toolbar = { $cell: true, $type: "div", class: "mdc-toolbar__row", $components: [{ $type: "section", class: "mdc-toolbar__section mdc-toolbar__section--align-start", $components: [ { $type: "button", class: "demo-menu material-icons mdc-toolbar__icon--menu", $text: "menu" }, { $type: "span", class: "mdc-toolbar__title catalog-title", $text: "LiveCoding.space" } ] }] }; document.querySelector("#toolbar").$cell({ $cell: true, $type: "div", class: "mdc-toolbar mdc-toolbar--fixed", $components: [toolbar] } ); // let drawer = new mdc.drawer.MDCTemporaryDrawer(document.querySelector('.mdc-temporary-drawer')); // document.querySelector('.menu').addEventListener('click', () => drawer.open = true); var drawerEl = document.querySelector('.mdc-temporary-drawer'); var MDCTemporaryDrawer = mdc.drawer.MDCTemporaryDrawer; var drawer = new MDCTemporaryDrawer(drawerEl); document.querySelector('.demo-menu').addEventListener('click', function () { //self.currentNodeID = (self.currentNodeID == '') ? (vwf_view.kernel.find("", "/")[0]) : self.currentNodeID; // let currentNode = document.querySelector('#currentNode')._currentNode; // currentNode == '' ? document.querySelector('#currentNode')._setNode(vwf_view.kernel.find("", "/")[0]) : // document.querySelector('#currentNode')._setNode(currentNode); //document.querySelector('#currentNode')._setNode(self.currentNodeID); drawer.open = !drawer.open; }); drawerEl.addEventListener('MDCTemporaryDrawer:open', function () { //console.log('Received MDCPersistentDrawer:open'); }); drawerEl.addEventListener('MDCTemporaryDrawer:close', function () { //console.log('Received MDCPersistentDrawer:close'); }); //============== }, createdNode: function (nodeID, childID, childExtendsID, childImplementsIDs, childSource, childType, childIndex, childName, callback /* ( ready ) */) { var nodeIDAttribute = $.encoder.encodeForHTMLAttribute("id", nodeID, true); var childIDAttribute = $.encoder.encodeForHTMLAttribute("id", childID, true); var childIDAlpha = $.encoder.encodeForAlphaNumeric(childID); var kernel = this.kernel; var self = this; var parent = this.nodes[nodeID]; var node = this.nodes[childID] = { children: [], properties: [], events: {}, methods: {}, parent: parent, parentID: nodeID, ID: childID, extendsID: childExtendsID, implementsIDs: childImplementsIDs, source: childSource, name: childName, }; if (parent) { parent.children.push(node); } if (childID == vwf_view.kernel.find("", "/")[0] && childExtendsID && this.kernel.test(childExtendsID, "self::element(*,'http://vwf.example.com/aframe/ascene.vwf')", childExtendsID)) { this.scenes[childID] = node; } let nodeCell = document.querySelector("#currentNode"); if (nodeCell !== null) { if (nodeCell._currentNode === nodeID) { nodeCell._getChildNodes(); } } if (nodeID === this.kernel.application()) { // document.querySelector('a-scene').classList.add("mdc-toolbar-fixed-adjust"); document.querySelector('body').classList.add("editor-body"); } }, createdProperty: function (nodeID, propertyName, propertyValue) { return this.initializedProperty(nodeID, propertyName, propertyValue); }, initializedProperty: function (nodeID, propertyName, propertyValue) { var node = this.nodes[nodeID]; if (!node) return; // TODO: patch until full-graph sync is working; drivers should be able to assume that nodeIDs refer to valid objects var property = node.properties[propertyName] = createProperty.call(this, node, propertyName, propertyValue); node.properties.push(property); }, deletedNode: function (nodeID) { var node = this.nodes[nodeID]; node.parent.children.splice(node.parent.children.indexOf(node), 1); delete this.nodes[nodeID]; let nodeCell = document.querySelector("#currentNode"); if (nodeCell) { if (nodeCell._currentNode !== "") { if (nodeCell._currentNode !== nodeID) { //&& (this.nodes[nodeID] !== undefined) nodeCell._getChildNodes(); } else { nodeCell._setNode(vwf_view.kernel.find("", "/")[0]); nodeCell._getChildNodes(); } } } }, //addedChild: [ /* nodeID, childID, childName */ ], //removedChild: [ /* nodeID, childID */ ], satProperty: function (nodeID, propertyName, propertyValue) { var node = this.nodes[nodeID]; if (!node) return; // TODO: patch until full-graph sync is working; drivers should be able to assume that nodeIDs refer to valid objects // It is possible for a property to have satProperty called for it without ever getting an // initializedProperty (if that property delegated to itself or another on replication) // Catch that case here and create the property if (!node.properties[propertyName]) { var property = node.properties[propertyName] = createProperty.call(this, node, propertyName, propertyValue); node.properties.push(property); } try { propertyValue = utility.transform(propertyValue, utility.transforms.transit); node.properties[propertyName].value = JSON.stringify(propertyValue); node.properties[propertyName].rawValue = propertyValue; } catch (e) { this.logger.warnx("satProperty", nodeID, propertyName, propertyValue, "stringify error:", e.message); node.properties[propertyName].value = propertyValue; } let nodeCell = document.querySelector('#currentNode'); if (nodeCell !== null) { if (nodeCell._currentNode == nodeID && propertyName == 'edit') { console.log('EDIT !!!') } } let propCell = document.querySelector("#currentNode #prop-" + propertyName); if (propCell !== null) { if (propCell._currentNode == nodeID) { propCell.value = node.properties[propertyName].getValue(); } } }, //gotProperty: [ /* nodeID, propertyName, propertyValue */ ], gotProperty: function (nodeID, propertyName, propertyValue) { var node = this.nodes[nodeID]; if (!node) return; // TODO: patch until full-graph sync is working; drivers should be able to assume that nodeIDs refer to valid objects let nodeCell = document.querySelector('#currentNode'); if (nodeCell !== null) { if (nodeCell._currentNode == nodeID && propertyName == 'edit') { let editCheckBox = document.querySelector("#currentNode #editnode"); if (editCheckBox) { if (propertyValue) { editCheckBox.setAttribute('checked', ''); } else { let checkAttr = editCheckBox.getAttribute('checked'); if (checkAttr) editCheckBox.removeAttribute('checked'); } } console.log('EDIT !!! is ' + propertyValue) } } }, createdMethod: function (nodeID, methodName, methodParameters, methodBody) { var node = this.nodes[nodeID]; if (node) { node.methods[methodName] = methodParameters; } }, //calledMethod: function( nodeID, methodName, methodParameters, methodValue ) { //}, createdEvent: function (nodeID, eventName, eventParameters) { var node = this.nodes[nodeID]; if (node) { node.events[eventName] = eventParameters; } }, firedEvent: function (nodeID, eventName, eventParameters) { }, executed: function (nodeID, scriptText, scriptType) { // var nodeScript = { // text: scriptText, // type: scriptType, // }; // if ( !this.allScripts[ nodeID ] ) { // var nodeScripts = new Array(); // nodeScripts.push(nodeScript); // this.allScripts[ nodeID ] = nodeScripts; // } // else { // this.allScripts[ nodeID ].push(nodeScript); // } }, //ticked: [ /* time */ ], }); function createCellWindow(elementID, cellNode, title) { document.querySelector('#' + elementID).$cell({ $cell: true, $type: "div", id: elementID, class: 'draggable', $init: function () { // let draggie = new Draggabilly('.draggable', { // handle: '.handle', // containment: true // }); // get all draggie elements var draggableElems = document.querySelectorAll('.draggable'); // array of Draggabillies var draggies = [] // init Draggabillies for (var i = 0, len = draggableElems.length; i < len; i++) { var draggableElem = draggableElems[i]; var draggie = new Draggabilly(draggableElem, { handle: '.handle', containment: true }); draggies.push(draggie); } this.style.visibility = 'hidden'; }, $components: [ { $cell: true, $type: "div", class: "handle", $components: [ { $cell: true, $type: "button", class: "mdc-button mdc-button--compact", $text: "X", onclick: function (e) { //self.currentNodeID = m.ID; document.querySelector('#' + elementID).style.visibility = 'hidden'; } }, { $cell: true, $type: "span", class: "mdc-typography--button", $text: title } ] }, cellNode, { $cell: true, $type: "div", class: "handle", style: "height: 10px; width: inherit;", //$text: "sdfsdf" } // { $text: "23423"} ] } ); } // -- getChildByName -------------------------------------------------------------------- function getChildByName(node, childName) { var childNode = undefined; for (var i = 0; i < node.children.length && childNode === undefined; i++) { if (node.children[i].name == childName) { childNode = node.children[i]; } } return childNode; }; // -- viewScript ------------------------------------------------------------------------ function createAceEditor(view, nodeID, elID) { var editor = view.ace.edit(elID); editor.setTheme("ace/theme/monokai"); editor.setFontSize(16); editor.getSession().setMode("ace/mode/javascript"); editor.commands.addCommand({ name: "doit", bindKey: { win: "Ctrl-e", mac: "Command-e" }, exec: function () { codeEditorDoit(editor, nodeID); } }); editor.commands.addCommand({ name: "printit", bindKey: { win: "Ctrl-b", mac: "Command-b" }, exec: function () { codeEditorPrintit(editor, nodeID); } }); return editor; } function getPrototypes(kernel, extendsID) { var prototypes = []; var id = extendsID; while (id !== undefined) { prototypes.push(id); id = kernel.prototype(id); } return prototypes; } function getPrototypes(kernel, extendsID) { var prototypes = []; var id = extendsID; while (id !== undefined) { prototypes.push(id); id = kernel.prototype(id); } return prototypes; } function createProperty(node, propertyName, propertyValue) { var property = { name: propertyName, rawValue: propertyValue, value: undefined, getValue: function () { var propertyValue; if (this.value == undefined) { try { propertyValue = utility.transform(this.rawValue, utility.transforms.transit); this.value = JSON.stringify(propertyValue); } catch (e) { this.logger.warnx("createdProperty", nodeID, this.propertyName, this.rawValue, "stringify error:", e.message); this.value = this.rawValue; } } return this.value; } }; return property; } function getProperties(kernel, extendsID) { var pTypes = getPrototypes(kernel, extendsID); var pProperties = {}; if (pTypes) { for (var i = 0; i < pTypes.length; i++) { var nd = this.nodes[pTypes[i]]; if (nd && nd.properties) { for (var key in nd.properties) { pProperties[key] = { "prop": nd.properties[key], "prototype": pTypes[i] }; } } } } return pProperties; } function getChildren(kernel, extendsID) { var pTypes = getPrototypes(kernel, extendsID); var pChildren = {}; if (pTypes) { for (var i = 0; i < pTypes.length; i++) { var nd = this.nodes[pTypes[i]]; if (nd && nd.children) { for (var key in nd.children) { pChildren[key] = nd.children[key]; } } } } return pChildren; } function getEvents(kernel, extendsID) { var pTypes = getPrototypes(kernel, extendsID); var events = {}; if (pTypes) { for (var i = 0; i < pTypes.length; i++) { var nd = this.nodes[pTypes[i]]; if (nd && nd.events) { for (var key in nd.events) { events[key] = nd.events[key]; } } } } return events; } function getMethods(kernel, extendsID) { var pTypes = getPrototypes(kernel, extendsID); var methods = {}; if (pTypes) { for (var i = 0; i < pTypes.length; i++) { var nd = this.nodes[pTypes[i]]; if (nd && nd.methods) { for (var key in nd.methods) { methods[key] = nd.methods[key]; } } } } return methods; } // -- Show Code Editor tab function codeEditorDoit(editor, nodeID) { var selectedText = editor.getSession().doc.getTextRange(editor.selection.getRange()); if (selectedText == "") { var currline = editor.getSelectionRange().start.row; var selectedText = editor.session.getLine(currline); } //console.log(selectedText); //var sceneID = self.kernel.application(); vwf_view.kernel.execute(nodeID, selectedText); } function codeEditorPrintit(editor, nodeID) { var selectedText = editor.getSession().doc.getTextRange(editor.selection.getRange()); if (selectedText == "") { var currline = editor.getSelectionRange().start.row; var selectedText = editor.session.getLine(currline); } //console.log(selectedText); //var sceneID = self.kernel.application(); let scriptText = 'console.log(' + selectedText + ');' self.kernel.execute(nodeID, scriptText); } function saveStateAsFile(filename) // invoke with the view as "this" { this.logger.info("Saving: " + filename); var clients = this.nodes["http://vwf.example.com/clients.vwf"]; if (supportAjaxUploadWithProgress.call(this)) { var xhr = new XMLHttpRequest(); // Save State Information var state = vwf.getState(); state.nodes[0].children = {}; var timestamp = state["queue"].time; timestamp = Math.round(timestamp * 1000); var objectIsTypedArray = function (candidate) { var typedArrayTypes = [ Int8Array, Uint8Array, // Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array ]; var isTypedArray = false; if (typeof candidate == "object" && candidate != null) { typedArrayTypes.forEach(function (typedArrayType) { isTypedArray = isTypedArray || candidate instanceof typedArrayType; }); } return isTypedArray; }; var transitTransformation = function (object) { return objectIsTypedArray(object) ? Array.prototype.slice.call(object) : object; }; var json = JSON.stringify( require("vwf/utility").transform( state, transitTransformation ) ); json = $.encoder.encodeForURL(json); var path = window.location.pathname; var pathSplit = path.split('/'); if (pathSplit[0] == "") { pathSplit.shift(); } if (pathSplit[pathSplit.length - 1] == "") { pathSplit.pop(); } var inst = undefined; var instIndex = pathSplit.length - 1; if (pathSplit.length > 2) { if (pathSplit[pathSplit.length - 2] == "load") { instIndex = pathSplit.length - 3; } } if (pathSplit.length > 3) { if (pathSplit[pathSplit.length - 3] == "load") { instIndex = pathSplit.length - 4; } } inst = pathSplit[instIndex]; var root = ""; for (var i = 0; i < instIndex; i++) { if (root != "") { root = root + "/"; } root = root + pathSplit[i]; } if (filename == '') filename = inst; if (root.indexOf('.vwf') != -1) root = root.substring(0, root.lastIndexOf('/')); xhr.open("POST", "/" + root + "/save/" + filename, true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("root=" + root + "/" + filename + "&filename=saveState&inst=" + inst + "×tamp=" + timestamp + "&extension=.vwf.json" + "&jsonState=" + json); // Save Config Information var config = { "info": {}, "model": {}, "view": {} }; // Save browser title config["info"]["title"] = document.title//$('title').html(); // Save model drivers Object.keys(vwf_view.kernel.kernel.models).forEach(function (modelDriver) { if (modelDriver.indexOf('vwf/model/') != -1) config["model"][modelDriver] = ""; }); // If neither glge or threejs model drivers are defined, specify nodriver if (config["model"]["vwf/model/glge"] === undefined && config["model"]["vwf/model/threejs"] === undefined) config["model"]["nodriver"] = ""; // Save view drivers and associated parameters, if any Object.keys(vwf_view.kernel.kernel.views).forEach(function (viewDriver) { if (viewDriver.indexOf('vwf/view/') != -1) { if (vwf_view.kernel.kernel.views[viewDriver].parameters) { config["view"][viewDriver] = vwf_view.kernel.kernel.views[viewDriver].parameters; } else config["view"][viewDriver] = ""; } }); var jsonConfig = $.encoder.encodeForURL(JSON.stringify(config)); // Save config file to server var xhrConfig = new XMLHttpRequest(); xhrConfig.open("POST", "/" + root + "/save/" + filename, true); xhrConfig.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhrConfig.send("root=" + root + "/" + filename + "&filename=saveState&inst=" + inst + "×tamp=" + timestamp + "&extension=.vwf.config.json" + "&jsonState=" + jsonConfig); } else { console.error("Unable to save state."); } } // -- LoadSavedState -------------------------------------------------------------------------- function loadSavedState(filename, applicationpath, revision) { this.logger.info("Loading: " + filename); // Redirect until setState ID conflict is resolved var path = window.location.pathname; var inst = path.substring(path.length - 17, path.length - 1); var pathSplit = path.split('/'); if (pathSplit[0] == "") { pathSplit.shift(); } if (pathSplit[pathSplit.length - 1] == "") { pathSplit.pop(); } var inst = undefined; var instIndex = pathSplit.length - 1; if (pathSplit.length > 2) { if (pathSplit[pathSplit.length - 2] == "load") { instIndex = pathSplit.length - 3; } } if (pathSplit.length > 3) { if (pathSplit[pathSplit.length - 3] == "load") { instIndex = pathSplit.length - 4; } } inst = pathSplit[instIndex]; if (revision) { window.location.pathname = applicationpath + "/" + inst + '/load/' + filename + '/' + revision + '/'; } else { window.location.pathname = applicationpath + "/" + inst + '/load/' + filename + '/'; } // $.get(filename,function(data,status){ // vwf.setState(data); // }); } // -- SupportAjax ----------------------------------------------------------------------------- function supportAjaxUploadWithProgress() { return supportAjaxUploadProgressEvents(); function supportAjaxUploadProgressEvents() { var xhr = new XMLHttpRequest(); return !!(xhr && ('upload' in xhr) && ('onprogress' in xhr.upload)); } } });