egroupware_official/phpgwapi/js/dynapi/fx/pathanim.js

97 lines
2.5 KiB
JavaScript

/*
DS: the extra features of this version will possibly be rebuilt as an advanced timeline object
DynAPI Distribution
PathAnimation Class
The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
requires: dynapi.fx.Thread
*/
function PathAnimation(dlyr) {
this.Thread = Thread;
this.Thread(dlyr);
this.paths = [];
this.pathPlaying = null;
}
var p = dynapi.setPrototype('PathAnimation','Thread');
p.add = function (path, loops, resets) {
var n = this.paths.length;
this.paths[n] = path;
this.setLoops(n,loops);
this.setResets(n,resets);
this.setFrame(n,0);
return n;
};
p.setLoops = function (n, loops) {
this.paths[n].loops = (loops);
};
p.setResets = function (n, resets) {
this.paths[n].resets = (resets);
};
p.setFrame = function (n, frame) {
this.paths[n].frame = frame;
};
p.playAnimation = function (noevt) {
if (!this.playing) {
this.pathPlaying = null;
if (arguments[0]==null) arguments[0] = 0;
if (typeof(arguments[0]) == "number") {
this.pathPlaying = this.paths[arguments[0]];
}
else if (typeof(arguments[0]) == "object") {
this.pathPlaying = arguments[0];
this.pathPlaying.loops = arguments[1]||false;
this.pathPlaying.resets = arguments[2]||false;
this.pathPlaying.frame = 0;
}
this.playing = true;
if (this.dlyr!=null && noevt!=false) this.dlyr.invokeEvent("pathstart");
this.start();
}
};
//p._Thread_stop = Thread.prototype.stop;
p.stopAnimation = function (noevt) {
if (this.pathPlaying && this.pathPlaying.resets && this.dlyr!=null) this.dlyr.setLocation(this.pathPlaying[0],this.pathPlaying[1]);
this.stop();
this.pathPlaying = null;
this.playing = false;
if (this.dlyr!=null && noevt!=false) this.dlyr.invokeEvent("pathstop");
};
p.run = function () {
if (!this.playing || this.pathPlaying==null) return;
var anim = this.pathPlaying;
if (anim.frame>=anim.length/2) {
if (anim.loops) {
anim.frame = 0;
}
else if (anim.resets) {
anim.frame = 0;
if (this.dlyr!=null) this.dlyr.setLocation(anim[0],anim[1]);
this.stopAnimation();
this.dlyr.invokeEvent("pathfinish");
return;
}
else {
anim.frame = 0;
this.stopAnimation();
this.dlyr.invokeEvent("pathfinish");
return;
}
}
if (anim.frame==0 && (this.dlyr!=null && this.dlyr.x==anim[0] && this.dlyr.y==anim[1])) {
anim.frame += 1;
}
this.newX = anim[anim.frame*2];
this.newY = anim[anim.frame*2+1];
if (this.dlyr!=null) {
this.dlyr.invokeEvent("pathrun");
this.dlyr.setLocation(this.newX,this.newY);
}
anim.frame++;
};