{"version":3,"file":"Select.mjs","sources":["../src/Select.ts"],"sourcesContent":["import { Container, FillStyleInputs, Graphics, Text } from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { FancyButton } from './FancyButton';\nimport { ScrollBox, ScrollBoxOptions } from './ScrollBox';\nimport { PixiTextClass, PixiTextStyle } from './utils/helpers/text';\nimport { getView, type GetViewSettings } from './utils/helpers/view';\n\nconst defaultVisibleItems = 5;\n\ntype Offset = {\n    y: number;\n    x: number;\n};\n\nexport type SelectItemsOptions = {\n    items: string[];\n    backgroundColor: FillStyleInputs;\n    width: number;\n    height: number;\n    hoverColor?: FillStyleInputs;\n    textStyle?: PixiTextStyle;\n    TextClass?: PixiTextClass;\n    radius?: number;\n};\n\nexport type SelectOptions = {\n    closedBG: GetViewSettings;\n    openBG: GetViewSettings;\n    textStyle?: PixiTextStyle;\n    TextClass?: PixiTextClass;\n    selected?: number;\n    selectedTextOffset?: { x?: number; y?: number };\n\n    items: SelectItemsOptions;\n\n    scrollBoxOffset?: { x?: number; y?: number };\n    scrollBoxWidth?: number;\n    scrollBoxHeight?: number;\n    scrollBoxRadius?: number;\n\n    visibleItems?: number;\n\n    scrollBox?: ScrollBoxOptions & {\n        offset?: Offset;\n    };\n};\n\n/**\n * Container-based component that gives us a selection dropdown.\n *\n * It is a composition of a {@link Button} and a {@link ScrollBox}.\n * @example\n * new Select({\n *     closedBG: `select_closed.png`,\n *     openBG: `select_open.png`,\n *     textStyle: { fill: 0xffffff, fontSize: 20 },\n *     items: {\n *         items,\n *         backgroundColor: 0x000000,\n *         hoverColor: 0x000000,\n *         width: 200,\n *         height: 50,\n *     },\n *     scrollBox: {\n *         width: 200,\n *         height: 350,\n *         radius: 30,\n *     },\n * });\n */\n\nexport class Select extends Container\n{\n    protected view: Container = new Container();\n    protected openButton!: FancyButton;\n    protected closeButton!: FancyButton;\n    protected openView!: Container;\n    protected scrollBox: ScrollBox | undefined;\n\n    /** Selected value ID. */\n    value: number = -1;\n\n    /** Fires when selected value is changed. */\n    onSelect: Signal<(value: number, text: string) => void>;\n\n    constructor(options?: SelectOptions)\n    {\n        super();\n\n        this.addChild(this.view);\n        this.onSelect = new Signal();\n\n        if (options)\n        {\n            this.init(options);\n        }\n    }\n\n    /**\n     * Initiates Select.\n     * @param root0\n     * @param root0.closedBG\n     * @param root0.textStyle\n     * @param root0.items\n     * @param root0.openBG\n     * @param root0.selected\n     * @param root0.selectedTextOffset\n     * @param root0.scrollBox\n     * @param root0.visibleItems\n     * @param root0.TextClass\n     */\n    init({\n        closedBG,\n        textStyle,\n        TextClass,\n        items,\n        openBG,\n        selected,\n        selectedTextOffset,\n        scrollBox,\n        visibleItems,\n    }: SelectOptions)\n    {\n        TextClass = TextClass ?? Text;\n        if (this.openView && this.openView !== openBG)\n        {\n            this.view.removeChild(this.openView);\n        }\n\n        // openButton\n        if (!this.openButton)\n        {\n            this.openButton = new FancyButton({\n                defaultView: closedBG,\n                text: new TextClass({\n                    text: items?.items ? items.items[0] : '',\n                    style: textStyle,\n                }),\n                textOffset: selectedTextOffset,\n            });\n            this.openButton.onPress.connect(() => this.toggle());\n            this.addChild(this.openButton);\n        }\n        else\n        {\n            this.openButton.defaultView = getView(closedBG);\n            this.openButton.textView = new TextClass({\n                text: items?.items ? items.items[0] : '',\n                style: textStyle,\n            });\n\n            this.openButton.textOffset = selectedTextOffset ?? {};\n        }\n\n        // openView\n        if (this.openView !== openBG)\n        {\n            this.openView = getView(openBG);\n            this.view.visible = false;\n            this.view.addChild(this.openView);\n        }\n\n        // closeButton\n        if (!this.closeButton)\n        {\n            this.closeButton = new FancyButton({\n                defaultView: new Graphics()\n                    .rect(0, 0, this.openButton.width, this.openButton.height)\n                    .fill({ color: 0x000000, alpha: 0.00001 }),\n                text: new TextClass({\n                    text: items?.items ? items.items[0] : '',\n                    style: textStyle,\n                }),\n                textOffset: selectedTextOffset,\n            });\n            this.closeButton.onPress.connect(() => this.toggle());\n            this.view.addChild(this.closeButton);\n        }\n        else\n        {\n            this.closeButton.defaultView = new Graphics()\n                .rect(0, 0, this.openButton.width, this.openButton.height)\n                .fill({ color: 0x000000, alpha: 0.00001 });\n\n            this.closeButton.textView = new TextClass({\n                text: items?.items ? items.items[0] : '',\n                style: textStyle,\n            });\n\n            this.openButton.textOffset = selectedTextOffset ?? {};\n        }\n\n        // ScrollBox\n        if (!this.scrollBox)\n        {\n            this.scrollBox = new ScrollBox();\n\n            this.view.addChild(this.scrollBox);\n        }\n        else\n        {\n            this.scrollBox.removeItems();\n        }\n\n        this.scrollBox.init({\n            type: 'vertical',\n            elementsMargin: 0,\n            width: this.openButton.width,\n            height: this.openButton.height * (visibleItems ?? defaultVisibleItems),\n            radius: 0,\n            padding: 0,\n            ...scrollBox,\n        });\n\n        this.scrollBox.y = this.openButton.height;\n\n        if (scrollBox?.offset)\n        {\n            this.scrollBox.x = scrollBox.offset.x ?? 0;\n            this.scrollBox.y += scrollBox.offset.y ?? 0;\n        }\n\n        this.addItems(items, selected);\n    }\n\n    /**\n     * Adds items to the dropdown.\n     * @param items\n     * @param selected\n     */\n    addItems(items: SelectItemsOptions, selected = 0)\n    {\n        this.convertItemsToButtons(items).forEach((button, id) =>\n        {\n            const text = button.text;\n\n            if (id === selected)\n            {\n                this.openButton.text = text ?? '';\n                this.closeButton.text = text ?? '';\n            }\n\n            button.onPress.connect(() =>\n            {\n                this.value = id;\n                this.onSelect.emit(id, text ?? '');\n                this.openButton.text = text ?? '';\n                this.closeButton.text = text ?? '';\n                this.close();\n            });\n\n            this.scrollBox?.addItem(button);\n        });\n    }\n\n    /**\n     * Remove items from the dropdown.\n     * @param itemID - Item to remove (starting from 0).\n     */\n    removeItem(itemID: number)\n    {\n        if (!this.scrollBox) return;\n\n        this.scrollBox.removeItem(itemID);\n    }\n\n    /** Toggle the select state (open if closed, closes - id open). */\n    toggle()\n    {\n        this.view.visible = !this.view.visible;\n        this.openButton.visible = !this.openButton.visible;\n    }\n\n    /** Show dropdown. */\n    open()\n    {\n        this.view.visible = true;\n        this.openButton.visible = false;\n    }\n\n    /** Hide dropdown. */\n    close()\n    {\n        this.view.visible = false;\n        this.openButton.visible = true;\n    }\n\n    protected convertItemsToButtons({\n        items,\n        backgroundColor,\n        hoverColor,\n        width,\n        height,\n        textStyle,\n        TextClass,\n        radius,\n    }: SelectItemsOptions): FancyButton[]\n    {\n        TextClass = TextClass ?? Text;\n        const buttons: FancyButton[] = [];\n\n        items.forEach((item) =>\n        {\n            const defaultView = new Graphics()\n                .roundRect(0, 0, width, height, radius)\n                .fill(backgroundColor);\n\n            const color = hoverColor ?? backgroundColor;\n            const hoverView = new Graphics().roundRect(0, 0, width, height, radius).fill(color);\n\n            const text = new TextClass({ text: item, style: textStyle });\n\n            const button = new FancyButton({ defaultView, hoverView, text });\n\n            buttons.push(button);\n        });\n\n        return buttons;\n    }\n}\n"],"names":[],"mappings":"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"}