import * as library from '../core/library.js';
import { animationtickers } from '../core/library.js';
import { mergeOver, isa_fn, isa_obj, xt, xtGet, convertTime, λnull } from '../core/utilities.js';import * as library from '../core/library.js';
import { animationtickers } from '../core/library.js';
import { mergeOver, isa_fn, isa_obj, xt, xtGet, convertTime, λnull } from '../core/utilities.js';locateTarget - a private function and attribute to help retrieve data from the scrawl-canvas library
const locateTargetSections = ['artefact', 'group', 'animation', 'tween', 'styles'];
const locateTarget = (item) => {
if(item && item.substring){
let result;
return (locateTargetSections.some(section => {
result = library[section][item];
return result;
})) ? result : false;
}
return false;
};export default function (P = {}) { let defaultAttributes = {order - integer Number (defaults to 1) - the order in which Tween/Actions run is determined by their order value: Tween/Actions with a lower order value run before those with a higher value
order: 1,ticker - String - the name-String of the Ticker the Tween/Action uses for its timeline
ticker: '',targets - Array containing the Scrawl-canvas objects on which the Tween/Action will act; one Tween/Action can modify attributes in multiple objects
targets: null,time - the timeline time when the Tween/Action activates and runs.
0 will run as soon as their associated Ticker timeline runs; values greater than 0 will delay their run until that time is reached on the timeline.3s is 3000 milliseconds; 200ms is 200 milliseconds30% - measured against the duration of the Ticker timeline. time: 0,action - a user-defined function which will run every time the Tween/Action completes an update - generally once each Display cycle while the Tween/Action is running
action: null,reverseOnCycleEnd - Boolean flag; when set, the Tween/Action will reverse its direction and continue running, rather than halt.
reverseOnCycleEnd: false,reversed - internal Boolean flag indicating whether the Tween/Action is running in forwards or backwards mode
reversed: false,
};
P.defs = mergeOver(P.defs, defaultAttributes); P.kill = function () {
let t,
ticker = this.ticker;
if (ticker === `${this.name}_ticker`) {
t = animationtickers[ticker];
if (t) t.kill();
}
else if (ticker) this.removeFromTicker(ticker);
this.deregister();
return true;
}; let G = P.getters,
S = P.setters; G.targets = function () {
return [].concat(this.targets);
};
S.targets = function (item = []) {
this.setTargets(item);
};action
S.action = function (item) {
this.action = item;
if (typeof this.action !== 'function') this.action = λnull;
};calculateEffectiveTime
The effective time is the time, relative to the Tween/Action’s associated Ticker timeline, when the Tween/Action will start running
P.calculateEffectiveTime = function (item) {
let time = xtGet(item, this.time),
calculatedTime = convertTime(time),
cTime = calculatedTime[1],
cType = calculatedTime[0],
ticker,
tickerDuration = 0;
this.effectiveTime = 0;
if (cType === '%' && cTime <= 100) {
if (this.ticker) {
ticker = animationtickers[this.ticker];
if (ticker) {
tickerDuration = ticker.effectiveDuration;
this.effectiveTime = tickerDuration * (cTime / 100);
}
}
}
else this.effectiveTime = cTime;
return this;
};addToTicker
P.addToTicker = function (item) {
let tick;
if (xt(item)) {
if (this.ticker && this.ticker !== item) this.removeFromTicker(this.ticker);
tick = animationtickers[item];
if (xt(tick)) {
this.ticker = item;
tick.subscribe(this.name);
this.calculateEffectiveTime();
}
}
return this;
};removeFromTicker
P.removeFromTicker = function (item) {
let tick;
item = (xt(item)) ? item : this.ticker;
if (item) {
tick = animationtickers[item];
if (xt(tick)) {
this.ticker = '';
tick.unsubscribe(this.name);
}
}
return this;
};setTargets
P.setTargets = function (items) {
items = [].concat(items);
let newTargets = [];
items.forEach(item => {
if (isa_fn(item)) {
if (isa_fn(item.set)) newTargets.push(item);
}
else if (isa_obj(item) && xt(item.name)) newTargets.push(item);
else {
let result = locateTarget(item);
if (result) newTargets.push(result);
}
});
this.targets = newTargets;
return this;
};addToTargets
P.addToTargets = function (items) {
items = [].concat(items);
items.forEach(item => {
if (typeof item === 'function') {
if (typeof item.set === 'function') this.targets.push(item);
}
else {
result = locateTarget(item);
if (result) this.targets.push(result);
}
}, this);
return this;
};removeFromTargets
P.removeFromTargets = function (items) {
items = [].concat(items);
let identifiers = [],
newTargets = [].concat(this.targets);
newTargets.forEach(target => {
let type = target.type || 'unknown',
name = target.name || 'unnamed';
if (type !== 'unknown' && name !== 'unnamed') identifiers.push(`${type}_${name}`);
});
items.forEach(item => {
let myObj;
if (typeof item === 'function') myObj = item;
else myObj = locateTarget(item);
if (myObj) {
let type = myObj.type || 'unknown',
name = myObj.name || 'unnamed';
if (type !== 'unknown' && name !== 'unnamed') {
let objName = `${type}_${name}`,
doRemove = identifiers.indexOf(objName);
if (doRemove >= 0) newTargets[doRemove] = false;
}
}
});
this.targets = [];
newTargets.forEach(target => {
if (target) this.targets.push(target);
}, this);
return this;
};checkForTarget
P.checkForTarget = function (item) {
if (!item.substring) return false;
return this.targets.some(t => t.name === item);
};Return the prototype
return P;
};