uiWin.lua 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. --- 模块功能:UI窗口管理
  2. -- @module uiWin
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.03.25
  7. module(...,package.seeall)
  8. --窗口管理栈
  9. local stack = {}
  10. --当前分配的窗口ID
  11. local winid = 0
  12. local function allocid()
  13. winid = winid + 1
  14. return winid
  15. end
  16. local function loseFocus()
  17. if stack[#stack] and stack[#stack]["onLoseFocus"] then
  18. stack[#stack]["onLoseFocus"]()
  19. end
  20. end
  21. --- 新增一个窗口
  22. -- @table wnd 窗口的元素以及消息处理函数表
  23. -- @return number,窗口ID
  24. -- @usage uiWin.add({onUpdate = refresh})
  25. function add(wnd)
  26. ---必须注册更新接口
  27. assert(wnd.onUpdate)
  28. if type(wnd) ~= "table" then
  29. assert("unknown uiwin type "..type(wnd))
  30. end
  31. --上一个窗口执行失去焦点的处理函数
  32. loseFocus()
  33. --为新窗口分配窗口ID
  34. wnd.id = allocid()
  35. --新窗口请求入栈
  36. sys.publish("UIWND_ADD",wnd)
  37. return wnd.id
  38. end
  39. --- 移除一个窗口
  40. -- @number winId 窗口ID
  41. -- @return nil
  42. -- @usage uiWin.remove(winId)
  43. function remove(winId)
  44. sys.publish("UIWND_REMOVE",winId)
  45. end
  46. function removeAll()
  47. sys.publish("UIWND_REMOVEALL")
  48. end
  49. function update()
  50. sys.publish("UIWND_UPDATE")
  51. end
  52. local function onAdd(wnd)
  53. table.insert(stack,wnd)
  54. stack[#stack].onUpdate()
  55. end
  56. local function onRemove(winid)
  57. local istop,k,v
  58. for k,v in ipairs(stack) do
  59. if v.id == winid then
  60. istop = (k==#stack)
  61. table.remove(stack,k)
  62. if #stack~=0 and istop then
  63. stack[#stack].onUpdate()
  64. end
  65. return
  66. end
  67. end
  68. end
  69. local function onRemoveAll()
  70. local k,v
  71. for k,v in ipairs(stack) do
  72. table.remove(stack,k)
  73. end
  74. end
  75. local function onUpdate()
  76. if stack[#stack] and stack[#stack].onUpdate then
  77. stack[#stack].onUpdate()
  78. end
  79. end
  80. --key:自定义功能键
  81. --value:自定义功能键的状态
  82. local function onKey(key,value)
  83. if stack[#stack] and stack[#stack].onKey then
  84. stack[#stack].onKey(key,value)
  85. end
  86. end
  87. --- 判断一个窗口是否处于最前显示
  88. -- @number winId 窗口ID
  89. -- @return bool,true表示最前显示,其余表示非最前显示
  90. -- @usage uiWin.isActive(winId)
  91. function isActive(winId)
  92. if stack[#stack] and stack[#stack].id then
  93. return stack[#stack].id==winId
  94. end
  95. end
  96. sys.subscribe("UIWND_ADD",onAdd)
  97. sys.subscribe("UIWND_REMOVE",onRemove)
  98. sys.subscribe("UIWND_REMOVEALL",onRemoveAll)
  99. sys.subscribe("UIWND_UPDATE",onUpdate)
  100. sys.subscribe("UIWND_KEY",onKey)