{"version":3,"file":"CheckBox.mjs","sources":["../src/CheckBox.ts"],"sourcesContent":["import { Text } from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { Switcher } from './Switcher';\nimport { cleanup } from './utils/helpers/cleanup';\nimport { PixiText, PixiTextClass, PixiTextStyle } from './utils/helpers/text';\nimport { getView, type GetViewSettings } from './utils/helpers/view';\n\ntype CheckBoxStyle = {\n    checked: GetViewSettings;\n    unchecked: GetViewSettings;\n    text?: PixiTextStyle;\n    textOffset?: {\n        x?: number;\n        y?: number;\n    };\n};\n\nexport type CheckBoxOptions = {\n    style: CheckBoxStyle;\n    text?: string;\n    TextClass?: PixiTextClass;\n    checked?: boolean;\n};\n\n/**\n * Creates a container-based checkbox element.\n * @example\n *  new CheckBox({\n *     style: {\n *         unchecked: `switch_off.png`,\n *         checked: `switch_on.png`,\n *     }\n *  });\n */\nexport class CheckBox extends Switcher\n{\n    //* Text label */\n    labelText: PixiText | undefined;\n\n    /** Signal emitted when checkbox state changes. */\n    onCheck: Signal<(state: boolean) => void>;\n\n    protected _style: CheckBoxStyle | undefined;\n    protected _textClass: PixiTextClass;\n\n    constructor(options: CheckBoxOptions)\n    {\n        super();\n\n        this._textClass = options.TextClass ?? Text;\n        this.text = options.text ?? '';\n\n        this.style = options.style;\n\n        this.checked = options.checked ?? false;\n\n        this.triggerEvents = ['onPress'];\n\n        this.innerView.cursor = 'pointer';\n\n        this.onCheck = new Signal();\n\n        this.onChange.connect(() => this.onCheck.emit(this.checked));\n    }\n\n    protected addLabel(text?: string, style?: PixiTextStyle)\n    {\n        if (!text) return;\n\n        this.labelText = new this._textClass({\n            text: text ?? '',\n            style: style ?? this._style?.text,\n        });\n        this.addChild(this.labelText);\n\n        this.labelText.cursor = 'pointer';\n        this.labelText.eventMode = 'static';\n        this.labelText.on('pointertap', () => (this.checked = !this.checked));\n\n        this.alignText();\n    }\n\n    /** Setter, which sets a checkbox text. */\n    set text(text: string)\n    {\n        if (!text)\n        {\n            if (this.labelText)\n            {\n                cleanup(this.labelText);\n                this.labelText = undefined;\n            }\n\n            return;\n        }\n\n        if (this.labelText)\n        {\n            this.labelText.text = text;\n        }\n        else\n        {\n            this.addLabel(text);\n        }\n\n        this.alignText();\n    }\n\n    /** Getter, which returns a checkbox text. */\n    get text(): string | ''\n    {\n        return this.labelText?.text ?? '';\n    }\n\n    /** Setter, which sets a checkbox style settings. */\n    set style(style: CheckBoxStyle)\n    {\n        // Preserve checked state for the end of the method\n        const wasChecked = this.checked;\n\n        this._style = style;\n\n        const { unchecked, checked } = style;\n\n        const uncheckedView = getView(unchecked);\n        const checkedView = getView(checked);\n\n        this.views = [uncheckedView, checkedView];\n\n        // Set initial view visibility based on checked state\n        if (wasChecked)\n        {\n            checkedView.visible = true;\n            uncheckedView.visible = false;\n            this.active = 1;\n        }\n        else\n        {\n            uncheckedView.visible = true;\n            checkedView.visible = false;\n            this.active = 0;\n        }\n\n        // Update text style if text exists and style has text configuration\n        if (this.labelText && style.text)\n        {\n            this.labelText.style = style.text;\n            this.alignText();\n        }\n    }\n\n    /** Getter, which returns a checkbox style settings. */\n    get style(): CheckBoxStyle | undefined\n    {\n        return this._style;\n    }\n\n    /**\n     * Aligns the text label based on the checkbox style.\n     * This method calculates the position of the text label based on the checkbox's unchecked view dimensions\n     * and applies any specified text offsets.\n     * It ensures that the text label is centered vertically and positioned to the right of the checkbox\n     * with an optional offset.\n     * This method is called after the checkbox style is set or when the text label is updated\n     * to ensure that the text label is always correctly positioned relative to the checkbox.\n     * @see {@link CheckBoxStyle.textOffset} for offset options.\n     * @see {@link getView} for how views are created.\n     */\n    protected alignText()\n    {\n        if (!this.style) return;\n        if (!this.labelText) return;\n        if (!this.views) return;\n\n        const uncheckedView = this.views[0];\n\n        if (uncheckedView)\n        {\n            this.labelText.x = uncheckedView.width + 10 + (this._style?.textOffset?.x ?? 0);\n            this.labelText.y\n                = ((uncheckedView.height - this.labelText.height) / 2) + (this._style?.textOffset?.y ?? 0);\n        }\n    }\n\n    /** Getter, which returns a checkbox state. */\n    get checked(): boolean\n    {\n        return this.active === 1;\n    }\n\n    /** Setter, which sets a checkbox state. */\n    set checked(checked: boolean)\n    {\n        this.switch(checked ? 1 : 0);\n    }\n\n    /**\n     * Setter, that sets a checkbox state without emitting a signal.\n     * @param checked\n     */\n    forceCheck(checked: boolean)\n    {\n        this.forceSwitch(checked ? 1 : 0);\n    }\n}\n"],"names":[],"mappings":"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"}