/*
文件名:UI_Widget.nut
路径:Core/UI_Class/UI_Widget.nut
创建日期:2024-11-08	14:24
文件用途: 控件基类
*/
//基础UI
class Yosin_CommonUi extends Yosin_BaseWindow {

    ObjectId = null;

    Localtion_X = 0;
    Localtion_Y = 0;
    Width = null;
    Height = null;

    isLBDown = false;
    //是否悬停
    isInRect = false;

    OnClick = null;
    OnClickSound = null;

    Data = null;

    constructor(x, y, width, height) {
        this.Localtion_X = x;
        this.Localtion_Y = y;
        this.Width = width;
        this.Height = height;

        ObjectId = clock();
        base.constructor();
        //构造时第一次同步坐标
        SyncPos(x, y);
    }

    //override
    //鼠标事件回调
    function OnMouseProc(MousePos_X, MousePos_Y) {
        local Pos = GetWorldPosition();
        if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) isInRect = true;
        else isInRect = false;
        base.OnMouseProc(MousePos_X, MousePos_Y);
    }
    //鼠标左键按下回调
    function OnMouseLbDown(MousePos_X, MousePos_Y) {
        local Pos = GetWorldPosition();
        if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
            isLBDown = true;
            //如果有配置按键音效
            if (OnClickSound) {
                Sq_PlaySoundEffect(OnClickSound);
            }
        }
        base.OnMouseLbDown(MousePos_X, MousePos_Y);
    }
    //鼠标左键弹起回调
    function OnMouseLbUp(MousePos_X, MousePos_Y) {
        isLBDown = false;
        base.OnMouseLbUp(MousePos_X, MousePos_Y);
    }

    //鼠标左键单击回调
    function OnMouseLbClick(MousePos_X, MousePos_Y) {
        local Pos = GetWorldPosition();
        if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
            if (OnClick) OnClick(this);
        }
        base.OnMouseLbClick(MousePos_X, MousePos_Y);
    }

}

//基础按钮
class Yosin_BaseButton extends Yosin_CommonUi {
    //按钮状态
    State = 0;
    Path = null;
    Idx = null;

    Sprite = null;
    SpriteState = -1;
    FrameList = null;

    //按下时的模拟偏移
    DownSimulateOffset = true;

    constructor(X, Y, W, H, Path, Idx) {
        this.Path = Path;
        this.Idx = Idx;
        base.constructor(X, Y, W, H);

        FrameList = [];
        Sprite = CL_SpriteObject();
        // Sprite.ShowBorder(true);
        Addchild(Sprite);

        for (local i = 0; i< 4; i++) {
            local Sf = CL_SpriteFrameObject(this.Path, this.Idx + i);
            FrameList.push(Sf);
        }
    }

    function ChangeFrame() {
        //状态更改 刷新精灵帧
        if (State != SpriteState) {
            //按下时模拟偏移的Flag 如果按下 调整Y坐标向下一个单位
            if (DownSimulateOffset) {
                if (State == 2) {
                    Y += 1;
                    SyncPos(X, Y);
                } else if (SpriteState == 2) {
                    Y -= 1;
                    SyncPos(X, Y);
                }
            }
            SpriteState = State;
            Sprite.SetFrame(FrameList[SpriteState]);
            Sprite.SetPosition(0, 0);
        }
    }

    function Proc(Dt) {
        //不可用
        if (State == 3) {

        } else {
            //按下
            if (isLBDown) {
                State = 2;
            }
            //悬停
            else if (isInRect) {
                State = 1;
            }
            //普通
            else {
                State = 0;
            }
        }
        ChangeFrame();
    }
}

//三分法拉伸
class Yosin_EmeStretch extends Yosin_CommonUi {

    Path = null;
    Idx = null;
    //按钮状态
    SpriteList = null;

    constructor(X, Y, W, H, Path, Idx, Direction = true) {
        this.Path = Path;
        this.Idx = Idx;
        base.constructor(X, Y, W, H);

        SpriteList = [];
        SpriteList.push(CL_SpriteObject(Path, Idx));
        SpriteList.push(CL_SpriteObject(Path, Idx + 1));
        SpriteList.push(CL_SpriteObject(Path, Idx + 2));

        //横向
        if (Direction) {
            local ScaleW = (W - SpriteList[0].GetSize().w - SpriteList[2].GetSize().w);
            local ScaleRate = ScaleW / SpriteList[1].GetSize().w;
            SpriteList[1].SetPosition(SpriteList[0].GetSize().w, 0);
            SpriteList[1].SetScale(ScaleRate, 1.0);
            SpriteList[2].SetPosition(SpriteList[0].GetSize().w + ScaleW, 0);
        }
        //纵向
        else {
            local ScaleH = (H - SpriteList[0].GetSize().h - SpriteList[2].GetSize().h);
            local ScaleRate = ScaleH / SpriteList[1].GetSize().h;
            SpriteList[1].SetPosition(0, SpriteList[0].GetSize().h);
            SpriteList[1].SetScale(1.0, ScaleRate);
            SpriteList[2].SetPosition(0, SpriteList[0].GetSize().h + ScaleH);
        }

        foreach(Child in SpriteList) {
            Addchild(Child);
        }

    }
}



//九宫格拉伸
class Yosin_NineBoxStretch extends Yosin_CommonUi {

    constructor(X, Y, W, H, Path, Idx) {
        base.constructor(X, Y, W, H);
        DrawBackground( W, H, Path, Idx);
    }


    // 绘制
    function DrawBackground(width, height, path, imgId) {

        local x = 0;
        local y = 0;

        // 左上角
        local backgroundTopLeft = CL_SpriteObject(path, imgId);
        backgroundTopLeft.SetPosition(x, y);
        Addchild(backgroundTopLeft);
        // 左上角图片大小
        local cornerImgSize = backgroundTopLeft.GetSize();
        local cornerWidth = cornerImgSize.w;
        local cornerHeight = cornerImgSize.h;

        // 中间
        local backgroundCenter = CL_SpriteObject(path, imgId + 4);
        backgroundCenter.SetPosition(cornerWidth, y + cornerHeight);
        Addchild(backgroundCenter);
        // 中间图片大小
        local centerImgSize = backgroundCenter.GetSize();
        local centerWidth = centerImgSize.w;
        local centerHeight = centerImgSize.h;


        local scaleW = (width.tofloat() - cornerWidth.tofloat() * 2.0) / centerWidth.tofloat();
        local scaleH = (height.tofloat() - y.tofloat() - cornerHeight.tofloat()) / centerHeight.tofloat();

        // 上边
        local backgroundTop = CL_SpriteObject(path, imgId + 1);
        backgroundTop.SetPosition(cornerWidth, y);
        backgroundTop.SetScale(scaleW, 1);
        Addchild(backgroundTop);

        // 右上角
        local backgroundTopRight = CL_SpriteObject(path, imgId + 2);
        backgroundTopRight.SetPosition(width - cornerWidth, y);
        Addchild(backgroundTopRight);

        // 左边
        local backgroundLeft = CL_SpriteObject(path, imgId + 3);
        backgroundLeft.SetPosition(x, y + cornerHeight );
        backgroundLeft.SetScale(1, scaleH);
        Addchild(backgroundLeft);

        // 中间
        backgroundCenter.SetScale(scaleW, scaleH);

        // 右边
        local backgroundRight = CL_SpriteObject(path, imgId + 5);
        backgroundRight.SetPosition(width - cornerWidth, y + cornerHeight);
        backgroundRight.SetScale(1, scaleH);
        Addchild(backgroundRight);

        // 左下角
        local backgroundBottomLeft = CL_SpriteObject(path, imgId + 6);
        backgroundBottomLeft.SetPosition(x, height - cornerHeight);
        Addchild(backgroundBottomLeft);

        // 下边
        local backgroundBottom = CL_SpriteObject(path, imgId + 7);
        backgroundBottom.SetPosition(cornerWidth, height - cornerHeight);
        backgroundBottom.SetScale( scaleW , 1);
        Addchild(backgroundBottom);

        // 右下角
        local backgroundBottomRight = CL_SpriteObject(path, imgId + 8);
        backgroundBottomRight.SetPosition(width - cornerWidth, height - cornerHeight);
        Addchild(backgroundBottomRight);

    }

}




//拼接按钮
class Yosin_SplicingButton extends Yosin_CommonUi {
    //按钮状态
    State = 0;
    Path = null;
    Idx = null;

    SpriteList = null;
    SpriteState = -1;
    FrameList = null;

    //按下时的模拟偏移
    DownSimulateOffset = true;

    constructor(X, Y, W, H, Path, Idx, Direction = true, UnavailableFlag = true) {
        this.Path = Path;
        this.Idx = Idx;
        base.constructor(X, Y, W, H);

        SpriteList = array(4);

        //普通态
        SpriteList[0] = Yosin_EmeStretch(0, 0, W, H, Path, Idx, Direction);
        //悬停态
        SpriteList[1] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + (UnavailableFlag ? 4 : 3), Direction);
        //按下态
        SpriteList[2] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + (UnavailableFlag ? 8 : 3), Direction);
        if (UnavailableFlag) {
            //不可用态
            SpriteList[3] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + 12, Direction);
        }
    }

    function ChangeFrame() {
        //状态更改 刷新精灵帧
        if (State != SpriteState) {
            //按下时模拟偏移的Flag 如果按下 调整Y坐标向下一个单位
            if (DownSimulateOffset) {
                if (State == 2) {
                    Y += 1;
                    SyncPos(X, Y);
                } else if (SpriteState == 2) {
                    Y -= 1;
                    SyncPos(X, Y);
                }
            }
            if (SpriteState != -1) {
                RemoveUIChild(SpriteList[SpriteState]);
            }
            SpriteState = State;
            AddUIChild(SpriteList[SpriteState]);
        }
    }

    function Proc(Dt) {
        //不可用
        if (State == 3) {

        } else {
            //按下
            if (isLBDown) {
                State = 2;
            }
            //悬停
            else if (isInRect) {
                State = 1;
            }
            //普通
            else {
                State = 0;
            }
        }
        ChangeFrame();
    }
}