| author | Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr> |
| Fri, 18 Apr 2014 14:31:58 +0200 | |
| changeset 51 | 79833eaa394a |
| parent 47 | c0b4a8b5a012 |
| permissions | -rw-r--r-- |
|
47
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
1 |
var d3_timer_queue = null, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
2 |
d3_timer_interval, // is an interval (or frame) active? |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
3 |
d3_timer_timeout; // is a timeout active? |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
4 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
5 |
// The timer will continue to fire until callback returns true. |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
6 |
d3.timer = function(callback, delay, then) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
7 |
var found = false, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
8 |
t0, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
9 |
t1 = d3_timer_queue; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
10 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
11 |
if (arguments.length < 3) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
12 |
if (arguments.length < 2) delay = 0; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
13 |
else if (!isFinite(delay)) return; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
14 |
then = Date.now(); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
15 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
16 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
17 |
// See if the callback's already in the queue. |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
18 |
while (t1) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
19 |
if (t1.callback === callback) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
20 |
t1.then = then; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
21 |
t1.delay = delay; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
22 |
found = true; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
23 |
break; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
24 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
25 |
t0 = t1; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
26 |
t1 = t1.next; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
27 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
28 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
29 |
// Otherwise, add the callback to the queue. |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
30 |
if (!found) d3_timer_queue = { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
31 |
callback: callback, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
32 |
then: then, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
33 |
delay: delay, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
34 |
next: d3_timer_queue |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
35 |
}; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
36 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
37 |
// Start animatin'! |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
38 |
if (!d3_timer_interval) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
39 |
d3_timer_timeout = clearTimeout(d3_timer_timeout); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
40 |
d3_timer_interval = 1; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
41 |
d3_timer_frame(d3_timer_step); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
42 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
43 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
44 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
45 |
function d3_timer_step() { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
46 |
var elapsed, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
47 |
now = Date.now(), |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
48 |
t1 = d3_timer_queue; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
49 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
50 |
while (t1) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
51 |
elapsed = now - t1.then; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
52 |
if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
53 |
t1 = t1.next; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
54 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
55 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
56 |
var delay = d3_timer_flush() - now; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
57 |
if (delay > 24) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
58 |
if (isFinite(delay)) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
59 |
clearTimeout(d3_timer_timeout); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
60 |
d3_timer_timeout = setTimeout(d3_timer_step, delay); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
61 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
62 |
d3_timer_interval = 0; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
63 |
} else { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
64 |
d3_timer_interval = 1; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
65 |
d3_timer_frame(d3_timer_step); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
66 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
67 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
68 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
69 |
d3.timer.flush = function() { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
70 |
var elapsed, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
71 |
now = Date.now(), |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
72 |
t1 = d3_timer_queue; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
73 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
74 |
while (t1) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
75 |
elapsed = now - t1.then; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
76 |
if (!t1.delay) t1.flush = t1.callback(elapsed); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
77 |
t1 = t1.next; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
78 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
79 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
80 |
d3_timer_flush(); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
81 |
}; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
82 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
83 |
// Flush after callbacks, to avoid concurrent queue modification. |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
84 |
function d3_timer_flush() { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
85 |
var t0 = null, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
86 |
t1 = d3_timer_queue, |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
87 |
then = Infinity; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
88 |
while (t1) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
89 |
if (t1.flush) { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
90 |
t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
91 |
} else { |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
92 |
then = Math.min(then, t1.then + t1.delay); |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
93 |
t1 = (t0 = t1).next; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
94 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
95 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
96 |
return then; |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
97 |
} |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
98 |
|
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
99 |
var d3_timer_frame = window.requestAnimationFrame |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
100 |
|| window.webkitRequestAnimationFrame |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
101 |
|| window.mozRequestAnimationFrame |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
102 |
|| window.oRequestAnimationFrame |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
103 |
|| window.msRequestAnimationFrame |
|
c0b4a8b5a012
add toolkit.html + démonstrateurs
Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
parents:
diff
changeset
|
104 |
|| function(callback) { setTimeout(callback, 17); }; |