mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Improve wiring for horizontally aligned nodes
This commit is contained in:
parent
2448e137c8
commit
26fc942c79
@ -1033,7 +1033,7 @@ RED.view = (function() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateLinkPath(origX,origY, destX, destY, sc) {
|
function generateLinkPath(origX,origY, destX, destY, sc, hasStatus = false) {
|
||||||
var dy = destY-origY;
|
var dy = destY-origY;
|
||||||
var dx = destX-origX;
|
var dx = destX-origX;
|
||||||
var delta = Math.sqrt(dy*dy+dx*dx);
|
var delta = Math.sqrt(dy*dy+dx*dx);
|
||||||
@ -1050,62 +1050,110 @@ RED.view = (function() {
|
|||||||
} else {
|
} else {
|
||||||
scale = 0.4-0.2*(Math.max(0,(node_width-Math.min(Math.abs(dx),Math.abs(dy)))/node_width));
|
scale = 0.4-0.2*(Math.max(0,(node_width-Math.min(Math.abs(dx),Math.abs(dy)))/node_width));
|
||||||
}
|
}
|
||||||
|
function genCP(cp) {
|
||||||
|
return ` M ${cp[0]-5} ${cp[1]} h 10 M ${cp[0]} ${cp[1]-5} v 10 `
|
||||||
|
}
|
||||||
if (dx*sc > 0) {
|
if (dx*sc > 0) {
|
||||||
return "M "+origX+" "+origY+
|
let cp = [
|
||||||
" C "+(origX+sc*(node_width*scale))+" "+(origY+scaleY*node_height)+" "+
|
[(origX+sc*(node_width*scale)), (origY+scaleY*node_height)],
|
||||||
(destX-sc*(scale)*node_width)+" "+(destY-scaleY*node_height)+" "+
|
[(destX-sc*(scale)*node_width), (destY-scaleY*node_height)]
|
||||||
destX+" "+destY
|
]
|
||||||
|
return `M ${origX} ${origY} C ${cp[0][0]} ${cp[0][1]} ${cp[1][0]} ${cp[1][1]} ${destX} ${destY}`
|
||||||
|
+ ` ${genCP(cp[0])} ${genCP(cp[1])}`
|
||||||
} else {
|
} else {
|
||||||
|
let topX, topY, bottomX, bottomY
|
||||||
|
let cp
|
||||||
|
let midX = Math.floor(destX-dx/2);
|
||||||
|
let midY = Math.floor(destY-dy/2);
|
||||||
|
if (Math.abs(dy) < 10) {
|
||||||
|
bottomY = Math.max(origY, destY) + (hasStatus?35:25)
|
||||||
|
let startCurveHeight = bottomY - origY
|
||||||
|
let endCurveHeight = bottomY - destY
|
||||||
|
cp = [
|
||||||
|
[ origX + sc*15 , origY ],
|
||||||
|
[ origX + sc*25 , origY + 5 ],
|
||||||
|
[ origX + sc*25 , origY + startCurveHeight/2 ],
|
||||||
|
|
||||||
var midX = Math.floor(destX-dx/2);
|
[ origX + sc*25 , origY + startCurveHeight - 5 ],
|
||||||
var midY = Math.floor(destY-dy/2);
|
[ origX + sc*15 , origY + startCurveHeight ],
|
||||||
//
|
[ origX , origY + startCurveHeight ],
|
||||||
if (dy === 0) {
|
|
||||||
midY = destY + node_height;
|
[ destX - sc*15, origY + startCurveHeight ],
|
||||||
}
|
[ destX - sc*25, origY + startCurveHeight - 5 ],
|
||||||
var cp_height = node_height/2;
|
[ destX - sc*25, destY + endCurveHeight/2 ],
|
||||||
var y1 = (destY + midY)/2
|
|
||||||
var topX =origX + sc*node_width*scale;
|
[ destX - sc*25, destY + 5 ],
|
||||||
var topY = dy>0?Math.min(y1 - dy/2 , origY+cp_height):Math.max(y1 - dy/2 , origY-cp_height);
|
[ destX - sc*15, destY ],
|
||||||
var bottomX = destX - sc*node_width*scale;
|
[ destX, destY ],
|
||||||
var bottomY = dy>0?Math.max(y1, destY-cp_height):Math.min(y1, destY+cp_height);
|
]
|
||||||
var x1 = (origX+topX)/2;
|
|
||||||
var scy = dy>0?1:-1;
|
return "M "+origX+" "+origY+
|
||||||
var cp = [
|
" C "+
|
||||||
// Orig -> Top
|
cp[0][0]+" "+cp[0][1]+" "+
|
||||||
[x1,origY],
|
cp[1][0]+" "+cp[1][1]+" "+
|
||||||
[topX,dy>0?Math.max(origY, topY-cp_height):Math.min(origY, topY+cp_height)],
|
cp[2][0]+" "+cp[2][1]+" "+
|
||||||
// Top -> Mid
|
" C " +
|
||||||
// [Mirror previous cp]
|
cp[3][0]+" "+cp[3][1]+" "+
|
||||||
[x1,dy>0?Math.min(midY, topY+cp_height):Math.max(midY, topY-cp_height)],
|
|
||||||
// Mid -> Bottom
|
|
||||||
// [Mirror previous cp]
|
|
||||||
[bottomX,dy>0?Math.max(midY, bottomY-cp_height):Math.min(midY, bottomY+cp_height)],
|
|
||||||
// Bottom -> Dest
|
|
||||||
// [Mirror previous cp]
|
|
||||||
[(destX+bottomX)/2,destY]
|
|
||||||
];
|
|
||||||
if (cp[2][1] === topY+scy*cp_height) {
|
|
||||||
if (Math.abs(dy) < cp_height*10) {
|
|
||||||
cp[1][1] = topY-scy*cp_height/2;
|
|
||||||
cp[3][1] = bottomY-scy*cp_height/2;
|
|
||||||
}
|
|
||||||
cp[2][0] = topX;
|
|
||||||
}
|
|
||||||
return "M "+origX+" "+origY+
|
|
||||||
" C "+
|
|
||||||
cp[0][0]+" "+cp[0][1]+" "+
|
|
||||||
cp[1][0]+" "+cp[1][1]+" "+
|
|
||||||
topX+" "+topY+
|
|
||||||
" S "+
|
|
||||||
cp[2][0]+" "+cp[2][1]+" "+
|
|
||||||
midX+" "+midY+
|
|
||||||
" S "+
|
|
||||||
cp[3][0]+" "+cp[3][1]+" "+
|
|
||||||
bottomX+" "+bottomY+
|
|
||||||
" S "+
|
|
||||||
cp[4][0]+" "+cp[4][1]+" "+
|
cp[4][0]+" "+cp[4][1]+" "+
|
||||||
destX+" "+destY
|
cp[5][0]+" "+cp[5][1]+" "+
|
||||||
|
" h "+dx+
|
||||||
|
" C "+
|
||||||
|
cp[6][0]+" "+cp[6][1]+" "+
|
||||||
|
cp[7][0]+" "+cp[7][1]+" "+
|
||||||
|
cp[8][0]+" "+cp[8][1]+" "+
|
||||||
|
" C " +
|
||||||
|
cp[9][0]+" "+cp[9][1]+" "+
|
||||||
|
cp[10][0]+" "+cp[10][1]+" "+
|
||||||
|
cp[11][0]+" "+cp[11][1]+" "
|
||||||
|
// +genCP(cp[0])+genCP(cp[1])+genCP(cp[2])+genCP(cp[3])+genCP(cp[4])
|
||||||
|
// +genCP(cp[5])+genCP(cp[6])+genCP(cp[7])+genCP(cp[8])+genCP(cp[9])+genCP(cp[10])
|
||||||
|
} else {
|
||||||
|
var cp_height = node_height/2;
|
||||||
|
var y1 = (destY + midY)/2
|
||||||
|
topX = origX + sc*node_width*scale;
|
||||||
|
topY = dy>0?Math.min(y1 - dy/2 , origY+cp_height):Math.max(y1 - dy/2 , origY-cp_height);
|
||||||
|
bottomX = destX - sc*node_width*scale;
|
||||||
|
bottomY = dy>0?Math.max(y1, destY-cp_height):Math.min(y1, destY+cp_height);
|
||||||
|
var x1 = (origX+topX)/2;
|
||||||
|
var scy = dy>0?1:-1;
|
||||||
|
cp = [
|
||||||
|
// Orig -> Top
|
||||||
|
[x1,origY],
|
||||||
|
[topX,dy>0?Math.max(origY, topY-cp_height):Math.min(origY, topY+cp_height)],
|
||||||
|
// Top -> Mid
|
||||||
|
// [Mirror previous cp]
|
||||||
|
[x1,dy>0?Math.min(midY, topY+cp_height):Math.max(midY, topY-cp_height)],
|
||||||
|
// Mid -> Bottom
|
||||||
|
// [Mirror previous cp]
|
||||||
|
[bottomX,dy>0?Math.max(midY, bottomY-cp_height):Math.min(midY, bottomY+cp_height)],
|
||||||
|
// Bottom -> Dest
|
||||||
|
// [Mirror previous cp]
|
||||||
|
[(destX+bottomX)/2,destY]
|
||||||
|
];
|
||||||
|
if (cp[2][1] === topY+scy*cp_height) {
|
||||||
|
if (Math.abs(dy) < cp_height*10) {
|
||||||
|
cp[1][1] = topY-scy*cp_height/2;
|
||||||
|
cp[3][1] = bottomY-scy*cp_height/2;
|
||||||
|
}
|
||||||
|
cp[2][0] = topX;
|
||||||
|
}
|
||||||
|
return "M "+origX+" "+origY+
|
||||||
|
" C "+
|
||||||
|
cp[0][0]+" "+cp[0][1]+" "+
|
||||||
|
cp[1][0]+" "+cp[1][1]+" "+
|
||||||
|
topX+" "+topY+
|
||||||
|
" S "+
|
||||||
|
cp[2][0]+" "+cp[2][1]+" "+
|
||||||
|
midX+" "+midY+
|
||||||
|
" S "+
|
||||||
|
cp[3][0]+" "+cp[3][1]+" "+
|
||||||
|
bottomX+" "+bottomY+
|
||||||
|
" S "+
|
||||||
|
cp[4][0]+" "+cp[4][1]+" "+
|
||||||
|
destX+" "+destY
|
||||||
|
|
||||||
|
// +genCP(cp[0])+genCP(cp[1])+genCP(cp[2])+genCP(cp[3])+genCP(cp[4])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1722,7 +1770,7 @@ RED.view = (function() {
|
|||||||
var portY = -((numOutputs-1)/2)*13 +13*sourcePort;
|
var portY = -((numOutputs-1)/2)*13 +13*sourcePort;
|
||||||
|
|
||||||
var sc = (drag_line.portType === PORT_TYPE_OUTPUT)?1:-1;
|
var sc = (drag_line.portType === PORT_TYPE_OUTPUT)?1:-1;
|
||||||
drag_line.el.attr("d",generateLinkPath(drag_line.node.x+sc*drag_line.node.w/2,drag_line.node.y+portY,mousePos[0],mousePos[1],sc));
|
drag_line.el.attr("d",generateLinkPath(drag_line.node.x+sc*drag_line.node.w/2,drag_line.node.y+portY,mousePos[0],mousePos[1],sc, !!drag_line.node.status));
|
||||||
}
|
}
|
||||||
d3.event.preventDefault();
|
d3.event.preventDefault();
|
||||||
} else if (mouse_mode == RED.state.MOVING) {
|
} else if (mouse_mode == RED.state.MOVING) {
|
||||||
@ -5067,7 +5115,7 @@ RED.view = (function() {
|
|||||||
// " C "+(d.x1+scale*node_width)+" "+(d.y1+scaleY*node_height)+" "+
|
// " C "+(d.x1+scale*node_width)+" "+(d.y1+scaleY*node_height)+" "+
|
||||||
// (d.x2-scale*node_width)+" "+(d.y2-scaleY*node_height)+" "+
|
// (d.x2-scale*node_width)+" "+(d.y2-scaleY*node_height)+" "+
|
||||||
// d.x2+" "+d.y2;
|
// d.x2+" "+d.y2;
|
||||||
var path = generateLinkPath(d.x1,d.y1,d.x2,d.y2,1);
|
var path = generateLinkPath(d.x1,d.y1,d.x2,d.y2,1, !!(d.source.status || d.target.status));
|
||||||
if (/NaN/.test(path)) {
|
if (/NaN/.test(path)) {
|
||||||
path = ""
|
path = ""
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user