X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=portal%2Fstatic%2Funbound_reservation_static%2Fsrc%2Fconnectors-bezier.js;fp=portal%2Fstatic%2Funbound_reservation_static%2Fsrc%2Fconnectors-bezier.js;h=5c5f307698c8ed50e78365fbca0cee60ab894c2f;hb=729a9dbb380b51a217194ba2a4e5978186fe50b0;hp=0000000000000000000000000000000000000000;hpb=c4bd5da6e2630eddf1262aa8d808dbb48b097d53;p=myslice.git diff --git a/portal/static/unbound_reservation_static/src/connectors-bezier.js b/portal/static/unbound_reservation_static/src/connectors-bezier.js new file mode 100644 index 00000000..5c5f3076 --- /dev/null +++ b/portal/static/unbound_reservation_static/src/connectors-bezier.js @@ -0,0 +1,67 @@ + +;(function() { + + var Bezier = function(params) { + params = params || {}; + + var self = this, + _super = jsPlumb.Connectors.AbstractConnector.apply(this, arguments), + stub = params.stub || 50, + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.type = "Bezier"; + this.getCurviness = function() { return majorAnchor; }; + + this._findControlPoint = function(point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var soo = sourceEndpoint.anchor.getOrientation(sourceEndpoint), + too = targetEndpoint.anchor.getOrientation(targetEndpoint), + perpendicular = soo[0] != too[0] || soo[1] == too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) // X + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + else p.push(point[0] - (majorAnchor * soo[0])); + + if (soo[1] === 0) // Y + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + else p.push(point[1] + (majorAnchor * too[1])); + } + else { + if (too[0] === 0) // X + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + else p.push(point[0] + (majorAnchor * too[0])); + + if (too[1] === 0) // Y + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + else p.push(point[1] + (majorAnchor * soo[1])); + } + + return p; + }; + + this._compute = function(paintInfo, p) { + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]), + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h, + _CP = self._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint), + _CP2 = self._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint); + + _super.addSegment(this, "Bezier", { + x1:_sx, y1:_sy, x2:_tx, y2:_ty, + cp1x:_CP[0], cp1y:_CP[1], cp2x:_CP2[0], cp2y:_CP2[1] + }); + }; + }; + + jsPlumb.registerConnectorType(Bezier, "Bezier"); + +})(); \ No newline at end of file