{"version":3,"file":"Dialog.mjs","sources":["../src/Dialog.ts"],"sourcesContent":["import { Container, Graphics, NineSliceSprite, ObservablePoint, Sprite, Texture, Ticker } from 'pixi.js';\nimport { Group, Tween } from 'tweedle.js';\nimport { Signal } from 'typed-signals';\nimport { Button } from './Button';\nimport { type ButtonOptions, FancyButton } from './FancyButton';\nimport { List, type ListOptions } from './List';\nimport { ScrollBox, ScrollBoxOptions } from './ScrollBox';\nimport { AnyText, getTextView, PixiText } from './utils/helpers/text';\nimport { getView, type GetViewSettings } from './utils/helpers/view';\n\ntype Animation = {\n    props: Record<string, any>;\n    duration?: number;\n};\n\nexport type DialogOptions = {\n    backdrop?: GetViewSettings;\n    backdropColor?: number;\n    backdropAlpha?: number;\n    background: GetViewSettings;\n    title?: AnyText;\n    content?: AnyText | Container | Container[];\n    width?: number;\n    height?: number;\n    padding?: number;\n    buttons?: (ButtonOptions | FancyButton | Button)[];\n    buttonList?: ListOptions<Container>;\n    scrollBox?: ScrollBoxOptions;\n    animations?: {\n        open?: Animation;\n        close?: Animation;\n    };\n    closeOnBackdropClick?: boolean;\n    nineSliceSprite?: [number, number, number, number];\n};\n\n/**\n * Modal dialog component for asking users questions.\n * @example\n * const dialog = new Dialog({\n *     background: new Graphics().roundRect(0, 0, 400, 200, 20).fill(0xFFFFFF),\n *     title: 'Confirm',\n *     content: 'Are you sure?',\n *     buttons: [\n *         { text: 'Cancel' },\n *         { text: 'OK' }\n *     ]\n * });\n * dialog.onSelect.connect((index, text) => {\n *     console.log(`Button ${index} clicked: ${text}`);\n * });\n * dialog.open();\n */\nexport class Dialog extends Container\n{\n    protected backdrop: Container;\n    protected innerView?: Container | NineSliceSprite;\n    protected contentView: Container;\n    protected titleText?: PixiText;\n    protected contentBody?: Container;\n    protected scrollBox: ScrollBox;\n    protected buttonContainer: List;\n\n    protected readonly options: DialogOptions;\n\n    protected _isOpen: boolean = false;\n\n    /** Signal emitted when a button is selected. */\n    onSelect: Signal<(buttonIndex: number, buttonText: string) => void>;\n    /** Signal emitted when the dialog is closed. */\n    onClose: Signal<() => void>;\n\n    /**\n     * Modal dialog component for asking users questions.\n     * @param {DialogOptions} options - Configuration options for the dialog.\n     * @param {string | Texture | Container | Sprite | Graphics} options.backdrop - Backdrop view or settings.\n     * @param {number} options.backdropColor - Color of the backdrop (if backdrop is not provided).\n     * @param {number} options.backdropAlpha - Alpha of the backdrop (if backdrop is not provided).\n     * @param {string | Texture | Container | Sprite | Graphics} options.background -\n     * Background view or settings for the dialog.\n     * @param {string | Texture | Container | Sprite | Graphics} options.title -\n     * Title text or settings for the dialog.\n     * @param {string | Texture | Container | Sprite | Graphics | Container[]} options.content -\n     * Content text, view, or array of views for the dialog.\n     * @param {number} options.width - Width of the dialog.\n     * @param {number} options.height - Height of the dialog.\n     * @param {number} options.padding - Padding around the dialog content.\n     * @param {(ButtonOptions | FancyButton | Button)[]} options.buttons - Array of button configurations or instances.\n     * @param {ListOptions<Container>} options.buttonList - Configuration options for the button list layout.\n     * @param {ScrollBoxOptions} options.scrollBox - Configuration options for the scroll box containing the content.\n     * @param {object} options.animations - Animation settings for opening and closing the dialog.\n     * @param {Animation} options.animations.open - Animation settings for opening the dialog.\n     * @param {Animation} options.animations.close - Animation settings for closing the dialog.\n     * @param {boolean} options.closeOnBackdropClick - Whether to close the dialog when clicking on the backdrop.\n     * @param {[number, number, number, number]} options.nineSliceSprite - Nine-slice scaling settings for the background.\n     */\n    constructor(options: DialogOptions)\n    {\n        super();\n\n        this.options = options;\n        this.onSelect = new Signal();\n        this.onClose = new Signal();\n\n        this.backdrop = new Container();\n        this.contentView = new Container();\n        this.buttonContainer = new List({\n            type: 'horizontal',\n            elementsMargin: 10,\n            ...options.buttonList,\n        });\n\n        this.initBackdrop();\n        this.initInnerView();\n        this.initTitle();\n        this.initButtons();\n\n        const offset = this.dialogPadding;\n        const { width } = this.options;\n        let { height } = this.options;\n\n        if (height)\n        {\n            height = height - (offset * 2) - this.buttonContainer.height;\n\n            if (this.titleText?.height)\n            {\n                height -= this.titleText.height;\n            }\n        }\n\n        this.scrollBox = new ScrollBox({\n            background: 0x000000,\n            elementsMargin: 10,\n            radius: 0,\n            type: 'bidirectional',\n            padding: 10,\n            ...this.options.scrollBox,\n            width: width ? width - (offset * 2) : 0,\n            height,\n        });\n\n        this.innerView?.addChild(this.scrollBox);\n\n        this.visible = false;\n\n        this.initContent();\n\n        // Setup ticker for tween animations\n        Ticker.shared.add(() => Group.shared.update());\n    }\n\n    /** Gets the dialog width from options or innerView. */\n    protected get dialogWidth(): number\n    {\n        return this.options.width ?? this.innerView?.width ?? 0;\n    }\n\n    /** Gets the dialog height from options or innerView. */\n    protected get dialogHeight(): number\n    {\n        return this.options.height ?? this.innerView?.height ?? 0;\n    }\n\n    /** Gets the dialog padding from options. */\n    protected get dialogPadding(): number\n    {\n        return this.options.padding ?? 20;\n    }\n\n    /** Gets the open state of the dialog. */\n    get isOpen(): boolean\n    {\n        return this._isOpen;\n    }\n\n    /** Initializes the backdrop (semi-transparent background). */\n    protected initBackdrop(): void\n    {\n        if (this.options.backdrop)\n        {\n            this.backdrop = getView(this.options.backdrop);\n        }\n        else\n        {\n            const backdropSprite = new Sprite(Texture.WHITE);\n\n            backdropSprite.tint = this.options.backdropColor ?? 0x000000;\n            backdropSprite.alpha = this.options.backdropAlpha ?? 0.5;\n            backdropSprite.width = 10000;\n            backdropSprite.height = 10000;\n            this.backdrop = backdropSprite;\n        }\n\n        this.backdrop.eventMode = 'static';\n        this.backdrop.x = -5000;\n        this.backdrop.y = -5000;\n\n        if (this.options.closeOnBackdropClick)\n        {\n            this.backdrop.on('pointertap', () => this.close());\n        }\n\n        this.addChild(this.backdrop);\n    }\n\n    /** Initializes the inner view (background panel). */\n    protected initInnerView(): void\n    {\n        const { background, nineSliceSprite } = this.options;\n\n        if (nineSliceSprite)\n        {\n            if (typeof background === 'string')\n            {\n                this.innerView = new NineSliceSprite({\n                    texture: Texture.from(background),\n                    leftWidth: nineSliceSprite[0],\n                    topHeight: nineSliceSprite[1],\n                    rightWidth: nineSliceSprite[2],\n                    bottomHeight: nineSliceSprite[3],\n                });\n            }\n            else if (background instanceof Texture)\n            {\n                this.innerView = new NineSliceSprite({\n                    texture: background,\n                    leftWidth: nineSliceSprite[0],\n                    topHeight: nineSliceSprite[1],\n                    rightWidth: nineSliceSprite[2],\n                    bottomHeight: nineSliceSprite[3],\n                });\n            }\n            else\n            {\n                console.warn(\n                    'NineSliceSprite can not be used with views set as Container. '\n                    + 'Pass the texture or texture name as instead of the Container extended instance.',\n                );\n                this.innerView = getView(background);\n            }\n        }\n        else\n        {\n            this.innerView = getView(background);\n        }\n\n        if (this.options.width && this.options.height)\n        {\n            if (this.innerView instanceof NineSliceSprite)\n            {\n                this.innerView.width = this.options.width;\n                this.innerView.height = this.options.height;\n            }\n            else if (this.innerView instanceof Graphics)\n            {\n                this.innerView.width = this.options.width;\n                this.innerView.height = this.options.height;\n            }\n        }\n\n        if ('anchor' in this.innerView)\n        {\n            (this.innerView.anchor as ObservablePoint).set(0.5, 0.5);\n        }\n        else\n        {\n            this.innerView.pivot.set(this.dialogWidth / 2, this.dialogHeight / 2);\n        }\n\n        this.innerView.eventMode = 'static';\n\n        this.addChild(this.innerView);\n        this.innerView.addChild(this.contentView);\n    }\n\n    /** Initializes the title text if provided. */\n    protected initTitle(): void\n    {\n        if (!this.options.title) return;\n\n        this.titleText = getTextView(this.options.title);\n        if ('anchor' in this.titleText)\n        {\n            (this.titleText.anchor as ObservablePoint).set(0.5, 0);\n        }\n\n        this.titleText.x = this.dialogWidth / 2;\n        this.titleText.y = this.dialogPadding;\n\n        this.contentView.addChild(this.titleText);\n    }\n\n    /** Initializes the content area, optionally wrapped in ScrollBox. */\n    protected initContent(): void\n    {\n        if (!this.options.content) return;\n\n        let yOffset = this.dialogPadding;\n\n        if (this.titleText)\n        {\n            yOffset += this.titleText.height;\n        }\n\n        if (typeof this.options.content === 'string' || typeof this.options.content === 'number')\n        {\n            const textView = getTextView(this.options.content);\n\n            this.scrollBox.addItem(textView);\n        }\n        else\n            if (Array.isArray(this.options.content))\n            {\n                this.options.content.forEach((item) => this.scrollBox.addItem(item));\n            }\n            else\n            {\n                this.scrollBox.addItem(this.options.content);\n            }\n\n        this.scrollBox.x = this.dialogPadding;\n        this.scrollBox.y = yOffset;\n\n        this.contentView.addChild(this.scrollBox);\n    }\n\n    /** Initializes the buttons at the bottom of the dialog. */\n    protected initButtons(): void\n    {\n        if (!this.options.buttons || this.options.buttons.length === 0)\n        {\n            return;\n        }\n\n        const buttonConfigs = this.options.buttons;\n\n        buttonConfigs.forEach((btn, index) =>\n        {\n            let button: Button | FancyButton;\n\n            switch (true)\n            {\n                case btn instanceof Button:\n                    btn.onPress.connect(() =>\n                    {\n                        this.onSelect.emit(index, '');\n                    });\n\n                    if (btn.view)\n                    {\n                        this.buttonContainer.addChild(btn.view);\n                    }\n                    break;\n                case btn instanceof FancyButton:\n                    btn.onPress.connect(() =>\n                    {\n                        this.onSelect.emit(index, (btn as FancyButton).text ?? '');\n                    });\n                    this.buttonContainer.addChild(btn);\n                    break;\n\n                default:\n                    button = new FancyButton(btn);\n\n                    button.onPress.connect(() =>\n                    {\n                        this.onSelect.emit(index, (button as FancyButton).text ?? '');\n                    });\n                    this.buttonContainer.addChild(button);\n                    break;\n            }\n        });\n\n        this.buttonContainer.x = (this.dialogWidth / 2) - (this.buttonContainer.width / 2);\n        this.buttonContainer.y = this.dialogHeight - this.dialogPadding - this.buttonContainer.height;\n\n        this.contentView.addChild(this.buttonContainer);\n    }\n\n    /** Opens the dialog with animation. */\n    open(): void\n    {\n        if (!this.innerView) return;\n\n        this.visible = true;\n        this._isOpen = true;\n\n        const openAnimation = this.options.animations?.open;\n\n        if (!openAnimation)\n        {\n            // No animation - set immediately\n            this.backdrop.alpha = this.options.backdropAlpha ?? 0.5;\n            this.innerView.scale.set(1);\n\n            return;\n        }\n\n        // Use animation\n        this.backdrop.alpha = 0;\n        this.innerView.scale.set(0.8);\n\n        const duration = openAnimation.duration ?? 300;\n\n        new Tween(this.backdrop)\n            .to({ alpha: this.options.backdropAlpha ?? 0.5 }, duration)\n            .start();\n\n        new Tween(this.innerView.scale)\n            .to({ x: 1, y: 1 }, duration)\n            .start();\n    }\n\n    /** Closes the dialog with animation. */\n    close(): void\n    {\n        if (!this.innerView) return;\n\n        const closeAnimation = this.options.animations?.close;\n\n        if (!closeAnimation)\n        {\n            // No animation - set immediately\n            this.visible = false;\n            this._isOpen = false;\n\n            this.onClose.emit();\n\n            return;\n        }\n\n        // Use animation\n        const duration = closeAnimation.duration ?? 300;\n\n        new Tween(this.backdrop)\n            .to({ alpha: 0 }, duration)\n            .start();\n\n        new Tween(this.innerView.scale)\n            .to({ x: 0.8, y: 0.8 }, duration)\n            .onComplete(() =>\n            {\n                this.visible = false;\n                this._isOpen = false;\n                this.onClose.emit();\n            })\n            .start();\n    }\n\n    /** Shows the dialog (alias for open). */\n    show(): void\n    {\n        this.open();\n    }\n\n    /** Hides the dialog (alias for close). */\n    hide(): void\n    {\n        this.close();\n    }\n}\n"],"names":[],"mappings":"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"}