utf8 = require("utf8") _defaultfont = love.graphics.getFont() gui = {} gui.__index = gui gui.TB={} gui.Version="8.0.0" -- 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 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 mxy+h or myx+w or mxy+h or my 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=" 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 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 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 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 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 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 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 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 function gui:newFullImageLabel(i,name) return self:newImageLabel(i,name,0,0,0,0,0,0,1,1) end 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 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 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 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 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 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 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 function gui:newFullFrame(name) name=name or "" return self:newFrame(name,0,0,0,0,0,0,1,1) end 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 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 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 function gui:addDominance() _GuiPro.TopHovered=self end function gui:addHotKey(key) local temp=self:newFrame(0,0,0,0) temp.Visible=false temp:setHotKey(key) return temp end 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 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 function gui:anchorRight(n) self:SetDualDim(-(self.width+n),nil,nil,nil,1) end 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 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 function gui:Center() local x,y=self:getFullSize() self:SetDualDim(-math.floor(x/2),-math.floor(y/2),nil,nil,.5,.5) end function gui:centerX() self:SetDualDim(-(self.width/2),nil,nil,nil,.5) end function gui:centerY() self:SetDualDim(nil,-(self.height/2),nil,nil,nil,.5) end 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 function gui:disrespectHierarchy() _GuiPro.Hierarchy=false end 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 function gui:GetChild(name) return self.Children[name] or self end function gui:getChildren() return self.Children end function gui:getColor(cindex) return Color[cindex] end 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 function gui:getHighest() if self.Children[#self.Children]~=nil then return self.Children[#self.Children] end end function gui:getLowest() if self.Children[1]~=nil then return self.Children[1] end end function InGrid(i,x,y,s) return math.floor((i-1)/x)*s,(i-1)*s-(math.floor((i-1)/y)*(s*x)) end 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 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 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 function gui:isHighest() return (self==self.Parent:getHighest()) end 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 function gui:isLowest() return (self==self.Parent:getLowest()) end function gui.massMutate(t,...) local mut={...} for i=1,#mut do mut[i]:Mutate(t) end end function gui:Move(x,y) self.offset.pos.x=self.offset.pos.x+x self.offset.pos.y=self.offset.pos.y+y end 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 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 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 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 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 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 function gui:destroyAllChildren() local c=self.Children for i=1,#c do c[i]:Destroy() end end function gui:removeDominance() _GuiPro.TopHovered=nil end function gui:respectHierarchy() _GuiPro.Hierarchy=true end function gui.round(num, idp) local mult = 10^(idp or 0) return math.floor(num * mult + 0.5) / mult end function gui.setBG(i) gui.ff:SetImage(i) end 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 function gui:setDefualtFont(font) _defaultfont = font end 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 function gui:setText(txt) self.text=txt end function gui:getText(txt) return self.text end --_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 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 function gui:SetHover(img,x,y) --_GuiPro.CursorH=love.mouse.newCursor(img,x,y) end function gui:SetName(name) self.Parent.Children[name]=self self.Name=name end function gui:setNewFont(FontSize) self.Font=love.graphics.setNewFont(tonumber(FontSize)) end 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 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 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 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 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 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 function gui:AddDrawRuleB(rule) if not(self.DrawRulesB) then self.DrawRulesB={} end table.insert(self.DrawRulesB,rule) end function gui:AddDrawRuleE(rule) if not(self.DrawRulesE) then self.DrawRulesE={} end table.insert(self.DrawRulesE,rule) end 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 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.Visibility*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 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.Visibility*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 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)