{"version":3,"file":"List.mjs","sources":["../src/List.ts"],"sourcesContent":["import { Container, ContainerChild } from 'pixi.js';\nimport { LIST_TYPE } from './utils/HelpTypes';\n\nexport type ListType = (typeof LIST_TYPE)[number];\n\nexport type ListOptions<C extends ContainerChild = ContainerChild> = {\n    elementsMargin?: number;\n    children?: C[];\n    padding?: number;\n    vertPadding?: number;\n    horPadding?: number;\n    topPadding?: number;\n    bottomPadding?: number;\n    leftPadding?: number;\n    rightPadding?: number;\n    items?: C[];\n    maxWidth?: number;\n    maxHeight?: number;\n};\n\n/**\n * Container-based component for arranging Pixi containers one after another based on their sizes.\n *\n * Type option is used to set the direction of the arrangement.\n *\n * If type is not specified, it will be acting like a bidirectional, items will be arranged to fit horizontally,\n * after there is no space left, new line will be started, so items will be arranged like `inline-block` in css.\n * Max width to fit horizontally can be set by `maxWidth` option, of not set, parent width will be used.\n * Check this example to see how it works:\n * https://pixijs.io/ui/storybook/?path=/story/components-scrollbox-use-graphics--use-graphics\n *\n * It is used inside elements with repeatable content, like {@link Select} or {@link ScrollBox}.\n * @example\n * const list = new List({\n *    children: [\n        new Graphics().rect(0, 0, 50, 50).fill(0x000000),\n        new Graphics().rect(0, 0, 50, 50).fill(0xFFFFFF),\n *    ],\n * });\n *\n * list.addChild(new Graphics().rect(0, 0, 50, 50)).fill(0x000000);\n */\nexport class List<C extends ContainerChild = ContainerChild> extends Container<C>\n{\n    protected options?: { type?: ListType } & ListOptions<C>;\n\n    /** Arrange direction. Defaults to 'bidirectional' for multi-column layout when type is not specified. */\n    protected _type: ListType = 'bidirectional';\n\n    /** Width of area to fit elements when arrange. (If not set parent width will be used). */\n    protected _maxWidth: number = 0;\n\n    /** Returns all arranged elements. */\n    override readonly children: C[] = [];\n\n    constructor(options?: { type?: ListType } & ListOptions<C>)\n    {\n        super();\n\n        if (options)\n        {\n            if (options.maxWidth)\n            {\n                this._maxWidth = options.maxWidth;\n            }\n\n            this.init(options);\n        }\n\n        options?.items?.forEach((item) => this.addChild(item));\n\n        this.on('added', () => this.arrangeChildren());\n        this.on('childAdded', () => this.arrangeChildren());\n    }\n\n    /**\n     * Initiates list component.\n     * @param options\n     */\n    init(options?: { type?: ListType } & ListOptions<C>)\n    {\n        this.options = options;\n\n        // Only override the default 'bidirectional' type if explicitly specified\n        if (options?.type)\n        {\n            this.type = options.type;\n        }\n\n        if (options?.children)\n        {\n            options.children.forEach((child) => this.addChild(child));\n        }\n    }\n\n    /**\n     * Set items arrange direction.\n     * @param type - Arrange direction.\n     */\n    set type(type: ListType)\n    {\n        this._type = type;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get items arrange direction.\n     * @returns Arrange direction.\n     */\n    get type(): ListType\n    {\n        return this._type;\n    }\n\n    /**\n     * Set element margin.\n     * @param margin - Margin between elements.\n     */\n    set elementsMargin(margin: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.elementsMargin = margin;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get element margin.\n     * @returns Margin between elements.\n     */\n    get elementsMargin(): number\n    {\n        return this.options?.elementsMargin ?? 0;\n    }\n\n    /**\n     * Set padding, overriding all padding options.\n     * @param padding - Padding surrounding list elements and its border.\n     */\n    set padding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.padding = padding;\n        this.options.vertPadding = padding;\n        this.options.horPadding = padding;\n        this.options.leftPadding = padding;\n        this.options.rightPadding = padding;\n        this.options.topPadding = padding;\n        this.options.bottomPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get padding.\n     * @returns Padding surrounding list elements and its border.\n     */\n    get padding(): number\n    {\n        return this.options?.padding ?? 0;\n    }\n\n    /**\n     * Set vertical padding, overriding all top and bottom padding options.\n     * @param padding - Vertical padding between list border and its elements.\n     */\n    set vertPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.vertPadding = padding;\n        this.options.topPadding = padding;\n        this.options.bottomPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get vertical padding.\n     * @returns Vertical padding between list border and its elements.\n     */\n    get vertPadding(): number\n    {\n        return this.options?.vertPadding ?? this.padding ?? 0;\n    }\n\n    /**\n     * Set horizontal padding, overriding all left and right padding options.\n     * @param padding - Horizontal padding between list border and its elements.\n     */\n    set horPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.horPadding = padding;\n        this.options.leftPadding = padding;\n        this.options.rightPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get horizontal padding.\n     * @returns Horizontal padding between list border and its elements.\n     */\n    get horPadding(): number\n    {\n        return this.options?.horPadding ?? this.padding ?? 0;\n    }\n\n    /**\n     * Set left padding.\n     * @param padding - Left padding between list border and its elements.\n     */\n    set leftPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.leftPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get left padding.\n     * @returns Left padding between list border and its elements.\n     */\n    get leftPadding(): number\n    {\n        return this.options?.leftPadding ?? this.horPadding;\n    }\n\n    /**\n     * Set right padding.\n     * @param padding - Right padding between list border and its elements.\n     */\n    set rightPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.rightPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get right padding.\n     * @returns Right padding between list border and its elements.\n     */\n    get rightPadding(): number\n    {\n        return this.options?.rightPadding ?? this.horPadding;\n    }\n\n    /**\n     * Set top padding.\n     * @param padding - Top padding between list border and its elements.\n     */\n    set topPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.topPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get top padding.\n     * @returns Top padding between list border and its elements.\n     */\n    get topPadding(): number\n    {\n        return this.options?.topPadding ?? this.vertPadding;\n    }\n\n    /**\n     * Set bottom padding.\n     * @param padding - Bottom padding between list border and its elements.\n     */\n    set bottomPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.bottomPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get bottom padding.\n     * @returns Bottom padding between list border and its elements.\n     */\n    get bottomPadding(): number\n    {\n        return this.options?.bottomPadding ?? this.vertPadding;\n    }\n\n    /**\n     * Arrange all elements basing in their sizes and component options.\n     * Can be arranged vertically, horizontally or bidirectional.\n     */\n    public arrangeChildren()\n    {\n        let maxHeight = 0;\n        let x = this.leftPadding;\n        let y = this.topPadding;\n\n        const elementsMargin = this.options?.elementsMargin ?? 0;\n        let maxWidth = this.maxWidth || this.parent?.width;\n\n        if (this.rightPadding)\n        {\n            maxWidth -= this.rightPadding;\n        }\n\n        this.children.forEach((child, id) =>\n        {\n            switch (this.type)\n            {\n                case 'vertical':\n                    child.y = y;\n                    child.x = x;\n\n                    y += elementsMargin + child.height;\n                    break;\n\n                case 'horizontal':\n                    child.x = x;\n                    child.y = y;\n\n                    x += elementsMargin + child.width;\n                    break;\n\n                case 'bidirectional':\n                default:\n                    child.x = x;\n                    child.y = y;\n\n                    if (child.x + child.width > maxWidth && id > 0)\n                    {\n                        y += elementsMargin + maxHeight;\n                        x = this.leftPadding;\n\n                        child.x = x;\n                        child.y = y;\n                        maxHeight = 0;\n                    }\n\n                    maxHeight = Math.max(maxHeight, child.height);\n                    x += elementsMargin + child.width;\n                    break;\n            }\n        });\n    }\n\n    /**\n     * Removes items from the list. (Does not destroy them)\n     * @param itemID - Item to remove (starting from 0).\n     */\n    removeItem(itemID: number)\n    {\n        const child = this.children[itemID];\n\n        if (!child)\n        {\n            return;\n        }\n\n        this.removeChild(child);\n        this.arrangeChildren();\n    }\n\n    /** Set width of area to fit elements when arrange. (If not set parent width will be used). */\n    set maxWidth(width: number)\n    {\n        this._maxWidth = width;\n        this.arrangeChildren();\n    }\n\n    /** Get width of area to fit elements when arrange. (If not set parent width will be used). */\n    get maxWidth(): number\n    {\n        return this._maxWidth;\n    }\n}\n"],"names":[],"mappings":"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"}