209 lines
5.1 KiB
JavaScript
209 lines
5.1 KiB
JavaScript
/* eslint-disable */
|
|
import editorStyle from "../util/defaultStyle";
|
|
import Anchor from '../item/anchor';
|
|
const dashArray = [
|
|
[0,1],
|
|
[0,2],
|
|
[1,2],
|
|
[0,1,1,2],
|
|
[0,2,1,2],
|
|
[1,2,1,2],
|
|
[2,2,1,2],
|
|
[3,2,1,2],
|
|
[4,2,1,2]
|
|
];
|
|
const interval = 9;
|
|
const lineDash = [4, 2, 1, 2];
|
|
|
|
const nodeDefinition = {
|
|
options:{
|
|
icon: null,
|
|
iconStyle: {
|
|
width: 14,
|
|
height: 14,
|
|
left: 0,
|
|
top: 0,
|
|
},
|
|
style:{
|
|
fill: '#f9f9f9',
|
|
stroke:'#bbb',
|
|
cursor: 'default',
|
|
},
|
|
stateStyles: {
|
|
selected: {
|
|
fill: '#eee',
|
|
},
|
|
hover: {
|
|
cursor: editorStyle.cursor.hoverNode,
|
|
}
|
|
}
|
|
},
|
|
drawAnchor(group) {
|
|
const bbox = group.get('children')[0].getBBox();
|
|
this.getAnchorPoints().forEach((p, i) => {
|
|
const anchorContainer = group.addGroup();
|
|
const anchor = new Anchor({
|
|
group: anchorContainer,
|
|
index: i,
|
|
model:{
|
|
style:{
|
|
x: bbox.minX + bbox.width * p[0],
|
|
y: bbox.minY + bbox.height * p[1]
|
|
}
|
|
}
|
|
});
|
|
group.anchorShapes.push(anchorContainer);
|
|
});
|
|
},
|
|
initAnchor(group){
|
|
group.anchorShapes = [];
|
|
group.showAnchor = () => {
|
|
this.drawAnchor(group);
|
|
};
|
|
group.getAllAnchors = () => {
|
|
return group.anchorShapes.map(c => {
|
|
c.filter(a => a.isAnchor)
|
|
})
|
|
};
|
|
group.getAnchor = (i) => {
|
|
return group.anchorShapes.filter(a => a.get('index') === i)
|
|
};
|
|
group.clearAnchor = () => {
|
|
group.anchorShapes && group.anchorShapes.forEach(a => a.remove());
|
|
group.anchorShapes = [];
|
|
};
|
|
group.clearHotpotActived = () => {
|
|
group.anchorShapes && group.anchorShapes.forEach(a => {
|
|
if (a.isAnchor)
|
|
a.setHotspotActived(false);
|
|
});
|
|
};
|
|
},
|
|
drawShape(cfg, group) {
|
|
const shapeType = this.shapeType;
|
|
let style = this.getShapeStyle(cfg);
|
|
const shape = group.addShape(shapeType, {
|
|
attrs: {
|
|
...style,
|
|
}
|
|
});
|
|
this.drawIcon(cfg,group);
|
|
this.initAnchor(group);
|
|
return shape;
|
|
},
|
|
drawIcon(cfg,group){
|
|
let style = this.getShapeStyle(cfg);
|
|
if(this.options.icon){
|
|
let attrs = {
|
|
x: style.x + this.options.iconStyle.left,
|
|
y: style.y + this.options.iconStyle.top,
|
|
width: this.options.iconStyle.width,
|
|
height: this.options.iconStyle.height,
|
|
};
|
|
if(this.shapeType === 'circle'){
|
|
attrs = {
|
|
x: style.x- style.r + this.options.iconStyle.left,
|
|
y: style.y - style.r + this.options.iconStyle.top,
|
|
width: this.options.iconStyle.width,
|
|
height: this.options.iconStyle.height,
|
|
}
|
|
}else if(this.shapeType === 'path'){
|
|
attrs = {
|
|
x: this.options.iconStyle.left,
|
|
y: this.options.iconStyle.top,
|
|
width: this.options.iconStyle.width,
|
|
height: this.options.iconStyle.height,
|
|
}
|
|
}
|
|
group.icon = group.addShape('image', {
|
|
attrs: {
|
|
img:this.options.icon,
|
|
...attrs,
|
|
},
|
|
draggable: true,
|
|
});
|
|
if(cfg.hideIcon){
|
|
group.icon.hide();
|
|
}
|
|
}
|
|
},
|
|
setState(name, value, item) {
|
|
const group = item.getContainer();
|
|
if (name === 'show-anchor') {
|
|
if (value) {
|
|
group.showAnchor();
|
|
} else {
|
|
group.clearAnchor();
|
|
}
|
|
} else if (name === 'selected') {
|
|
const rect = group.getChildByIndex(0);
|
|
if (value) {
|
|
rect.attr('fill', this.options.stateStyles.selected.fill);
|
|
} else {
|
|
rect.attr('fill', this.options.style.fill);
|
|
}
|
|
} else if (name === 'hover') {
|
|
const rect = group.getChildByIndex(0);
|
|
const text = group.getChildByIndex(1);
|
|
if (value) {
|
|
rect.attr('cursor', this.options.stateStyles.hover.cursor);
|
|
if(text)
|
|
text.attr('cursor', this.options.stateStyles.hover.cursor);
|
|
} else {
|
|
rect.attr('cursor', this.options.style.cursor);
|
|
if(text)
|
|
text.attr('cursor', this.options.style.cursor);
|
|
}
|
|
}
|
|
this.setCustomState(name, value, item);
|
|
},
|
|
setCustomState(name, value, item){
|
|
|
|
},
|
|
getAnchorPoints() {
|
|
return [
|
|
[0.5, 0], // top
|
|
[1, 0.5], // right
|
|
[0.5, 1], // bottom
|
|
[0, 0.5], // left
|
|
]
|
|
},
|
|
runAnimate(cfg, group){
|
|
if(cfg.active){
|
|
let totalArray = [];
|
|
let index = 0;
|
|
const shape = group.getFirst();
|
|
shape.animate(
|
|
(ratio)=>{
|
|
for (let i = 0; i < 9; i += interval) {
|
|
totalArray = totalArray.concat(lineDash);
|
|
}
|
|
const cfg = {
|
|
lineDash: dashArray[index].concat(totalArray)
|
|
};
|
|
index = (index + 1) % interval;
|
|
return cfg;
|
|
},
|
|
{
|
|
repeat: true,
|
|
duration: 5000
|
|
});
|
|
}
|
|
},
|
|
afterDraw(cfg, group) {
|
|
this.runAnimate(cfg,group);
|
|
},
|
|
afterUpdate(cfg, group) {
|
|
const icon = group.get('group').icon;
|
|
if(cfg.hideIcon && icon && icon.get('visible')){
|
|
icon.hide();
|
|
}else if(!cfg.hideIcon && icon && !icon.get('visible')){
|
|
icon.show();
|
|
}
|
|
},
|
|
};
|
|
|
|
export default function(G6) {
|
|
G6.registerNode('base-node', nodeDefinition, 'single-node');
|
|
}
|