Skip to content

Commit cf32e5b

Browse files
committed
feat: 增加用户输入框库模块
1 parent d7d2ff3 commit cf32e5b

File tree

5 files changed

+265
-38
lines changed

5 files changed

+265
-38
lines changed

Boilerplate_!Base/info.ini

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,23 @@ lua_83=src\lib\UI.ColorPicker.lua
9191
lua_84=src\lib\UI.FontPicker.lua
9292
lua_85=src\lib\UI.IconPicker.lua
9393
lua_86=src\lib\UI.TextEditor.lua
94-
lua_87=src\lib\UI.ListEditor.lua
95-
lua_88=src\lib\UI.Browser.lua
96-
lua_89=src\lib\UI.Request.lua
97-
lua_90=src\lib\UI.UserSettings.lua
98-
lua_91=src\lib\UI.FloatBar.lua
99-
lua_92=src\lib\UI.Notify.lua
100-
lua_93=src\lib\PacketExtend.lua
101-
lua_94=src\lib\Panel.lua
102-
lua_95=src\lib\LoadingEnd.lua
103-
lua_96=src\BgMsgCenter.lua
104-
lua_97=src\HoverEntry.lua
105-
lua_98=src\KeyPanel.lua
106-
lua_99=src\DebugLogs.lua
107-
lua_100=src\Dev_UIManager.lua
108-
lua_101=src\Dev_UIEditor.lua
109-
lua_102=src\Dev_UIFindStation.lua
110-
lua_103=src\PS.Welcome.lua
111-
lua_104=src\PS.GlobalConfig.lua
112-
lua_105=src\PS.UISample.lua
94+
lua_87=src\lib\UI.UserInput.lua
95+
lua_88=src\lib\UI.ListEditor.lua
96+
lua_89=src\lib\UI.Browser.lua
97+
lua_90=src\lib\UI.Request.lua
98+
lua_91=src\lib\UI.UserSettings.lua
99+
lua_92=src\lib\UI.FloatBar.lua
100+
lua_93=src\lib\UI.Notify.lua
101+
lua_94=src\lib\PacketExtend.lua
102+
lua_95=src\lib\Panel.lua
103+
lua_96=src\lib\LoadingEnd.lua
104+
lua_97=src\BgMsgCenter.lua
105+
lua_98=src\HoverEntry.lua
106+
lua_99=src\KeyPanel.lua
107+
lua_100=src\DebugLogs.lua
108+
lua_101=src\Dev_UIManager.lua
109+
lua_102=src\Dev_UIEditor.lua
110+
lua_103=src\Dev_UIFindStation.lua
111+
lua_104=src\PS.Welcome.lua
112+
lua_105=src\PS.GlobalConfig.lua
113+
lua_106=src\PS.UISample.lua

Boilerplate_!Base/info.ini.zh_TW

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,23 @@ lua_83=src\lib\UI.ColorPicker.lua
9191
lua_84=src\lib\UI.FontPicker.lua
9292
lua_85=src\lib\UI.IconPicker.lua
9393
lua_86=src\lib\UI.TextEditor.lua
94-
lua_87=src\lib\UI.ListEditor.lua
95-
lua_88=src\lib\UI.Browser.lua
96-
lua_89=src\lib\UI.Request.lua
97-
lua_90=src\lib\UI.UserSettings.lua
98-
lua_91=src\lib\UI.FloatBar.lua
99-
lua_92=src\lib\UI.Notify.lua
100-
lua_93=src\lib\PacketExtend.lua
101-
lua_94=src\lib\Panel.lua
102-
lua_95=src\lib\LoadingEnd.lua
103-
lua_96=src\BgMsgCenter.lua
104-
lua_97=src\HoverEntry.lua
105-
lua_98=src\KeyPanel.lua
106-
lua_99=src\DebugLogs.lua
107-
lua_100=src\Dev_UIManager.lua
108-
lua_101=src\Dev_UIEditor.lua
109-
lua_102=src\Dev_UIFindStation.lua
110-
lua_103=src\PS.Welcome.lua
111-
lua_104=src\PS.GlobalConfig.lua
112-
lua_105=src\PS.UISample.lua
94+
lua_87=src\lib\UI.UserInput.lua
95+
lua_88=src\lib\UI.ListEditor.lua
96+
lua_89=src\lib\UI.Browser.lua
97+
lua_90=src\lib\UI.Request.lua
98+
lua_91=src\lib\UI.UserSettings.lua
99+
lua_92=src\lib\UI.FloatBar.lua
100+
lua_93=src\lib\UI.Notify.lua
101+
lua_94=src\lib\PacketExtend.lua
102+
lua_95=src\lib\Panel.lua
103+
lua_96=src\lib\LoadingEnd.lua
104+
lua_97=src\BgMsgCenter.lua
105+
lua_98=src\HoverEntry.lua
106+
lua_99=src\KeyPanel.lua
107+
lua_100=src\DebugLogs.lua
108+
lua_101=src\Dev_UIManager.lua
109+
lua_102=src\Dev_UIEditor.lua
110+
lua_103=src\Dev_UIFindStation.lua
111+
lua_104=src\PS.Welcome.lua
112+
lua_105=src\PS.GlobalConfig.lua
113+
lua_106=src\PS.UISample.lua

Boilerplate_!Base/lang/lib/zhcn.jx3dat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ return {
1717
['Color Picker'] = '��ɫѡ����',
1818
['Color Picker Pro'] = '��ɫ��',
1919
['Text Editor'] = '�ı��༭��',
20+
['User Input'] = '�û�����',
2021
['Font %d'] = '���� %d',
2122

2223
['Add to BOSS list'] = '���������б�',

Boilerplate_!Base/lang/lib/zhtw.jx3dat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ return {
1717
['Color Picker'] = '顏色選擇器',
1818
['Color Picker Pro'] = '調色板',
1919
['Text Editor'] = '文本編輯器',
20+
['User Input'] = '用戶輸入',
2021
['Font %d'] = '字體 %d',
2122

2223
['Add to BOSS list'] = '加入首領列表',
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
--------------------------------------------------------------------------------
2+
-- This file is part of the JX3 Plugin Project.
3+
-- @desc : UserInput
4+
-- @copyright: Emil Zhai <root@zhaiyiming.com>
5+
--------------------------------------------------------------------------------
6+
---@class (partial) Boilerplate
7+
local X = Boilerplate
8+
--------------------------------------------------------------------------------
9+
local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.UserInput')
10+
--------------------------------------------------------------------------------
11+
--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]]
12+
--------------------------------------------------------------------------------
13+
local _L = X.LoadLangPack(X.PACKET_INFO.FRAMEWORK_ROOT .. 'lang/lib/')
14+
--------------------------------------------------------------------------------
15+
16+
local DEFAULT_W, DEFAULT_H = 420, 140
17+
local DEFAULT_MULTILINE_W, DEFAULT_MULTILINE_H = 520, 320
18+
local BTN_H, BTN_W = 30, 100
19+
local PADDING = 10
20+
21+
local function OpenSingleLineInput(opt)
22+
local szFrameName = opt.name or X.NSFormatString('{$NS}_DefaultUserInput')
23+
X.UI.CloseFrame(szFrameName)
24+
25+
local ui
26+
local function OnResize()
27+
local nW, nH = ui:ContainerSize()
28+
ui:Fetch('WndEditBox')
29+
:Pos(PADDING, PADDING)
30+
:Size(nW - PADDING * 2, nH - PADDING * 3 - BTN_H)
31+
ui:Fetch('Btn_Confirm')
32+
:Pos((nW - BTN_W) / 2, nH - PADDING - BTN_H)
33+
:Size(BTN_W, BTN_H)
34+
end
35+
36+
ui = X.UI.CreateFrame(szFrameName, {
37+
w = opt.w or DEFAULT_W,
38+
h = opt.h or DEFAULT_H,
39+
alpha = opt.alpha or 180,
40+
text = opt.title or _L['User Input'],
41+
anchor = opt.anchor or { s = 'CENTER', r = 'CENTER', x = 0, y = 0 },
42+
theme = X.UI.FRAME_THEME.SIMPLE,
43+
close = true,
44+
esc = true,
45+
resize = true,
46+
minimize = false,
47+
onSizeChange = OnResize,
48+
})
49+
50+
ui:Append('WndEditBox', {
51+
name = 'WndEditBox',
52+
x = PADDING,
53+
y = PADDING,
54+
w = (opt.w or DEFAULT_W) - PADDING * 2,
55+
h = (opt.h or DEFAULT_H) - PADDING * 3 - BTN_H,
56+
multiline = false,
57+
text = opt.initialValue and tostring(opt.initialValue) or '',
58+
placeholder = opt.placeholder,
59+
alignHorizontal = 0,
60+
alignVertical = 0,
61+
maxLength = opt.maxLength,
62+
onSpecialKeyDown = function(_, szKey)
63+
if szKey == 'Enter' then
64+
ui:Fetch('Btn_Confirm'):Click()
65+
return 1
66+
end
67+
end,
68+
})
69+
70+
ui:Append('WndButton', {
71+
name = 'Btn_Confirm',
72+
x = 0,
73+
y = 0,
74+
w = BTN_W,
75+
h = BTN_H,
76+
text = opt.confirmText or (g_tStrings and g_tStrings.STR_HOTKEY_SURE) or 'OK',
77+
onClick = function()
78+
local szValue = ui:Fetch('WndEditBox'):Text() or ''
79+
opt.fnAction(szValue)
80+
ui:Remove()
81+
end,
82+
})
83+
84+
ui:Focus()
85+
OnResize()
86+
return ui
87+
end
88+
89+
local function OpenMultiLineInput(opt)
90+
local szFrameName = opt.name or X.NSFormatString('{$NS}_DefaultUserInput_Multiline')
91+
X.UI.CloseFrame(szFrameName)
92+
93+
local ui
94+
local function OnResize()
95+
local nW, nH = ui:ContainerSize()
96+
ui:Fetch('WndEditBox')
97+
:Pos(PADDING, PADDING)
98+
:Size(nW - PADDING * 2, nH - PADDING * 3 - BTN_H)
99+
ui:Fetch('Btn_Confirm')
100+
:Pos((nW - BTN_W) / 2, nH - PADDING - BTN_H)
101+
:Size(BTN_W, BTN_H)
102+
end
103+
104+
ui = X.UI.CreateFrame(szFrameName, {
105+
w = opt.w or DEFAULT_MULTILINE_W,
106+
h = opt.h or DEFAULT_MULTILINE_H,
107+
alpha = opt.alpha or 180,
108+
text = opt.title or _L['User Input'],
109+
anchor = opt.anchor or { s = 'CENTER', r = 'CENTER', x = 0, y = 0 },
110+
theme = X.UI.FRAME_THEME.SIMPLE,
111+
close = true,
112+
esc = true,
113+
resize = true,
114+
minimize = false,
115+
onSizeChange = OnResize,
116+
})
117+
118+
ui:Append('WndEditBox', {
119+
name = 'WndEditBox',
120+
x = PADDING,
121+
y = PADDING,
122+
w = (opt.w or DEFAULT_MULTILINE_W) - PADDING * 2,
123+
h = (opt.h or DEFAULT_MULTILINE_H) - PADDING * 3 - BTN_H,
124+
multiline = true,
125+
text = opt.initialValue and tostring(opt.initialValue) or '',
126+
placeholder = opt.placeholder,
127+
alignHorizontal = 0,
128+
alignVertical = 0,
129+
maxLength = opt.maxLength,
130+
})
131+
132+
ui:Append('WndButton', {
133+
name = 'Btn_Confirm',
134+
x = 0,
135+
y = 0,
136+
w = BTN_W,
137+
h = BTN_H,
138+
text = opt.confirmText or (g_tStrings and g_tStrings.STR_HOTKEY_SURE) or 'OK',
139+
onClick = function()
140+
local szValue = ui:Fetch('WndEditBox'):Text() or ''
141+
opt.fnAction(szValue)
142+
ui:Remove()
143+
end,
144+
})
145+
146+
ui:Focus()
147+
OnResize()
148+
return ui
149+
end
150+
151+
-- Global API
152+
---@class UI_GetUserInput_Options @用户输入参数
153+
---@field placeholder string? @占位提示
154+
---@field initialValue string|number? @初始值(内部会 tostring
155+
---@field multiline boolean? @是否多行
156+
---@field maxLength number? @最大长度
157+
---@field name string? @窗体名(用于复用/关闭)
158+
---@field title string? @标题
159+
---@field w number? @宽度
160+
---@field h number? @高度
161+
---@field alpha number? @透明度
162+
---@field anchor FrameAnchor? @位置
163+
---@field confirmText string? @确认按钮文本
164+
---@field fnAction fun(value: string) @确认回调
165+
166+
---@param opt UI_GetUserInput_Options @参数
167+
---@return any ui @窗体对象(由 UI.CreateFrame 返回)
168+
function X.UI.GetUserInput(opt)
169+
if not X.IsTable(opt) or type(opt.fnAction) ~= 'function' then
170+
return
171+
end
172+
if opt.multiline then
173+
return OpenMultiLineInput(opt)
174+
end
175+
return OpenSingleLineInput(opt)
176+
end
177+
178+
---@class UI_GetUserInputNumber_Options @数字输入参数
179+
---@field placeholder string? @占位提示
180+
---@field initialValue number? @初始值
181+
---@field min number? @最小值
182+
---@field max number? @最大值
183+
---@field maxLength number? @最大长度
184+
---@field w number? @宽度
185+
---@field h number? @高度
186+
---@field alpha number? @透明度
187+
---@field anchor FrameAnchor? @位置
188+
---@field confirmText string? @确认按钮文本
189+
---@field fnAction fun(value: number) @确认回调
190+
191+
---@param opt UI_GetUserInputNumber_Options @参数
192+
---@return any ui @窗体对象(由 UI.CreateFrame 返回)
193+
function X.UI.GetUserInputNumber(opt)
194+
if not X.IsTable(opt) or type(opt.fnAction) ~= 'function' then
195+
return
196+
end
197+
return X.UI.GetUserInput({
198+
placeholder = opt.placeholder,
199+
initialValue = opt.initialValue,
200+
multiline = false,
201+
maxLength = opt.maxLength,
202+
w = opt.w,
203+
h = opt.h,
204+
alpha = opt.alpha,
205+
anchor = opt.anchor,
206+
confirmText = opt.confirmText,
207+
fnAction = function(szText)
208+
local n = tonumber(szText)
209+
if not n then
210+
return
211+
end
212+
if not X.IsNil(opt.min) and n < opt.min then
213+
return
214+
end
215+
if not X.IsNil(opt.max) and n > opt.max then
216+
return
217+
end
218+
opt.fnAction(n)
219+
end,
220+
})
221+
end
222+
223+
--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]]

0 commit comments

Comments
 (0)