最终提交
This commit is contained in:
115
4G/源代码/lib/uiWin.lua
Normal file
115
4G/源代码/lib/uiWin.lua
Normal 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 bool,true表示最前显示,其余表示非最前显示
|
||||
-- @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)
|
||||
Reference in New Issue
Block a user