forked from creaktive/iStat-Pro.wdgt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Animator.js
136 lines (114 loc) · 3.39 KB
/
Animator.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
127
128
129
130
131
132
133
134
135
136
var kSubAnimatorModeConcurrent = 0;
var kSubAnimatorModeFollow = 1;
var kAnimatorCallBackValue = 1;
var kAnimatorCallBackStep = 2;
function AnimationController() {
var _self = this;
this.mode = 0;
this.active = false;
this.animators = Array();
this.callbacks = Array();
this.stepCallbacks = Array();
this.timerCallback = function(){ _self.tick(); };
}
// Remove all animation objects
AnimationController.prototype.purge = function(){
this.animators.length = 0;
}
// Remove all callbacks
AnimationController.prototype.purgeCallbacks = function(){
this.callbacks.length = 0;
}
// Remove all step based callbacks
AnimationController.prototype.purgeStepCallbacks = function(){
this.stepCallbacks.length = 0;
}
// add a group of animation objects
AnimationController.prototype.pushGroup = function(animators){
this.animators.push(animators);
}
// add a single animation object
AnimationController.prototype.pushAnimator = function(animator){
this.animators.push(Array(animator));
}
// Add a new callback
AnimationController.prototype.pushCallback = function(callback){
this.callbacks.push(callback);
}
// Add a new step based callback
AnimationController.prototype.pushStepCallback = function(callback){
this.stepCallbacks.push(callback);
}
// creates a callback with the specified options
AnimationController.prototype.callbackWithOptions = function(mode, func){
callback = {callback:func, mode:mode};
return callback;
}
// Create and return a new step based callback. These are called at a specific timer tick unlike the normal callbacks which are called once animation has finished
AnimationController.prototype.callbackAtStep = function(step, funct){
var callback = new Object();
callback.step = step;
callback.callback = funct;
return callback;
}
// Prepare to animate. Sets the total timer and number of steps. The timer interval is determined based on those 2 values
AnimationController.prototype.prepare = function(time, steps){
this.steps = steps;
this.interval = time / steps;
this.time = time;
}
// Animate !!
AnimationController.prototype.run = function(time, steps){
this.active = true;
this.currentStep = 0;
this.timer = setInterval(this.timerCallback, this.interval);
}
// Cancel animation but dont finish any phases
AnimationController.prototype.cancelWithoutFinishing = function(){
if(this.timer)
clearInterval(this.timer);
this.timer = null
this.active = false;
}
// Cancel animation.
AnimationController.prototype.cancel = function(){
if(this.timer)
clearInterval(this.timer);
this.timer = null
this.active = false;
if(this.animators.length > 0){
for(a=0;a<this.animators.length;a++){
var group = this.animators[a];
for(b=0;b<group.length;b++){
if(!group[b].finished)
group[b].finish();
}
}
}
for(a=0;a<this.callbacks.length;a++){
this.callbacks[a]();
}
}
// Timer tick. Update each phase of each animation object
AnimationController.prototype.tick = function(){
for(x=0;x<this.stepCallbacks.length;x++){
if(this.stepCallbacks[x].step == this.currentStep)
this.stepCallbacks[x].callback();
}
for(x=0;x<this.animators.length;x++){
var group = this.animators[x];
for(y=0;y<group.length;y++){
group[y].tick(this.currentStep);
}
}
if(this.currentStep >= this.steps){
clearInterval(this.timer);
this.timer = null
this.active = false;
for(x=0;x<this.callbacks.length;x++){
this.callbacks[x](this);
}
return;
}
this.currentStep++;
}