{"version":3,"file":"Switcher.mjs","sources":["../src/Switcher.ts"],"sourcesContent":["import { Container } from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { getView, type GetViewSettings } from './utils/helpers/view';\nimport { ButtonEvent } from './utils/HelpTypes';\n\n/**\n * Container based component that switches visibility of a given containers by any of the interaction events.\n *\n * By default it switches on press.\n *\n * Can be used for creating buttons, tabs, radio buttons, checkboxes etc.\n * @example\n * // switch on onPress\n * const switch = new Swich([`switch_off.png`, `switch_on.png`]);\n *\n * // switch on hover\n * const button = new Swich([`button_default.png`, `button_hover.png`], ['onHover', 'onOut']);\n *\n * button.events.onPress.connect(() => console.log('button pressed'));\n */\nexport class Switcher extends Container\n{\n    protected _triggerEvents: Set<ButtonEvent> = new Set(['onPress']);\n\n    /** Container that holds all the content of the component. */\n    innerView: Container;\n\n    /** The id of the visible(active) view. */\n    protected _active: number | undefined;\n\n    /** Fired when active view changes. */\n    onChange: Signal<(state: number | boolean) => void>;\n\n    /**\n     * @param {Array<Container | string>} views - Array of views or textures that will be switching.\n     * @param triggerEvents - Button events, to switch views (can be one event or an array of events).\n     * @param activeViewID - The id of the view, visible by default.\n     */\n    constructor(\n        views?: Array<Container | string>,\n        triggerEvents?: ButtonEvent | ButtonEvent[],\n        activeViewID?: number,\n    )\n    {\n        super();\n\n        this.innerView = new Container();\n        this.addChild(this.innerView);\n\n        this.onChange = new Signal();\n\n        if (views) this.views = views;\n        if (triggerEvents) this.triggerEvents = triggerEvents;\n        if (activeViewID !== undefined && this.views.length > 0) this.active = activeViewID;\n\n        this.setInteractionEvents();\n    }\n\n    protected setInteractionEvents()\n    {\n        this.innerView.eventMode = 'static';\n\n        this.innerView.on('pointerdown', () => this.handleEvents('onDown'));\n        this.innerView.on('pointerup', () => this.handleEvents('onUp'));\n        this.innerView.on('pointerupoutside', () => this.handleEvents('onUpOut'));\n        this.innerView.on('pointerout', () => this.handleEvents('onOut'));\n        this.innerView.on('pointertap', () => this.handleEvents('onPress'));\n        this.innerView.on('pointerover', () => this.handleEvents('onHover'));\n    }\n\n    protected handleEvents(event: ButtonEvent)\n    {\n        if (this._triggerEvents.has(event))\n        {\n            this.switch();\n        }\n    }\n\n    /** Returns the active view. */\n    get activeView(): Container | undefined\n    {\n        if (this.views && this.active !== undefined && this.views[this.active])\n        {\n            return this.views[this.active] as Container;\n        }\n\n        return undefined;\n    }\n\n    /** Sets the list of instances for switching. */\n    set views(views: Array<Container | string>)\n    {\n        this.innerView.removeChildren();\n        views.forEach((stateView) => this.add(stateView));\n    }\n\n    /** Returns all the switchable views */\n    get views(): Array<Container>\n    {\n        return this.innerView.children as Array<Container>;\n    }\n\n    /**\n     * Adds view instance to a switching list.\n     * @param view\n     */\n    add(view: GetViewSettings): void\n    {\n        const viewInstance = getView(view);\n\n        this.innerView.addChild(viewInstance);\n\n        viewInstance.visible = false;\n\n        if (this.views.length === 1)\n        {\n            this.active = 0;\n        }\n    }\n\n    /**\n     * Removes view instance from a switching list by id.\n     * @param id - id of the view to remove.\n     */\n    remove(id: number)\n    {\n        if (this.views[id])\n        {\n            this.innerView.removeChild(this.views[id]);\n        }\n    }\n\n    /**\n     * Sets a list of events that will make a switcher switch to the next view.\n     * @param {ButtonEvent | ButtonEvent[]} triggerEvents - Button events,\n     * to switch views (can be one event or an array of events).\n     */\n    set triggerEvents(triggerEvents: ButtonEvent | ButtonEvent[])\n    {\n        this._triggerEvents = new Set(\n            Array.isArray(triggerEvents) ? triggerEvents : [triggerEvents],\n        );\n    }\n\n    /** Returns a list of events that will make a switcher switch to the next view. */\n    get triggerEvents(): ButtonEvent[]\n    {\n        return Array.from(this._triggerEvents);\n    }\n\n    /**\n     * Show a view by id, or to next one by order, if no ID provided.\n     * @param {number} id - optional id of the view to show. If not set, will switch to the next view.\n     */\n    switch(id?: number)\n    {\n        if (id !== undefined && id === this.active) return;\n\n        const exID = this.active;\n\n        this.forceSwitch(id);\n\n        if (exID !== this.active)\n        {\n            const res = this.views.length > 2 ? (this.active ?? 0) : (this.active === 1);\n\n            this.onChange.emit(res);\n        }\n    }\n\n    /**\n     * Switches a view to a given one without triggering the onChange event.\n     * @param {number} id - optional id of the view to show. If not set, will switch to the next view.\n     */\n    forceSwitch(id?: number)\n    {\n        if (id !== undefined && id === this.active) return;\n\n        if (this.activeView)\n        {\n            this.activeView.visible = false;\n        }\n\n        if (id !== undefined && !this.views[id])\n        {\n            throw new Error(`View with id ${id} does not exist.`);\n        }\n\n        this._active = id === undefined ? this.nextActive : id;\n\n        if (this._active === undefined)\n        {\n            return;\n        }\n\n        this.views[this._active].visible = true;\n    }\n\n    /** Returns the id of the next view in order. Or undefined, if order is empty. */\n    protected get nextActive(): number | undefined\n    {\n        if (this.views.length === 0) return undefined;\n\n        if (this.active === undefined) return 0;\n\n        return this.active < this.views.length - 1 ? this.active + 1 : 0;\n    }\n\n    /** Sets the id of the visible(active) view and shows to it. */\n    set active(id: number)\n    {\n        this.switch(id);\n    }\n\n    /** Gets the id of the visible(active) view. */\n    get active(): number | undefined\n    {\n        return this._active;\n    }\n}\n"],"names":[],"mappings":"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"}