summaryrefslogtreecommitdiffstats
path: root/src/draggable.js
blob: b0deac7974b661a85b5fcacf9bd246e2642c92cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var bind = function(fn, me) {
  return function() { return fn.apply(me, arguments); };
};

SVG.Draggable = function Draggable(e) {
  this._windowMouseUp = bind(this._windowMouseUp, this);
  this._windowMouseMove = bind(this._windowMouseMove, this);
  this.draggable = bind(this.draggable, this);
  this.element = e;
  this.element.draggable = this.draggable;
};

SVG.Draggable.prototype.draggable = function() {
  var self = this;
  this.element.on('mousedown', function(e) {
    self.startDragEvent = e;
    self.startDragPosition = {
      x: self.element.attributes.x || 0,
      y: self.element.attributes.y || 0
    };
    window.addEventListener('mousemove', self._windowMouseMove);
    window.addEventListener('mouseup', self._windowMouseUp);
    return typeof self.element.dragstart === 'function' ? self.element.dragstart(e) : void 0;
  });
  return this.element;
};

SVG.Draggable.prototype._windowMouseMove = function(e) {
  if (this.startDragEvent != null) {
    var d = {
      x: e.pageX - this.startDragEvent.pageX,
      y: e.pageY - this.startDragEvent.pageY
    };
    this.element.move(this.startDragPosition.x + d.x, this.startDragPosition.y + d.y);
    return typeof this.element.dragmove === 'function' ? this.element.dragmove(d, e) : void 0;
  }
};

SVG.Draggable.prototype._windowMouseUp = function(e) {
  this.startDragEvent = null;
  this.startDragPosition = null;
  window.removeEventListener('mousemove', this._windowMouseMove);
  window.removeEventListener('mouseup', this._windowMouseUp);
  return typeof this.element.dragend === 'function' ? this.element.dragend(e) : void 0;
};