forked from FabricLabs/fabric
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcircuit-view.js
104 lines (84 loc) · 2.62 KB
/
circuit-view.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
'use strict';
const {
OP_DONE,
OP_SEPARATOR
} = require('../constants');
const Circuit = require('../types/circuit');
const Component = require('@fabric/http/components/component');
const d3 = require('d3');
const d3Graphviz = require('d3-graphviz');
class CircuitView extends Component {
constructor (settings = {}) {
super(settings);
this.d3 = d3;
this.d3Graphviz = d3Graphviz;
this.settings = Object.assign({
title: 'Circuit View',
handle: 'fabric-circuit-view'
});
this.circuit = new Circuit();
this.state = {
status: 'ready'
};
return this;
}
_advanceCircuit (event) {
event.preventDefault();
console.log('advancing circuit:', this, this.circuit.settings.program);
this.circuit = new Circuit(Object.assign({}, this.circuit.settings, {
program: this.circuit.settings.program,
wires: [{
name: 'start',
from: 'init',
to: this.circuit.settings.program[0]
}].concat(this.circuit.settings.program.map((instruction, i) => {
return {
name: instruction,
from: instruction,
to: this.circuit.settings.program[i + 1] || OP_DONE
};
})).concat([{
name: OP_DONE,
from: OP_DONE,
to: OP_DONE
}])
}));
let transition = d3.transition().delay(100).duration(1000);
d3.select('#circuit-svg').style('width', '100%').style('width', '500px').graphviz().transition(transition).renderDot(this.circuit.dot);
d3.select('#circuit-svg svg').style('width', '100%').style('width', '500px');
}
_loadFromPath () {
let path = document.location.pathname;
let parts = path.split('/')[2];
let wires = parts.split(OP_SEPARATOR).map((instruction, i) => {
return {
name: instruction,
from: instruction,
to: parts.split(OP_SEPARATOR)[i + 1]
};
});
this.circuit = new Circuit({
script: parts,
program: parts.split(OP_SEPARATOR),
wires: wires
});
return this.circuit;
}
async connectedCallback () {
await super.connectedCallback();
window.app.circuit._registerMethod('_advanceCircuit', this._advanceCircuit.bind(this));
let svg = this.querySelector('#circuit-svg');
let circuit = this._loadFromPath();
return this;
}
_getInnerHTML () {
return `<div class="ui segment">
<h3>${this.settings.title}</h3>
<button data-action="_advanceCircuit" class="ui mini right labeled icon button">advance<i class="fast forward icon"></i></button>
<div class="canvas">
<div id="circuit-svg"></div>
</div>
</div>`;
}
}
module.exports = CircuitView;