最终提交

This commit is contained in:
2026-05-21 13:24:05 +08:00
parent a1d1f19585
commit 1ab5940cbd
78 changed files with 313 additions and 4814 deletions

115
4G/源代码/lib/uiWin.lua Normal file
View File

@@ -0,0 +1,115 @@
--- 模块功能UI窗口管理
-- @module uiWin
-- @author openLuat
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.25
module(...,package.seeall)
--窗口管理栈
local stack = {}
--当前分配的窗口ID
local winid = 0
local function allocid()
winid = winid + 1
return winid
end
local function loseFocus()
if stack[#stack] and stack[#stack]["onLoseFocus"] then
stack[#stack]["onLoseFocus"]()
end
end
--- 新增一个窗口
-- @table wnd 窗口的元素以及消息处理函数表
-- @return number窗口ID
-- @usage uiWin.add({onUpdate = refresh})
function add(wnd)
---必须注册更新接口
assert(wnd.onUpdate)
if type(wnd) ~= "table" then
assert("unknown uiwin type "..type(wnd))
end
--上一个窗口执行失去焦点的处理函数
loseFocus()
--为新窗口分配窗口ID
wnd.id = allocid()
--新窗口请求入栈
sys.publish("UIWND_ADD",wnd)
return wnd.id
end
--- 移除一个窗口
-- @number winId 窗口ID
-- @return nil
-- @usage uiWin.remove(winId)
function remove(winId)
sys.publish("UIWND_REMOVE",winId)
end
function removeAll()
sys.publish("UIWND_REMOVEALL")
end
function update()
sys.publish("UIWND_UPDATE")
end
local function onAdd(wnd)
table.insert(stack,wnd)
stack[#stack].onUpdate()
end
local function onRemove(winid)
local istop,k,v
for k,v in ipairs(stack) do
if v.id == winid then
istop = (k==#stack)
table.remove(stack,k)
if #stack~=0 and istop then
stack[#stack].onUpdate()
end
return
end
end
end
local function onRemoveAll()
local k,v
for k,v in ipairs(stack) do
table.remove(stack,k)
end
end
local function onUpdate()
if stack[#stack] and stack[#stack].onUpdate then
stack[#stack].onUpdate()
end
end
--key自定义功能键
--value自定义功能键的状态
local function onKey(key,value)
if stack[#stack] and stack[#stack].onKey then
stack[#stack].onKey(key,value)
end
end
--- 判断一个窗口是否处于最前显示
-- @number winId 窗口ID
-- @return booltrue表示最前显示其余表示非最前显示
-- @usage uiWin.isActive(winId)
function isActive(winId)
if stack[#stack] and stack[#stack].id then
return stack[#stack].id==winId
end
end
sys.subscribe("UIWND_ADD",onAdd)
sys.subscribe("UIWND_REMOVE",onRemove)
sys.subscribe("UIWND_REMOVEALL",onRemoveAll)
sys.subscribe("UIWND_UPDATE",onUpdate)
sys.subscribe("UIWND_KEY",onKey)