add frame message objec wrapper / helper that looks like engine api

This commit is contained in:
Stewart Allen 2021-01-04 20:36:35 -05:00
commit 5fe11ef05a
4 changed files with 118 additions and 18 deletions

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

@ -0,0 +1,80 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
(function() {
let KIRI = self.kiri = self.kiri || {};
let frame, cwin, onevent = {};
function $(id) { return document.getElementById(id) }
function setFrame(fo) {
frame = fo;
cwin = fo.contentWindow;
}
function send(msg) {
cwin.postMessage(msg);
}
function recv(msg) {
let { origin, source, target, data } = msg;
let efn = onevent[data.event];
if (efn) {
efn(data.data, data.event);
}
API.onmessage(data, msg);
}
let API = KIRI.frame = {
setFrame: (io) => {
let type = typeof(io);
switch (type) {
case 'string': setFrame($(io)); break;
case 'object': setFrame(io); break;
default: throw `invalid frame type ${type}`;
}
window.addEventListener('message', msg => {
let { origin, source, target, data } = msg;
if (source.window === cwin) {
recv(msg);
}
});
},
send: send,
load: (load) => { send({ load }) },
parse: (data) => { send({ parse })},
get: (scope) => { send({ get: scope })},
setMode: (mode) => { send({ mode }) },
setDevice: (device) => { send({ device })},
setProcess: (process) => { send({ process })},
setFeatures: (features) => { send({ features })},
slice: () => { send({ function: "slice" }) },
prepare: () => { send({ function: "prepare" }) },
export: () => { send({ function: "export" }) },
onmessage: () => { },
progress: (progress, message) => { send({ progress, message }) },
alert: (alert, time) => { send({ alert, time }) },
emit: (emit, message) => { send({ emit, message }) },
onevent: (event, fn) => {
onevent[event] = fn;
send({ event });
}
};
})();

View file

@ -405,13 +405,14 @@
});
}
if (data.emit) API.event.emit(data.emit, data.message)
switch (data.get) {
case "all": send({all: settings}); break;
if (data.get) switch (data.get) {
case "mode": send({mode: settings.mode}); break;
case "device": send({device: settings.device}); break;
case "process": send({process: settings.process}); break;
default: send({all: settings}); break;
}
switch (data.set) {
if (data.set) switch (data.set) {
case "features":
Object.assign(feature, data.features);
break;
@ -424,6 +425,14 @@
saveSettings();
break;
}
if (data.parse) {
new moto.STL().parse(data.parse, vertices => {
let widget = newWidget().loadVertices(vertices);
platform.add(widget);
});
}
if (data.load) platformLoad(data.load);
if (data.clear) platform.clear();
if (data.alert) alert2(data.alert, data.time);
if (data.progress >= 0) setProgress(data.progress, data.message);
});