mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Allow shift-click to detach existing wires
This commit is contained in:
parent
ed19e4fa08
commit
f35dd34da9
@ -231,7 +231,21 @@ RED.view = (function() {
|
|||||||
});
|
});
|
||||||
grid.style("visibility","hidden");
|
grid.style("visibility","hidden");
|
||||||
|
|
||||||
var drag_line = vis.append("svg:path").attr("class", "drag_line");
|
var dragGroup = vis.append('g');
|
||||||
|
var drag_lines = [];
|
||||||
|
|
||||||
|
function showDragLines(nodes) {
|
||||||
|
for (var i=0;i<nodes.length;i++) {
|
||||||
|
var node = nodes[i];
|
||||||
|
node.el = dragGroup.append("svg:path").attr("class", "drag_line");
|
||||||
|
drag_lines.push(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideDragLines() {
|
||||||
|
while(drag_lines.length) {
|
||||||
|
(drag_lines.pop()).el.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function updateActiveNodes() {
|
function updateActiveNodes() {
|
||||||
var activeWorkspace = RED.workspaces.active();
|
var activeWorkspace = RED.workspaces.active();
|
||||||
@ -497,16 +511,52 @@ RED.view = (function() {
|
|||||||
var mousePos;
|
var mousePos;
|
||||||
if (mouse_mode == RED.state.JOINING) {
|
if (mouse_mode == RED.state.JOINING) {
|
||||||
// update drag line
|
// update drag line
|
||||||
drag_line.attr("class", "drag_line");
|
if (drag_lines.length === 0) {
|
||||||
|
if (d3.event.shiftKey) {
|
||||||
|
// Get all the wires we need to detach.
|
||||||
|
var links = [];
|
||||||
|
var filter;
|
||||||
|
if (mousedown_port_type === 0) {
|
||||||
|
filter = {
|
||||||
|
source:mousedown_node,
|
||||||
|
sourcePort: mousedown_port_index
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filter = {
|
||||||
|
target: mousedown_node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var existingLinks = RED.nodes.filterLinks(filter);
|
||||||
|
for (var i=0;i<existingLinks.length;i++) {
|
||||||
|
var link = existingLinks[i];
|
||||||
|
RED.nodes.removeLink(link);
|
||||||
|
links.push({
|
||||||
|
link:link,
|
||||||
|
node: (mousedown_port_type===0)?link.target:link.source,
|
||||||
|
port: (mousedown_port_type===0)?0:link.sourcePort,
|
||||||
|
portType: (mousedown_port_type===0)?1:0
|
||||||
|
})
|
||||||
|
}
|
||||||
|
showDragLines(links);
|
||||||
|
mouse_mode = 0;
|
||||||
|
updateActiveNodes();
|
||||||
|
redraw();
|
||||||
|
mouse_mode = RED.state.JOINING;
|
||||||
|
} else {
|
||||||
|
showDragLines([{node:mousedown_node,port:mousedown_port_index,portType:mousedown_port_type}]);
|
||||||
|
}
|
||||||
|
}
|
||||||
mousePos = mouse_position;
|
mousePos = mouse_position;
|
||||||
var numOutputs = (mousedown_port_type === 0)?(mousedown_node.outputs || 1):1;
|
for (var i=0;i<drag_lines.length;i++) {
|
||||||
var sourcePort = mousedown_port_index;
|
var drag_line = drag_lines[i];
|
||||||
|
var numOutputs = (drag_line.portType === 0)?(drag_line.node.outputs || 1):1;
|
||||||
|
var sourcePort = drag_line.port;
|
||||||
var portY = -((numOutputs-1)/2)*13 +13*sourcePort;
|
var portY = -((numOutputs-1)/2)*13 +13*sourcePort;
|
||||||
|
|
||||||
var sc = (mousedown_port_type === 0)?1:-1;
|
var sc = (drag_line.portType === 0)?1:-1;
|
||||||
|
|
||||||
var dy = mousePos[1]-(mousedown_node.y+portY);
|
var dy = mousePos[1]-(drag_line.node.y+portY);
|
||||||
var dx = mousePos[0]-(mousedown_node.x+sc*mousedown_node.w/2);
|
var dx = mousePos[0]-(drag_line.node.x+sc*drag_line.node.w/2);
|
||||||
var delta = Math.sqrt(dy*dy+dx*dx);
|
var delta = Math.sqrt(dy*dy+dx*dx);
|
||||||
var scale = lineCurveScale;
|
var scale = lineCurveScale;
|
||||||
var scaleY = 0;
|
var scaleY = 0;
|
||||||
@ -521,12 +571,13 @@ RED.view = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drag_line.attr("d",
|
drag_line.el.attr("d",
|
||||||
"M "+(mousedown_node.x+sc*mousedown_node.w/2)+" "+(mousedown_node.y+portY)+
|
"M "+(drag_line.node.x+sc*drag_line.node.w/2)+" "+(drag_line.node.y+portY)+
|
||||||
" C "+(mousedown_node.x+sc*(mousedown_node.w/2+node_width*scale))+" "+(mousedown_node.y+portY+scaleY*node_height)+" "+
|
" C "+(drag_line.node.x+sc*(drag_line.node.w/2+node_width*scale))+" "+(drag_line.node.y+portY+scaleY*node_height)+" "+
|
||||||
(mousePos[0]-sc*(scale)*node_width)+" "+(mousePos[1]-scaleY*node_height)+" "+
|
(mousePos[0]-sc*(scale)*node_width)+" "+(mousePos[1]-scaleY*node_height)+" "+
|
||||||
mousePos[0]+" "+mousePos[1]
|
mousePos[0]+" "+mousePos[1]
|
||||||
);
|
);
|
||||||
|
}
|
||||||
d3.event.preventDefault();
|
d3.event.preventDefault();
|
||||||
} else if (mouse_mode == RED.state.MOVING) {
|
} else if (mouse_mode == RED.state.MOVING) {
|
||||||
mousePos = d3.mouse(document.body);
|
mousePos = d3.mouse(document.body);
|
||||||
@ -587,7 +638,19 @@ RED.view = (function() {
|
|||||||
|
|
||||||
function canvasMouseUp() {
|
function canvasMouseUp() {
|
||||||
if (mousedown_node && mouse_mode == RED.state.JOINING) {
|
if (mousedown_node && mouse_mode == RED.state.JOINING) {
|
||||||
drag_line.attr("class", "drag_line_hidden");
|
var removedLinks = [];
|
||||||
|
for (var i=0;i<drag_lines.length;i++) {
|
||||||
|
if (drag_lines[i].link) {
|
||||||
|
removedLinks.push(drag_lines[i].link)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var historyEvent = {
|
||||||
|
t:'delete',
|
||||||
|
links: removedLinks,
|
||||||
|
dirty:RED.nodes.dirty()
|
||||||
|
};
|
||||||
|
RED.history.push(historyEvent);
|
||||||
|
hideDragLines();
|
||||||
}
|
}
|
||||||
if (lasso) {
|
if (lasso) {
|
||||||
var x = parseInt(lasso.attr("x"));
|
var x = parseInt(lasso.attr("x"));
|
||||||
@ -925,8 +988,9 @@ RED.view = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function portMouseUp(d,portType,portIndex) {
|
function portMouseUp(d,portType,portIndex) {
|
||||||
|
var i;
|
||||||
document.body.style.cursor = "";
|
document.body.style.cursor = "";
|
||||||
if (mouse_mode == RED.state.JOINING && mousedown_node) {
|
if (mouse_mode == RED.state.JOINING && drag_lines.length > 0) {
|
||||||
if (typeof TouchEvent != "undefined" && d3.event instanceof TouchEvent) {
|
if (typeof TouchEvent != "undefined" && d3.event instanceof TouchEvent) {
|
||||||
RED.nodes.eachNode(function(n) {
|
RED.nodes.eachNode(function(n) {
|
||||||
if (n.z == RED.workspaces.active()) {
|
if (n.z == RED.workspaces.active()) {
|
||||||
@ -943,28 +1007,40 @@ RED.view = (function() {
|
|||||||
} else {
|
} else {
|
||||||
mouseup_node = d;
|
mouseup_node = d;
|
||||||
}
|
}
|
||||||
if (portType == mousedown_port_type || mouseup_node === mousedown_node) {
|
var addedLinks = [];
|
||||||
drag_line.attr("class", "drag_line_hidden");
|
var removedLinks = [];
|
||||||
resetMouseVars();
|
|
||||||
return;
|
for (i=0;i<drag_lines.length;i++) {
|
||||||
|
if (drag_lines[i].link) {
|
||||||
|
removedLinks.push(drag_lines[i].link)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
for (i=0;i<drag_lines.length;i++) {
|
||||||
|
if (portType != drag_lines[i].portType && mouseup_node !== drag_lines[i].node) {
|
||||||
|
var drag_line = drag_lines[i];
|
||||||
var src,dst,src_port;
|
var src,dst,src_port;
|
||||||
if (mousedown_port_type === 0) {
|
if (drag_line.portType === 0) {
|
||||||
src = mousedown_node;
|
src = drag_line.node;
|
||||||
src_port = mousedown_port_index;
|
src_port = drag_line.port;
|
||||||
dst = mouseup_node;
|
dst = mouseup_node;
|
||||||
} else if (mousedown_port_type == 1) {
|
} else if (drag_line.portType == 1) {
|
||||||
src = mouseup_node;
|
src = mouseup_node;
|
||||||
dst = mousedown_node;
|
dst = drag_line.node;
|
||||||
src_port = portIndex;
|
src_port = portIndex;
|
||||||
}
|
}
|
||||||
var existingLink = RED.nodes.filterLinks({source:src,target:dst,sourcePort: src_port}).length !== 0;
|
var existingLink = RED.nodes.filterLinks({source:src,target:dst,sourcePort: src_port}).length !== 0;
|
||||||
if (!existingLink) {
|
if (!existingLink) {
|
||||||
var link = {source: src, sourcePort:src_port, target: dst};
|
var link = {source: src, sourcePort:src_port, target: dst};
|
||||||
RED.nodes.addLink(link);
|
RED.nodes.addLink(link);
|
||||||
|
addedLinks.push(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (addedLinks.length > 0 || removedLinks.length > 0) {
|
||||||
var historyEvent = {
|
var historyEvent = {
|
||||||
t:'add',
|
t:'add',
|
||||||
links:[link],
|
links:addedLinks,
|
||||||
|
removedLinks: removedLinks,
|
||||||
dirty:RED.nodes.dirty()
|
dirty:RED.nodes.dirty()
|
||||||
};
|
};
|
||||||
if (activeSubflow) {
|
if (activeSubflow) {
|
||||||
@ -980,8 +1056,9 @@ RED.view = (function() {
|
|||||||
RED.history.push(historyEvent);
|
RED.history.push(historyEvent);
|
||||||
updateActiveNodes();
|
updateActiveNodes();
|
||||||
RED.nodes.dirty(true);
|
RED.nodes.dirty(true);
|
||||||
} else {
|
|
||||||
}
|
}
|
||||||
|
resetMouseVars();
|
||||||
|
hideDragLines();
|
||||||
selected_link = null;
|
selected_link = null;
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user