aboutsummaryrefslogtreecommitdiff
path: root/events.lua
blob: aa645eaf8c554a80a9eeaaade39fa8d09343ec26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
local EventPrototype = {}

function EventPrototype:preventDefault()
	self.defaultPrevented = true
end

function Event(type, data)
	return setmetatable({
		type = type,
		data = data,
		defaultPrevented = false,
		timeStamp = lua_async.clock(),
	}, {__index = EventPrototype})
end

local EventTargetPrototype = {}

function EventTargetPrototype:dispatchEvent(event)
	event.target = self

	local callback = self["on" .. event.type]

	if callback then
		callback(event)
	end

	local listeners = self.__eventListeners[event.type]

	if listeners then
		for i, callback in ipairs(listeners) do
			callback(event)
		end
	end

	return not event.defaultPrevented
end

function EventTargetPrototype:addEventListener(type, callback)
	local listeners = self.__eventListeners[type] or {}
	table.insert(listeners, callback)
	self.__eventListeners[type] = listeners
end

function EventTargetPrototype:removeEventListener(type, callback)
	local listeners = self.__eventListeners[type]

	if listeners then
		for k, v in pairs(listeners) do
			if v == callback then
				table.remove(listeners, k)
				break
			end
		end
	end
end

function EventTarget()
	return setmetatable({
		__eventListeners = {},
	}, {__index = EventTargetPrototype})
end