event.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. local Event = class("Event")
  2. local EXPORTED_METHODS = {
  3. "addEventListener",
  4. "dispatchEvent",
  5. "removeEventListener",
  6. "removeEventListenersByTag",
  7. "removeEventListenersByEvent",
  8. "removeAllEventListeners",
  9. "hasEventListener",
  10. "dumpAllEventListeners",
  11. }
  12. function Event:init_()
  13. self.target_ = nil
  14. self.listeners_ = {}
  15. self.nextListenerHandleIndex_ = 0
  16. end
  17. function Event:bind(target)
  18. self:init_()
  19. cc.setmethods(target, self, EXPORTED_METHODS)
  20. self.target_ = target
  21. end
  22. function Event:unbind(target)
  23. cc.unsetmethods(target, EXPORTED_METHODS)
  24. self:init_()
  25. end
  26. function Event:on(eventName, listener, tag)
  27. assert(type(eventName) == "string" and eventName ~= "",
  28. "Event:addEventListener() - invalid eventName")
  29. eventName = string.upper(eventName)
  30. if self.listeners_[eventName] == nil then
  31. self.listeners_[eventName] = {}
  32. end
  33. self.nextListenerHandleIndex_ = self.nextListenerHandleIndex_ + 1
  34. local handle = tostring(self.nextListenerHandleIndex_)
  35. tag = tag or ""
  36. self.listeners_[eventName][handle] = {listener, tag}
  37. if DEBUG > 1 then
  38. printInfo("%s [Event] addEventListener() - event: %s, handle: %s, tag: \"%s\"",
  39. tostring(self.target_), eventName, handle, tostring(tag))
  40. end
  41. return self.target_, handle
  42. end
  43. Event.addEventListener = Event.on
  44. function Event:dispatchEvent(event)
  45. event.name = string.upper(tostring(event.name))
  46. local eventName = event.name
  47. if DEBUG > 1 then
  48. printInfo("%s [Event] dispatchEvent() - event %s", tostring(self.target_), eventName)
  49. end
  50. if self.listeners_[eventName] == nil then return end
  51. event.target = self.target_
  52. event.stop_ = false
  53. event.stop = function(self)
  54. self.stop_ = true
  55. end
  56. for handle, listener in pairs(self.listeners_[eventName]) do
  57. if DEBUG > 1 then
  58. printInfo("%s [Event] dispatchEvent() - dispatching event %s to listener %s", tostring(self.target_), eventName, handle)
  59. end
  60. -- listener[1] = listener
  61. -- listener[2] = tag
  62. event.tag = listener[2]
  63. listener[1](event)
  64. if event.stop_ then
  65. if DEBUG > 1 then
  66. printInfo("%s [Event] dispatchEvent() - break dispatching for event %s", tostring(self.target_), eventName)
  67. end
  68. break
  69. end
  70. end
  71. return self.target_
  72. end
  73. function Event:removeEventListener(handleToRemove)
  74. for eventName, listenersForEvent in pairs(self.listeners_) do
  75. for handle, _ in pairs(listenersForEvent) do
  76. if handle == handleToRemove then
  77. listenersForEvent[handle] = nil
  78. if DEBUG > 1 then
  79. printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName)
  80. end
  81. return self.target_
  82. end
  83. end
  84. end
  85. return self.target_
  86. end
  87. function Event:removeEventListenersByTag(tagToRemove)
  88. for eventName, listenersForEvent in pairs(self.listeners_) do
  89. for handle, listener in pairs(listenersForEvent) do
  90. -- listener[1] = listener
  91. -- listener[2] = tag
  92. if listener[2] == tagToRemove then
  93. listenersForEvent[handle] = nil
  94. if DEBUG > 1 then
  95. printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName)
  96. end
  97. end
  98. end
  99. end
  100. return self.target_
  101. end
  102. function Event:removeEventListenersByEvent(eventName)
  103. self.listeners_[string.upper(eventName)] = nil
  104. if DEBUG > 1 then
  105. printInfo("%s [Event] removeAllEventListenersForEvent() - remove all listeners for event %s", tostring(self.target_), eventName)
  106. end
  107. return self.target_
  108. end
  109. function Event:removeAllEventListeners()
  110. self.listeners_ = {}
  111. if DEBUG > 1 then
  112. printInfo("%s [Event] removeAllEventListeners() - remove all listeners", tostring(self.target_))
  113. end
  114. return self.target_
  115. end
  116. function Event:hasEventListener(eventName)
  117. eventName = string.upper(tostring(eventName))
  118. local t = self.listeners_[eventName]
  119. for _, __ in pairs(t) do
  120. return true
  121. end
  122. return false
  123. end
  124. function Event:dumpAllEventListeners()
  125. print("---- Event:dumpAllEventListeners() ----")
  126. for name, listeners in pairs(self.listeners_) do
  127. printf("-- event: %s", name)
  128. for handle, listener in pairs(listeners) do
  129. printf("-- listener: %s, handle: %s", tostring(listener[1]), tostring(handle))
  130. end
  131. end
  132. return self.target_
  133. end
  134. return Event