diff --git a/editor/ext-connector.js b/editor/ext-connector.js index 820aa9f9..1f6304dc 100644 --- a/editor/ext-connector.js +++ b/editor/ext-connector.js @@ -1,11 +1,11 @@ $(function() { - svgCanvas.addExtension("Connector", function(vars) { - var svgcontent = vars.content, - svgroot = vars.root, - getNextId = vars.getNextId, - getElem = vars.getElem, - addElem = vars.addSvgElementFromJson, - selManager = vars.selectorManager, + svgCanvas.addExtension("Connector", function(S) { + var svgcontent = S.content, + svgroot = S.root, + getNextId = S.getNextId, + getElem = S.getElem, + addElem = S.addSvgElementFromJson, + selManager = S.selectorManager, started = false, start_x, start_y, @@ -73,7 +73,7 @@ $(function() { } function addArrow() { - var defs = vars.findDefs(); + var defs = S.findDefs(); var m_id = "se_connector_arrow"; var marker = getElem(m_id); @@ -110,6 +110,88 @@ $(function() { selElems[0].removeAttribute("marker-mid"); } + function findConnectors() { + + // Check if selected elements have connections + var elems = selElems; + var i = elems.length; + var connectors = $(svgcontent).find("." + conn_class); + if(!connectors.length) return; + connections = []; + + var sel = ':not(a,g,svg,.'+conn_class+')'; + var all_els = []; + // Get children from groups + + while(i--) { + var elem = elems[i]; + if(!elem) continue; + // Get all children that cannot contain children + var solid_elems = $(elem).find(sel); + // Include self if okay + if($(elem).filter(sel).length) { + solid_elems.push(elem); + } + $.merge(all_els, solid_elems); + } + + i = all_els.length; + + if(i > 1) { + // Multiselected, so unselect connector + svgCanvas.removeFromSelection($("." + conn_class).toArray()); + } + + while(i--) { + var elem = all_els[i]; + if(!elem) continue; + if(elem.getAttribute('class') == conn_class) continue; + var elem_id = elem.id; + connectors.each(function() { + var con_id = this.id; + if(con_id.indexOf(elem_id) != -1) { + var is_start = true; + if(con_id.indexOf(connect_str + elem_id) != -1) { + // Found connector (selected is end elem) + is_start = false; + } + + var bb = svgCanvas.getStrokedBBox([elem]); + var x = bb.x + bb.width/2; + var y = bb.y + bb.height/2; + connections.push({ + elem: elem, + connector: this, + is_start: is_start, + start_x: x, + start_y: y + }); + } + }); + } + + } + + function updateConnectors() { + // Updates connector lines based on selected elements + // Is not used on mousemove, as it runs getStrokedBBox every time, + // which isn't necessary there. + findConnectors(); + if(connections.length) { + // Update line with element + var i = connections.length; + while(i--) { + var conn = connections[i]; + var line = conn.connector; + var elem = conn.elem; + var bb = svgCanvas.getStrokedBBox([elem]); + var pt_x = bb.x + bb.width/2; + var pt_y = bb.y + bb.height/2; + setPoint(line, conn.is_start?0:'end', pt_x, pt_y, true); + } + } + } + // Init code (function() { var conn_tools = $('