mirror of
https://github.com/rayaman/multi.git
synced 2026-09-05 07:27:35 -04:00
Added intergration loveManager
Adds multi.intergrations.loveManager,lua Created an example file for you to look at
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
package.path="?/init.lua;"..package.path
|
||||
require("multi")
|
||||
require("multi.compat.backwards[1,5,0]")
|
||||
multi:newLoop(function(dt,self)
|
||||
print(dt)
|
||||
end)
|
||||
multi:mainloop() -- start the main runner
|
||||
@@ -0,0 +1,35 @@
|
||||
package.path="?/init.lua;?.lua;"..package.path
|
||||
local GLOBAL,sThread=require("multi.intergration.lanesManager").init()
|
||||
require("multi.threading")
|
||||
multi:newAlarm(2):OnRing(function(self)
|
||||
GLOBAL["NumOfCores"]=sThread.getCores()
|
||||
end)
|
||||
multi:newAlarm(7):OnRing(function(self)
|
||||
GLOBAL["AnotherTest"]=true
|
||||
end)
|
||||
multi:newAlarm(13):OnRing(function(self)
|
||||
GLOBAL["FinalTest"]=true
|
||||
end)
|
||||
multi:newSystemThread("test",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
print("Waiting for variable: NumOfCores")
|
||||
print("Got it: ",sThread.waitFor("NumOfCores"))
|
||||
sThread.hold(function()
|
||||
return GLOBAL["AnotherTest"] -- note this would hold the entire systemthread. Spawn a coroutine thread using multi:newThread() or multi:newThreaded...
|
||||
end)
|
||||
print("Holding works!")
|
||||
multi:newThread("tests",function()
|
||||
thread.hold(function()
|
||||
return GLOBAL["FinalTest"] -- note this will not hold the entire systemthread. As seen with the TLoop constantly going!
|
||||
end)
|
||||
print("Final test works!")
|
||||
os.exit()
|
||||
end)
|
||||
local a=0
|
||||
multi:newTLoop(function()
|
||||
a=a+1
|
||||
print(a)
|
||||
end,.5)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:mainloop()
|
||||
@@ -0,0 +1,62 @@
|
||||
package.path="?/init.lua;?.lua;"..package.path
|
||||
local GLOBAL,sThread=require("multi.intergration.lanesManager").init()
|
||||
require("multi.threading") -- obvious copy/paste below with no attempt to clean it up :P
|
||||
local function comma_value(amount)
|
||||
local formatted = amount
|
||||
while true do
|
||||
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
|
||||
if (k==0) then
|
||||
break
|
||||
end
|
||||
end
|
||||
return formatted
|
||||
end
|
||||
multi:newSystemThread("test1",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
multi:benchMark(sThread.waitFor("Bench"),nil,"Thread 1"):OnBench(function(self,c) GLOBAL["T1"]=c multi:Stop() end)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:newSystemThread("test2",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
multi:benchMark(sThread.waitFor("Bench"),nil,"Thread 2"):OnBench(function(self,c) GLOBAL["T2"]=c multi:Stop() end)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:newSystemThread("test3",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
multi:benchMark(sThread.waitFor("Bench"),nil,"Thread 3"):OnBench(function(self,c) GLOBAL["T3"]=c multi:Stop() end)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:newSystemThread("test4",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
multi:benchMark(sThread.waitFor("Bench"),nil,"Thread 4"):OnBench(function(self,c) GLOBAL["T4"]=c multi:Stop() end)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:newSystemThread("test5",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
multi:benchMark(sThread.waitFor("Bench"),nil,"Thread 5"):OnBench(function(self,c) GLOBAL["T5"]=c multi:Stop() end)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:newSystemThread("test6",function() -- spawns a thread in another lua process
|
||||
require("multi.all") -- now you can do all of your coding with the multi library! You could even spawn more threads from here with the intergration. You would need to require the interaction again though
|
||||
multi:benchMark(sThread.waitFor("Bench"),nil,"Thread 6"):OnBench(function(self,c) GLOBAL["T6"]=c multi:Stop() end)
|
||||
multi:mainloop()
|
||||
end)
|
||||
multi:newSystemThread("Combiner",function() -- spawns a thread in another lua process
|
||||
print("Bench: ",comma_value(tostring(sThread.waitFor("T1")+sThread.waitFor("T2")+sThread.waitFor("T3")+sThread.waitFor("T4")+sThread.waitFor("T5")+sThread.waitFor("T6"))))
|
||||
GLOBAL["DONE"]=true
|
||||
end)
|
||||
multi:newThread("test0",function()
|
||||
-- sThread.waitFor("DONE") -- lets hold the main thread completely so we don't eat up cpu
|
||||
-- os.exit()
|
||||
-- when the main thread is holding there is a chance that error handling on the system threads may not work!
|
||||
-- instead we can do this
|
||||
while true do
|
||||
thread.skip(1) -- allow error handling to take place... Otherwise lets keep the main thread running on the low
|
||||
sThread.sleep(.001) -- Sleeping for .001 is a greeat way to keep cpu usage down. Make sure if you aren't doing work to rest. Abuse the hell out of GLOBAL if you need to :P
|
||||
if GLOBAL["DONE"] then
|
||||
os.exit()
|
||||
end
|
||||
end
|
||||
end)
|
||||
GLOBAL["Bench"]=10
|
||||
multi:mainloop()
|
||||
@@ -0,0 +1,15 @@
|
||||
function gui:Clickable()
|
||||
local x,y,w,h=love.graphics.getScissor()
|
||||
local mx=love.mouse.getX()
|
||||
local my=love.mouse.getY()
|
||||
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
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
function DrawThings(items)
|
||||
for i=1,#items do
|
||||
items[i]:draw()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,85 @@
|
||||
function gui:OnClicked(func)
|
||||
table.insert(self.funcs,func)
|
||||
end
|
||||
function gui:OnReleased(func)
|
||||
table.insert(self.funcs2,func)
|
||||
end
|
||||
function gui:OnEnter(func)
|
||||
table.insert(self.funcs3,func)
|
||||
end
|
||||
function gui:OnExit(func)
|
||||
table.insert(self.funcs4,func)
|
||||
end
|
||||
function gui:OnUpdate(func)
|
||||
table.insert(self.funcs5,func)
|
||||
end
|
||||
function gui:OnDragStart(func)
|
||||
table.insert(self.func8,func)
|
||||
end
|
||||
function gui:OnDragging(func)
|
||||
table.insert(self.func6,func)
|
||||
end
|
||||
function gui:OnDragEnd(func)
|
||||
table.insert(self.func7,func)
|
||||
end
|
||||
function gui:WhileHovering(func)
|
||||
table.insert(self.func9,func)
|
||||
end
|
||||
function gui:OnMouseMoved(func)
|
||||
table.insert(self.func10,func)
|
||||
end
|
||||
function gui:getChildren()
|
||||
return self.Children
|
||||
end
|
||||
function gui:LClicked()
|
||||
return self.lclicked
|
||||
end
|
||||
function gui:RClicked()
|
||||
return self.rclicked
|
||||
end
|
||||
function gui:MClicked()
|
||||
return self.mclicked
|
||||
end
|
||||
function gui:Clicked()
|
||||
return (self.lclicked or self.rclicked)
|
||||
end
|
||||
function gui:Hovering()
|
||||
return self.hovering
|
||||
end
|
||||
function gui:FreeConnections()
|
||||
self.funcs={function(b,self) if b=="l" then self.LRE=true end end,function(b,self) if b=="r" then self.RRE=true end end,function(b,self) if b=="m" then self.MRE=true end end}
|
||||
self.funcs2={function(b,self) if b=="l" then self.LRE=false end end,function(b,self) if b=="r" then self.RRE=false end end,function(b,self) if b=="m" then self.MRE=false end end}
|
||||
self.funcs3={function(self) self.HE=true end}
|
||||
self.funcs4={function(self) self.HE=false end}
|
||||
self.funcs5={function(self) self.x=(self.Parent.width*self.scale.pos.x)+self.offset.pos.x+self.Parent.x self.y=(self.Parent.height*self.scale.pos.y)+self.offset.pos.y+self.Parent.y self.width=(self.Parent.width*self.scale.size.x)+self.offset.size.x self.height=(self.Parent.height*self.scale.size.y)+self.offset.size.y end}
|
||||
end
|
||||
function gui:LClick()
|
||||
for i=1,#self.funcs do
|
||||
self.funcs[i]("l",self)
|
||||
end
|
||||
end
|
||||
function gui:RClick()
|
||||
for i=1,#self.funcs do
|
||||
self.funcs[i]("r",self)
|
||||
end
|
||||
end
|
||||
function gui:MClick()
|
||||
for i=1,#self.funcs do
|
||||
self.funcs[i]("m",self)
|
||||
end
|
||||
end
|
||||
function gui:LRelease()
|
||||
for i=1,#self.funcs2 do
|
||||
self.funcs2[i]("l",self)
|
||||
end
|
||||
end
|
||||
function gui:RRelease()
|
||||
for i=1,#self.funcs2 do
|
||||
self.funcs2[i]("r",self)
|
||||
end
|
||||
end
|
||||
function gui:MRelease()
|
||||
for i=1,#self.funcs2 do
|
||||
self.funcs2[i]("m",self)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,46 @@
|
||||
function UpdateThings(items)
|
||||
for i=#items,1,-1 do
|
||||
if items[i]:LClicked() then
|
||||
for g=1,#items[i].funcs do
|
||||
items[i].funcs[g]("l",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
elseif items[i]:RClicked() then
|
||||
for g=1,#items[i].funcs do
|
||||
items[i].funcs[g]("r",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
elseif items[i]:MClicked() then
|
||||
for g=1,#items[i].funcs do
|
||||
items[i].funcs[g]("m",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
end
|
||||
if not(items[i]:LClicked()) and items[i].LRE then
|
||||
for g=1,#items[i].funcs2 do
|
||||
items[i].funcs2[g]("l",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
elseif not(items[i]:RClicked()) and items[i].RRE then
|
||||
for g=1,#items[i].funcs2 do
|
||||
items[i].funcs2[g]("r",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
elseif not(items[i]:MClicked()) and items[i].MRE then
|
||||
for g=1,#items[i].funcs2 do
|
||||
items[i].funcs2[g]("m",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
end
|
||||
if items[i]:Hovering() and items[i].HE==false then
|
||||
for g=1,#items[i].funcs3 do
|
||||
items[i].funcs3[g](items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
elseif not(items[i]:Hovering()) and items[i].HE==true then
|
||||
for g=1,#items[i].funcs4 do
|
||||
items[i].funcs4[g](items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
elseif items[i]:Hovering() then
|
||||
for g=1,#items[i].func9 do
|
||||
items[i].func9[g](items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y)
|
||||
end
|
||||
end
|
||||
for g=1,#items[i].funcs5 do
|
||||
items[i].funcs5[g](items[i])
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,25 @@
|
||||
function GetAllChildren(Object)
|
||||
local Stuff = {}
|
||||
function Seek(Items)
|
||||
for i=1,#Items do
|
||||
if Items[i].Visible==true then
|
||||
table.insert(Stuff,Items[i])
|
||||
local NItems = Items[i]:getChildren()
|
||||
if NItems ~= nil then
|
||||
Seek(NItems)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local Objs = Object:getChildren()
|
||||
for i=1,#Objs do
|
||||
if Objs[i].Visible==true then
|
||||
table.insert(Stuff,Objs[i])
|
||||
local Items = Objs[i]:getChildren()
|
||||
if Items ~= nil then
|
||||
Seek(Items)
|
||||
end
|
||||
end
|
||||
end
|
||||
return Stuff
|
||||
end
|
||||
@@ -0,0 +1,21 @@
|
||||
function GetAllChildren2(Object)
|
||||
local Stuff = {}
|
||||
function Seek(Items)
|
||||
for i=1,#Items do
|
||||
table.insert(Stuff,Items[i])
|
||||
local NItems = Items[i]:getChildren()
|
||||
if NItems ~= nil then
|
||||
Seek(NItems)
|
||||
end
|
||||
end
|
||||
end
|
||||
local Objs = Object:getChildren()
|
||||
for i=1,#Objs do
|
||||
table.insert(Stuff,Objs[i])
|
||||
local Items = Objs[i]:getChildren()
|
||||
if Items ~= nil then
|
||||
Seek(Items)
|
||||
end
|
||||
end
|
||||
return Stuff
|
||||
end
|
||||
@@ -0,0 +1,14 @@
|
||||
function gui:eventable()
|
||||
if self.important then
|
||||
return true
|
||||
end
|
||||
if _GuiPro.Hierarchy then
|
||||
if _GuiPro.TopHovered~=nil then
|
||||
return self:isDescendant(_GuiPro.TopHovered) or _GuiPro.TopHovered==self
|
||||
else
|
||||
return true
|
||||
end
|
||||
else
|
||||
return true
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:full()
|
||||
self:SetDualDim(nil,nil,nil,nil,nil,nil,1,1)
|
||||
end
|
||||
@@ -0,0 +1,238 @@
|
||||
function gui.enableAutoWindowScaling(b)
|
||||
_GuiPro.DPI_ENABLED=b or true
|
||||
_defaultfont=love.graphics.newFont(12*love.window.getPixelScale())
|
||||
end
|
||||
function filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
if type(name)~="string" then
|
||||
sh=sw
|
||||
sw=sy
|
||||
sy=sx
|
||||
sx=h
|
||||
h=w
|
||||
w=y
|
||||
y=x
|
||||
x=name
|
||||
end
|
||||
return x,y,w,h,sx,sy,sw,sh
|
||||
end
|
||||
function gui:newBase(tp,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
_GuiPro.count=_GuiPro.count+1
|
||||
local c = {}
|
||||
setmetatable(c, gui)
|
||||
if self==gui then
|
||||
c.Parent=_GuiPro
|
||||
else
|
||||
c.Parent=self
|
||||
end
|
||||
c.segments=nil
|
||||
c.ry=nil
|
||||
c.rx=nil
|
||||
c.DPI=1
|
||||
if _GuiPro.DPI_ENABLED then
|
||||
c.DPI=love.window.getPixelScale()
|
||||
x, y, w, h=c.DPI*x,c.DPI*y,c.DPI*w,c.DPI*h
|
||||
end
|
||||
c.centerFontY=true
|
||||
c.FormFactor="rectangle"
|
||||
c.Type=tp
|
||||
c.Active=true
|
||||
c.form="rectangle"
|
||||
c.Draggable=false
|
||||
c.Name=name or "Gui"..tp
|
||||
c:SetName(name)
|
||||
c.BorderSize=1
|
||||
c.BorderColor={0,0,0}
|
||||
c.BorderVisibility=1
|
||||
c.VIS=true
|
||||
c.Visible=true
|
||||
c.oV=true
|
||||
c.Children={}
|
||||
c.hovering=false
|
||||
c.rclicked=false
|
||||
c.lclicked=false
|
||||
c.mclicked=false
|
||||
c.clicked=false
|
||||
c.Visibility=1
|
||||
c.ClipDescendants=false
|
||||
c.TextWrap=true
|
||||
c.scale={}
|
||||
c.scale.size={}
|
||||
c.scale.size.x=sw or 0
|
||||
c.scale.size.y=sh or 0
|
||||
c.offset={}
|
||||
c.offset.size={}
|
||||
c.offset.size.x=w or 0
|
||||
c.offset.size.y=h or 0
|
||||
c.scale.pos={}
|
||||
c.scale.pos.x=sx or 0
|
||||
c.scale.pos.y=sy or 0
|
||||
c.offset.pos={}
|
||||
c.offset.pos.x=x or 0
|
||||
c.offset.pos.y=y or 0
|
||||
c.width = 0
|
||||
c.height = 0
|
||||
c.LRE=false
|
||||
c.RRE=false
|
||||
c.MRE=false
|
||||
c.Color = {255, 255, 255}
|
||||
function c:setRoundness(rx,ry,segments)
|
||||
self.segments=segments
|
||||
self.ry=ry
|
||||
self.rx=rx
|
||||
end
|
||||
function c.stfunc()
|
||||
love.graphics.rectangle("fill", c.x, c.y, c.width, c.height,c.rx,c.ry,c.segments)
|
||||
end
|
||||
function c:hasRoundness()
|
||||
return (self.ry or self.rx)
|
||||
end
|
||||
c.funcs={function(b,self)
|
||||
if b=="l" then
|
||||
self.LRE=true
|
||||
end
|
||||
end,
|
||||
function(b,self)
|
||||
if b=="r" then
|
||||
self.RRE=true
|
||||
end
|
||||
end,
|
||||
function(b,self)
|
||||
if b=="m" then
|
||||
self.MRE=true
|
||||
end
|
||||
end}
|
||||
c.funcs2={function(b,self)
|
||||
if b=="l" then
|
||||
self.LRE=false
|
||||
end
|
||||
end,
|
||||
function(b,self)
|
||||
if b=="r" then
|
||||
self.RRE=false
|
||||
end
|
||||
end,
|
||||
function(b,self)
|
||||
if b=="m" then
|
||||
self.MRE=false
|
||||
end
|
||||
end}
|
||||
c.HE=false
|
||||
c.funcs3={function(self)
|
||||
self.HE=true
|
||||
end}
|
||||
c.funcs4={function(self)
|
||||
self.HE=false
|
||||
end}
|
||||
c.funcs5={}
|
||||
c.tid={}
|
||||
c.touchcount=0
|
||||
c.x=(c.Parent.width*c.scale.pos.x)+c.offset.pos.x+c.Parent.x
|
||||
c.y=(c.Parent.height*c.scale.pos.y)+c.offset.pos.y+c.Parent.y
|
||||
c.width=(c.Parent.width*c.scale.size.x)+c.offset.size.x
|
||||
c.height=(c.Parent.height*c.scale.size.y)+c.offset.size.y
|
||||
c.func6={}
|
||||
c.func7={function() _GuiPro.DragItem={} end}
|
||||
c.func8={function(self) _GuiPro.DragItem=self end}
|
||||
c.func9={}
|
||||
c.func10={}
|
||||
function c:ImageRule()
|
||||
if self.Image then
|
||||
local sx=self.width/self.ImageWidth
|
||||
local sy=self.height/self.ImageHeigth
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.ImageVisibility*255)
|
||||
if self.width~=self.ImageWidth and self.height~=self.ImageHeigth then
|
||||
love.graphics.draw(self.Image,self.x,self.y,math.rad(self.rotation),sx,sy)
|
||||
else
|
||||
love.graphics.draw(self.Image,self.Quad,self.x,self.y,math.rad(self.rotation),sx,sy)
|
||||
end
|
||||
end
|
||||
end
|
||||
function c:VideoRule()
|
||||
if self.Video then
|
||||
local sx=self.width/self.VideoWidth
|
||||
local sy=self.height/self.VideoHeigth
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.VideoVisibility*255)
|
||||
if self.width~=self.VideoWidth and self.height~=self.VideoHeigth then
|
||||
love.graphics.draw(self.Video,self.x,self.y,math.rad(self.rotation),sx,sy)
|
||||
else
|
||||
love.graphics.draw(self.Video,self.Quad,self.x,self.y,math.rad(self.rotation),sx,sy)
|
||||
end
|
||||
end
|
||||
end
|
||||
function c:repeatImage(b,b2)
|
||||
if b then
|
||||
self.Image:setWrap(b,b2 or "repeat")
|
||||
function self:ImageRule()
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.ImageVisibility*255)
|
||||
love.graphics.draw(self.Image,self.Quad,self.x,self.y,math.rad(self.rotation))
|
||||
end
|
||||
else
|
||||
sx=self.width/self.ImageWidth
|
||||
sy=self.height/self.ImageHeigth
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.ImageVisibility*255)
|
||||
love.graphics.draw(self.Image,self.Quad,self.x,self.y,math.rad(self.rotation),sx,sy)
|
||||
end
|
||||
end
|
||||
function c:Mutate(t)
|
||||
for i,v in pairs(t) do
|
||||
_GuiPro.self=self
|
||||
if type(i)=="number" then
|
||||
loadstring("_GuiPro.self:"..v)()
|
||||
else
|
||||
self[i]=v
|
||||
end
|
||||
end
|
||||
return self
|
||||
end
|
||||
c:WhileHovering(function(self)
|
||||
self.omx=self.nmx
|
||||
self.omy=self.nmy
|
||||
self.nmx=love.mouse.getX()
|
||||
self.nmy=love.mouse.getY()
|
||||
if self.omx~=self.nmx or self.omy~=self.nmy then
|
||||
for i=1,#self.func10 do
|
||||
if self and self.nmx and self.nmy and self.omx and self.omy then
|
||||
self.func10[i](self,self.nmx,self.nmy,self.omx,self.omy)
|
||||
end
|
||||
end
|
||||
end
|
||||
if self.WasBeingDragged==true and love.mouse.isDown(self.dragbut or "m")==false and self.Type~="TextImageButtonFrameDrag" then
|
||||
for i=1,#self.func7 do
|
||||
self.func7[i](self,(love.mouse.getX())-self.width/2,(love.mouse.getY())-self.height/2)
|
||||
end
|
||||
end
|
||||
if _GuiPro.hasDrag==false and love.mouse.isDown(self.dragbut or "m") then
|
||||
for i=1,#self.func8 do
|
||||
self.func8[i](self,(love.mouse.getX())-self.width/2,(love.mouse.getY())-self.height/2)
|
||||
end
|
||||
end
|
||||
if self.IsBeingDragged==true then
|
||||
_GuiPro.hasDrag=true
|
||||
self.WasBeingDragged=true
|
||||
elseif self.WasBeingDragged==true and self.IsBeingDragged==false then
|
||||
self.WasBeingDragged=false
|
||||
_GuiPro.hasDrag=false
|
||||
end
|
||||
if self.Draggable==true and love.mouse.isDown(self.dragbut or "m") and _GuiPro.hasDrag==false then
|
||||
for i=1,#self.func6 do
|
||||
self.func6[i](self,(love.mouse.getX())-self.width/2,(love.mouse.getY())-self.height/2)
|
||||
end
|
||||
_GuiPro.hasDrag=true
|
||||
if self.FormFactor:lower()=="circle" or self.FormFactor:lower()=="c" or self.FormFactor:lower()=="cir" then
|
||||
self.IsBeingDragged=true
|
||||
x=(love.mouse.getX()-self.x)
|
||||
y=(love.mouse.getY()-self.y)
|
||||
self:Move(x,y)
|
||||
elseif self.FormFactor:lower()=="rectangle" or self.FormFactor:lower()=="r" or self.FormFactor:lower()=="rect" then
|
||||
self.IsBeingDragged=true
|
||||
x=(love.mouse.getX()-self.x)-self.width/2
|
||||
y=(love.mouse.getY()-self.y)-self.height/2
|
||||
self:Move(x,y)
|
||||
end
|
||||
else
|
||||
self.IsBeingDragged=false
|
||||
end
|
||||
end)
|
||||
table.insert(c.Parent.Children,c)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
_GuiPro.mousedownfunc=love.mouse.isDown
|
||||
function love.mouse.isDown(b)
|
||||
if not(b) then
|
||||
return false
|
||||
end
|
||||
return _GuiPro.mousedownfunc(({["l"]=1,["r"]=2,["m"]=3})[b] or b)
|
||||
end
|
||||
@@ -0,0 +1,204 @@
|
||||
--[[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
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui:AddDrawRuleB(rule)
|
||||
if not(self.DrawRulesB) then self.DrawRulesB={} end
|
||||
table.insert(self.DrawRulesB,rule)
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui:AddDrawRuleE(rule)
|
||||
if not(self.DrawRulesE) then self.DrawRulesE={} end
|
||||
table.insert(self.DrawRulesE,rule)
|
||||
end
|
||||
@@ -0,0 +1,12 @@
|
||||
function gui:draw()
|
||||
if _GuiPro.rotate~=0 then
|
||||
love.graphics.rotate(math.rad(_GuiPro.rotate))
|
||||
end
|
||||
if self.FormFactor:lower()=="rectangle" then
|
||||
self:drawR()
|
||||
elseif self.FormFactor:lower()=="circle" then
|
||||
self:drawC()
|
||||
else
|
||||
error("Unsupported FormFactor: "..self.FormFactor.."!")
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,89 @@
|
||||
function gui:drawC()
|
||||
if love.mouse.isDown("l")==false and love.mouse.isDown("m")==false and love.mouse.isDown("r")==false then
|
||||
_GuiPro.DragItem={}
|
||||
_GuiPro.hasDrag=false
|
||||
end
|
||||
if self.Visible==true and self.VIS==true then
|
||||
local b=true
|
||||
for i,v in pairs(_GuiPro.Clips) do
|
||||
if self:isDescendant(v)==true then
|
||||
b=false
|
||||
end
|
||||
end
|
||||
if b then
|
||||
love.graphics.setStencilTest( )
|
||||
_GuiPro.HasStencel=false
|
||||
_GuiPro.StencelHolder=nil
|
||||
end
|
||||
local x,y,r,s=(self.offset.pos.x or 0)+self.Parent.x,(self.offset.pos.y or 0)+self.Parent.y,self.offset.size.x or 0,self.offset.size.y or 360
|
||||
if self.CC then
|
||||
x,y=x+r,y+r
|
||||
end
|
||||
self.x,self.y=x,y
|
||||
_GuiPro.circleStencilFunction = function()
|
||||
love.graphics.circle("fill",x,y,r,s)
|
||||
end
|
||||
if math.sqrt((love.mouse.getX()-x)^2+(love.mouse.getY()-y)^2)<=r and self:eventable() and self:Clickable() and self.Active==true then
|
||||
self.hovering=true
|
||||
if love.mouse.isDown("l") and _GuiPro.hasDrag==false then
|
||||
if string.find(self.Type, "Button") then
|
||||
love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.lclicked=true
|
||||
elseif love.mouse.isDown("r") and _GuiPro.hasDrag==false then
|
||||
if string.find(self.Type, "Button") then
|
||||
love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.rclicked=true
|
||||
elseif love.mouse.isDown("m") and _GuiPro.hasDrag==false then
|
||||
if string.find(self.Type, "Button") then
|
||||
love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.mclicked=true
|
||||
else
|
||||
if string.find(self.Type, "Button") and _GuiPro.hasDrag==false then
|
||||
love.graphics.setColor(self.Color[1]-5, self.Color[2]-5, self.Color[3]-5,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.rclicked=false
|
||||
self.lclicked=false
|
||||
self.mclicked=false
|
||||
end
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
self.hovering=false
|
||||
self.rclicked=false
|
||||
self.lclicked=false
|
||||
self.mclicked=false
|
||||
end
|
||||
if self.ClipDescendants==true then
|
||||
_GuiPro.Clips[tostring(self)]=self
|
||||
_GuiPro.HasStencel=true
|
||||
_GuiPro.StencelHolder=self
|
||||
love.graphics.stencil(_GuiPro.circleStencilFunction)
|
||||
love.graphics.setStencilTest("notequal",0)
|
||||
end
|
||||
love.graphics.circle("fill",x,y,r,s)
|
||||
love.graphics.setColor(self.BorderColor[1], self.BorderColor[2], self.BorderColor[3],self.BorderVisibility*254)
|
||||
for b=0,self.BorderSize-1 do
|
||||
love.graphics.circle("line",x,y,r+b,s)
|
||||
end
|
||||
if string.find(self.Type, "Text") then
|
||||
if self.text~=nil then
|
||||
if self.AutoScaleText then
|
||||
self.FontSize=math.floor(self.height/1.45833)
|
||||
end
|
||||
love.graphics.setColor(self.TextColor[1],self.TextColor[2],self.TextColor[3],self.TextVisibility*254)
|
||||
love.graphics.setFont(self.Font)
|
||||
love.graphics.printf(self.text, x-(r/2)+(self.XTween), y-(r/2)+self.Tween, r, self.TextFormat)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,118 @@
|
||||
function gui:drawR()
|
||||
if love.mouse.isDown("l")==false and love.mouse.isDown("m")==false and love.mouse.isDown("r")==false then
|
||||
_GuiPro.DragItem={}
|
||||
_GuiPro.hasDrag=false
|
||||
end
|
||||
if self.Visible==true and self.VIS==true then
|
||||
local b=true
|
||||
for i,v in pairs(_GuiPro.Clips) do
|
||||
if self:isDescendant(v)==true then
|
||||
b=false
|
||||
end
|
||||
end
|
||||
if b==true then
|
||||
love.graphics.setStencilTest()
|
||||
love.graphics.setScissor()
|
||||
end
|
||||
self.x=(self.Parent.width*self.scale.pos.x)+self.offset.pos.x+self.Parent.x
|
||||
self.y=(self.Parent.height*self.scale.pos.y)+self.offset.pos.y+self.Parent.y
|
||||
self.width=(self.Parent.width*self.scale.size.x)+self.offset.size.x
|
||||
self.height=(self.Parent.height*self.scale.size.y)+self.offset.size.y
|
||||
if self.DrawRulesB then
|
||||
for dr=1,#self.DrawRulesB do
|
||||
self.DrawRulesB[dr](self)
|
||||
end
|
||||
end
|
||||
if (love.mouse.getX() > self.x and love.mouse.getX() < self.x+self.width and love.mouse.getY() > self.y and love.mouse.getY() < self.y+self.height and self:Clickable() and self:eventable()) or self:touchable("r") and self.Active==true then
|
||||
self.hovering=true
|
||||
if love.mouse.isDown("l") or self:touchable("r") and _GuiPro.hasDrag==false then
|
||||
if string.find(self.Type, "Button") then
|
||||
love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.lclicked=true
|
||||
elseif love.mouse.isDown("r") or self:touchable("r") and _GuiPro.hasDrag==false then
|
||||
if string.find(self.Type, "Button") then
|
||||
love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.rclicked=true
|
||||
elseif love.mouse.isDown("m") or self:touchable("r") and _GuiPro.hasDrag==false then
|
||||
if string.find(self.Type, "Button") then
|
||||
love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.mclicked=true
|
||||
else
|
||||
if string.find(self.Type, "Button") or self:touchable("r") and _GuiPro.hasDrag==false then
|
||||
love.graphics.setColor(self.Color[1]-5, self.Color[2]-5, self.Color[3]-5,self.Visibility*254)
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
end
|
||||
self.rclicked=false
|
||||
self.lclicked=false
|
||||
self.mclicked=false
|
||||
end
|
||||
else
|
||||
love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254)
|
||||
self.hovering=false
|
||||
self.rclicked=false
|
||||
self.lclicked=false
|
||||
self.mclicked=false
|
||||
end
|
||||
if self.ClipDescendants==true then
|
||||
_GuiPro.Clips[tostring(self)]=self
|
||||
love.graphics.setScissor(self.x, self.y, self.width, self.height)
|
||||
end
|
||||
if self:hasRoundness() then
|
||||
love.graphics.stencil(self.stfunc, "replace", 1)
|
||||
love.graphics.setStencilTest("greater", 0)
|
||||
end
|
||||
love.graphics.rectangle("fill", self.x, self.y, self.width, self.height,(self.rx or 1)*self.DPI,(self.ry or 1)*self.DPI,(self.segments or 1)*self.DPI)
|
||||
if string.find(self.Type, "Image") then
|
||||
self:ImageRule()
|
||||
end
|
||||
if self.Type=="Video" then
|
||||
self:VideoRule()
|
||||
end
|
||||
if self:hasRoundness() then
|
||||
love.graphics.setStencilTest()
|
||||
end
|
||||
love.graphics.setColor(self.BorderColor[1], self.BorderColor[2], self.BorderColor[3],self.BorderVisibility*254)
|
||||
for b=0,self.BorderSize-1 do
|
||||
love.graphics.rectangle("line", self.x-(b/2), self.y-(b/2), self.width+b, self.height+b,(self.rx or 1)*self.DPI,(self.ry or 1)*self.DPI,(self.segments or 1)*self.DPI)
|
||||
end
|
||||
if string.find(self.Type, "Text") then
|
||||
if self.text~=nil then
|
||||
if self.AutoScaleText then
|
||||
self.FontSize=math.floor(self.height/1.45833)
|
||||
end
|
||||
love.graphics.setColor(self.TextColor[1],self.TextColor[2],self.TextColor[3],self.TextVisibility*254)
|
||||
if self.Font==_defaultfont then
|
||||
love.graphics.setFont(self.Font)
|
||||
love.graphics.printf(self.text, self.x+2+(self.XTween*self.DPI)+((self.marginL or 0)*self.DPI or self.XTween*self.DPI), self.y+(self.FontHeight/2)+self.Tween*self.DPI, self.width+(0 or (self.marginR or 0)*self.DPI), self.TextFormat)
|
||||
else
|
||||
if type(self.Font)=="string" then
|
||||
self.Font=love.graphics.newFont(self.Font,self.FontSize)
|
||||
self.FontHeight=self.Font:getHeight()
|
||||
else
|
||||
love.graphics.setFont(self.Font)
|
||||
end
|
||||
if type(self.FontSize)=="string" then
|
||||
self.FontSize=tonumber(self.FontSize)
|
||||
love.graphics.setNewFont(self.FontSize)
|
||||
end
|
||||
love.graphics.printf(self.text, self.x+2+((self.marginL or 0)*self.DPI or self.XTween*self.DPI), self.y+math.floor((self.FontHeight-self.FontSize)/2)+self.Tween*self.DPI, self.width+(0 or (self.marginR or 0)*self.DPI), self.TextFormat)
|
||||
end
|
||||
end
|
||||
end
|
||||
if self.DrawRulesE then
|
||||
for dr=1,#self.DrawRulesE do
|
||||
self.DrawRulesE[dr](self)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,37 @@
|
||||
function gui:newDropFrame(name,x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("DropFrame",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.WasBeingDragged=false
|
||||
c.IsBeingDragged=false
|
||||
c.Draggable=false
|
||||
c.funcD={}
|
||||
function c:GetDroppedItems()
|
||||
local t=self:getChildren()
|
||||
local tab={}
|
||||
for i=1,#t do
|
||||
if t[i].Type=="TextImageButtonFrameDrag" then
|
||||
table.insert(tab,t[i])
|
||||
end
|
||||
end
|
||||
return tab
|
||||
end
|
||||
function c:OnDropped(func)
|
||||
table.insert(self.funcD,func)
|
||||
end
|
||||
c:OnUpdate(function(self)
|
||||
if _GuiPro.DragItem then
|
||||
if _GuiPro.DragItem.Type=="TextImageButtonFrameDrag" and love.mouse.isDown(_GuiPro.DragItem.dragbut or "m")==false and self:IsHovering() then
|
||||
local t=_GuiPro.DragItem
|
||||
_GuiPro.DragItem={}
|
||||
for i=1,#t.funcD do
|
||||
t.funcD[i](self,t)
|
||||
end
|
||||
for i=1,#self.funcD do
|
||||
self.funcD[i](self,t)
|
||||
end
|
||||
_GuiPro.hasDrag=false
|
||||
end
|
||||
end
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
function gui:newFrame(name,x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("Frame",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.WasBeingDragged=false
|
||||
c.IsBeingDragged=false
|
||||
c.Draggable=false
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui:newFullFrame(name)
|
||||
name=name or ""
|
||||
return self:newFrame(name,0,0,0,0,0,0,1,1)
|
||||
end
|
||||
@@ -0,0 +1,59 @@
|
||||
function gui:newTabFrame(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=gui:newFrame(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.tabheight=20
|
||||
c.Holder=c:newFrame("Holder",0,c.tabheight,0,0,0,0,1,1)
|
||||
c.TabHolder=c:newFrame("TabHolder",0,0,0,c.tabheight,0,0,1)
|
||||
function c:setTabHeight(n)
|
||||
self.tabheight=n
|
||||
self.Holder:SetDualDim(0,-self.tabheight,0,0,0,0,1,1)
|
||||
end
|
||||
function c:addTab(name,colorT,colorH)
|
||||
if colorT and not(colorH) then
|
||||
colorH=colorT
|
||||
end
|
||||
local tab=self.TabHolder:newTextButton(name,name,0,0,0,0,0,0,0,1)
|
||||
tab.Tween=-3
|
||||
if colorT then
|
||||
tab.Color=colorT
|
||||
end
|
||||
local holder=self.Holder:newFrame(name,0,0,0,0,0,0,1,1)
|
||||
if colorH then
|
||||
holder.Color=colorH
|
||||
end
|
||||
tab.frame=holder
|
||||
tab:OnReleased(function(b,self)
|
||||
if b=="l" then
|
||||
local tt=self.Parent:getChildren()
|
||||
local th=self.Parent.Parent.Holder:getChildren()
|
||||
for i=1,#th do
|
||||
th[i].Visible=false
|
||||
end
|
||||
for i=1,#tt do
|
||||
tt[i].frame.Visible=false
|
||||
tt[i].BorderSize=1
|
||||
end
|
||||
self.BorderSize=0
|
||||
self.frame.Visible=true
|
||||
end
|
||||
end)
|
||||
local tt=self.TabHolder:getChildren()
|
||||
for i=1,#tt do
|
||||
tt[i].frame.Visible=false
|
||||
tt[i].BorderSize=1
|
||||
end
|
||||
tab.frame.Visible=true
|
||||
tab.BorderSize=0
|
||||
return tab,holder
|
||||
end
|
||||
c:OnUpdate(function(self)
|
||||
local th=self.TabHolder:getChildren()
|
||||
local l=self.width/#th
|
||||
for i=1,#th do
|
||||
th[i]:SetDualDim(l*(i-1),0,l)
|
||||
end
|
||||
if #th==0 then
|
||||
self:Destroy()
|
||||
end
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
function gui:SetImage(i)
|
||||
if type(i)=="string" then
|
||||
self.Image=love.graphics.newImage(i)
|
||||
else
|
||||
self.Image=i
|
||||
end
|
||||
if self.Image~=nil then
|
||||
self.ImageHeigth=self.Image:getHeight()
|
||||
self.ImageWidth=self.Image:getWidth()
|
||||
self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth)
|
||||
end
|
||||
return self.ImageWidth,self.ImageHeigth
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
function gui:UpdateImage()
|
||||
self.ImageHeigth=self.Image:getHeight()
|
||||
self.ImageWidth=self.Image:getWidth()
|
||||
self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth)
|
||||
end
|
||||
@@ -0,0 +1,20 @@
|
||||
function gui:getTile(i,x,y,w,h)-- returns imagedata
|
||||
if type(i)=="string" then
|
||||
i=love.graphics.newImage(i)
|
||||
elseif type(i)=="userdata" then
|
||||
-- do nothing
|
||||
elseif string.find(self.Type,"Image",1,true) then
|
||||
local i,x,y,w,h=self.Image,i,x,y,w
|
||||
else
|
||||
error("getTile invalid args!!! Usage: ImageElement:getTile(x,y,w,h) or gui:getTile(imagedata,x,y,w,h)")
|
||||
end
|
||||
local iw,ih=i:getDimensions()
|
||||
local id,_id=i:getData(),love.image.newImageData(w,h)
|
||||
for _x=x,w+x-1 do
|
||||
for _y=y,h+y-1 do
|
||||
--
|
||||
_id:setPixel(_x-x,_y-y,id:getPixel(_x,_y))
|
||||
end
|
||||
end
|
||||
return love.graphics.newImage(_id)
|
||||
end
|
||||
@@ -0,0 +1,57 @@
|
||||
function gui:newAnim(file,delay, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local x,y,w,h,sx,sy,sw,sh=filter(file, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("ImageAnimation",file, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.Visibility=0
|
||||
c.ImageVisibility=1
|
||||
c.delay=delay or .05
|
||||
c.files={}
|
||||
c.AnimStart={}
|
||||
c.AnimEnd={}
|
||||
local _files=alphanumsort(love.filesystem.getDirectoryItems(file))
|
||||
for i=1,#_files do
|
||||
if string.sub(_files[i],-1,-1)~="b" then
|
||||
table.insert(c.files,love.graphics.newImage(file.."/".._files[i]))
|
||||
end
|
||||
end
|
||||
c.step=multi:newTStep(1,#c.files,1,c.delay)
|
||||
c.step.parent=c
|
||||
c.rotation=0
|
||||
c.step:OnStart(function(step)
|
||||
for i=1,#step.parent.AnimStart do
|
||||
step.parent.AnimStart[i](step.parent)
|
||||
end
|
||||
end)
|
||||
c.step:OnStep(function(pos,step)
|
||||
step.parent:SetImage(step.parent.files[pos])
|
||||
end)
|
||||
c.step:OnEnd(function(step)
|
||||
for i=1,#step.parent.AnimEnd do
|
||||
step.parent.AnimEnd[i](step.parent)
|
||||
end
|
||||
end)
|
||||
function c:OnAnimStart(func)
|
||||
table.insert(self.AnimStart,func)
|
||||
end
|
||||
function c:OnAnimEnd(func)
|
||||
table.insert(self.AnimEnd,func)
|
||||
end
|
||||
function c:Pause()
|
||||
self.step:Pause()
|
||||
end
|
||||
function c:Resume()
|
||||
self.step:Resume()
|
||||
end
|
||||
function c:Reset()
|
||||
self.step.pos=1
|
||||
end
|
||||
function c:getFrames()
|
||||
return #self.files
|
||||
end
|
||||
function c:getFrame()
|
||||
return self.step.pos
|
||||
end
|
||||
function c:setFrame(n)
|
||||
return self:SetImage(self.files[n])
|
||||
end
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,52 @@
|
||||
function gui:newAnimFromData(data,delay, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("ImageAnimation","FromFile", x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.Visibility=0
|
||||
c.ImageVisibility=1
|
||||
c.delay=delay or .05
|
||||
c.files=data
|
||||
c.AnimStart={}
|
||||
c.AnimEnd={}
|
||||
c:SetImage(c.files[1])
|
||||
c.step=multi:newTStep(1,#c.files,1,c.delay)
|
||||
c.step.parent=c
|
||||
c.rotation=0
|
||||
c.step:OnStart(function(step)
|
||||
for i=1,#step.parent.AnimStart do
|
||||
step.parent.AnimStart[i](step.parent)
|
||||
end
|
||||
end)
|
||||
c.step:OnStep(function(pos,step)
|
||||
step.parent:SetImage(step.parent.files[pos])
|
||||
end)
|
||||
c.step:OnEnd(function(step)
|
||||
for i=1,#step.parent.AnimEnd do
|
||||
step.parent.AnimEnd[i](step.parent)
|
||||
end
|
||||
end)
|
||||
function c:OnAnimStart(func)
|
||||
table.insert(self.AnimStart,func)
|
||||
end
|
||||
function c:OnAnimEnd(func)
|
||||
table.insert(self.AnimEnd,func)
|
||||
end
|
||||
function c:Pause()
|
||||
self.step:Pause()
|
||||
end
|
||||
function c:Resume()
|
||||
self.step:Resume()
|
||||
end
|
||||
function c:Reset()
|
||||
self.step.pos=1
|
||||
end
|
||||
function c:getFrames()
|
||||
return #self.files
|
||||
end
|
||||
function c:getFrame()
|
||||
return self.step.pos
|
||||
end
|
||||
function c:setFrame(n)
|
||||
return self:SetImage(self.files[n])
|
||||
end
|
||||
return c
|
||||
end
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
function gui:newAnimFromTiles(file,xd,yd,delay, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(file, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("ImageAnimation",file, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local im=love.graphics.newImage(file)
|
||||
local _x,_y=im:getDimensions()
|
||||
c.Visibility=0
|
||||
c.ImageVisibility=1
|
||||
c.delay=delay or .05
|
||||
c.files={}
|
||||
c.AnimStart={}
|
||||
c.AnimEnd={}
|
||||
for i=0,_y/yd-1 do
|
||||
for j=0,_x/xd-1 do
|
||||
table.insert(c.files,gui:getTile(im,j*xd,i*yd,xd,yd))
|
||||
end
|
||||
end
|
||||
c:SetImage(c.files[1])
|
||||
c.step=multi:newTStep(1,#c.files,1,c.delay)
|
||||
c.step.parent=c
|
||||
c.rotation=0
|
||||
c.step:OnStart(function(step)
|
||||
for i=1,#step.parent.AnimStart do
|
||||
step.parent.AnimStart[i](step.parent)
|
||||
end
|
||||
end)
|
||||
c.step:OnStep(function(pos,step)
|
||||
step.parent:SetImage(step.parent.files[pos])
|
||||
end)
|
||||
c.step:OnEnd(function(step)
|
||||
for i=1,#step.parent.AnimEnd do
|
||||
step.parent.AnimEnd[i](step.parent)
|
||||
end
|
||||
end)
|
||||
function c:OnAnimStart(func)
|
||||
table.insert(self.AnimStart,func)
|
||||
end
|
||||
function c:OnAnimEnd(func)
|
||||
table.insert(self.AnimEnd,func)
|
||||
end
|
||||
function c:Pause()
|
||||
self.step:Pause()
|
||||
end
|
||||
function c:Resume()
|
||||
self.step:Resume()
|
||||
end
|
||||
function c:Reset()
|
||||
self.step.pos=1
|
||||
end
|
||||
function c:getFrames()
|
||||
return #self.files
|
||||
end
|
||||
function c:getFrame()
|
||||
return self.step.pos
|
||||
end
|
||||
function c:setFrame(n)
|
||||
return self:SetImage(self.files[n])
|
||||
end
|
||||
return c
|
||||
end
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
function gui:newFullImageLabel(i,name)
|
||||
return self:newImageLabel(i,name,0,0,0,0,0,0,1,1)
|
||||
end
|
||||
@@ -0,0 +1,25 @@
|
||||
function gui:newImageButton(i,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("ImageButton",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
if type(i)=="string" then
|
||||
c.Image=love.graphics.newImage(i)
|
||||
else
|
||||
c.Image=i
|
||||
end
|
||||
c.Visibility=0
|
||||
c.ImageVisibility=1
|
||||
c.rotation=0
|
||||
if c.Image~=nil then
|
||||
c.ImageHeigth=c.Image:getHeight()
|
||||
c.ImageHeight=c.Image:getHeight()
|
||||
c.ImageWidth=c.Image:getWidth()
|
||||
c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth)
|
||||
end
|
||||
c:OnEnter(function()
|
||||
love.mouse.setCursor(_GuiPro.CursorH)
|
||||
end)
|
||||
c:OnExit(function()
|
||||
love.mouse.setCursor(_GuiPro.CursorN)
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,18 @@
|
||||
function gui:newImageLabel(i,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("ImageLabel",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
if type(i)=="string" then
|
||||
c.Image=love.graphics.newImage(i)
|
||||
else
|
||||
c.Image=i
|
||||
end
|
||||
c.Visibility=0
|
||||
c.ImageVisibility=1
|
||||
c.rotation=0
|
||||
if c.Image~=nil then
|
||||
c.ImageHeigth=c.Image:getHeight()
|
||||
c.ImageWidth=c.Image:getWidth()
|
||||
c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth)
|
||||
end
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,62 @@
|
||||
function gui:newVideo(name,i,x,y,w,h,sx,sy,sw,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("Video",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
if type(i)=="string" then
|
||||
c.Video=love.graphics.newVideo(i)
|
||||
else
|
||||
c.Video=i
|
||||
end
|
||||
c.Visibility=0
|
||||
c.VideoVisibility=1
|
||||
c.rotation=0
|
||||
if c.Video~=nil then
|
||||
c.VideoHeigth=c.Video:getHeight()
|
||||
c.VideoWidth=c.Video:getWidth()
|
||||
c.Quad=love.graphics.newQuad(0,0,w,h,c.VideoWidth,c.VideoHeigth)
|
||||
end
|
||||
c.funcV={}
|
||||
function c:Play()
|
||||
self.handStart=true
|
||||
self.Video:play()
|
||||
end
|
||||
function c:Pause()
|
||||
self.Video:pause()
|
||||
end
|
||||
c.Resume=c.Play
|
||||
function c:Stop()
|
||||
self.handStart=false
|
||||
self:Pause()
|
||||
self:Rewind()
|
||||
for i=1,# self.funcV do
|
||||
self.funcV[i](self)
|
||||
end
|
||||
end
|
||||
function c:OnVideoStopped(func)
|
||||
table.insert(self.funcV,func)
|
||||
end
|
||||
function c:Rewind()
|
||||
self.Video:rewind()
|
||||
end
|
||||
function c:Restart()
|
||||
self:Rewind()
|
||||
self:Play()
|
||||
end
|
||||
function c:Seek(o)
|
||||
self.Video:seek(o)
|
||||
end
|
||||
function c:Tell()
|
||||
self.Video:tell()
|
||||
end
|
||||
function c:SetFilter(min, mag, anisotropy)
|
||||
self.Video:setFilter(min, mag, anisotropy)
|
||||
end
|
||||
function c:IsPlaying()
|
||||
return self.Video:isPlaying()
|
||||
end
|
||||
c:OnUpdate(function(self)
|
||||
if self.Video:isPlaying()==false and self.handStart == true then
|
||||
self:Stop()
|
||||
end
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,51 @@
|
||||
function gui:newDragItem(t,i,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("TextImageButtonFrameDrag",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.WasBeingDragged=false
|
||||
c.IsBeingDragged=false
|
||||
c.Draggable=true
|
||||
c.funcD={}
|
||||
if type(i)=="string" then
|
||||
c.Image=love.graphics.newImage(i)
|
||||
c.ImageVisibility=1
|
||||
c.ImageHeigth=c.Image:getHeight()
|
||||
c.ImageWidth=c.Image:getWidth()
|
||||
c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth)
|
||||
elseif type(i)=="image" then
|
||||
c.Image=i
|
||||
c.ImageVisibility=1
|
||||
c.ImageHeigth=c.Image:getHeight()
|
||||
c.ImageWidth=c.Image:getWidth()
|
||||
c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth)
|
||||
end
|
||||
c:OnDragStart(function(self,x,y)
|
||||
if _GuiPro.hasDrag==false then
|
||||
self:setParent(_GuiPro)
|
||||
self:SetDualDim(x,y)
|
||||
self:TopStack()
|
||||
end
|
||||
end)
|
||||
c.rotation=0
|
||||
c.Tween=0
|
||||
c.XTween=0
|
||||
c.text = t
|
||||
c.AutoScaleText=false
|
||||
c.FontHeight=_defaultfont:getHeight()
|
||||
c.Font=_defaultfont
|
||||
c.FontSize=15
|
||||
c.TextFormat="center"
|
||||
c.TextVisibility=1
|
||||
c.TextColor = {0, 0, 0}
|
||||
function c:OnDropped(func)
|
||||
table.insert(self.funcD,func)
|
||||
end
|
||||
c:OnUpdate(function(self)
|
||||
if love.mouse.isDown("m" or self.dragbut)==false and self==_GuiPro.DragItem and self.hovering==false then
|
||||
_GuiPro.DragItem={}
|
||||
for i=1,#self.func7 do
|
||||
self.func7[i](self,(love.mouse.getX())-self.width/2,(love.mouse.getY())-self.height/2)
|
||||
end
|
||||
end
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,28 @@
|
||||
function gui:newItem(t,i,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("TextImageButtonFrame",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
if type(i)=="string" then
|
||||
c.Image=love.graphics.newImage(i)
|
||||
else
|
||||
c.Image=i
|
||||
end
|
||||
c.rotation=0
|
||||
c.ImageVisibility=1
|
||||
c.Draggable=false
|
||||
if c.Image~=nil then
|
||||
c.ImageHeigth=c.Image:getHeight()
|
||||
c.ImageWidth=c.Image:getWidth()
|
||||
c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth)
|
||||
end
|
||||
c.Tween=0
|
||||
c.XTween=0
|
||||
c.text = t
|
||||
c.AutoScaleText=false
|
||||
c.FontHeight=_defaultfont:getHeight()
|
||||
c.Font=_defaultfont
|
||||
c.FontSize=15
|
||||
c.TextFormat="center"
|
||||
c.TextVisibility=1 -- 0=invisible,1=solid (self.TextVisibility*254+1)
|
||||
c.TextColor = {0, 0, 0}
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,45 @@
|
||||
function gui:AdvTextBox(txt,x,y,w,h,sx,sy,sw,sh)
|
||||
name="AdvTextBox"
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("AdvTextBoxFrame",name, x, y, w, 30, sx ,sy ,sw ,sh)
|
||||
c.Draggable=true
|
||||
c.dragbut="r"
|
||||
c.BorderSize=0
|
||||
c:ApplyGradient{Color.Blue,Color.sexy_purple}
|
||||
c:newTextLabel(txt,"Holder",0,0,0,h-30,0,1,1,0).Color=Color.sexy_purple
|
||||
c.funcO={}
|
||||
c.funcX={}
|
||||
c:OnDragStart(function(self)
|
||||
self:TopStack()
|
||||
end)
|
||||
--local temp = c:newTextButton("X","Close",-25,5,20,20,1)
|
||||
--temp.Tween=-5
|
||||
--temp.XTween=-2
|
||||
--temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent) end end)
|
||||
--temp.Color=Color.Red
|
||||
c.tLink=c:newTextBox("puttext","TextBox",5,h-95,-40,30,0,1,1,1)
|
||||
c.tLink.Color=Color.light_gray
|
||||
c.tLink.ClearOnFocus=true
|
||||
c.tLink:OnFocus(function(self) self.ClearOnFocus=false end)
|
||||
local temp=c:newTextButton("OK","Ok",-35,h-65,30,30,1,1)
|
||||
temp:OnReleased(function(b,self) for i=1,#self.Parent.funcO do self.Parent.funcO[i](self.Parent,self.Parent.tLink.text) end end)
|
||||
temp.Color=Color.Green
|
||||
temp.XTween=-2
|
||||
local temp=c:newTextButton("X","Cancel",-35,h-95,30,30,1,1)
|
||||
temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent,self.Parent.tLink.text) end end)
|
||||
temp.Color=Color.Red
|
||||
temp.XTween=-2
|
||||
function c:Close()
|
||||
self.Visible=false
|
||||
end
|
||||
function c:Open()
|
||||
self.Visible=true
|
||||
end
|
||||
function c:OnOk(func)
|
||||
table.insert(self.funcO,func)
|
||||
end
|
||||
function c:OnX(func)
|
||||
table.insert(self.funcX,func)
|
||||
end
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,36 @@
|
||||
function _GuiPro.gradient(colors)
|
||||
local direction = colors.direction or "horizontal"
|
||||
colors.direction=nil
|
||||
trans = colors.trans or 255
|
||||
trans=math.floor(trans)
|
||||
if direction == "horizontal" then
|
||||
direction = true
|
||||
elseif direction == "vertical" then
|
||||
direction = false
|
||||
else
|
||||
error("Invalid direction '" .. tostring(direction) "' for gradient. Horizontal or vertical expected.")
|
||||
end
|
||||
local result = love.image.newImageData(direction and 1 or #colors, direction and #colors or 1)
|
||||
for __i, color in ipairs(colors) do
|
||||
local x, y
|
||||
if direction then
|
||||
x, y = 0, __i - 1
|
||||
else
|
||||
x, y = __i - 1, 0
|
||||
end
|
||||
result:setPixel(x, y, color[1], color[2], color[3], trans)
|
||||
end
|
||||
result = love.graphics.newImage(result)
|
||||
result:setFilter('linear', 'linear')
|
||||
return result
|
||||
end
|
||||
function _GuiPro.drawinrect(img, x, y, w, h, r, ox, oy, kx, ky)
|
||||
love.graphics.draw(img, x, y, r, w / img:getWidth(), h / img:getHeight(), ox, oy, kx, ky)
|
||||
end
|
||||
function gui:ApplyGradient(rules)
|
||||
self.Image=nil
|
||||
self.Type=self.Type.."w/GradImage"
|
||||
self.rotation=0
|
||||
self.ImageVisibility=rules.visibility or 1
|
||||
self:SetImage(_GuiPro.gradient(rules))
|
||||
end
|
||||
@@ -0,0 +1,10 @@
|
||||
function gui:BottomStack()
|
||||
childs=self.Parent:getChildren()
|
||||
for i=1,#childs do
|
||||
if childs[i]==self then
|
||||
table.remove(self.Parent.Children,i)
|
||||
table.insert(self.Parent.Children,1,self)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui:Center()
|
||||
local x,y=self:getFullSize()
|
||||
self:SetDualDim(-math.floor(x/2),-math.floor(y/2),nil,nil,.5,.5)
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
function gui:Destroy()
|
||||
check=self.Parent:getChildren()
|
||||
local cc=0
|
||||
for cc=1,#check do
|
||||
if check[cc]==self then
|
||||
table.remove(self.Parent.Children,cc)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,25 @@
|
||||
function gui:GetAllChildren()
|
||||
local Stuff = {}
|
||||
function Seek(Items)
|
||||
for i=1,#Items do
|
||||
if Items[i].Visible==true then
|
||||
table.insert(Stuff,Items[i])
|
||||
local NItems = Items[i]:getChildren()
|
||||
if NItems ~= nil then
|
||||
Seek(NItems)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local Objs = self:getChildren()
|
||||
for i=1,#Objs do
|
||||
if Objs[i].Visible==true then
|
||||
table.insert(Stuff,Objs[i])
|
||||
local Items = Objs[i]:getChildren()
|
||||
if Items ~= nil then
|
||||
Seek(Items)
|
||||
end
|
||||
end
|
||||
end
|
||||
return Stuff
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:GetChild(name)
|
||||
return self.Children[name] or self
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function InGrid(i,x,y,s)
|
||||
return math.floor((i-1)/x)*s,(i-1)*s-(math.floor((i-1)/y)*(s*x))
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
function InGridX(i,w,h,xs,ys)
|
||||
local xc,yc=math.floor(w/xs),math.floor(h/ys)
|
||||
local xi,yi=(i-1)%xc,math.floor((i-1)/xc)
|
||||
return xi*xs,yi*ys
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
function InGridY(i,w,h,xs,ys)
|
||||
local xc,yc=math.floor(w/xs),math.floor(h/ys)
|
||||
local xi,yi=math.floor((i-1)/yc),(i-1)%yc
|
||||
return xi*xs,yi*ys
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:IsHovering()
|
||||
return (love.mouse.getX() > self.x and love.mouse.getX() < self.x+self.width and love.mouse.getY() > self.y and love.mouse.getY() < self.y+self.height)
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui:Move(x,y)
|
||||
self.offset.pos.x=self.offset.pos.x+x
|
||||
self.offset.pos.y=self.offset.pos.y+y
|
||||
end
|
||||
@@ -0,0 +1,46 @@
|
||||
function gui:SetDualDim(x, y, w, h, sx ,sy ,sw ,sh)
|
||||
if _GuiPro.DPI_ENABLED then
|
||||
if x then
|
||||
x=self.DPI*x
|
||||
end
|
||||
if y then
|
||||
y=self.DPI*y
|
||||
end
|
||||
if w then
|
||||
w=self.DPI*w
|
||||
end
|
||||
if h then
|
||||
h=self.DPI*h
|
||||
end
|
||||
end
|
||||
if sx then
|
||||
self.scale.pos.x=sx
|
||||
end
|
||||
if sy then
|
||||
self.scale.pos.y=sy
|
||||
end
|
||||
if x then
|
||||
self.offset.pos.x=x
|
||||
end
|
||||
if y then
|
||||
self.offset.pos.y=y
|
||||
end
|
||||
if sw then
|
||||
self.scale.size.x=sw
|
||||
end
|
||||
if sh then
|
||||
self.scale.size.y=sh
|
||||
end
|
||||
if w then
|
||||
self.offset.size.x=w
|
||||
end
|
||||
if h then
|
||||
self.offset.size.y=h
|
||||
end
|
||||
if self.Image then
|
||||
self:SetImage(self.Image)
|
||||
end
|
||||
end
|
||||
function gui:setDualDim(...)
|
||||
self:SetDualDim(...)
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
_GuiPro.CursorN=love.mouse.getSystemCursor("arrow")
|
||||
_GuiPro.CursorH=love.mouse.getSystemCursor("hand")
|
||||
function gui:SetHand(img,x,y)
|
||||
_GuiPro.CursorN=love.mouse.newCursor(img,x,y)
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:SetHover(img,x,y)
|
||||
_GuiPro.CursorH=love.mouse.newCursor(img,x,y)
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui:SetName(name)
|
||||
self.Parent.Children[name]=self
|
||||
self.Name=name
|
||||
end
|
||||
@@ -0,0 +1,10 @@
|
||||
function gui:TopStack()
|
||||
childs=self.Parent:getChildren()
|
||||
for i=1,#childs do
|
||||
if childs[i]==self then
|
||||
table.remove(self.Parent.Children,i)
|
||||
table.insert(self.Parent.Children,self)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:addDominance()
|
||||
_GuiPro.TopHovered=self
|
||||
end
|
||||
@@ -0,0 +1,6 @@
|
||||
function gui:addHotKey(key)
|
||||
local temp=self:newFrame(0,0,0,0)
|
||||
temp.Visible=false
|
||||
temp:setHotKey(key)
|
||||
return temp
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
function alphanumsort(o)
|
||||
local function padnum(d) local dec, n = string.match(d, "(%.?)0*(.+)")
|
||||
return #dec > 0 and ("%.12f"):format(d) or ("%s%03d%s"):format(dec, #n, n)
|
||||
end
|
||||
table.sort(o, function(a,b) return tostring(a):gsub("%.?%d+",padnum)..("%3d"):format(#b)< tostring(b):gsub("%.?%d+",padnum)..("%3d"):format(#a) end)
|
||||
return o
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:anchorRight(n)
|
||||
self:SetDualDim(-(self.width+n),nil,nil,nil,1)
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:centerX()
|
||||
self:SetDualDim(-(self.width/2),nil,nil,nil,.5)
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:centerY()
|
||||
self:SetDualDim(nil,-(self.height/2),nil,nil,nil,.5)
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:disrespectHierarchy()
|
||||
_GuiPro.Hierarchy=false
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:getChildren()
|
||||
return self.Children
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:getColor(cindex)
|
||||
return Color[cindex]
|
||||
end
|
||||
@@ -0,0 +1,12 @@
|
||||
function gui:getFullSize()
|
||||
local maxx,maxy=-math.huge,-math.huge
|
||||
local temp = self:GetAllChildren()
|
||||
for i=1,#temp do
|
||||
if temp[i].width>maxx then
|
||||
maxx=temp[i].width+temp[i].offset.pos.x
|
||||
elseif temp[i].height>maxy then
|
||||
maxy=temp[i].height+temp[i].offset.pos.y
|
||||
end
|
||||
end
|
||||
return maxx,maxy
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
function gui:getHighest()
|
||||
if self.Children[#self.Children]~=nil then
|
||||
return self.Children[#self.Children]
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
function gui:getLowest()
|
||||
if self.Children[1]~=nil then
|
||||
return self.Children[1]
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
function gui:isDescendant(obj)
|
||||
local things=obj:GetAllChildren()
|
||||
for i=1,#things do
|
||||
if things[i]==self then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:isHighest()
|
||||
return (self==self.Parent:getHighest())
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:isLowest()
|
||||
return (self==self.Parent:getLowest())
|
||||
end
|
||||
@@ -0,0 +1,6 @@
|
||||
function gui.massMutate(t,...)
|
||||
local mut={...}
|
||||
for i=1,#mut do
|
||||
mut[i]:Mutate(t)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,41 @@
|
||||
if love.filesystem.exists("CheckBoxes.png") then
|
||||
_GuiPro.UC=gui:getTile("CheckBoxes.png",0,0,16,16)
|
||||
_GuiPro.C=gui:getTile("CheckBoxes.png",16,0,16,16)
|
||||
_GuiPro.UCH=gui:getTile("CheckBoxes.png",0,16,16,16)
|
||||
_GuiPro.CH=gui:getTile("CheckBoxes.png",16,16,16,16)
|
||||
end
|
||||
function gui:newCheckBox(name,x,y)
|
||||
if not(_GuiPro.UC) then error("CheckBoxes.png not found! Cannot currently use checkbox without the data") end
|
||||
if type(name)~="String" then
|
||||
x,y,name=name,x,"CheckBox"
|
||||
end
|
||||
local c=self:newImageLabel(_GuiPro.UC,name, x, y, 16,16)
|
||||
c.Visibility=0
|
||||
c.check=false
|
||||
c:OnEnter(function(self)
|
||||
if self.check then
|
||||
self:SetImage(_GuiPro.CH)
|
||||
else
|
||||
self:SetImage(_GuiPro.UCH)
|
||||
end
|
||||
end)
|
||||
function c:isChecked()
|
||||
return self.check
|
||||
end
|
||||
c:OnExit(function(self)
|
||||
if self.check then
|
||||
self:SetImage(_GuiPro.C)
|
||||
else
|
||||
self:SetImage(_GuiPro.UC)
|
||||
end
|
||||
end)
|
||||
c:OnReleased(function(b,self)
|
||||
self.check=not(self.check)
|
||||
if self.check then
|
||||
self:SetImage(_GuiPro.CH)
|
||||
else
|
||||
self:SetImage(_GuiPro.UCH)
|
||||
end
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,36 @@
|
||||
function gui:newMessageBox(txt,x,y,w,h,sx,sy,sw,sh)
|
||||
name="MessageBox"
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("MessageBoxFrame",name, x, y, w, 30, sx ,sy ,sw ,sh)
|
||||
c.Draggable=true
|
||||
c.dragbut="r"
|
||||
c:ApplyGradient{Color.Blue,Color.sexy_purple}
|
||||
c.BorderSize=0
|
||||
c:newTextLabel(txt,"Holder",0,0,0,h-30,0,1,1,0).Color=Color.sexy_purple
|
||||
c.funcO={}
|
||||
c.funcX={}
|
||||
c:OnDragStart(function(self)
|
||||
self:TopStack()
|
||||
end)
|
||||
local temp = c:newTextButton("X","Close",-25,5,20,20,1)
|
||||
temp.Tween=-5
|
||||
temp.XTween=-2
|
||||
temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent) end end)
|
||||
temp.Color=Color.Red
|
||||
local temp=c:newTextButton("OK","Ok",0,h-65,0,30,.25,1,.5)
|
||||
temp:OnReleased(function(b,self) for i=1,#self.Parent.funcO do self.Parent.funcO[i](self.Parent) end end)
|
||||
temp.Color=Color.Green
|
||||
function c:Close()
|
||||
self.Visible=false
|
||||
end
|
||||
function c:Open()
|
||||
self.Visible=true
|
||||
end
|
||||
function c:OnOk(func)
|
||||
table.insert(self.funcO,func)
|
||||
end
|
||||
function c:OnX(func)
|
||||
table.insert(self.funcX,func)
|
||||
end
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,49 @@
|
||||
function gui:newPart(x, y,w ,h , sx ,sy ,sw ,sh)
|
||||
local c = {}
|
||||
setmetatable(c, gui)
|
||||
if self==gui then
|
||||
c.Parent=_GuiPro
|
||||
else
|
||||
c.Parent=self
|
||||
end
|
||||
c.funcs={}
|
||||
c.funcs2={}
|
||||
c.funcs3={}
|
||||
c.funcs4={}
|
||||
c.funcs5={}
|
||||
c.func6={}
|
||||
c.func7={}
|
||||
c.func8={}
|
||||
c.func9={}
|
||||
c.func10={}
|
||||
c.form="rectangle"
|
||||
c.Color = {255, 255, 255}
|
||||
c.scale={}
|
||||
c.scale.size={}
|
||||
c.scale.size.x=sw or 0
|
||||
c.scale.size.y=sh or 0
|
||||
c.offset={}
|
||||
c.offset.size={}
|
||||
c.offset.size.x=w or 0
|
||||
c.offset.size.y=h or 0
|
||||
c.scale.pos={}
|
||||
c.scale.pos.x=sx or 0
|
||||
c.scale.pos.y=sy or 0
|
||||
c.offset.pos={}
|
||||
c.offset.pos.x=x or 0
|
||||
c.offset.pos.y=y or 0
|
||||
c.VIS=true
|
||||
c.Visible=true
|
||||
c.Visibility=1
|
||||
c.BorderColor={0,0,0}
|
||||
c.BorderSize=0
|
||||
c.Type="Part"
|
||||
c.Name="GuiPart"
|
||||
_GuiPro.count=_GuiPro.count+1
|
||||
c.x=(c.Parent.width*c.scale.pos.x)+c.offset.pos.x+c.Parent.x
|
||||
c.y=(c.Parent.height*c.scale.pos.y)+c.offset.pos.y+c.Parent.y
|
||||
c.width=(c.Parent.width*c.scale.size.x)+c.offset.size.x
|
||||
c.height=(c.Parent.height*c.scale.size.y)+c.offset.size.y
|
||||
table.insert(c.Parent.Children,c)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,45 @@
|
||||
function gui:newProgressBar(txt,x,y,w,h,sx,sy,sw,sh)
|
||||
name="newProgressBar"
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("newProgressBarFrame",name, x, y, w, 30, sx ,sy ,sw ,sh)
|
||||
c.Draggable=true
|
||||
c.dragbut="r"
|
||||
c.BorderSize=0
|
||||
c:ApplyGradient{Color.Blue,Color.sexy_purple}
|
||||
c:newTextLabel(txt,"Holder",0,0,0,h-30,0,1,1,0).Color=Color.sexy_purple
|
||||
c.funcO={}
|
||||
c.funcX={}
|
||||
c:OnDragStart(function(self)
|
||||
self:TopStack()
|
||||
end)
|
||||
local temp = c:newTextButton("X","Close",-25,5,20,20,1)
|
||||
temp.Tween=-5
|
||||
temp.XTween=-2
|
||||
temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent) end end)
|
||||
temp.Color=Color.Red
|
||||
c.BarBG=c:newTextButton("",5,h-65,-10,30,0,1,1)
|
||||
c.BarBG:ApplyGradient{Color.Red,Color.light_red}
|
||||
c.Bar=c.BarBG:newTextLabel("",0,0,0,0,0,0,0,1)
|
||||
c.Bar:ApplyGradient{Color.Green,Color.light_green}
|
||||
c.BarDisp=c.BarBG:newTextLabel("0%","0%",0,0,0,0,0,0,1,1)
|
||||
c.BarDisp.Visibility=0
|
||||
c.BarDisp.Link=c.Bar
|
||||
c.BarDisp:OnUpdate(function(self)
|
||||
self.text=self.Link.scale.size.x*100 .."%"
|
||||
end)
|
||||
c.Func1={}
|
||||
function c:On100(func)
|
||||
table.insert(self.Func1,func)
|
||||
end
|
||||
c:OnUpdate(function(self)
|
||||
if self.Bar.scale.size.x*100>=100 then
|
||||
for P=1,#self.Func1 do
|
||||
self.Func1[P](self)
|
||||
end
|
||||
end
|
||||
end)
|
||||
function c:SetPercentage(n)
|
||||
self.Bar:SetDualDim(0,0,0,0,0,0,n/100,1)
|
||||
end
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,42 @@
|
||||
function gui:newScrollBar(color1,color2)
|
||||
local scrollbar=self:newFrame(-20,0,20,0,1,0,0,1)
|
||||
scrollbar.funcS={}
|
||||
scrollbar.Color=color1 or Color.saddle_brown
|
||||
scrollbar:OnClicked(function(b,self,x,y)
|
||||
love.mouse.setX(self.x+10)
|
||||
if y>=10 and y<=self.height-10 then
|
||||
self.mover:SetDualDim(0,y-10)
|
||||
end
|
||||
if y<10 then
|
||||
love.mouse.setY(10+self.y)
|
||||
end
|
||||
if y>self.height-10 then
|
||||
love.mouse.setY((self.height-10)+self.y)
|
||||
end
|
||||
for i=1,#self.funcS do
|
||||
self.funcS[i](self,self:getPosition())
|
||||
end
|
||||
end)
|
||||
scrollbar:OnEnter(function(self)
|
||||
self:addDominance()
|
||||
end)
|
||||
scrollbar:OnExit(function(self)
|
||||
self:removeDominance()
|
||||
end)
|
||||
scrollbar.mover=scrollbar:newTextButton("","",0,0,20,20)
|
||||
scrollbar.mover.Color=color2 or Color.light_brown
|
||||
function scrollbar:getPosition()
|
||||
return ((self.mover.offset.pos.y)/(self.height-20))*100
|
||||
end
|
||||
function scrollbar:setPosition(n)
|
||||
print((self.height-20),n)
|
||||
self.mover.offset.pos.y=((self.height-20)/(100/n))
|
||||
for i=1,#self.funcS do
|
||||
self.funcS[i](self,self:getPosition())
|
||||
end
|
||||
end
|
||||
function scrollbar:OnScroll(func)
|
||||
table.insert(self.funcS,func)
|
||||
end
|
||||
return scrollbar
|
||||
end
|
||||
@@ -0,0 +1,98 @@
|
||||
function gui:newScrollMenu(title,tabN,onloop,x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local Main = self:newFrame(x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local Title=Main:newTextButton(title,"Title",0,0,0,20,0,0,1)
|
||||
Title.Tween=-4
|
||||
Title.FontSize=12
|
||||
Title:OnReleased(function(b,self)
|
||||
self.Parent.Tick=not(self.Parent.Tick)
|
||||
end)
|
||||
local scroll=Main:newTextButton("","Scroll",-20,20,20,-20,1,0,0,1)
|
||||
scroll:OnClicked(function(b,self,x,y)
|
||||
self.Parent.Mover:SetDualDim(0,y-10,20,20)
|
||||
if self.Parent.Mover.offset.pos.y<0 then
|
||||
self.Parent.Mover:SetDualDim(0,0,20,20)
|
||||
end
|
||||
if self.Parent.Mover.offset.pos.y>self.Parent.height-40 then
|
||||
self.Parent.Mover:SetDualDim(0,self.Parent.height-40,20,20)
|
||||
end
|
||||
local temp = #self.Parent.TList
|
||||
self.Parent.pos=(math.floor((temp*self.Parent.Mover.offset.pos.y)/self.height))+1
|
||||
end)
|
||||
Main:OnUpdate(function(self)
|
||||
if self.Tick==false then
|
||||
self.Visibility=0
|
||||
end
|
||||
end)
|
||||
scroll:OnUpdate(function(self)
|
||||
self.Visible=self.Parent.Tick
|
||||
end)
|
||||
local Mover=scroll:newTextLabel("",0,0,20,20)
|
||||
Main.Mover=Mover
|
||||
Main.TList=tabN
|
||||
Main.pos=1
|
||||
Main.Tick=true
|
||||
function Main:Update(title,tabN,onloop)
|
||||
ch=self:getChildren()
|
||||
for i=#ch,1,-1 do
|
||||
ch[i]:Destroy()
|
||||
end
|
||||
Title=Main:newTextButton(title,"Title",0,0,0,20,0,0,1)
|
||||
Title.Tween=-4
|
||||
Title.FontSize=12
|
||||
Title:OnReleased(function(b,self)
|
||||
self.Parent.Tick=not(self.Parent.Tick)
|
||||
end)
|
||||
scroll=Main:newTextButton("","Scroll",-20,20,20,-20,1,0,0,1)
|
||||
scroll:OnClicked(function(b,self,x,y)
|
||||
self.Parent.Mover:SetDualDim(0,y-10,20,20)
|
||||
if self.Parent.Mover.offset.pos.y<0 then
|
||||
self.Parent.Mover:SetDualDim(0,0,20,20)
|
||||
end
|
||||
if self.Parent.Mover.offset.pos.y>self.Parent.height-40 then
|
||||
self.Parent.Mover:SetDualDim(0,self.Parent.height-40,20,20)
|
||||
end
|
||||
local temp = #self.Parent.TList
|
||||
self.Parent.pos=(math.floor((temp*self.Parent.Mover.offset.pos.y)/self.height))+1
|
||||
end)
|
||||
local Mover=scroll:newTextLabel("",0,0,20,20)
|
||||
Main.Mover=Mover
|
||||
Main.TList=tabN
|
||||
Main.pos=1
|
||||
Main.Tick=true
|
||||
scroll:OnUpdate(function(self)
|
||||
self.Visible=self.Parent.Tick
|
||||
end)
|
||||
for i=1,math.floor(Main.height/20)-1 do
|
||||
local temp=Main:newTextButton("","Item"..i,0,i*20,-20,20,0,0,1)
|
||||
temp.FontSize=10
|
||||
temp.Tween=-4
|
||||
temp.pos=i
|
||||
temp:OnUpdate(function(self)
|
||||
self.text=self.Parent.TList[(self.Parent.pos+self.pos)-1]
|
||||
self.Visible=self.Parent.Tick
|
||||
end)
|
||||
if onloop then
|
||||
onloop(temp,i)
|
||||
end
|
||||
end
|
||||
end
|
||||
io.write(tostring(Main.height).."\n")
|
||||
for i=1,math.floor(Main.height/20)-1 do
|
||||
local temp=Main:newTextButton("Item"..i,0,i*20,-20,20,0,0,1)
|
||||
temp.FontSize=10
|
||||
temp.Tween=-4
|
||||
temp.pos=i
|
||||
temp:OnUpdate(function(self)
|
||||
if self.Parent.TList[(self.Parent.pos+self.pos)-1]~=nil then
|
||||
self.text=self.Parent.TList[(self.Parent.pos+self.pos)-1]
|
||||
else
|
||||
self.text=""
|
||||
end
|
||||
self.Visible=self.Parent.Tick
|
||||
end)
|
||||
if onloop then
|
||||
onloop(temp,i)
|
||||
end
|
||||
end
|
||||
return Main
|
||||
end
|
||||
@@ -0,0 +1,6 @@
|
||||
function gui:destroyAllChildren()
|
||||
local c=self.Children
|
||||
for i=1,#c do
|
||||
c[i]:Destroy()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:removeDominance()
|
||||
_GuiPro.TopHovered=nil
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:respectHierarchy()
|
||||
_GuiPro.Hierarchy=true
|
||||
end
|
||||
@@ -0,0 +1,4 @@
|
||||
function gui.round(num, idp)
|
||||
local mult = 10^(idp or 0)
|
||||
return math.floor(num * mult + 0.5) / mult
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui.setBG(i)
|
||||
gui.ff:SetImage(i)
|
||||
end
|
||||
@@ -0,0 +1,14 @@
|
||||
function gui:setColor(a,b,c)
|
||||
if type(a)=="string" then
|
||||
self.Color=Color[a]
|
||||
elseif type(a)=="number" then
|
||||
self.Color=Color.new(a,b,c)
|
||||
end
|
||||
end
|
||||
function gui:setTextColor(a,b,c)
|
||||
if type(a)=="string" then
|
||||
self.TextColor=Color[a]
|
||||
elseif type(a)=="number" then
|
||||
self.TextColor=Color.new(a,b,c)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:setDefualtFont(font)
|
||||
_defaultfont = font
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
function gui:setHotKey(key)
|
||||
local tab=key:split("+")
|
||||
self.hotkeys=tab
|
||||
self.cooldown=false
|
||||
self.Alarm=multi:newAlarm(1)
|
||||
self.Alarm.parent=self
|
||||
self.args={}
|
||||
self.funcHK=multi:newConnection()
|
||||
self.Alarm:OnRing(function(alarm) alarm.parent.cooldown=false end)
|
||||
function self:OnHotKey(func)
|
||||
self.funcHK:connect(func)
|
||||
end
|
||||
self:OnUpdate(function(self)
|
||||
if self.cooldown then return end
|
||||
for i=1,#self.hotkeys do
|
||||
if not(love.keyboard.isDown(self.hotkeys[i])) then
|
||||
return
|
||||
end
|
||||
end
|
||||
self.cooldown=true
|
||||
self.funcHK:Fire(self)
|
||||
self.Alarm:Reset()
|
||||
end)
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function gui:setNewFont(FontSize)
|
||||
self.Font=love.graphics.setNewFont(tonumber(FontSize))
|
||||
end
|
||||
@@ -0,0 +1,14 @@
|
||||
function gui:setParent(parent,name)-- Needs fixing!!!
|
||||
local temp=self.Parent:getChildren()
|
||||
for i=1,#temp do
|
||||
if temp[i]==self then
|
||||
table.remove(self.Parent.Children,i)
|
||||
break
|
||||
end
|
||||
end
|
||||
table.insert(parent.Children,self)
|
||||
self.Parent=parent
|
||||
if name then
|
||||
self:SetName(name)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,14 @@
|
||||
function gui:setVisiblity(val)
|
||||
self.Visible=val
|
||||
self.oV=val
|
||||
doto=self:GetAllChildren()
|
||||
if val==false then
|
||||
for i=1,#doto do
|
||||
doto[i].Visible=val
|
||||
end
|
||||
else
|
||||
for i=1,#doto do
|
||||
doto[i].Visible=doto[i].oV
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,6 @@
|
||||
function gui:setText(txt)
|
||||
self.text=txt
|
||||
end
|
||||
function gui:getText(txt)
|
||||
return self.text
|
||||
end
|
||||
@@ -0,0 +1,178 @@
|
||||
function string:insert(p,s)
|
||||
return ("%s%s%s"):format(self:sub(1,p), s, self:sub(p+1))
|
||||
end
|
||||
function string:remove(p,l)
|
||||
l=l or 1
|
||||
return ("%s%s"):format(self:sub(1,p-1), self:sub(p+l))
|
||||
end
|
||||
function gui:newTextBox(t,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("TextBox",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.ClearOnFocus=false
|
||||
c.LoseFocusOnEnter=true
|
||||
c.Tween=0
|
||||
c.XTween=0
|
||||
c.FontHeight=_defaultfont:getHeight()
|
||||
c.Font=_defaultfont
|
||||
c.FontSize=15
|
||||
c.TextFormat="center"
|
||||
c.text = t
|
||||
c.ttext= t
|
||||
c.AutoScaleText=false
|
||||
c.TextVisibility=1
|
||||
c.Color = {220, 220, 220}
|
||||
c.TextColor = {0, 0, 0}
|
||||
c.Active=false
|
||||
c.hidden=false
|
||||
c.cursor={0,1}
|
||||
c.mark=nil
|
||||
c.arrowkeys=false
|
||||
c.funcF={function()
|
||||
love.keyboard.setTextInput(true)
|
||||
end}
|
||||
c.cooldown=false
|
||||
c.cooldown2=false
|
||||
c.funcE={function()
|
||||
love.keyboard.setTextInput(false)
|
||||
end}
|
||||
function c:triggerEnter()
|
||||
for cc=1,#self.funcE do
|
||||
self.funcE[cc](self,self.ttext)
|
||||
end
|
||||
self.text=""
|
||||
self.ttext=""
|
||||
end
|
||||
c.Enter=true
|
||||
c.Alarm=multi:newAlarm(.1)
|
||||
c.Alarm.parent=c
|
||||
c.Alarm:OnRing(function(alarm) alarm.parent.cooldown=false end)
|
||||
c.Alarm2=multi:newAlarm(.5)
|
||||
c.Alarm2.parent=c
|
||||
c.Alarm2:OnRing(function(alarm) alarm.parent.cooldown2=false end)
|
||||
c.ArrowAlarm=multi:newAlarm(.1)
|
||||
c.ArrowAlarm.parent=c
|
||||
c.ArrowAlarm:OnRing(function(alarm) alarm.parent.arrowkeys=false end)
|
||||
function c:OnFocus(func)
|
||||
table.insert(self.funcF,func)
|
||||
end
|
||||
function c:OnEnter(func)
|
||||
table.insert(self.funcE,func)
|
||||
end
|
||||
c:OnClicked(function(b,self)
|
||||
for cc=1,#self.funcF do
|
||||
self.funcF[cc](self)
|
||||
end
|
||||
if self.Active==false then
|
||||
if self.ClearOnFocus==true then
|
||||
self.text=""
|
||||
self.ttext=""
|
||||
end
|
||||
for tb=1,#gui.TB do
|
||||
if gui.TB[tb]~=nil then
|
||||
gui.TB[tb].Active=false
|
||||
end
|
||||
end
|
||||
self.Active=true
|
||||
end
|
||||
end)
|
||||
c:OnClicked(function(b,self,x,y)
|
||||
local dwidth, wrappedtext = _defaultfont:getWrap(self.text:sub(1,self.cursor[1]), self.width)
|
||||
local height = _defaultfont:getHeight()
|
||||
if #wrappedtext>=1 then
|
||||
width= _defaultfont:getWidth(wrappedtext[#wrappedtext])
|
||||
self.cursor[2]=#wrappedtext
|
||||
else
|
||||
self.cursor[2]=1
|
||||
width=0
|
||||
end
|
||||
yc=math.ceil(((y/self.DPI)-(self.FontHeight/2)+self.Tween-self.y)/height)
|
||||
xc=math.floor(x)
|
||||
end)
|
||||
c:AddDrawRuleE(function(self)
|
||||
if self.Active then
|
||||
local dwidth, wrappedtext = _defaultfont:getWrap(self.text:sub(1,self.cursor[1]), self.width)
|
||||
local height = _defaultfont:getHeight()
|
||||
if #wrappedtext>=1 then
|
||||
width= _defaultfont:getWidth(wrappedtext[#wrappedtext])
|
||||
self.cursor[2]=#wrappedtext
|
||||
else
|
||||
self.cursor[2]=1
|
||||
width=0
|
||||
end
|
||||
x1=width+2+self.x+self.XTween
|
||||
y1=(self.y+(height*(self.cursor[2]-1))+(self.FontHeight/2)+self.Tween)*self.DPI
|
||||
x2=width+2+self.x+self.XTween
|
||||
y2=(self.y+(self.FontHeight/2)+self.Tween*self.DPI)+height*self.cursor[2]
|
||||
love.graphics.line(x1,y1,x2,y2)
|
||||
end
|
||||
end)
|
||||
c:OnUpdate(function(self)
|
||||
if love.keyboard.isDown("backspace") and self.Active and self.cooldown==false then
|
||||
if #self.text>0 then
|
||||
self.text = self.text:remove(self.cursor[1])
|
||||
self.ttext = self.ttext:remove(self.cursor[1])
|
||||
self.cursor[1]=self.cursor[1]-1
|
||||
end
|
||||
self.cooldown=true
|
||||
self.Alarm:Reset()
|
||||
elseif love.keyboard.isDown("backspace")==false then
|
||||
self.cooldown=false
|
||||
end
|
||||
if love.keyboard.isDown("left") and self.arrowkeys==false and self.Active then
|
||||
self.arrowkeys=true
|
||||
self.cursor[1]=self.cursor[1]-1
|
||||
if self.cursor[1]<0 then
|
||||
self.cursor[1]=0
|
||||
end
|
||||
self.ArrowAlarm:Reset()
|
||||
elseif love.keyboard.isDown("right") and self.arrowkeys==false and self.Active then
|
||||
self.arrowkeys=true
|
||||
self.cursor[1]=self.cursor[1]+1
|
||||
if self.cursor[1]>#self.text then
|
||||
self.cursor[1]=#self.text
|
||||
end
|
||||
self.ArrowAlarm:Reset()
|
||||
end
|
||||
if love.keyboard.isDown("delete") and self.Active then
|
||||
if #self.text>0 then
|
||||
self.text = ""
|
||||
self.ttext = ""
|
||||
self.cursor[1]=1
|
||||
end
|
||||
elseif (love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")) and love.keyboard.isDown("return") and self.cooldown2==false then
|
||||
self.text=self.text.."\n"
|
||||
self.ttext=self.ttext.."\n"
|
||||
self.cooldown2=true
|
||||
c.Alarm2:Reset()
|
||||
elseif (love.keyboard.isDown("return") or love.keyboard.isDown("enter") or love.keyboard.isDown("kpenter")) and self.Active and self.Enter and not(love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")) then
|
||||
if self.LoseFocusOnEnter then
|
||||
self.Active=false
|
||||
else
|
||||
self.Active=true
|
||||
end
|
||||
for cc=1,#self.funcE do
|
||||
self.funcE[cc](self,self.ttext)
|
||||
end
|
||||
end
|
||||
end)
|
||||
table.insert(gui.TB,c)
|
||||
return c
|
||||
end
|
||||
--TEXT BOX HELPER FUNCTION
|
||||
function love.textinput(t)
|
||||
for tb=1,#gui.TB do
|
||||
if gui.TB[tb]~=nil then
|
||||
if gui.TB[tb].Active then
|
||||
if gui.TB[tb].hidden then
|
||||
--gui.TB[tb].text=gui.TB[tb].text.."*"
|
||||
gui.TB[tb].text=gui.TB[tb].text:insert(gui.TB[tb].cursor[1],"*")
|
||||
else
|
||||
--gui.TB[tb].text=gui.TB[tb].text..t
|
||||
gui.TB[tb].text=gui.TB[tb].text:insert(gui.TB[tb].cursor[1],t)
|
||||
end
|
||||
gui.TB[tb].ttext=gui.TB[tb].ttext:insert(gui.TB[tb].cursor[1],t)
|
||||
gui.TB[tb].cursor[1]=gui.TB[tb].cursor[1]+1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,22 @@
|
||||
function gui:newTextButton(t,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("TextButton",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.Tween=0
|
||||
c.XTween=0
|
||||
c.FontHeight=_defaultfont:getHeight()
|
||||
c.Font=_defaultfont
|
||||
c.FontSize=15
|
||||
c.TextFormat="center"
|
||||
c.text = t
|
||||
c.AutoScaleText=false
|
||||
c.TextVisibility=1 -- 0=invisible,1=solid (self.TextVisibility*254+1)
|
||||
c.Color = {220, 220, 220}
|
||||
c.TextColor = {0, 0, 0}
|
||||
c:OnEnter(function()
|
||||
love.mouse.setCursor(_GuiPro.CursorH)
|
||||
end)
|
||||
c:OnExit(function()
|
||||
love.mouse.setCursor(_GuiPro.CursorN)
|
||||
end)
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,16 @@
|
||||
function gui:newTextLabel(t,name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
local c=self:newBase("TextLabel",name, x, y, w, h, sx ,sy ,sw ,sh)
|
||||
c.Tween=0
|
||||
c.XTween=0
|
||||
c.FontHeight=_defaultfont:getHeight()
|
||||
c.Font=_defaultfont
|
||||
c.FontSize=15
|
||||
c.TextFormat="center"
|
||||
c.text = t
|
||||
c.AutoScaleText=false
|
||||
c.TextVisibility=1 -- 0=invisible,1=solid (self.TextVisibility*254+1)
|
||||
c.Color = {220, 220, 220}
|
||||
c.TextColor = {0, 0, 0}
|
||||
return c
|
||||
end
|
||||
@@ -0,0 +1,58 @@
|
||||
utf8 = require("utf8")
|
||||
_defaultfont = love.graphics.getFont()
|
||||
gui = {}
|
||||
gui.__index = gui
|
||||
gui.TB={}
|
||||
gui.Version="VERSION" -- Is it really ready for release?
|
||||
_GuiPro={GBoost=true,hasDrag=false,DragItem={},Children={},Visible=true,count=0,x=0,y=0,height=0,width=0,update=function(self) local things=GetAllChildren2(self) UpdateThings(things) end,draw=function(self) local things=GetAllChildren(self) DrawThings(things) end,getChildren=function(self) return self.Children end}
|
||||
_GuiPro.Clips={}
|
||||
_GuiPro.rotate=0
|
||||
setmetatable(_GuiPro, gui)
|
||||
function gui:LoadInterface(file)
|
||||
local add=".int"
|
||||
if string.find(file,".",1,true) then add="" end
|
||||
if love.filesystem.exists(file..add) then
|
||||
a,b=pcall(love.filesystem.load(file..add))
|
||||
if a then
|
||||
print("Loaded: "..file)
|
||||
else
|
||||
print("Error loading file: "..file)
|
||||
print(a,b)
|
||||
end
|
||||
else
|
||||
print("File does not exist!")
|
||||
return false
|
||||
end
|
||||
end
|
||||
function gui.LoadAll(dir)
|
||||
files=love.filesystem.getDirectoryItems(dir)
|
||||
for i=1,#files do
|
||||
if string.sub(files[i],-4)==".int" then
|
||||
gui:LoadInterface(dir.."/"..files[i])
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Start Of Load
|
||||
|
||||
--gui.LoadAll("GuiManager/LibCore")
|
||||
gui.LoadAll("GuiManager/Core")
|
||||
gui.LoadAll("GuiManager/Image-Animation")
|
||||
gui.LoadAll("GuiManager/Frame")
|
||||
gui.LoadAll("GuiManager/Item")
|
||||
gui.LoadAll("GuiManager/Misc")
|
||||
gui.LoadAll("GuiManager/Text")
|
||||
gui.LoadAll("GuiManager/Drawing")
|
||||
gui.LoadAll("GuiManager/Combos")
|
||||
--gui.LoadAll("GuiManager/WIP")
|
||||
multi.boost=2
|
||||
|
||||
-- End of Load
|
||||
gui:respectHierarchy()
|
||||
_GuiPro.width,_GuiPro.height=love.graphics.getDimensions()
|
||||
multi:newLoop():OnLoop(function() _GuiPro.width,_GuiPro.height=love.graphics.getDimensions() _GuiPro:update() end)
|
||||
multi:onDraw(function() _GuiPro:draw() end)
|
||||
gui.ff=gui:newFrame("",0,0,0,0,0,0,1,1)
|
||||
gui.ff.Color={255,255,255}
|
||||
gui.ff:OnUpdate(function(self)
|
||||
self:BottomStack()
|
||||
end)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 228 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 351 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 350 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 418 KiB |
@@ -0,0 +1,39 @@
|
||||
function love.conf(t)
|
||||
t.identity = nil -- The name of the save directory (string)
|
||||
t.version = "0.10.2" -- The LOVE version this game was made for (string)
|
||||
t.console = true -- Attach a console (boolean, Windows only)
|
||||
|
||||
t.window.title = "Chat Client" -- The window title (string)
|
||||
t.window.icon = nil -- Filepath to an image to use as the window's icon (string)
|
||||
t.window.width = 500 -- The window width (number)
|
||||
t.window.height = 500 -- The window height (number)
|
||||
t.window.borderless = false -- Remove all border visuals from the window (boolean)
|
||||
t.window.resizable = false -- Let the window be user-resizable (boolean)
|
||||
t.window.minwidth = 1 -- Minimum window width if the window is resizable (number)
|
||||
t.window.minheight = 1 -- Minimum window height if the window is resizable (number)
|
||||
t.window.fullscreen = false -- Enable fullscreen (boolean)
|
||||
t.window.fullscreentype = "desktop" -- Standard fullscreen or desktop fullscreen mode (string)
|
||||
t.window.vsync = false -- Enable vertical sync (boolean)
|
||||
t.window.fsaa = 0 -- The number of samples to use with multi-sampled antialiasing (number)
|
||||
t.window.display = 1 -- Index of the monitor to show the window in (number)
|
||||
t.window.highdpi = false -- Enable high-dpi mode for the window on a Retina display (boolean)
|
||||
t.window.srgb = false -- Enable sRGB gamma correction when drawing to the screen (boolean)
|
||||
t.window.x = nil -- The x-coordinate of the window's position in the specified display (number)
|
||||
t.window.y = nil -- The y-coordinate of the window's position in the specified display (number)
|
||||
|
||||
t.modules.audio = true -- Enable the audio module (boolean)
|
||||
t.modules.event = true -- Enable the event module (boolean)
|
||||
t.modules.graphics = true -- Enable the graphics module (boolean)
|
||||
t.modules.image = true -- Enable the image module (boolean)
|
||||
t.modules.joystick = true -- Enable the joystick module (boolean)
|
||||
t.modules.keyboard = true -- Enable the keyboard module (boolean)
|
||||
t.modules.math = true -- Enable the math module (boolean)
|
||||
t.modules.mouse = true -- Enable the mouse module (boolean)
|
||||
t.modules.physics = true -- Enable the physics module (boolean)
|
||||
t.modules.sound = true -- Enable the sound module (boolean)
|
||||
t.modules.system = true -- Enable the system module (boolean)
|
||||
t.modules.timer = true -- Enable the timer module (boolean)
|
||||
t.modules.window = true -- Enable the window module (boolean)
|
||||
t.modules.thread = true -- Enable the thread module (boolean)
|
||||
end
|
||||
--1440 x 2560
|
||||
@@ -0,0 +1,212 @@
|
||||
audio = {}
|
||||
audio.__index = audio
|
||||
function audio:new(f,t)
|
||||
local obj={}
|
||||
setmetatable(obj, audio)
|
||||
obj.source=love.audio.newSource(f,t)
|
||||
obj.f=f
|
||||
obj.t=t or "stream"
|
||||
obj.endEvent=multi:newLoop()
|
||||
obj.endEvent.Pare=obj
|
||||
obj.wasPlaying=false
|
||||
obj.func={}
|
||||
obj.func2={}
|
||||
obj.func3={}
|
||||
obj.func4={}
|
||||
obj.endEvent:OnLoop(function(time,loop)
|
||||
if not(loop.Pare:isPlaying()) and loop.Pare.wasPlaying==true and not(loop.Pare:isPaused()) then
|
||||
for i=1,#loop.Pare.func do
|
||||
loop.Pare:stop()
|
||||
loop.Pare.wasPlaying=false
|
||||
loop.Pare.endEvent:Pause()
|
||||
loop.Pare.func[i](loop.Pare)
|
||||
end
|
||||
end
|
||||
end)
|
||||
obj.endEvent:Pause()
|
||||
return obj
|
||||
end
|
||||
function audio:clone()
|
||||
local _temp=audio:new(self.f,self.t)
|
||||
_temp.source=self.source:clone()
|
||||
return _temp
|
||||
end
|
||||
--Mutators
|
||||
function audio:play()
|
||||
if self:isPaused() then
|
||||
for i=1,#self.func4 do
|
||||
self.func4[i](self)
|
||||
end
|
||||
self:resume()
|
||||
else
|
||||
for i=1,#self.func3 do
|
||||
self.func3[i](self)
|
||||
end
|
||||
self.source:play()
|
||||
self.wasPlaying=true
|
||||
self.endEvent:Resume()
|
||||
end
|
||||
end
|
||||
function audio:stop()
|
||||
self.source:stop()
|
||||
self.wasPlaying=true
|
||||
self.endEvent:Pause()
|
||||
end
|
||||
function audio:pause()
|
||||
for i=1,#self.func2 do
|
||||
self.func2[i](self)
|
||||
end
|
||||
self.source:pause()
|
||||
end
|
||||
function audio:resume()
|
||||
self.source:resume()
|
||||
end
|
||||
function audio:rewind()
|
||||
self.source:rewind()
|
||||
end
|
||||
function audio:setAttenuationDistances(r,m)
|
||||
self.source:setAttenuationDistances(r,m)
|
||||
end
|
||||
function audio:setCone(innerAngle, outerAngle, outerVolume)
|
||||
self.source:setCone(innerAngle, outerAngle, outerVolume)
|
||||
end
|
||||
function audio:setDirection(x, y, z)
|
||||
self.source:setDirection(x, y, z)
|
||||
end
|
||||
function audio:setLooping(loop)
|
||||
self.source:setLooping(loop)
|
||||
end
|
||||
function audio:setPitch(pitch)
|
||||
self.source:setPitch(pitch)
|
||||
end
|
||||
function audio:setPosition(x, y, z)
|
||||
self.source:setPosition(x, y, z)
|
||||
end
|
||||
function audio:setRelative(enable)
|
||||
self.source:setRelative(enable)
|
||||
end
|
||||
function audio:setRolloff(rolloff)
|
||||
self.source:setRolloff(rolloff)
|
||||
end
|
||||
function audio:setVelocity(x, y, z)
|
||||
self.source:setVelocity(x, y, z)
|
||||
end
|
||||
function audio:setVolume(volume)
|
||||
self.source:setVolume(volume)
|
||||
end
|
||||
function audio:setVolumeLimits(min, max)
|
||||
self.source:setVolumeLimits(min, max)
|
||||
end
|
||||
function audio:seek(offset,unit)
|
||||
self.source:seek(offset,unit)
|
||||
end
|
||||
--Assessors
|
||||
function audio:isPlaying()
|
||||
return self.source:isPlaying()
|
||||
end
|
||||
function audio:isPaused()
|
||||
return self.source:isPaused()
|
||||
end
|
||||
function audio:isStopped()
|
||||
return self.source:isStopped()
|
||||
end
|
||||
function audio:isLooping()
|
||||
return self.source:isLooping()
|
||||
end
|
||||
function audio:isStatic()
|
||||
return self.source:isStatic()
|
||||
end
|
||||
function audio:isRelative()
|
||||
return self.source:isRelative()
|
||||
end
|
||||
function audio:getAttenuationDistances()
|
||||
return self.source:getAttenuationDistances()
|
||||
end
|
||||
function audio:getChannels()
|
||||
return self.source:getChannels()
|
||||
end
|
||||
function audio:getCone()
|
||||
return self.source:getCone()
|
||||
end
|
||||
function audio:getDirection()
|
||||
return self.source:getDirection()
|
||||
end
|
||||
function audio:getPitch()
|
||||
return self.source:getPitch()
|
||||
end
|
||||
function audio:getPosition()
|
||||
return self.source:getPosition()
|
||||
end
|
||||
function audio:getRolloff()
|
||||
return self.source:getRolloff()
|
||||
end
|
||||
function audio:getVelocity()
|
||||
return self.source:getVelocity()
|
||||
end
|
||||
function audio:getVolume()
|
||||
return self.source:getVolume()
|
||||
end
|
||||
function audio:getVolumeLimits()
|
||||
return self.source:getVolumeLimits()
|
||||
end
|
||||
function audio:tell(unit)
|
||||
return self.source:tell(unit)
|
||||
end
|
||||
function audio:type()
|
||||
return self.source:type()
|
||||
end
|
||||
function audio:typeOf()
|
||||
return self.source:typeOf()
|
||||
end
|
||||
--Events
|
||||
function audio:onResume(func)
|
||||
table.insert(self.func4,func)
|
||||
end
|
||||
function audio:onPlay(func)
|
||||
table.insert(self.func3,func)
|
||||
end
|
||||
function audio:onPause(func)
|
||||
table.insert(self.func2,func)
|
||||
end
|
||||
function audio:onStop(func)
|
||||
table.insert(self.func,func)
|
||||
end
|
||||
--[[
|
||||
Object:type |Done
|
||||
Object:typeOf |Done
|
||||
Source:clone |Done
|
||||
Source:getAttenuationDistances |Done
|
||||
Source:getChannels |Done
|
||||
Source:getCone |Done
|
||||
Source:getDirection |Done
|
||||
Source:getPitch |Done
|
||||
Source:getPosition |Done
|
||||
Source:getRolloff |Done
|
||||
Source:getVelocity |Done
|
||||
Source:getVolume |Done
|
||||
Source:getVolumeLimits |Done
|
||||
Source:isLooping |Done
|
||||
Source:isPaused |Done
|
||||
Source:isPlaying |Done
|
||||
Source:isRelative |Done
|
||||
Source:isStatic |Done
|
||||
Source:isStopped |Done
|
||||
Source:pause |Done
|
||||
Source:play |Done
|
||||
Source:resume |Done
|
||||
Source:rewind |Done
|
||||
Source:seek |Done
|
||||
Source:setAttenuationDistances |Done
|
||||
Source:setCone |Done
|
||||
Source:setDirection |Done
|
||||
Source:setLooping |Done
|
||||
Source:setPitch |Done
|
||||
Source:setPosition |Done
|
||||
Source:setRelative |Done
|
||||
Source:setRolloff |Done
|
||||
Source:setVelocity |Done
|
||||
Source:setVolume |Done
|
||||
Source:setVolumeLimits |Done
|
||||
Source:stop |Done
|
||||
Source:tell |Done
|
||||
]]
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user