{"version":3,"file":"RadioGroup.mjs","sources":["../src/RadioGroup.ts"],"sourcesContent":["import { Container } from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { CheckBox } from './CheckBox';\nimport { List, ListType } from './List';\n\nexport type RadioBoxOptions = {\n    items: CheckBox[];\n    type: ListType;\n    elementsMargin: number;\n    selectedItem?: number;\n};\n\n/**\n * Creates a container-based controlling wrapper for checkbox elements,\n * for them top behave as radio buttons.\n *\n * Only one checkbox/radio button can be selected at a time.\n *\n * List of items is passed as an array of {@link CheckBox} objects.\n * @example\n * new RadioGroup({\n *     items: [\n *          new CheckBox({\n *              style: {\n *                  unchecked: `switch_off.png`,\n *                  checked: `switch_on.png`,\n *              }\n *          }),\n *         new CheckBox({\n *              style: {\n *                  unchecked: `switch_off.png`,\n *                  checked: `switch_on.png`,\n *              }\n *          }),\n *          new CheckBox({\n *              style: {\n *                  unchecked: `switch_off.png`,\n *                  checked: `switch_on.png`,\n *              }\n *          }),\n *     ],\n *     type: 'vertical'\n * });\n */\nexport class RadioGroup extends Container\n{\n    protected items: CheckBox[] = [];\n\n    /** {@link List}, that holds and control all inned checkboxes.  */\n    innerView: List | undefined;\n\n    /** Text value of the selected item. */\n    value: string = '';\n\n    /** ID of the selected item. */\n    selected: number = 0;\n\n    /** Fires, when new item is selected. */\n    onChange: Signal<(selectedItemID: number, selectedVal: string) => void>;\n\n    protected options: RadioBoxOptions;\n\n    constructor(options?: RadioBoxOptions)\n    {\n        super();\n\n        const defaultOptions: RadioBoxOptions = {\n            items: [],\n            type: 'vertical',\n            elementsMargin: 0,\n            selectedItem: 0,\n        };\n\n        this.options = { ...defaultOptions, ...options };\n        this.onChange = new Signal();\n\n        this.init(this.options);\n    }\n\n    /**\n     * Initiates a group.\n     * @param options\n     */\n    init(options: RadioBoxOptions)\n    {\n        this.options = options;\n\n        this.selected = options.selectedItem ?? 0; // first item by default\n        this.value = options.items[this.selected]?.labelText?.text ?? '';\n\n        if (this.innerView)\n        {\n            this.innerView.type = options.type;\n            this.innerView.elementsMargin = options.elementsMargin;\n        }\n        else\n        {\n            this.innerView = new List({\n                type: options.type,\n                elementsMargin: options.elementsMargin,\n            });\n        }\n\n        this.addItems(options.items);\n\n        this.addChild(this.innerView);\n\n        this.selectItem(this.selected);\n    }\n\n    /**\n     * Add items to a group.\n     * @param {CheckBox[]} items - array of {@link CheckBox} instances.\n     */\n    addItems(items: CheckBox[])\n    {\n        items.forEach((checkBox, id) =>\n        {\n            checkBox.onChange.connect(() => this.selectItem(id));\n\n            this.items.push(checkBox);\n\n            this.innerView?.addChild(checkBox);\n        });\n    }\n\n    /**\n     * Remove items from a group.\n     * @param ids\n     */\n    removeItems(ids: number[])\n    {\n        ids.forEach((id) =>\n        {\n            const item = this.items[id];\n\n            if (!item) return;\n\n            item.onChange.disconnectAll();\n\n            this.innerView?.removeChild(item);\n\n            this.items.splice(id, 1);\n        });\n    }\n\n    /**\n     * Select item by ID.\n     * @param id\n     */\n    selectItem(id: number)\n    {\n        this.items.forEach((item, key) =>\n        {\n            item.forceCheck(key === id);\n        });\n\n        if (this.selected !== id)\n        {\n            this.onChange.emit(id, this.items[id].labelText?.text ?? '');\n        }\n\n        this.value = this.options.items[id].labelText?.text ?? '';\n        this.selected = id;\n    }\n}\n"],"names":[],"mappings":"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"}