MineOS/lib/zones.lua

80 lines
2.5 KiB
Lua

-----------------------------------------------------------------------------------------------------------------------------------------
if not _G.event then _G.event = require("event") end
if not _G.computer then _G.computer = require("computer") end
local zones = {}
zones.objects = {}
-----------------------------------------------------------------------------------------------------------------------------------------
local function listener(...)
local eventData = { ... }
local exit
local zoneInfo
if eventData[1] == "touch" then
for program in pairs(zones.objects) do
if exit then break end
for class in pairs(zones.objects[program]) do
if exit then break end
for name in pairs(zones.objects[program][class]) do
if exit then break end
if
eventData[3] >= zones.objects[program][class][name][1] and
eventData[4] >= zones.objects[program][class][name][2] and
eventData[3] <= zones.objects[program][class][name][3] and
eventData[4] <= zones.objects[program][class][name][4]
then
zoneInfo = {}
for i = 1, #zones.objects[program][class][name] do
if zones.objects[program][class][name][i] then
table.insert(zoneInfo, zones.objects[program][class][name][i])
end
end
computer.pushSignal("zone", program, class, name, eventData[3], eventData[4], eventData[5], table.unpack(zoneInfo))
exit = true
end
end
end
end
end
end
function zones.start()
event.listen("touch", listener)
event.listen("drag", listener)
end
function zones.stop()
event.ignore("touch", listener)
event.ignore("drag", listener)
end
function zones.add(program, class, name, x, y, width, height, ...)
zones.objects[program] = zones.objects[program] or {}
zones.objects[program][class] = zones.objects[program][class] or {}
zones.objects[program][class][name] = { x, y, x + width - 1, y + height - 1, ... }
end
function zones.remove(program, class, name)
if program and class and name then
if zones.objects[program] and zones.objects[program][class] then zones.objects[program][class][name] = nil end
elseif program and class then
if zones.objects[program] then zones.objects[program][class] = nil end
elseif program then
zones.objects[program] = nil
end
end
-----------------------------------------------------------------------------------------------------------------------------------------
zones.stop()
zones.start()
-----------------------------------------------------------------------------------------------------------------------------------------
return zones