114 lines
2.2 KiB
JavaScript
114 lines
2.2 KiB
JavaScript
define(['svg/SVGUtilities'], (svg) => {
|
|
'use strict';
|
|
|
|
function deepCopy(o) {
|
|
if(typeof o !== 'object' || !o) {
|
|
return o;
|
|
}
|
|
const r = {};
|
|
for(let k in o) {
|
|
if(o.hasOwnProperty(k)) {
|
|
r[k] = deepCopy(o[k]);
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
class BaseTheme {
|
|
constructor({name, settings, blocks, notes}) {
|
|
this.name = name;
|
|
this.blocks = deepCopy(blocks);
|
|
this.notes = deepCopy(notes);
|
|
Object.assign(this, deepCopy(settings));
|
|
}
|
|
|
|
reset() {
|
|
}
|
|
|
|
addDefs() {
|
|
}
|
|
|
|
getBlock(type) {
|
|
return this.blocks[type] || this.blocks[''];
|
|
}
|
|
|
|
getNote(type) {
|
|
return this.notes[type] || this.notes[''];
|
|
}
|
|
|
|
renderAgentLine({x, y0, y1, width, className}) {
|
|
if(width > 0) {
|
|
return svg.make('rect', Object.assign({
|
|
'x': x - width / 2,
|
|
'y': y0,
|
|
'width': width,
|
|
'height': y1 - y0,
|
|
'class': className,
|
|
}, this.agentLineAttrs));
|
|
} else {
|
|
return svg.make('line', Object.assign({
|
|
'x1': x,
|
|
'y1': y0,
|
|
'x2': x,
|
|
'y2': y1,
|
|
'class': className,
|
|
}, this.agentLineAttrs));
|
|
}
|
|
}
|
|
}
|
|
|
|
BaseTheme.renderHorizArrowHead = (attrs, {x, y, dx, dy}) => {
|
|
return svg.make(
|
|
attrs.fill === 'none' ? 'polyline' : 'polygon',
|
|
Object.assign({
|
|
'points': (
|
|
(x + dx) + ' ' + (y - dy) + ' ' +
|
|
x + ' ' + y + ' ' +
|
|
(x + dx) + ' ' + (y + dy)
|
|
),
|
|
}, attrs)
|
|
);
|
|
};
|
|
|
|
BaseTheme.renderTag = (attrs, {x, y, width, height}) => {
|
|
const {rx, ry} = attrs;
|
|
const x2 = x + width;
|
|
const y2 = y + height;
|
|
|
|
const line = (
|
|
'M' + x2 + ' ' + y +
|
|
'L' + x2 + ' ' + (y2 - ry) +
|
|
'L' + (x2 - rx) + ' ' + y2 +
|
|
'L' + x + ' ' + y2
|
|
);
|
|
|
|
const g = svg.make('g');
|
|
if(attrs.fill !== 'none') {
|
|
g.appendChild(svg.make('path', Object.assign({
|
|
'd': line + 'L' + x + ' ' + y,
|
|
}, attrs, {'stroke': 'none'})));
|
|
}
|
|
|
|
if(attrs.stroke !== 'none') {
|
|
g.appendChild(svg.make('path', Object.assign({
|
|
'd': line,
|
|
}, attrs, {'fill': 'none'})));
|
|
}
|
|
|
|
return g;
|
|
};
|
|
|
|
BaseTheme.renderCross = (attrs, {x, y, radius}) => {
|
|
return svg.make('path', Object.assign({
|
|
'd': (
|
|
'M' + (x - radius) + ' ' + (y - radius) +
|
|
'l' + (radius * 2) + ' ' + (radius * 2) +
|
|
'm0 ' + (-radius * 2) +
|
|
'l' + (-radius * 2) + ' ' + (radius * 2)
|
|
),
|
|
}, attrs));
|
|
};
|
|
|
|
return BaseTheme;
|
|
});
|