DOF/sqr/User/UI/Widget/Drag_Button.nut

115 lines
3.1 KiB
Plaintext
Raw Normal View History

2024-12-14 11:14:20 +08:00
/*
文件名:Drag_Button.nut
路径:User/UI/Widget/Drag_Button.nut
创建日期:2024-12-14 09:40
文件用途:拖动按钮
*/
class Yosin_DragButton extends Yosin_CommonUi {
//路径
Path = "";
//索引
Idx = 0;
2024-12-14 16:13:56 +08:00
//方向
Direction = true;
2024-12-14 11:14:20 +08:00
//按钮
Button = null;
2024-12-14 23:16:14 +08:00
//变动位置回调函数
OnChange = null;
2024-12-14 16:13:56 +08:00
//鼠标相对位置
M_Xpos = null;
M_Ypos = null;
//未移动时的初始坐标
BasePos = null;
//移动Flag
MoveFlag = false;
//最大移动值
Max_Move_Value = 0;
//移动值
Move_Value = 0;
2024-12-14 23:16:14 +08:00
//侦测值
Detect_Value = 0;
2024-12-14 11:14:20 +08:00
2025-02-20 13:53:36 +08:00
constructor(X, Y, W, H, Path, Idx, Direction = true, UnavailableFlag = true, IsTwoImg = false) {
2024-12-14 11:14:20 +08:00
this.Path = Path;
this.Idx = Idx;
2024-12-14 16:13:56 +08:00
this.Direction = Direction;
2024-12-14 11:14:20 +08:00
base.constructor(X, Y, W, H);
2025-02-20 13:53:36 +08:00
Button = Yosin_SplicingButton(0, 0, W, H, Path, Idx, Direction, UnavailableFlag, IsTwoImg);
2024-12-14 11:14:20 +08:00
Button.DownSimulateOffset = false;
AddUIChild(Button);
2024-12-14 16:13:56 +08:00
BasePos = {
x = X,
y = Y
}
2024-12-14 23:16:14 +08:00
2024-12-14 11:14:20 +08:00
}
//override
//鼠标左键按下回调
2025-02-20 13:53:36 +08:00
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
2024-12-14 11:14:20 +08:00
2024-12-14 16:13:56 +08:00
if (isInRect) {
MoveFlag = true;
M_Xpos = MousePos_X; //原始鼠标位置数据
M_Ypos = MousePos_Y;
B_X = X; //原始窗口位置
B_Y = Y;
}
}
//override
2025-02-20 13:53:36 +08:00
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
2024-12-14 16:13:56 +08:00
//调用原生方法
2025-02-20 13:53:36 +08:00
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
2024-12-14 16:13:56 +08:00
//移动
if (MoveFlag) {
//左键拖动
if (Direction) {
Move_Value = B_X + (MousePos_X - M_Xpos);
2024-12-14 23:16:14 +08:00
if (!(Move_Value >= (0 + BasePos.x) && Move_Value <= (Max_Move_Value - Width + BasePos.x))) {
X = Move_Value;
DragLogic((Move_Value - Localtion_X).tofloat() / (Max_Move_Value - Width + BasePos.x - Localtion_X).tofloat());
}
2024-12-14 16:13:56 +08:00
} else {
Move_Value = B_Y + (MousePos_Y - M_Ypos);
2024-12-14 23:16:14 +08:00
if (Move_Value >= (0 + BasePos.y) && Move_Value <= (Max_Move_Value - Height + BasePos.y)) {
Y = (Move_Value);
DragLogic((Move_Value - Localtion_Y).tofloat() / (Max_Move_Value - Height + BasePos.y - Localtion_Y).tofloat());
}
2024-12-14 16:13:56 +08:00
}
SyncPos(X, Y);
}
}
2024-12-14 23:16:14 +08:00
//拖动逻辑
function DragLogic(Value) {
Detect_Value = Value;
if (OnChange) OnChange(Value);
}
2025-02-20 13:53:36 +08:00
//设置位置
function SetPos(gX, gY) {
X = gX;
Y = gY;
SyncPos(X, Y);
}
2024-12-14 16:13:56 +08:00
//鼠标左键弹起回调
2025-02-20 13:53:36 +08:00
function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
2024-12-14 16:13:56 +08:00
MoveFlag = false;
}
//设置最大移动值
function SetMaxMoveValue(Value) {
Max_Move_Value = Value;
2024-12-14 11:14:20 +08:00
}
}