فهرست منبع

New Lua EventDispatcher system. addEventListener now takes a callback function as second parameter

Ivan Safrin 13 سال پیش
والد
کامیت
ba4e3cbd37

+ 1 - 0
.gitignore

@@ -40,6 +40,7 @@ UserInterfaceState.*
 Player/Build/Mac OS X/Polycode Player.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate
 
 /Bindings/Contents/LUA/API/Polycode/*.lua
+!/Bindings/Contents/LUA/API/Polycode/EventDispatcher.lua
 /Bindings/Contents/LUA/API/Polycode.lua
 /Bindings/Contents/LUA/API/api.pak
 /Bindings/Contents/LUA/Include/*.h

+ 78 - 0
Bindings/Contents/LUA/API/Polycode/EventDispatcher.lua

@@ -0,0 +1,78 @@
+
+class "EventDispatcher"
+
+function EventDispatcher:EventDispatcher()
+	self.listenerEntries = {}
+end
+
+function EventDispatcher:addEventListener(listener, callback, eventCode)
+	if self.listenerEntries == nil then
+		self.listenerEntries = {}
+	end
+	local newEntry = {}
+	if self.__ptr ~= nil then
+		newEntry.handler = Polycore.EventHandler(newEntry)
+		Polycore.EventDispatcher_addEventListener(self.__ptr, newEntry.handler, eventCode)
+	end
+	newEntry.listener = listener
+	newEntry.callback = callback
+	newEntry.eventCode = eventCode
+	self.listenerEntries[#self.listenerEntries+1] = newEntry
+end
+
+function EventDispatcher:removeAllHandlers()
+	if self.listenerEntries == nil then
+		self.listenerEntries = {}
+	end	
+	if self.__ptr ~= nil then
+		Polycore.EventDispatcher_removeAllHandlers(self.__ptr)
+	end
+	self.listenerEntries = {}
+end
+
+function EventDispatcher:removeAllHandlersForListener(listener)
+	if self.listenerEntries == nil then
+		self.listenerEntries = {}
+	end	
+	local i=1
+	while i <= #self.listenerEntries do
+		if self.listenerEntries[i].listener == listener then
+			if self.__ptr ~= nil and self.listenerEntries[i].handler ~= nil then
+				Polycore.EventDispatcher_removeAllHandlersForListener(self.__ptr, self.listenerEntries[i].handler)
+				Polycore.delete_EventHandler(self.listenerEntries[i].handler)
+			end
+			table.remove(self.listenerEntries, i)
+		else
+			i = i + 1
+		end
+	end
+end
+
+function EventDispatcher:removeEventListener(listener, eventCode)
+	if self.listenerEntries == nil then
+		self.listenerEntries = {}
+	end	
+	local i=1
+	while i <= #self.listenerEntries do
+		if self.listenerEntries[i].listener == listener and self.listenerEntries[i].eventCode == eventCode then
+			if self.__ptr ~= nil and self.listenerEntries[i].handler ~= nil then
+				Polycore.EventDispatcher_removeAllHandlersForListener(self.__ptr, self.listenerEntries[i].handler)
+				Polycore.delete_EventHandler(self.listenerEntries[i].handler)
+			end
+			table.remove(self.listenerEntries, i)
+		else
+			i = i + 1
+		end
+	end
+end
+
+function EventDispatcher:dispatchEvent(event, eventCode)
+	if self.listenerEntries == nil then
+		self.listenerEntries = {}
+	end	
+	for i=1,#self.listenerEntries do
+		if self.listenerEntries[i].eventCode == eventCode then
+			self.listenerEntries[i].callback(self.listenerEntries[i].listener, event)
+		end
+	end
+end

+ 1 - 1
Bindings/Contents/LUA/API/defaults.lua

@@ -43,7 +43,7 @@ end
 _G["__handleEvent"] = function(target, event)
 	evt = _G["Event"]("__skip_ptr__")
 	evt.__ptr = event
-	target:handleEvent(evt)
+	target.callback(target.listener, evt)
 end
 
 __core__services__instance = Polycore.CoreServices_getInstance()

+ 3 - 2
Bindings/Scripts/create_lua_library/create_lua_library.py

@@ -726,8 +726,9 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 				luaIndexOut += "require \"%s/%s\"\n" % (prefix, ckey)
 				# Write lua file
 				mkdir_p(apiClassPath)
-				fout = open("%s/%s.lua" % (apiClassPath, ckey), "w")
-				fout.write(luaClassBindingOut)
+				if ckey != "EventDispatcher":
+					fout = open("%s/%s.lua" % (apiClassPath, ckey), "w")
+					fout.write(luaClassBindingOut)
 
 				luaDocOut += "\t</class>\n"