extract frame window listener from main

This commit is contained in:
Stewart Allen 2022-02-19 13:27:16 -05:00
commit 6078dbb479
3 changed files with 117 additions and 79 deletions

1
app.js
View file

@ -378,6 +378,7 @@ const script = {
"kiri/init",
"kiri/export",
"kiri/tools",
"kiri/frame",
"@devices",
"@icons"
],

116
src/kiri/frame.js Normal file
View file

@ -0,0 +1,116 @@
/** Copyright Stewart Allen <sa@grid.space> -- 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);
}
});
})();

View file

@ -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);