UNPKG

2.54 kBJavaScriptView Raw
1import step from './step';
2import startAnimation from './start';
3
4function stepAll( now, cy ){
5 let eles = cy._private.aniEles;
6 let doneEles = [];
7
8 function stepOne( ele, isCore ){
9 let _p = ele._private;
10 let current = _p.animation.current;
11 let queue = _p.animation.queue;
12 let ranAnis = false;
13
14 // if nothing currently animating, get something from the queue
15 if( current.length === 0 ){
16 let next = queue.shift();
17
18 if( next ){
19 current.push( next );
20 }
21 }
22
23 let callbacks = function( callbacks ){
24 for( let j = callbacks.length - 1; j >= 0; j-- ){
25 let cb = callbacks[ j ];
26
27 cb();
28 }
29
30 callbacks.splice( 0, callbacks.length );
31 };
32
33 // step and remove if done
34 for( let i = current.length - 1; i >= 0; i-- ){
35 let ani = current[ i ];
36 let ani_p = ani._private;
37
38 if( ani_p.stopped ){
39 current.splice( i, 1 );
40
41 ani_p.hooked = false;
42 ani_p.playing = false;
43 ani_p.started = false;
44
45 callbacks( ani_p.frames );
46
47 continue;
48 }
49
50 if( !ani_p.playing && !ani_p.applying ){ continue; }
51
52 // an apply() while playing shouldn't do anything
53 if( ani_p.playing && ani_p.applying ){
54 ani_p.applying = false;
55 }
56
57 if( !ani_p.started ){
58 startAnimation( ele, ani, now, isCore );
59 }
60
61 step( ele, ani, now, isCore );
62
63 if( ani_p.applying ){
64 ani_p.applying = false;
65 }
66
67 callbacks( ani_p.frames );
68
69 if( ani_p.step != null ){
70 ani_p.step(now);
71 }
72
73 if( ani.completed() ){
74 current.splice( i, 1 );
75
76 ani_p.hooked = false;
77 ani_p.playing = false;
78 ani_p.started = false;
79
80 callbacks( ani_p.completes );
81 }
82
83 ranAnis = true;
84 }
85
86 if( !isCore && current.length === 0 && queue.length === 0 ){
87 doneEles.push( ele );
88 }
89
90 return ranAnis;
91 } // stepElement
92
93 // handle all eles
94 let ranEleAni = false;
95 for( let e = 0; e < eles.length; e++ ){
96 let ele = eles[ e ];
97 let handledThisEle = stepOne( ele );
98
99 ranEleAni = ranEleAni || handledThisEle;
100 } // each element
101
102 let ranCoreAni = stepOne( cy, true );
103
104 // notify renderer
105 if( ranEleAni || ranCoreAni ){
106 if( eles.length > 0 ){
107 cy.notify('draw', eles);
108 } else {
109 cy.notify('draw');
110 }
111 }
112
113 // remove elements from list of currently animating if its queues are empty
114 eles.unmerge( doneEles );
115
116 cy.emit('step');
117
118} // stepAll
119
120export default stepAll;