-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdrag.js
More file actions
125 lines (105 loc) · 3.35 KB
/
Copy pathdrag.js
File metadata and controls
125 lines (105 loc) · 3.35 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// TODO Track touch points by identifier.
d3.behavior.drag = function() {
var event = d3.dispatch("drag", "dragstart", "dragend"),
origin = null;
function drag() {
this
.on("mousedown.drag", mousedown)
.on("touchstart.drag", mousedown);
d3.select(window)
.on("mousemove.drag", d3_behavior_dragMove)
.on("touchmove.drag", d3_behavior_dragMove)
.on("mouseup.drag", d3_behavior_dragUp, true)
.on("touchend.drag", d3_behavior_dragUp, true)
.on("click.drag", d3_behavior_dragClick, true);
}
// snapshot the local context for subsequent dispatch
function start() {
d3_behavior_dragEvent = event;
d3_behavior_dragEventTarget = d3.event.target;
d3_behavior_dragTarget = this;
d3_behavior_dragArguments = arguments;
d3_behavior_dragOrigin = d3_behavior_dragPoint();
if (origin) {
d3_behavior_dragOffset = origin.apply(d3_behavior_dragTarget, d3_behavior_dragArguments);
d3_behavior_dragOffset = [d3_behavior_dragOffset.x - d3_behavior_dragOrigin[0], d3_behavior_dragOffset.y - d3_behavior_dragOrigin[1]];
} else {
d3_behavior_dragOffset = [0, 0];
}
d3_behavior_dragMoved = 0;
}
function mousedown() {
start.apply(this, arguments);
d3_behavior_dragDispatch("dragstart");
}
drag.origin = function(x) {
if (!arguments.length) return origin;
origin = x;
return drag;
};
return d3.rebind(drag, event, "on");
};
var d3_behavior_dragEvent,
d3_behavior_dragEventTarget,
d3_behavior_dragTarget,
d3_behavior_dragArguments,
d3_behavior_dragOffset,
d3_behavior_dragOrigin,
d3_behavior_dragMoved;
function d3_behavior_dragDispatch(type) {
var p = d3_behavior_dragPoint(),
o = d3.event,
e = d3.event = {type: type};
if (p) {
e.x = p[0] + d3_behavior_dragOffset[0];
e.y = p[1] + d3_behavior_dragOffset[1];
e.dx = p[0] - d3_behavior_dragOrigin[0];
e.dy = p[1] - d3_behavior_dragOrigin[1];
d3_behavior_dragMoved |= e.dx | e.dy;
d3_behavior_dragOrigin = p;
}
try {
d3_behavior_dragEvent[type].apply(d3_behavior_dragTarget, d3_behavior_dragArguments);
} finally {
d3.event = o;
}
o.stopPropagation();
o.preventDefault();
}
function d3_behavior_dragPoint() {
var p = d3_behavior_dragTarget.parentNode,
t = d3.event.changedTouches;
return p && (t
? d3.svg.touches(p, t)[0]
: d3.svg.mouse(p));
}
function d3_behavior_dragMove() {
if (!d3_behavior_dragTarget) return;
var parent = d3_behavior_dragTarget.parentNode;
// O NOES! The drag element was removed from the DOM.
if (!parent) return d3_behavior_dragUp();
d3_behavior_dragDispatch("drag");
d3_eventCancel();
}
function d3_behavior_dragUp() {
if (!d3_behavior_dragTarget) return;
d3_behavior_dragDispatch("dragend");
// If the node was moved, prevent the mouseup from propagating.
// Also prevent the subsequent click from propagating (e.g., for anchors).
if (d3_behavior_dragMoved) {
d3_eventCancel();
d3_behavior_dragMoved = d3.event.target === d3_behavior_dragEventTarget;
}
d3_behavior_dragEvent =
d3_behavior_dragEventTarget =
d3_behavior_dragTarget =
d3_behavior_dragArguments =
d3_behavior_dragOffset =
d3_behavior_dragOrigin = null;
}
function d3_behavior_dragClick() {
if (d3_behavior_dragMoved) {
d3_eventCancel();
d3_behavior_dragMoved = 0;
}
}