{"version":3,"file":"Animator.mjs","sources":["../../src/animate/Animator.ts"],"sourcesContent":["import { AnimatorTimeline } from './AnimatorTimeline';\nimport type { MovieClip } from './MovieClip';\n\n// Static collection of timelines\nconst timelines: AnimatorTimeline[] = [];\n\n/**\n * Play animation via start/stop frame labels\n * @class Animator\n */\nexport class Animator\n{\n    /**\n     * The collection of timelines\n     */\n    private static get _timelines(): AnimatorTimeline[]\n    {\n        return timelines;\n    }\n\n    /**\n     * Suffix added to label for a stop.\n     */\n    static get STOP_LABEL(): string\n    {\n        return '_stop';\n    }\n\n    /**\n     * Suffix added to label for a loop.\n     */\n    static get LOOP_LABEL(): string\n    {\n        return '_loop';\n    }\n\n    /**\n     * Play the entire duration of the MovieClip.\n     * @param instance - Movie clip to play.\n     * @param callback - Optional callback when complete\n     * @return Timeline object for stopping or getting progress.\n     */\n    static play(instance: MovieClip, callback?: () => void): AnimatorTimeline;\n    /**\n     * Play an animation by frame labels. For instance, play animation sequence from\n     * 'idle' to 'idle_stop' or 'idle_loop'. If no event label is provided, will\n     * play the entire duration of the MovieClip.\n     * @param instance - Movie clip to play.\n     * @param label - The frame label event to call, if no event is provided\n     *        will use the entire length of the MovieClip.\n     * @param callback - Optional callback when complete\n     * @return Timeline object for stopping or getting progress.\n     */\n    static play(instance: MovieClip, label: string, callback?: () => void): AnimatorTimeline;\n    static play(instance: MovieClip, label?: string | (() => void), callback?: () => void): AnimatorTimeline\n    {\n        let loop = false;\n        let start;\n        let end;\n\n        if (!label || typeof label === 'function')\n        {\n            start = 0;\n            end = instance.totalFrames - 1;\n            if (label && typeof label === 'function')\n            {\n                callback = label;\n                label = null;\n            }\n        }\n        else\n        {\n            start = instance.labelsMap[label];\n            end = instance.labelsMap[label + this.STOP_LABEL];\n            if (end === undefined)\n            {\n                end = instance.labelsMap[label + this.LOOP_LABEL];\n                loop = true;\n            }\n            if (start === undefined)\n            {\n                throw new Error(`No start label matching \"${label}\"`);\n            }\n            else if (end === undefined)\n            {\n                throw new Error(`No end label matching \"${label}\"`);\n            }\n        }\n\n        return this.fromTo(\n            instance,\n            start,\n            end,\n            loop,\n            callback,\n        );\n    }\n\n    /**\n     * Play an animation from the current frame to an end frame or label.\n     * @param instance - Movie clip to play.\n     * @param end - The end frame or label.\n     * @param callback - Optional callback when complete\n     * @return Timeline object for stopping or getting progress.\n     */\n    static to(instance: MovieClip, end: string | number, callback?: () => void): AnimatorTimeline\n    {\n        return this.fromTo(\n            instance,\n            instance.currentFrame,\n            end,\n            false,\n            callback,\n        );\n    }\n\n    /**\n     * Play a MovieClip from a start to end frame.\n     * @param instance - Movie clip to play.\n     * @param start - The starting frame index or label.\n     * @param end - The ending frame index or label.\n     * @param loop - If the animation should loop.\n     * @param callback - Optional callback when complete\n     * @return Timeline object for stopping or getting progress.\n     */\n    static fromTo(instance: MovieClip,\n        start: number | string,\n        end: number | string,\n        loop?: boolean,\n        callback?: () => void): AnimatorTimeline\n    {\n        if (typeof start === 'string')\n        {\n            const startLabel = start;\n\n            start = instance.labelsMap[startLabel];\n            if (start === undefined)\n            {\n                throw new Error(`No start label matching \"${startLabel}\"`);\n            }\n        }\n        if (typeof end === 'string')\n        {\n            const endLabel = end;\n\n            end = instance.labelsMap[endLabel];\n            if (end === undefined)\n            {\n                throw new Error(`No end label matching \"${endLabel}\"`);\n            }\n        }\n        if (start < 0)\n        {\n            throw new Error('Start frame is out of bounds');\n        }\n        if (end >= instance.totalFrames)\n        {\n            throw new Error('End frame is out of bounds');\n        }\n        if (start >= end)\n        {\n            throw new Error('End frame is before start frame');\n        }\n\n        // Stop any animation that's playing\n        this.stop(instance);\n\n        loop = !!loop;\n\n        // Add a new timeline\n        const timeline = AnimatorTimeline.create(\n            instance,\n            start,\n            end,\n            loop,\n            callback,\n        );\n\n        this._timelines.push(timeline);\n\n        // Set the current frame\n        if (instance.currentFrame !== start)\n        {\n            instance.gotoAndPlay(start);\n        }\n        else\n        {\n            instance.play();\n        }\n\n        return timeline;\n    }\n\n    /**\n     * Stop the animation by instance.\n     * @param instance - Movie clip to play.\n     */\n    static stop(instance: MovieClip): void\n    {\n        for (let i = 0, len = this._timelines.length; i < len; i++)\n        {\n            const timeline = this._timelines[i];\n\n            if (timeline.instance === instance)\n            {\n                this._internalStop(timeline);\n                break;\n            }\n        }\n    }\n\n    /**\n     * Stop all the currently playing animations.\n     */\n    static stopAll(): void\n    {\n        for (let i = this._timelines.length - 1; i >= 0; i--)\n        {\n            this._internalStop(this._timelines[i]);\n        }\n    }\n\n    /**\n     * Stop the animation\n     * @private\n     * @param timeline - Timeline to stop.\n     */\n    static _internalStop(timeline: AnimatorTimeline): void\n    {\n        this._timelines.splice(this._timelines.indexOf(timeline), 1);\n        timeline.instance.stop();\n        timeline.destroy();\n    }\n}\n"],"names":[],"mappings":"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"}