116 lines
2.4 KiB
Lua
116 lines
2.4 KiB
Lua
|
|
--- 模块功能: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)
|