cytoscape
Version:
Graph theory (a.k.a. network) library for analysis and visualisation
121 lines (87 loc) • 2.55 kB
JavaScript
import step from './step.mjs';
import startAnimation from './start.mjs';
function stepAll( now, cy ){
let eles = cy._private.aniEles;
let doneEles = [];
function stepOne( ele, isCore ){
let _p = ele._private;
let current = _p.animation.current;
let queue = _p.animation.queue;
let ranAnis = false;
// if nothing currently animating, get something from the queue
if( current.length === 0 ){
let next = queue.shift();
if( next ){
current.push( next );
}
}
let callbacks = function( callbacks ){
for( let j = callbacks.length - 1; j >= 0; j-- ){
let cb = callbacks[ j ];
cb();
}
callbacks.splice( 0, callbacks.length );
};
// step and remove if done
for( let i = current.length - 1; i >= 0; i-- ){
let ani = current[ i ];
let ani_p = ani._private;
if( ani_p.stopped ){
current.splice( i, 1 );
ani_p.hooked = false;
ani_p.playing = false;
ani_p.started = false;
callbacks( ani_p.frames );
continue;
}
if( !ani_p.playing && !ani_p.applying ){ continue; }
// an apply() while playing shouldn't do anything
if( ani_p.playing && ani_p.applying ){
ani_p.applying = false;
}
if( !ani_p.started ){
startAnimation( ele, ani, now, isCore );
}
step( ele, ani, now, isCore );
if( ani_p.applying ){
ani_p.applying = false;
}
callbacks( ani_p.frames );
if( ani_p.step != null ){
ani_p.step(now);
}
if( ani.completed() ){
current.splice( i, 1 );
ani_p.hooked = false;
ani_p.playing = false;
ani_p.started = false;
callbacks( ani_p.completes );
}
ranAnis = true;
}
if( !isCore && current.length === 0 && queue.length === 0 ){
doneEles.push( ele );
}
return ranAnis;
} // stepElement
// handle all eles
let ranEleAni = false;
for( let e = 0; e < eles.length; e++ ){
let ele = eles[ e ];
let handledThisEle = stepOne( ele );
ranEleAni = ranEleAni || handledThisEle;
} // each element
let ranCoreAni = stepOne( cy, true );
// notify renderer
if( ranEleAni || ranCoreAni ){
if( eles.length > 0 ){
cy.notify('draw', eles);
} else {
cy.notify('draw');
}
}
// remove elements from list of currently animating if its queues are empty
eles.unmerge( doneEles );
cy.emit('step');
} // stepAll
export default stepAll;