--- 模块功能: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)