| // update drag line | // update drag line | ||||
| drag_line.attr("class", "drag_line"); | drag_line.attr("class", "drag_line"); | ||||
| mousePos = mouse_position; | 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 sourcePort = mousedown_port_index; | ||||
| var portY = -((numOutputs-1)/2)*13 +13*sourcePort; | var portY = -((numOutputs-1)/2)*13 +13*sourcePort; | ||||
| resetMouseVars(); | resetMouseVars(); | ||||
| return; | return; | ||||
| } | } | ||||
| var src,dst,src_port; | |||||
| var src,dst,src_port,dst_port; | |||||
| if (mousedown_port_type === 0) { | if (mousedown_port_type === 0) { | ||||
| src = mousedown_node; | src = mousedown_node; | ||||
| src_port = mousedown_port_index; | src_port = mousedown_port_index; | ||||
| dst = mouseup_node; | dst = mouseup_node; | ||||
| dst_port = portIndex; | |||||
| } else if (mousedown_port_type == 1) { | } else if (mousedown_port_type == 1) { | ||||
| src = mouseup_node; | src = mouseup_node; | ||||
| dst = mousedown_node; | |||||
| src_port = portIndex; | src_port = portIndex; | ||||
| dst = mousedown_node; | |||||
| dst_port = mousedown_port_index; | |||||
| } | } | ||||
| var existingLink = false; | var existingLink = false; | ||||
| RED.nodes.eachLink(function(d) { | 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) { | 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.nodes.addLink(link); | ||||
| RED.history.push({t:'add',links:[link],dirty:dirty}); | RED.history.push({t:'add',links:[link],dirty:dirty}); | ||||
| setDirty(true); | setDirty(true); | ||||
| var l = d._def.label; | var l = d._def.label; | ||||
| l = (typeof l === "function" ? l.call(d) : l)||""; | l = (typeof l === "function" ? l.call(d) : l)||""; | ||||
| d.w = Math.max(node_width,calculateTextWidth(l)+(d._def.inputs>0?7:0) ); | 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) { | if (d._def.badge) { | ||||
| var badge = node.append("svg:g").attr("class","node_badge_group"); | var badge = node.append("svg:g").attr("class","node_badge_group"); | ||||
| //node.append("circle").attr({"class":"centerDot","cx":0,"cy":0,"r":5}); | //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); | 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("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);}) | .on("mouseout",function(d) { var port = d3.select(this); port.classed("port_hovered",false);}) | ||||
| } | } | ||||
| var l = d._def.label; | var l = d._def.label; | ||||
| l = (typeof l === "function" ? l.call(d) : l)||""; | l = (typeof l === "function" ? l.call(d) : l)||""; | ||||
| d.w = Math.max(node_width,calculateTextWidth(l)+(d._def.inputs>0?7:0) ); | 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); | var thisNode = d3.select(this); | ||||
| //thisNode.selectAll(".centerDot").attr({"cx":function(d) { return d.w/2;},"cy":function(d){return d.h/2}}); | //thisNode.selectAll(".centerDot").attr({"cx":function(d) { return d.w/2;},"cy":function(d){return d.h/2}}); | ||||
| .classed("hidden",function(d) { return d.valid; }); | .classed("hidden",function(d) { return d.valid; }); | ||||
| thisNode.selectAll(".port_input").each(function(d,i) { | 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;}); | thisNode.selectAll(".node_icon").attr("y",function(d){return (d.h-d3.select(this).attr("height"))/2;}); | ||||
| }); | }); | ||||
| } | } | ||||
| 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"); | var linkEnter = link.enter().insert("g",".node").attr("class","link"); | ||||
| links.attr("d",function(d){ | links.attr("d",function(d){ | ||||
| var numOutputs = d.source.outputs || 1; | var numOutputs = d.source.outputs || 1; | ||||
| var sourcePort = d.sourcePort || 0; | 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 dx = (d.target.x-d.target.w/2)-(d.source.x+d.source.w/2); | ||||
| var delta = Math.sqrt(dy*dy+dx*dx); | var delta = Math.sqrt(dy*dy+dx*dx); | ||||
| var scale = lineCurveScale; | var scale = lineCurveScale; | ||||
| } | } | ||||
| d.x1 = d.source.x+d.source.w/2; | 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.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; }); | link.classed("link_selected", function(d) { return d === selected_link || d.selected; }); |