| @@ -406,7 +406,7 @@ RED.view = (function() { | |||
| // update drag line | |||
| drag_line.attr("class", "drag_line"); | |||
| mousePos = mouse_position; | |||
| var numOutputs = (mousedown_port_type === 0)?(mousedown_node.outputs || 1):1; | |||
| var numOutputs = (mousedown_port_type === 0)?(mousedown_node.outputs || 1):(mousedown_node._def.inputs || 1); | |||
| var sourcePort = mousedown_port_index; | |||
| var portY = -((numOutputs-1)/2)*13 +13*sourcePort; | |||
| @@ -813,23 +813,25 @@ RED.view = (function() { | |||
| resetMouseVars(); | |||
| return; | |||
| } | |||
| var src,dst,src_port; | |||
| var src,dst,src_port,dst_port; | |||
| if (mousedown_port_type === 0) { | |||
| src = mousedown_node; | |||
| src_port = mousedown_port_index; | |||
| dst = mouseup_node; | |||
| dst_port = portIndex; | |||
| } else if (mousedown_port_type == 1) { | |||
| src = mouseup_node; | |||
| dst = mousedown_node; | |||
| src_port = portIndex; | |||
| dst = mousedown_node; | |||
| dst_port = mousedown_port_index; | |||
| } | |||
| var existingLink = false; | |||
| RED.nodes.eachLink(function(d) { | |||
| existingLink = existingLink || (d.source === src && d.target === dst && d.sourcePort == src_port); | |||
| existingLink = existingLink || (d.source === src && d.target === dst && d.sourcePort == src_port && d.targetPort == dst_port); | |||
| }); | |||
| if (!existingLink) { | |||
| var link = {source: src, sourcePort:src_port, target: dst}; | |||
| var link = {source: src, sourcePort:src_port, target: dst, targetPort: dst_port}; | |||
| RED.nodes.addLink(link); | |||
| RED.history.push({t:'add',links:[link],dirty:dirty}); | |||
| setDirty(true); | |||
| @@ -965,7 +967,7 @@ RED.view = (function() { | |||
| var l = d._def.label; | |||
| l = (typeof l === "function" ? l.call(d) : l)||""; | |||
| d.w = Math.max(node_width,calculateTextWidth(l)+(d._def.inputs>0?7:0) ); | |||
| d.h = Math.max(node_height,(d.outputs||0) * 15); | |||
| d.h = Math.max(node_height,(Math.max(d.outputs,d._def.inputs)||0) * 15); | |||
| if (d._def.badge) { | |||
| var badge = node.append("svg:g").attr("class","node_badge_group"); | |||
| @@ -1139,13 +1141,16 @@ RED.view = (function() { | |||
| //node.append("circle").attr({"class":"centerDot","cx":0,"cy":0,"r":5}); | |||
| if (d._def.inputs > 0) { | |||
| var numInputs = d._def.inputs; | |||
| for (var n=0; n < numInputs; n++) { | |||
| var y = (d.h/2)-((numInputs-1)/2)*13; | |||
| y = (y+13*n)-5; | |||
| text.attr("x",38); | |||
| node.append("rect").attr("class","port port_input").attr("rx",3).attr("ry",3).attr("x",-5).attr("width",10).attr("height",10) | |||
| .on("mousedown",function(d){portMouseDown(d,1,0);}) | |||
| .on("touchstart",function(d){portMouseDown(d,1,0);}) | |||
| .on("mouseup",function(d){portMouseUp(d,1,0);} ) | |||
| .on("touchend",function(d){portMouseUp(d,1,0);} ) | |||
| node.append("rect").attr("class","port port_input").attr("rx",3).attr("ry",3).attr("y",y).attr("x",-5).attr("width",10).attr("height",10) | |||
| .on("mousedown", (function(nn){return function(d){portMouseDown(d,1,nn);}})(n)) | |||
| .on("touchstart", (function(nn){return function(d){portMouseDown(d,1,nn);}})(n)) | |||
| .on("mouseup", (function(nn){return function(d){portMouseUp(d,1,nn);}})(n)) | |||
| .on("touchend", (function(nn){return function(d){portMouseUp(d,1,nn);}})(n)) | |||
| .on("mouseover",function(d) { var port = d3.select(this); port.classed("port_hovered",(mouse_mode!=RED.state.JOINING || mousedown_port_type != 1 ));}) | |||
| .on("mouseout",function(d) { var port = d3.select(this); port.classed("port_hovered",false);}) | |||
| } | |||
| @@ -1162,7 +1167,7 @@ RED.view = (function() { | |||
| var l = d._def.label; | |||
| l = (typeof l === "function" ? l.call(d) : l)||""; | |||
| d.w = Math.max(node_width,calculateTextWidth(l)+(d._def.inputs>0?7:0) ); | |||
| d.h = Math.max(node_height,(d.outputs||0) * 15); | |||
| d.h = Math.max(node_height,(Math.max(d.outputs,d._def.inputs)||0) * 15); | |||
| } | |||
| var thisNode = d3.select(this); | |||
| //thisNode.selectAll(".centerDot").attr({"cx":function(d) { return d.w/2;},"cy":function(d){return d.h/2}}); | |||
| @@ -1231,8 +1236,11 @@ RED.view = (function() { | |||
| .classed("hidden",function(d) { return d.valid; }); | |||
| thisNode.selectAll(".port_input").each(function(d,i) { | |||
| var port = d3.select(this); | |||
| port.attr("y",function(d){return (d.h/2)-5;}) | |||
| var port = d3.select(this); | |||
| var numInputs = d._def.inputs; | |||
| var y = (d.h/2)-((numInputs-1)/2)*13; | |||
| y = (y+13*i)-5; | |||
| port.attr("y",y) | |||
| }); | |||
| thisNode.selectAll(".node_icon").attr("y",function(d){return (d.h-d3.select(this).attr("height"))/2;}); | |||
| @@ -1305,7 +1313,7 @@ RED.view = (function() { | |||
| }); | |||
| } | |||
| var link = vis.selectAll(".link").data(RED.nodes.links.filter(function(d) { return d.source.z == activeWorkspace && d.target.z == activeWorkspace }),function(d) { return d.source.id+":"+d.sourcePort+":"+d.target.id;}); | |||
| var link = vis.selectAll(".link").data(RED.nodes.links.filter(function(d) { return d.source.z == activeWorkspace && d.target.z == activeWorkspace }),function(d) { return d.source.id+":"+d.sourcePort+":"+d.target.id+":"+d.targetPort;}); | |||
| var linkEnter = link.enter().insert("g",".node").attr("class","link"); | |||
| @@ -1338,9 +1346,12 @@ RED.view = (function() { | |||
| links.attr("d",function(d){ | |||
| var numOutputs = d.source.outputs || 1; | |||
| var sourcePort = d.sourcePort || 0; | |||
| var y = -((numOutputs-1)/2)*13 +13*sourcePort; | |||
| var ysource = -((numOutputs-1)/2)*13 +13*sourcePort; | |||
| var numInputs = d.target._def.inputs || 1; | |||
| var targetPort = d.targetPort || 0; | |||
| var ytarget = -((numInputs-1)/2)*13 +13*targetPort; | |||
| var dy = d.target.y-(d.source.y+y); | |||
| var dy = (d.target.y+ytarget)-(d.source.y+ysource); | |||
| var dx = (d.target.x-d.target.w/2)-(d.source.x+d.source.w/2); | |||
| var delta = Math.sqrt(dy*dy+dx*dx); | |||
| var scale = lineCurveScale; | |||
| @@ -1357,14 +1368,14 @@ RED.view = (function() { | |||
| } | |||
| d.x1 = d.source.x+d.source.w/2; | |||
| d.y1 = d.source.y+y; | |||
| d.y1 = d.source.y+ysource; | |||
| d.x2 = d.target.x-d.target.w/2; | |||
| d.y2 = d.target.y; | |||
| d.y2 = d.target.y+ytarget; | |||
| return "M "+(d.source.x+d.source.w/2)+" "+(d.source.y+y)+ | |||
| " C "+(d.source.x+d.source.w/2+scale*node_width)+" "+(d.source.y+y+scaleY*node_height)+" "+ | |||
| (d.target.x-d.target.w/2-scale*node_width)+" "+(d.target.y-scaleY*node_height)+" "+ | |||
| (d.target.x-d.target.w/2)+" "+d.target.y; | |||
| return "M "+(d.x1)+" "+(d.y1)+ | |||
| " C "+(d.x1+scale*node_width)+" "+(d.y1+scaleY*node_height)+" "+ | |||
| (d.x2-scale*node_width)+" "+(d.y2-scaleY*node_height)+" "+ | |||
| (d.x2)+" "+d.y2; | |||
| }) | |||
| link.classed("link_selected", function(d) { return d === selected_link || d.selected; }); | |||