-
Notifications
You must be signed in to change notification settings - Fork 0
/
mouse-move.js
126 lines (106 loc) · 2.76 KB
/
mouse-move.js
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
126
define([
'./main',
'./Deferred',
'./mouse',
'compose/compose',
'eventd-adapter!has',
'./utils/timer'
], function(eventd, Deferred, mouse, Compose, has, timer){
var MouseMove = mouse.events.MouseMove = Compose(mouse.Event, {
type: "mousemove"
});
var fromName = has("event-create-event") ? "relatedTarget" : "fromElement",
toName = has("event-create-event") ? "relatedTarget" : "toElement";
function XYLine(startX, endX, startY, endY){
return function(n){
n = 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2); // perform easing
return {
x: ((endX - startX) * n) + startX,
y: ((endY - startY) * n) + startY
};
};
}
function outOver(last, current){
var outOpts = {},
overOpts = {};
outOpts[toName] = current;
overOpts[fromName] = last;
return mouse.mouseout(last, outOpts).then(function(){
return mouse.mouseover(current, overOpts);
});
}
function move(node, x, y){
return mouse.mousemove(node, { clientX: x, clientY: y });
}
function mover(line, onCycle, onEnd, duration){
var percent = 0,
startTime = -1;
duration = duration || mouse._defaultDuration;
var init = function(){
startTime = +(new Date);
init = null;
};
function cycle(){
init && init();
var curr = +(new Date),
step = (curr - startTime) / duration;
if(step >= 1){
step = 1;
}
percent = step;
onCycle(line(step));
if(percent >= 1){
onEnd();
remover();
}
}
var remover = timer(cycle);
return remover;
}
return Compose.call(mouse, {
mousemove: eventd.wrapDispatcher(MouseMove, mouse.addPosition),
_current: { x: 0, y: 0 },
_defaultDuration: 350,
move: function(clientX, clientY, duration, trace){
var current = mouse._current,
lastNode = eventd.document.elementFromPoint(current.x, current.y),
d, res = new Deferred(function(){
remover && remover();
remover = null;
});
var remover = mover(
XYLine(mouse._current.x, clientX, mouse._current.y, clientY),
function(values){
var node = eventd.document.elementFromPoint(values.x, values.y);
if(lastNode){
if(lastNode !== node){
d = Deferred.when(d, function(){
return outOver(lastNode, node);
});
lastNode = node;
}
}else{
lastNode = node;
}
d = Deferred.when(d, function(){
return move(lastNode, values.x, values.y);
});
if(trace){
d.then(function(){
var n = eventd.document.createElement("div");
n.style.cssText = "width: 2px; height: 2px; background-color: blue; position: absolute; left: " + values.x + "px; top: " + values.y + "px;";
eventd.body().appendChild(n);
});
}
},
function(){
d.then(function(){
res.resolve();
});
},
duration
);
return res.promise;
}
});
});