local path = string.sub(..., 1, string.len(...) - string.len(".core.input")) local helium = require(path .. ".dummy") local input={ eventHandlers = {}, subscriptions = {}, activeEvents = {} } local subscription = {} subscription.__index = subscription local context = {} context.__index = context local activeContext --[[Event types ###SIMPLE EVENTS### mousepressed,--press started mousereleased,--press released after an event inside started mousepressed_outside --mousepressed outside of the subscription mousereleased_outside --mousereleased outside of the subscription keypressed,--key pressed keyreleased,--key released ###COMPLEX EVENTS### dragged, clicked, hover, ]] function input.newContext(element) local ctx = setmetatable({view = element.view, subs = {}}, context) return ctx end function context:set() if activeContext then self.parentCtx = activeContext self.absX = self.parentCtx.absX + self.view.x self.absY = self.parentCtx.absY + self.view.y activeContext = self else self.absX = self.view.x self.absY = self.view.y activeContext = self end end function context:unset() if self.parentCtx then activeContext = self.parentCtx else activeContext = nil end end function context:destroy() for i, e in ipairs(self.subs) do self.subs:destroy() end end function subscription.create(x, y, w, h, eventType, callback, doff) local sub if activeContext then sub = setmetatable({ x = activeContext.absX + x, y = activeContext.absY + y, w = w, h = h, eventType = eventType, active = doff or true, callback = callback },subscription) else sub = setmetatable({ x = x, y = y, w = w, h = h, eventType = eventType, active = doff or true, callback = callback },subscription) end if not input.subscriptions[eventType] then input.subscriptions[eventType] = {} end table.insert(input.subscriptions[eventType],sub) return sub end function subscription:off() self.active = false end function subscription:on() self.active = true end function subscription:destroy() self.destroy = true self.active = false end function subscription:update(x, y, w, h) self.x = x or self.x self.y = y or self.y self.w = w or self.w self.h = h or self.h end function subscription:emit(...) return self.callback(...) end function subscription:checkInside(x, y) if x>self.x and xself.y and yself.x and xself.y and y