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

138 lines
3.9 KiB
Plaintext
Raw Normal View History

2025-02-20 13:53:36 +08:00
/*
文件名:NumberInputBox.nut
路径:User/UI/Widget/NumberInputBox.nut
创建日期:2025-02-07 20:31
文件用途:数字输入框
*/
class Yosin_NumberInputBox extends Yosin_CommonUi {
//框背景
BoxBackground = null;
//文本
TextObject = null;
Text = "0";
//输入光标
InputCursor = null;
//输入位置
InputPos = 0;
//是否获取焦点
IsFocus = false;
constructor(w, h) {
base.constructor(0, 0, w, h);
//输入框
BoxBackground = Yosin_NineBoxStretch(w, h, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
BoxBackground.SetPosition(0, 0);
Addchild(BoxBackground);
//文本
TextObject = Yosin_Mininumber(null);
TextObject.SetPosition(6, 5);
Addchild(TextObject);
//输入光标
InputCursor = CreateCursor();
InputCursor.SetUpdateFunc(function(Object, Dt) {
//处于焦点中执行
if (IsFocus) {
//光标闪烁逻辑
{
if (!(Object.Var.rawin("TimeFlag"))) {
Object.Var.TimeFlag <- 0;
Object.Var.VisibleFlag <- false;
}
Object.Var.TimeFlag += Dt;
if (Object.Var.TimeFlag >= 500) {
Object.Var.TimeFlag <- 0;
Object.SetVisible(Object.Var.VisibleFlag);
Object.Var.VisibleFlag <- !Object.Var.VisibleFlag;
}
}
//同步光标位置逻辑
{
Object.SetPosition(TextObject.X + TextObject.DrawTextWidth, 4);
}
}
}.bindenv(this));
Addchild(InputCursor);
_Imm_Input_Func_.rawset(C_Object, Imm_Input.bindenv(this));
}
//判断是否中文字符
function IsChineseChar(code) {
return (code & 0x80) != 0;
}
//接收文本数据
function Imm_Input(str) {
if (!this) return -1;
if (!IsFocus) return;
//退格键
if (str == "\b") {
if (this.Text.len() > 0) {
this.Text = Sq_RemoveStringLast(this.Text);
}
}
//只记录数字
else if (regexp("[0-9]").match(str)) {
if (this.Text.tointeger()< 9999999999999) {
if (this.Text == "0") this.Text = str;
else this.Text += str;
} else this.Text = "9999999999999";
}
//同步数字数据
TextObject.SetNumber(this.Text);
//每次设置文本时确保光标显示
InputCursor.SetVisible(true);
InputCursor.Var.TimeFlag <- 0;
InputCursor.Var.VisibleFlag <- false;
}
function CreateCursor() {
local Canvas = CL_CanvasObject();
// 重设大小并清空
Canvas.ResizeAndClear(1, 15);
// 开始绘制
Canvas.BeginDraw();
Canvas.SetFillBrush(sq_RGBA(255, 255, 255, 250));
Canvas.SetStrokeBrush(sq_RGBA(255, 255, 255, 250));
Canvas.DrawLine(1, 1, 1, 10);
// 结束绘制
Canvas.EndDraw();
Canvas.SetVisible(false);
return Canvas;
}
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
SetFocus(true);
} else {
SetFocus(false);
}
}
//设置焦点模式
function SetFocus(Flag) {
IsFocus = Flag;
InputCursor.SetVisible(Flag);
Sq_SetImmEnabled(Flag);
}
//设置数字
function SetNumber(Number) {
if (Number< 0) return;
this.Text = Number.tostring();
TextObject.SetNumber(this.Text);
}
//获取数字
function GetNumber() {
return this.Text.tointeger();
}
}