diff options
Diffstat (limited to 'events.lua')
-rw-r--r-- | events.lua | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/events.lua b/events.lua new file mode 100644 index 0000000..ee723e8 --- /dev/null +++ b/events.lua @@ -0,0 +1,61 @@ +local EventPrototype = {} + +function EventPrototype:preventDefault() + self.defaultPrevented = true +end + +function Event(type, data) + return setmetatable({ + type = type, + data = data, + defaultPrevented = false, + timeStamp = os.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[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 |