Made various minor improvements to connector plugin
git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1316 eee81c28-f429-11dd-99c0-75d572ba1ddd
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
$(function() {
|
$(function() {
|
||||||
svgCanvas.addExtension("Connector", function(vars) {
|
svgCanvas.addExtension("Connector", function(S) {
|
||||||
var svgcontent = vars.content,
|
var svgcontent = S.content,
|
||||||
svgroot = vars.root,
|
svgroot = S.root,
|
||||||
getNextId = vars.getNextId,
|
getNextId = S.getNextId,
|
||||||
getElem = vars.getElem,
|
getElem = S.getElem,
|
||||||
addElem = vars.addSvgElementFromJson,
|
addElem = S.addSvgElementFromJson,
|
||||||
selManager = vars.selectorManager,
|
selManager = S.selectorManager,
|
||||||
started = false,
|
started = false,
|
||||||
start_x,
|
start_x,
|
||||||
start_y,
|
start_y,
|
||||||
@@ -73,7 +73,7 @@ $(function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addArrow() {
|
function addArrow() {
|
||||||
var defs = vars.findDefs();
|
var defs = S.findDefs();
|
||||||
var m_id = "se_connector_arrow";
|
var m_id = "se_connector_arrow";
|
||||||
var marker = getElem(m_id);
|
var marker = getElem(m_id);
|
||||||
|
|
||||||
@@ -110,6 +110,88 @@ $(function() {
|
|||||||
selElems[0].removeAttribute("marker-mid");
|
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
|
// Init code
|
||||||
(function() {
|
(function() {
|
||||||
var conn_tools = $('<div id="connector_panel">\
|
var conn_tools = $('<div id="connector_panel">\
|
||||||
@@ -129,10 +211,26 @@ $(function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
vars.extendWhitelist({
|
S.extendWhitelist({
|
||||||
"marker": ["viewBox", "id", "refX", "refY", "markerUnits", "markerWidth", "markerHeight", "orient"],
|
"marker": ["viewBox", "id", "refX", "refY", "markerUnits", "markerWidth", "markerHeight", "orient"],
|
||||||
"polyline": ["class", "marker-mid"]
|
"polyline": ["class", "marker-mid"]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var gse = svgCanvas.groupSelectedElements;
|
||||||
|
|
||||||
|
svgCanvas.groupSelectedElements = function() {
|
||||||
|
svgCanvas.removeFromSelection($("." + conn_class).toArray());
|
||||||
|
gse();
|
||||||
|
}
|
||||||
|
|
||||||
|
var mse = svgCanvas.moveSelectedElements;
|
||||||
|
|
||||||
|
svgCanvas.moveSelectedElements = function() {
|
||||||
|
svgCanvas.removeFromSelection($("." + conn_class).toArray());
|
||||||
|
mse.apply(this, arguments);
|
||||||
|
updateConnectors();
|
||||||
|
}
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -171,9 +269,14 @@ $(function() {
|
|||||||
|
|
||||||
if(started) return;
|
if(started) return;
|
||||||
|
|
||||||
if(e.target.parentNode.parentNode == svgcontent) {
|
var mouse_target = e.target;
|
||||||
|
|
||||||
|
var parents = $(mouse_target).parents();
|
||||||
|
|
||||||
|
if($.inArray(svgcontent, parents) != -1) {
|
||||||
// Connectable element
|
// Connectable element
|
||||||
start_elem = e.target;
|
|
||||||
|
start_elem = mouse_target;
|
||||||
|
|
||||||
// Get center of source element
|
// Get center of source element
|
||||||
var bb = svgCanvas.getStrokedBBox([start_elem]);
|
var bb = svgCanvas.getStrokedBBox([start_elem]);
|
||||||
@@ -197,41 +300,7 @@ $(function() {
|
|||||||
started: true
|
started: true
|
||||||
};
|
};
|
||||||
} else if(mode == "select") {
|
} else if(mode == "select") {
|
||||||
|
findConnectors();
|
||||||
// Check if selected elements have connections
|
|
||||||
var elems = opts.selectedElements;
|
|
||||||
var i = elems.length;
|
|
||||||
var connectors = $(svgcontent).find("." + conn_class);
|
|
||||||
if(!connectors.length) return;
|
|
||||||
connections = [];
|
|
||||||
|
|
||||||
while(i--) {
|
|
||||||
var elem = elems[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
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mouseMove: function(opts) {
|
mouseMove: function(opts) {
|
||||||
@@ -256,7 +325,9 @@ $(function() {
|
|||||||
// Look for selected connector elements
|
// Look for selected connector elements
|
||||||
if(elem && elem.getAttribute('class') == conn_class) {
|
if(elem && elem.getAttribute('class') == conn_class) {
|
||||||
// Remove the "translate" transform given to move
|
// Remove the "translate" transform given to move
|
||||||
|
svgCanvas.removeFromSelection([elem]);
|
||||||
svgCanvas.getTransformList(elem).clear();
|
svgCanvas.getTransformList(elem).clear();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(connections.length) {
|
if(connections.length) {
|
||||||
@@ -361,6 +432,7 @@ $(function() {
|
|||||||
svgcontent = elem;
|
svgcontent = elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateConnectors();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -988,6 +988,7 @@ function BatchCommand(text) {
|
|||||||
addSvgElementFromJson: addSvgElementFromJson,
|
addSvgElementFromJson: addSvgElementFromJson,
|
||||||
selectorManager: selectorManager,
|
selectorManager: selectorManager,
|
||||||
findDefs: findDefs,
|
findDefs: findDefs,
|
||||||
|
recalculateDimensions: recalculateDimensions,
|
||||||
// Probably only needed for extensions, so no need to make public?
|
// Probably only needed for extensions, so no need to make public?
|
||||||
// Also, should we prevent extensions from allowing <script> elements to be added?
|
// Also, should we prevent extensions from allowing <script> elements to be added?
|
||||||
extendWhitelist: function(new_data) {
|
extendWhitelist: function(new_data) {
|
||||||
@@ -2777,7 +2778,7 @@ function BatchCommand(text) {
|
|||||||
canvas.beginUndoableChange("transform", selectedElements);
|
canvas.beginUndoableChange("transform", selectedElements);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.log("Unknown mode in mousedown: " + current_mode);
|
// This could occur in an extension
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3298,7 +3299,7 @@ function BatchCommand(text) {
|
|||||||
recalculateAllSelectedDimensions();
|
recalculateAllSelectedDimensions();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.log("Unknown mode in mouseup: " + current_mode);
|
// This could occur in an extension
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user