diff --git a/app.js b/app.js index 158f9dc5..83eb9a9a 100644 --- a/app.js +++ b/app.js @@ -378,6 +378,7 @@ const script = { "kiri/init", "kiri/export", "kiri/tools", + "kiri/frame", "@devices", "@icons" ], diff --git a/src/kiri/frame.js b/src/kiri/frame.js new file mode 100644 index 00000000..cf21cc5d --- /dev/null +++ b/src/kiri/frame.js @@ -0,0 +1,116 @@ +/** Copyright Stewart Allen -- All Rights Reserved */ + +"use strict"; + +(function () { + +// add frame message api listener +window.addEventListener('message', msg => { + const { kiri, moto } = self; + const { api, newWidget } = kiri; + const { conf, event, feature, platform, settings, show } = api; + + if (!feature.frame) return; + + const { origin, source, target, data } = msg; + + if (source.window === target.window) return; + + const send = source.window.postMessage; + + if (data.mode) { + api.mode.set(data.mode.toUpperCase()); + } + + if (data.view) { + api.view.set(VIEWS[data.view.toUpperCase()]); + } + + if (data.function) { + const cb = data.callback ? (output) => { + send({event:`${data.function}.done`, data: output}); + } : undefined; + api.function[data.function.toLowerCase()](cb); + } + + if (data.event) { + event.on(data.event, (evd) => { + send({event: data.event, data: evd}); + }); + } + + if (data.emit) { + event.emit(data.emit, data.message) + } + + if (data.get) switch (data.get) { + case "mode": send({mode: settings.mode()}); break; + case "device": send({device: settings.dev()}); break; + case "process": send({process: settings.proc()}); break; + default: send({all: settings}); break; + + } + + if (data.set) switch (data.set) { + case "features": + Object.assign(feature, data.features); + break; + case "device": + Object.assign(settings.dev(), data.options); + conf.save(); + break; + case "process": + Object.assign(settings.proc(), data.options); + conf.save(); + break; + } + + if (data.parse) { + let bin = data.parse; + let widget; + switch ((data.type || 'stl').toLowerCase()) { + case 'stl': + if (!bin.buffer) bin = new Float32Array(bin).buffer; + new load.STL().parse(bin, vertices => { + platform.add(widget = newWidget().loadVertices(vertices)); + send({event: "parsed", data: [ widget.id ]}); + }); + break; + case 'obj': + // todo + break; + case '3mf': + // todo + break; + case 'svg': + let wid = []; + for (let svg of load.SVG.parse(bin)) { + if (!(svg && svg.length)) continue; + platform.add(widget = newWidget().loadVertices(svg.toFloat32())); + wid.push(widget.id); + } + send({event: "parsed", data: wid}); + break; + } + } + + if (data.load) { + platform.load(data.load, (verts, widget) => { + send({event: "loaded", data: [ widget.id ]}); + }) + }; + + if (data.clear) { + platform.clear(); + } + + if (data.alert) { + show.alert(data.alert, data.time); + } + + if (data.progress >= 0) { + show.progress(data.progress, data.message); + } +}); + +})(); diff --git a/src/kiri/main.js b/src/kiri/main.js index 4f744c70..68560b3d 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -233,85 +233,6 @@ }, 1000); } - // frame message api - WIN.addEventListener('message', msg => { - if (!feature.frame) return; - let { origin, source, target, data } = msg; - if (source.window === target.window) return; - let send = source.window.postMessage; - if (data.mode) { api.mode.set(data.mode.toUpperCase()) } - if (data.view) { api.view.set(VIEWS[data.view.toUpperCase()]) } - if (data.function) { - let cb = data.callback ? (output) => { - send({event:`${data.function}.done`, data: output}); - } : undefined; - api.function[data.function.toLowerCase()](cb); - } - if (data.event) { - api.event.on(data.event, (evd) => { - send({event: data.event, data: evd}); - }); - } - if (data.emit) api.event.emit(data.emit, data.message) - if (data.get) switch (data.get) { - case "mode": send({mode: settings.mode()}); break; - case "device": send({device: settings.dev()}); break; - case "process": send({process: settings.proc()}); break; - default: send({all: settings}); break; - - } - if (data.set) switch (data.set) { - case "features": - Object.assign(feature, data.features); - break; - case "device": - Object.assign(settings.dev(), data.options); - api.conf.save(); - break; - case "process": - Object.assign(settings.proc(), data.options); - api.conf.save(); - break; - } - if (data.parse) { - let type = (data.type || 'stl').toLowerCase(); - let bin = data.parse; - let widget; - switch (type) { - case 'stl': - if (!bin.buffer) bin = new Float32Array(bin).buffer; - new load.STL().parse(bin, vertices => { - platform.add(widget = newWidget().loadVertices(vertices)); - send({event: "parsed", data: [ widget.id ]}); - }); - break; - case 'obj': - // todo - break; - case '3mf': - // todo - break; - case 'svg': - let wid = []; - for (let svg of load.SVG.parse(bin)) { - if (!(svg && svg.length)) continue; - platform.add(widget = newWidget().loadVertices(svg.toFloat32())); - wid.push(widget.id); - } - send({event: "parsed", data: wid}); - break; - } - } - if (data.load) { - api.platform.load(data.load, (verts, widget) => { - send({event: "loaded", data: [ widget.id ]}); - }) - }; - if (data.clear) platform.clear(); - if (data.alert) alert2(data.alert, data.time); - if (data.progress >= 0) setProgress(data.progress, data.message); - }); - // update version and init count let inits = parseInt(SDB.getItem('kiri-init') || stats.get('init') || 0) + 1; SDB.setItem('kiri-init', inits);