This is for the love2d engine. Works with the latest version. Look at my intro to software project for some examples on how to use this
205 lines
6.3 KiB
Plaintext
205 lines
6.3 KiB
Plaintext
--[[WORKING ON
|
|
doubleTap - UnFinished!
|
|
touchRendering - Broken
|
|
]]
|
|
function gui:TClickable(mx,my)
|
|
local x,y,w,h=love.graphics.getScissor()
|
|
if _GuiPro.HasStencel then
|
|
local obj=_GuiPro.StencelHolder
|
|
if self:isDescendant(obj) then
|
|
return math.sqrt((mx-obj.x)^2+(my-obj.y)^2)<=(obj.offset.size.x or 0)
|
|
end
|
|
end
|
|
if not(x) then
|
|
return true
|
|
end
|
|
return not(mx>x+w or mx<x or my>y+h or my<y)
|
|
end
|
|
function gui:touchable(t)
|
|
local touches = love.touch.getTouches()
|
|
local x,y=0,0
|
|
for i, id in ipairs(touches) do
|
|
if self.id==id then
|
|
x, y = love.touch.getPosition(id)
|
|
return (x > self.x and x < self.x+self.width and y > self.y and y < self.y+self.height and self:TClickable(x,y) and self:eventable())
|
|
end
|
|
end
|
|
self.id=-1
|
|
end
|
|
multi:newTask(function() -- A bit of post-loading haha
|
|
gui.touchpressed=multi:newConnection()
|
|
gui.touchreleased=multi:newConnection()
|
|
gui.touchmoved=multi:newConnection()
|
|
love.touchpressed=Library.convert(love.touchpressed or function() end)
|
|
love.touchreleased=Library.convert(love.touchreleased or function() end)
|
|
love.touchmoved=Library.convert(love.touchmoved or function() end)
|
|
love.touchpressed:inject(function(id, x, y, dx, dy, pressure) gui.touchpressed:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1)
|
|
love.touchreleased:inject(function(id, x, y, dx, dy, pressure) gui.touchreleased:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1)
|
|
love.touchmoved:inject(function(id, x, y, dx, dy, pressure) gui.touchmoved:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1)
|
|
_GuiPro.TouchReady=true
|
|
_GuiPro.TouchRegister={}
|
|
gui.touchpressed:connect(function(id, x, y, dx, dy, pressure)
|
|
for i,v in pairs(_GuiPro.TouchRegister) do
|
|
if #v.tid==0 then
|
|
if (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then
|
|
v:addTID(id)
|
|
v.touchcount=1
|
|
for i=1,#v.ToFuncP do
|
|
v.ToFuncP[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
|
|
end
|
|
end
|
|
elseif not(v:hasTID(id)) then
|
|
if (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then
|
|
v:addTID(id)
|
|
v.touchcount=v.touchcount+1
|
|
for i=1,#v.ToFuncP do
|
|
v.ToFuncP[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
gui.touchreleased:connect(function(id, x, y, dx, dy, pressure)
|
|
for i,v in pairs(_GuiPro.TouchRegister) do
|
|
if v:hasTID(id) then
|
|
v:removeTID(id)
|
|
for i=1,#v.ToFuncR do
|
|
v.ToFuncR[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
gui.touchmoved:connect(function(id, x, y, dx, dy, pressure)
|
|
for i,v in pairs(_GuiPro.TouchRegister) do
|
|
if v:hasTID(id) and (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then
|
|
for i=1,#v.ToFuncM do
|
|
v.ToFuncM[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
|
|
end
|
|
elseif v:hasTID(id) and not((x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable())) then
|
|
v:removeTID(id)
|
|
for i=1,#v.ToFuncR do
|
|
v.ToFuncR[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
end)
|
|
-- now that that is done lets set up some more post loading checks
|
|
_GuiPro.int=multi:newProcess()
|
|
_GuiPro.int:Start()
|
|
_GuiPro.int:setJobSpeed(.001)
|
|
_GuiPro.EXACT=0
|
|
_GuiPro.LAX=.01
|
|
_GuiPro.LAZY=.05
|
|
-- now lets define the reg function
|
|
function gui.Compare(a,b,v,tp)
|
|
if tp==">" then
|
|
if (a+v>b or a-v>b) then
|
|
return true
|
|
end
|
|
elseif tp=="<" then
|
|
if (a+v<b or a-v<b) then
|
|
return true
|
|
end
|
|
elseif tp=="<=" then
|
|
if (a+v<=b or a-v<=b) then
|
|
return true
|
|
end
|
|
elseif tp==">=" then
|
|
if (a+v>=b or a-v>=b) then
|
|
return true
|
|
end
|
|
elseif tp=="==" then -- this one is gonna be tricky
|
|
if (a>=b-v and a<=b+v) or (b>=a-v and b<=a+v) then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
function gui:regesterTouch()
|
|
local obj=self
|
|
obj.ToFuncP={}
|
|
obj.ToFuncM={}
|
|
obj.ToFuncR={}
|
|
obj.To2Func={}
|
|
obj.ToDTFunc={}
|
|
obj.touchRendering =_GuiPro.EXACT -- exact(0), lax(), #
|
|
function obj:removeTID(id)
|
|
for i=1,#self.tid do
|
|
if self.tid[i]==id then
|
|
table.remove(self.tid,i)
|
|
self.touchcount=self.touchcount-1
|
|
return
|
|
end
|
|
end
|
|
end
|
|
function obj:hasTID(id)
|
|
for i=1,#self.tid do
|
|
if self.tid[i]==id then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
obj.txl1=0
|
|
obj.tyl1=0
|
|
obj.txl2=0
|
|
obj.tyl2=0
|
|
obj.LS=0
|
|
obj:OnUpdate(function(self)
|
|
if self.touchcount==2 then
|
|
local x1,y1=love.touch.getPosition( self.tid[1] )
|
|
local x2,y2=love.touch.getPosition( self.tid[2] )
|
|
local CS=math.sqrt((x2-x1)^2+(y2-y1)^2)
|
|
if gui.Compare(CS,self.LS,self.touchRendering,">") then
|
|
for i=1,#self.To2Func do
|
|
self.To2Func[i](self,CS,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
|
|
end
|
|
elseif gui.Compare(CS,self.LS,self.touchRendering,"<") then
|
|
for i=1,#self.To2Func do
|
|
self.To2Func[i](self,-CS,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
|
|
end
|
|
elseif gui.Compare(CS,self.LS,self.touchRendering,"==") then
|
|
for i=1,#self.To2Func do
|
|
self.To2Func[i](self,0,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
|
|
end
|
|
end
|
|
-- if self.txl1~=x1 or self.txl2~=x2 or self.tyl1~=y1 or self.tyl2~=y2 then
|
|
-- for i=1,#self.To2Func do
|
|
-- self.To2Func[i](self,0,x1-self.x,y1-self.y,x2-self.x,y2-self.y)
|
|
-- end
|
|
-- end
|
|
self.LS=CS
|
|
self.txl1=x1
|
|
self.txl2=x2
|
|
self.tyl1=y1
|
|
self.tyl2=y2
|
|
end
|
|
end)
|
|
function obj:OnDoubleTap(func)
|
|
table.insert(self.ToDTFunc,func)
|
|
end
|
|
function obj:On2TouchMoved(func)
|
|
table.insert(self.To2Func,func)
|
|
end
|
|
function obj:addTID(id)
|
|
table.insert(self.tid,id)
|
|
end
|
|
function obj:OnTouchPressed(func)
|
|
table.insert(self.ToFuncP,func) -- event for touches
|
|
end
|
|
function obj:OnTouchReleased(func) -- event for touches
|
|
table.insert(self.ToFuncR,func)
|
|
end
|
|
function obj:OnTouchMoved(func) -- event for touches
|
|
table.insert(self.ToFuncM,func)
|
|
end
|
|
if _GuiPro.TouchReady then -- my sneaky test
|
|
print("Registred: "..tostring(obj))
|
|
table.insert(_GuiPro.TouchRegister,obj)
|
|
else
|
|
print("Attempting to register: "..tostring(obj))
|
|
_GuiPro.int:newJob(function() table.insert(_GuiPro.TouchRegister,obj) end) -- a sneaky way to ensure that your object gets registered eventually, even if you call the method before the touch patch was activated.
|
|
end
|
|
end
|