﻿
const MaxScale = 1.2

@Core.Class
export default class BtnScale extends Core.Script {
    static Ins: BtnScale = null
    private _curId: number = 0
    private _btnMap: Map<number, { btn: UI.Button | UI.StaleButton, isPress: boolean, tempVec: Type.Vector2, scaleNode: UI.Widget }> = new Map()

    /** 当脚本被实例后，会在第一帧更新前调用此函数 */
    protected onStart(): void {
        if (SystemUtil.isClient()) {
            BtnScale.Ins = this
            this.useUpdate = true
        }
    }

    /**
     * 激活按钮点击缩放效果
     * @param btn 被点击的按钮
     * @param scaleNode 缩放目标, 为空就是按钮本身
     * @returns 
     */
    public active(btn: UI.Button | UI.StaleButton, scaleNode?: UI.Widget) {
        let btnId = this._curId
        this._curId++
        if (!scaleNode) scaleNode = btn
        this._btnMap.set(btnId, { btn: btn, isPress: false, tempVec: Type.Vector2.zero, scaleNode: scaleNode })
        btn.onPressed.add(() => {
            this._btnMap.get(btnId).isPress = true
        })
        btn.onReleased.add(() => {
            this._btnMap.get(btnId).isPress = false
        })
        return btnId
    }

    /**
     * 关闭按钮点击缩放效果
     * @param id 
     * @returns 
     */
    public unActive(id: number) {
        this._btnMap.delete(id)
    }

    /**
     * 周期函数 每帧执行
     * 此函数执行需要将this.useUpdate赋值为true
     * @param dt 当前帧与上一帧的延迟 / 秒
     */
    protected onUpdate(dt: number): void {
        if (SystemUtil.isClient()) {
            for (let [key, value] of this._btnMap) {
                if (value.isPress) {
                    if (value.scaleNode.renderScale.x < MaxScale) value.scaleNode.renderScale = value.tempVec.set(value.scaleNode.renderScale.x + dt, value.scaleNode.renderScale.y + dt)
                } else {
                    if (value.scaleNode.renderScale.x > 1) value.scaleNode.renderScale = value.tempVec.set(value.scaleNode.renderScale.x - dt, value.scaleNode.renderScale.y - dt)
                    else if (value.scaleNode.renderScale.x < 1) value.scaleNode.renderScale = value.tempVec.set(1, 1)
                }
            }
        }
    }
}