112 lines
3.5 KiB
Lua
112 lines
3.5 KiB
Lua
return function(name, basalt)
|
|
local base = basalt.getObject("Object")(name, basalt)
|
|
|
|
local objectType = "Thread"
|
|
|
|
local func
|
|
local cRoutine
|
|
local isActive = false
|
|
local filter
|
|
|
|
local object = {
|
|
getType = function(self)
|
|
return objectType
|
|
end,
|
|
|
|
start = function(self, f)
|
|
if (f == nil) then
|
|
error("Function provided to thread is nil")
|
|
end
|
|
func = f
|
|
cRoutine = coroutine.create(func)
|
|
isActive = true
|
|
filter=nil
|
|
local ok, result = coroutine.resume(cRoutine)
|
|
filter = result
|
|
if not (ok) then
|
|
if (result ~= "Terminated") then
|
|
error("Thread Error Occurred - " .. result)
|
|
end
|
|
end
|
|
self:listenEvent("mouse_click")
|
|
self:listenEvent("mouse_up")
|
|
self:listenEvent("mouse_scroll")
|
|
self:listenEvent("mouse_drag")
|
|
self:listenEvent("key")
|
|
self:listenEvent("key_up")
|
|
self:listenEvent("char")
|
|
self:listenEvent("other_event")
|
|
return self
|
|
end,
|
|
|
|
getStatus = function(self, f)
|
|
if (cRoutine ~= nil) then
|
|
return coroutine.status(cRoutine)
|
|
end
|
|
return nil
|
|
end,
|
|
|
|
stop = function(self, f)
|
|
isActive = false
|
|
self:listenEvent("mouse_click", false)
|
|
self:listenEvent("mouse_up", false)
|
|
self:listenEvent("mouse_scroll", false)
|
|
self:listenEvent("mouse_drag", false)
|
|
self:listenEvent("key", false)
|
|
self:listenEvent("key_up", false)
|
|
self:listenEvent("char", false)
|
|
self:listenEvent("other_event", false)
|
|
return self
|
|
end,
|
|
|
|
mouseHandler = function(self, ...)
|
|
self:eventHandler("mouse_click", ...)
|
|
end,
|
|
mouseUpHandler = function(self, ...)
|
|
self:eventHandler("mouse_up", ...)
|
|
end,
|
|
mouseScrollHandler = function(self, ...)
|
|
self:eventHandler("mouse_scroll", ...)
|
|
end,
|
|
mouseDragHandler = function(self, ...)
|
|
self:eventHandler("mouse_drag", ...)
|
|
end,
|
|
mouseMoveHandler = function(self, ...)
|
|
self:eventHandler("mouse_move", ...)
|
|
end,
|
|
keyHandler = function(self, ...)
|
|
self:eventHandler("key", ...)
|
|
end,
|
|
keyUpHandler = function(self, ...)
|
|
self:eventHandler("key_up", ...)
|
|
end,
|
|
charHandler = function(self, ...)
|
|
self:eventHandler("char", ...)
|
|
end,
|
|
|
|
eventHandler = function(self, event, ...)
|
|
base.eventHandler(self, event, ...)
|
|
if (isActive) then
|
|
if (coroutine.status(cRoutine) == "suspended") then
|
|
if(filter~=nil)then
|
|
if(event~=filter)then return end
|
|
filter=nil
|
|
end
|
|
local ok, result = coroutine.resume(cRoutine, event, ...)
|
|
filter = result
|
|
if not (ok) then
|
|
if (result ~= "Terminated") then
|
|
error("Thread Error Occurred - " .. result)
|
|
end
|
|
end
|
|
else
|
|
self:stop()
|
|
end
|
|
end
|
|
end,
|
|
|
|
}
|
|
|
|
object.__index = object
|
|
return setmetatable(object, base)
|
|
end |