60 lines
1.5 KiB
JavaScript
60 lines
1.5 KiB
JavaScript
|
|
import * as nodes from '../src/nodes';
|
|
import defaultValues from './defaultGraph';
|
|
|
|
|
|
export const createNode = ({name, options, id}) => {
|
|
try {
|
|
const node = new nodes[name](options);
|
|
node.deserialize({id, options});
|
|
return node;
|
|
} catch (err) {
|
|
console.error('Failed to create node', name, err)
|
|
}
|
|
}
|
|
|
|
export const createNodes = (nodes) => {
|
|
nodes = nodes.map(({node, x, y}) => {
|
|
const nodeInstance = createNode(node);
|
|
return ({
|
|
node: nodeInstance,
|
|
x, y,
|
|
connect(outputs) {
|
|
try {
|
|
nodeInstance.reconnect(node, outputs);
|
|
} catch(err) {
|
|
console.error('Can\'t recoonect', nodeInstance, err);
|
|
}
|
|
}
|
|
});
|
|
}).filter(({node}) => node);
|
|
|
|
const outputsById = nodes
|
|
.map(({node}) => Object.values(node.out.__values))
|
|
.reduce((acc, nxt) => acc.concat(nxt), [])
|
|
.reduce((acc, nxt) => {
|
|
acc[nxt.id] = nxt;
|
|
return acc;
|
|
}, {});
|
|
|
|
return nodes.map(({node, x, y, connect}) => {
|
|
connect(outputsById);
|
|
return {node,x,y};
|
|
})
|
|
}
|
|
|
|
export const serializeNodes = (nodes) =>
|
|
nodes.map(({node, x, y}) => ({
|
|
node: node.serialize(),
|
|
x, y,
|
|
}));
|
|
|
|
|
|
export const load = (name) => {
|
|
try {
|
|
return createNodes(JSON.parse(localStorage.getItem(`IFP_GRAPH_${name}`)) || defaultValues);
|
|
} catch (err) {
|
|
return createNodes(defaultValues);
|
|
}
|
|
};
|
|
export const save = (name, graph) => localStorage.setItem(`IFP_GRAPH_${name}`, JSON.stringify(serializeNodes(graph))); |