redshift
Version:
A JavaScript UX framework. Handles animation, UI physics and user input tracking.
170 lines (133 loc) • 4.06 kB
JavaScript
"use strict";
var theLoop = require('./loop.js'),
ProcessManager = function () {
this.all = {};
this.active = [];
this.deactivateQueue = [];
theLoop.setCallback(this, this.fireActive);
};
ProcessManager.prototype = {
/*
[int]: Used for process ID
*/
processCounter: 0,
/*
[int]: Number of active processes
*/
activeCount: 0,
/*
Get the process with a given index
@param [int]: Index of process
@return [Process]
*/
getProcess: function (i) {
return this.all[i];
},
/*
Get number of active processes
@return [int]: Number of active processes
*/
getActiveCount: function () {
return this.activeCount;
},
/*
Get active tokens
@return [array]: Active tokens
*/
getActive: function () {
return this.active;
},
/*
Get the length of the deactivate queue
@return [int]: Length of queue
*/
getQueueLength: function () {
return this.deactivateQueue.length;
},
/*
Fire all active processes
@param [int]: Timestamp of executing frames
@param [int]: Time since previous frame
@return [boolean]: True if active processes found
*/
fireActive: function (framestamp, elapsed) {
var process,
activeCount = 0,
activeProcesses = [];
// Purge and check active count before execution
this.purge();
activeCount = this.getActiveCount();
activeProcesses = this.getActive();
// Loop through active processes and fire callback
for (var i = 0; i < activeCount; i++) {
process = this.getProcess(activeProcesses[i]);
if (process) {
process.fire(framestamp, elapsed);
}
}
// Repurge and recheck active count after execution
this.purge();
activeCount = this.getActiveCount();
return activeCount ? true : false;
},
/*
Register a new process
@param [Process]
@return [int]: Index of process to be used as ID
*/
register: function (process) {
var id = this.processCounter;
this.all[id] = process;
this.processCounter++;
return id;
},
/*
Activate a process
@param [int]: Index of active process
*/
activate: function (i) {
var queueIndex = this.deactivateQueue.indexOf(i),
isQueued = (queueIndex > -1),
isActive = (this.active.indexOf(i) > -1);
// Remove from deactivateQueue if in there
if (isQueued) {
this.deactivateQueue.splice(queueIndex, 1);
}
// Add to active processes array if not already in there
if (!isActive) {
this.active.push(i);
this.activeCount++;
theLoop.start(this);
}
},
/*
Deactivate a process
@param [int]: Index of process to add to deactivate queue
*/
deactivate: function (i) {
this.deactivateQueue.push(i);
},
/*
Purge the deactivate queue
*/
purge: function () {
var activeIndex,
queueLength = this.getQueueLength();
while (queueLength--) {
activeIndex = this.active.indexOf(this.deactivateQueue[queueLength]);
// If process in active list deactivate
if (activeIndex > -1) {
this.active.splice(activeIndex, 1);
this.activeCount--;
}
}
this.deactivateQueue = [];
},
/*
Remove the provided id and reindex remaining processes
*/
kill: function (id) {
delete this.all[id];
}
};
module.exports = new ProcessManager();