1 line
57 KiB
Lua
1 line
57 KiB
Lua
local a={basaltBG=colors.lightGray,basaltFG=colors.black,FrameBG=colors.gray,FrameFG=colors.black,ButtonBG=colors.gray,ButtonFG=colors.black,CheckboxBG=colors.gray,CheckboxFG=colors.black,InputBG=colors.gray,InputFG=colors.black,textfieldBG=colors.gray,textfieldFG=colors.black,listBG=colors.gray,listFG=colors.black,dropdownBG=colors.gray,dropdownFG=colors.black,radioBG=colors.gray,radioFG=colors.black,selectionBG=colors.black,selectionFG=colors.lightGray}local b={debugger=true,version=1}local c;local d={}local e={}local f=term.current()local g=string.sub;local function h(i,j,k)local i=string.sub(i,1,j)local l=j-string.len(i)if k=="right"then i=string.rep(" ",l)..i elseif k=="center"then i=string.rep(" ",math.floor(l/2))..i..string.rep(" ",math.floor(l/2))i=i..(string.len(i)<j and" "or"")else i=i..string.rep(" ",l)end;return i end;local function m(n,k)local o=0;if k=="center"then o=math.ceil(n/2)if o<1 then o=1 end end;if k=="bottom"then o=n end;return o end;local function p(q)return function(q,r)r=r-1;if r~=0 then return r,q[r]end end,q,#q+1 end;local s={[colors.white]="0",[colors.orange]="1",[colors.magenta]="2",[colors.lightBlue]="3",[colors.yellow]="4",[colors.lime]="5",[colors.pink]="6",[colors.gray]="7",[colors.lightGray]="8",[colors.cyan]="9",[colors.purple]="a",[colors.blue]="b",[colors.brown]="c",[colors.green]="d",[colors.red]="e",[colors.black]="f"}local function t()local u=f;local j,n=u.getSize()local v={}local w={}local x={}local y={}local z={}local A={}local B;local C={}local function D()B=(" "):rep(j)for l=0,15 do local E=2^l;local F=s[E]C[E]=F:rep(j)end end;D()local function G()local H=B;local I=C[colors.white]local J=C[colors.black]for l=1,n do v[l]=g(v[l]==nil and H or v[l]..H:sub(1,j-v[l]:len()),1,j)x[l]=g(x[l]==nil and I or x[l]..I:sub(1,j-x[l]:len()),1,j)w[l]=g(w[l]==nil and J or w[l]..J:sub(1,j-w[l]:len()),1,j)end end;G()local function K(L,M,i)if M>=1 and M<=n then if L+i:len()>0 and L<=j then local N=v[M]local O;local P=L+#i-1;if L<1 then local Q=1-L+1;local R=j-L+1;i=g(i,Q,R)elseif P>j then local R=j-L+1;i=g(i,1,R)end;if L>1 then local R=L-1;O=g(N,1,R)..i else O=i end;if P<j then O=O..g(N,P+1,j)end;v[M]=O end end end;local function S(L,M,T)if M>=1 and M<=n then if L+T:len()>0 and L<=j then local N=w[M]local O;local P=L+#T-1;if L<1 then T=g(T,1-L+1,j-L+1)elseif P>j then T=g(T,1,j-L+1)end;if L>1 then O=g(N,1,L-1)..T else O=T end;if P<j then O=O..g(N,P+1,j)end;w[M]=O end end end;local function U(L,M,T)if M>=1 and M<=n then if L+T:len()>0 and L<=j then local N=x[M]local O;local P=L+#T-1;if L<1 then local Q=1-L+1;local R=j-L+1;T=g(T,Q,R)elseif P>j then local R=j-L+1;T=g(T,1,R)end;if L>1 then local R=L-1;O=g(N,1,R)..T else O=T end;if P<j then O=O..g(N,P+1,j)end;x[M]=O end end end;local V={setBG=function(L,M,T)S(L,M,T)end,setText=function(L,M,i)K(L,M,i)end,setFG=function(L,M,T)U(L,M,T)end,drawBackgroundBox=function(L,M,j,n,W)for l=1,n do S(L,M+l-1,s[W]:rep(j))end end,drawForegroundBox=function(L,M,j,n,X)for l=1,n do U(L,M+l-1,s[X]:rep(j))end end,drawTextBox=function(L,M,j,n,Y)for l=1,n do K(L,M+l-1,Y:rep(j))end end,writeText=function(L,M,i,W,X)W=W or u.getBackgroundColor()X=X or u.getTextColor()K(L,M,i)S(L,M,s[W]:rep(i:len()))U(L,M,s[X]:rep(i:len()))end,update=function()local Z,_=u.getCursorPos()local a0=false;if u.getCursorBlink~=nil then a0=u.getCursorBlink()end;u.setCursorBlink(false)for l=1,n do u.setCursorPos(1,l)u.blit(v[l],x[l],w[l])end;u.setCursorBlink(a0)u.setCursorPos(Z,_)end,setTerm=function(a1)u=a1 end}return V end;local V=t()local function a2()local a3={}local a4={}local a5={registerEvent=function(self,a6,a7)if a3[a6]==nil then a3[a6]={}a4[a6]=1 end;a3[a6][a4[a6]]=a7;a4[a6]=a4[a6]+1;return a4[a6]-1 end,removeEvent=function(self,a6,a4)a3[a6][a4[a6]]=nil end,sendEvent=function(self,a6,...)if a3[a6]~=nil then for a8,a9 in pairs(a3[a6])do a9(...)end end end}a5.__index=a5;return a5 end;local aa={}local ab={}local ac=0;function ab:new(ad,ae,...)local af=table.pack(...)local ag=setmetatable({path=ad},{__index=self})ag.window=ae;ag.processId=ac;ag.coroutine=coroutine.create(function()os.run({basalt=b},ad,table.unpack(af))end)aa[ac]=ag;ac=ac+1;return ag end;function ab:resume(a5,...)term.redirect(self.window)local ah,ai=coroutine.resume(self.coroutine,a5,...)self.window=term.current()if ah then self.filter=ai else b.debug(ai)end end;function ab:isDead()if self.coroutine~=nil then if coroutine.status(self.coroutine)=="dead"then table.remove(aa,self.processId)return true end else return true end;return false end;function ab:getStatus()if self.coroutine~=nil then return coroutine.status(self.coroutine)end;return nil end;function ab:start()coroutine.resume(self.coroutine)end;local function aj(ak)local al="Object"local am=nil;local an=1;local ao="left"local ap="top"local aq=false;local ar=false;local as=true;local at=a2()local au={x=1,y=1,w=1,h=1,bgcolor=colors.black,fgcolor=colors.white,name=ak or"Object",parent=nil,show=function(self)ar=true;as=true;return self end,hide=function(self)ar=false;as=true;return self end,isVisible=function(self)return ar end,getZIndex=function(self)return an end,setFocus=function(self)if self.parent~=nil then self.parent:setFocusedObject(self)end;return self end,setZIndex=function(self,a4)an=a4;if self.parent~=nil then self.parent:removeObject(self)self.parent:addObject(self)end;return self end,getType=function(self)return al end,getName=function(self)return self.name end,remove=function(self)if self.parent~=nil then self.parent:removeObject(self)end;return self end,setParent=function(self,av)if av.getType~=nil and av:getType()=="Frame"then self:remove()av:addObject(self)if self.draw then self:show()end end;return self end,setValue=function(self,aw)if am~=aw then am=aw;as=true;self:valueChangedHandler()end;return self end,getValue=function(self)return am end,getVisualChanged=function(self)return as end,setVisualChanged=function(self,ax)as=ax or true;return self end,getEventSystem=function(self)return at end,getParent=function(self)return self.parent end,setPosition=function(self,ay,az,aA)if aA then self.x,self.y=self.x+ay,self.y+az else self.x,self.y=ay,az end;as=true;return self end,getPosition=function(self)return self.x,self.y end,getVisibility=function(self)return ar end,setVisibility=function(self,aB)ar=aB or not ar;as=true;return self end,setSize=function(self,j,n)self.w,self.h=j,n;as=true;return self end,getHeight=function(self)return self.h end,getWidth=function(self)return self.w end,setBackground=function(self,aC)self.bgcolor=aC;as=true;return self end,getBackground=function(self)return self.bgcolor end,setForeground=function(self,aC)self.fgcolor=aC;as=true;return self end,getForeground=function(self)return self.fgcolor end,draw=function(self)if ar then return true end;return false end,getAbsolutePosition=function(self,L,M)if L==nil then L=self.x end;if M==nil then M=self.y end;if self.parent~=nil then local aD,aE=self.parent:getAbsolutePosition(self.parent:getAnchorPosition())L=aD+L-1;M=aE+M-1 end;return L,M end,getAnchorPosition=function(self,L,M,aF)if L==nil then L=self.x end;if M==nil then M=self.y end;if ao=="right"then L=self.parent.w-L-self.w+2 end;if ap=="bottom"then M=self.parent.h-M-self.h+2 end;local aG,aH=self:getOffset()if aq or aF then return L,M end;return L+aG,M+aH end,getOffset=function(self)if self.parent~=nil and aq==false then return self.parent:getFrameOffset()end;return 0,0 end,ignoreOffset=function(self,aI)aq=aI or true;return self end,setAnchor=function(self,...)for aJ,a9 in pairs(table.pack(...))do if a9=="right"or a9=="left"then ao=a9 end;if a9=="top"or a9=="bottom"then ap=a9 end end;as=true;return self end,getAnchor=function(self)return ao,ap end,onChange=function(self,a7)self:registerEvent("value_changed",a7)return self end,onClick=function(self,a7)self:registerEvent("mouse_click",a7)return self end,onEvent=function(self,a7)self:registerEvent("custom_event_handler",a7)return self end,onClickUp=function(self,a7)self:registerEvent("mouse_up",a7)return self end,onKey=function(self,a7)self:registerEvent("key",a7)self:registerEvent("char",a7)return self end,onKeyUp=function(self,a7)self:registerEvent("key_up",a7)return self end,onBackgroundKey=function(self,a7)self:registerEvent("background_key",a7)self:registerEvent("background_char",a7)return self end,onBackgroundKeyUp=function(self,a7)self:registerEvent("background_key_up",a7)return self end,isFocused=function(self)if self.parent~=nil then return self.parent:getFocusedObject()==self end;return false end,onGetFocus=function(self,a7)self:registerEvent("get_focus",a7)return self end,onLoseFocus=function(self,a7)self:registerEvent("lose_focus",a7)return self end,registerEvent=function(self,a5,a7)return at:registerEvent(a5,a7)end,removeEvent=function(self,a5,a4)return at:removeEvent(a5,a4)end,mouseClickHandler=function(self,a5,aK,L,M)local aL,aM=self:getAbsolutePosition(self:getAnchorPosition())if aL<=L and aL+self.w>L and aM<=M and aM+self.h>M and ar then if self.parent~=nil then self.parent:setFocusedObject(self)end;at:sendEvent(a5,self,a5,aK,L,M)return true end;return false end,keyHandler=function(self,a5,aN)if self:isFocused()then at:sendEvent(a5,self,a5,aN)return true end;return false end,backgroundKeyHandler=function(self,a5,aN)at:sendEvent("background_"..a5,self,a5,aN)end,valueChangedHandler=function(self)at:sendEvent("value_changed",self)end,eventHandler=function(self,a5,aO,aP,aQ,aR)at:sendEvent("custom_event_handler",self,a5,aO,aP,aQ,aR)end,getFocusHandler=function(self)at:sendEvent("get_focus",self)end,loseFocusHandler=function(self)at:sendEvent("lose_focus",self)end}au.__index=au;return au end;local function aS(ak)local aT=aj(ak)local al="Button"aT:setValue("Button")aT:setZIndex(5)aT.w=8;aT.bgcolor=a.ButtonBG;aT.fgcolor=a.ButtonFG;local aU="center"local aV="center"local au={getType=function(self)return al end,setHorizontalAlign=function(self,aW)aU=aW end,setVerticalAlign=function(self,aW)aV=aW end,setText=function(self,i)aT:setValue(i)return self end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()local aZ=m(self.h,aV)self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)self.parent:drawForegroundBox(aX,aY,self.w,self.h,self.fgcolor)self.parent:drawTextBox(aX,aY,self.w,self.h," ")for l=1,self.h do if l==aZ then self.parent:setText(aX,aY+l-1,h(self:getValue(),self.w,aU))end end end end end}return setmetatable(au,aT)end;local function a_(ak)local aT=aj(ak)local al="Program"aT:setZIndex(5)local au;local function b0(L,M,j,n)local b1,b2=1,1;local b3,b4=colors.black,colors.white;local b5=false;local b6=false;local v={}local w={}local x={}local b7={}local B;local C={}for r=0,15 do local b8=2^r;b7[b8]={f.getPaletteColour(b8)}end;local function D()B=(" "):rep(j)for l=0,15 do local E=2^l;local F=s[E]C[E]=F:rep(j)end end;local function G()D()local H=B;local I=C[colors.white]local J=C[colors.black]for l=1,n do v[l]=g(v[l]==nil and H or v[l]..H:sub(1,j-v[l]:len()),1,j)x[l]=g(x[l]==nil and I or x[l]..I:sub(1,j-x[l]:len()),1,j)w[l]=g(w[l]==nil and J or w[l]..J:sub(1,j-w[l]:len()),1,j)end end;G()local function b9()if b1>=1 and b2>=1 and b1<=j and b2<=n then else end end;local function ba(bb,bc,bd)local be=b1;local P=be+#bb-1;if b2>=1 and b2<=n then if be<=j and P>=1 then if be==1 and P==j then v[b2]=bb;x[b2]=bc;w[b2]=bd else local bf,bg,bh;if be<1 then local bi=1-be+1;local bj=j-be+1;bf=g(bb,bi,bj)bg=g(bc,bi,bj)bh=g(bd,bi,bj)elseif P>j then local bj=j-be+1;bf=g(bb,1,bj)bg=g(bc,1,bj)bh=g(bd,1,bj)else bf=bb;bg=bc;bh=bd end;local bk=v[b2]local bl=x[b2]local bm=w[b2]local bn,bo,bp;if be>1 then local bq=be-1;bn=g(bk,1,bq)..bf;bo=g(bl,1,bq)..bg;bp=g(bm,1,bq)..bh else bn=bf;bo=bg;bp=bh end;if P<j then local br=P+1;bn=bn..g(bk,br,j)bo=bo..g(bl,br,j)bp=bp..g(bm,br,j)end;v[b2]=bn;x[b2]=bo;w[b2]=bp end end;b1=P+1;if b6 then b9()end end end;local function K(bs,bt,i)if i~=nil then local bu=v[bt]if bu~=nil then v[bt]=g(bu:sub(1,bs-1)..i..bu:sub(bs+i:len(),j),1,j)end end end;local function S(bs,bt,T)if T~=nil then local bv=w[bt]if bv~=nil then w[bt]=g(bv:sub(1,bs-1)..T..bv:sub(bs+T:len(),j),1,j)end end end;local function U(bs,bt,T)if T~=nil then local bw=x[bt]if bw~=nil then x[bt]=g(bw:sub(1,bs-1)..T..bw:sub(bs+T:len(),j),1,j)end end end;local bx=function(aC)if type(aC)~="number"then error("bad argument #1 (expected number, got "..type(aC)..")",2)elseif s[aC]==nil then error("Invalid color (got "..aC..")",2)end;b4=aC end;local by=function(aC)if type(aC)~="number"then error("bad argument #1 (expected number, got "..type(aC)..")",2)elseif s[aC]==nil then error("Invalid color (got "..aC..")",2)end;b3=aC end;local bz=function(bA,bB,bC,bD)if type(bA)~="number"then error("bad argument #1 (expected number, got "..type(bA)..")",2)end;if s[bA]==nil then error("Invalid color (got "..bA..")",2)end;local bE;if type(bB)=="number"and bC==nil and bD==nil then bE={colours.rgb8(bB)}b7[bA]=bE else if type(bB)~="number"then error("bad argument #2 (expected number, got "..type(bB)..")",2)end;if type(bC)~="number"then error("bad argument #3 (expected number, got "..type(bC)..")",2)end;if type(bD)~="number"then error("bad argument #4 (expected number, got "..type(bD)..")",2)end;bE=b7[bA]bE[1]=bB;bE[2]=bC;bE[3]=bD end end;local bF=function(bA)if type(bA)~="number"then error("bad argument #1 (expected number, got "..type(bA)..")",2)end;if s[bA]==nil then error("Invalid color (got "..bA..")",2)end;local bE=b7[bA]return bE[1],bE[2],bE[3]end;local bG={setCursorPos=function(bs,bt)if type(bs)~="number"then error("bad argument #1 (expected number, got "..type(bs)..")",2)end;if type(bt)~="number"then error("bad argument #2 (expected number, got "..type(bt)..")",2)end;b1=math.floor(bs)b2=math.floor(bt)if b6 then b9()end end,getCursorPos=function()return b1,b2 end,setCursorBlink=function(bH)if type(bH)~="boolean"then error("bad argument #1 (expected boolean, got "..type(bH)..")",2)end;b5=bH end,getCursorBlink=function()return b5 end,getPaletteColor=bF,getPaletteColour=bF,setBackgroundColor=by,setBackgroundColour=by,setTextColor=bx,setTextColour=bx,setPaletteColor=bz,setPaletteColour=bz,getBackgroundColor=function()return b3 end,getBackgroundColour=function()return b3 end,getSize=function()return j,n end,getTextColor=function()return b4 end,getTextColour=function()return b4 end,basalt_resize=function(bI,bJ)j,n=bI,bJ;G()end,basalt_reposition=function(bs,bt)L,M=bs,bt end,basalt_setVisible=function(bK)b6=bK end,drawBackgroundBox=function(bs,bt,bI,bJ,W)for l=1,bJ do S(bs,bt+l-1,s[W]:rep(bI))end end,drawForegroundBox=function(bs,bt,bI,bJ,X)for l=1,bJ do U(bs,bt+l-1,s[X]:rep(bI))end end,drawTextBox=function(bs,bt,bI,bJ,Y)for l=1,bJ do K(bs,bt+l-1,Y:rep(bI))end end,writeText=function(bs,bt,i,W,X)W=W or b3;X=X or b4;K(L,bt,i)S(bs,bt,s[W]:rep(i:len()))U(bs,bt,s[X]:rep(i:len()))end,basalt_update=function()if au.parent~=nil then for l=1,n do au.parent:setText(L,M+l-1,v[l])au.parent:setBG(L,M+l-1,w[l])au.parent:setFG(L,M+l-1,x[l])end end end,scroll=function(o)if type(o)~="number"then error("bad argument #1 (expected number, got "..type(o)..")",2)end;if o~=0 then local bL=B;local bM=C[b4]local bN=C[b3]for bO=1,n do local M=bO+o;if M>=1 and M<=n then v[bO]=v[M]w[bO]=w[M]x[bO]=x[M]else v[bO]=bL;x[bO]=bM;w[bO]=bN end end end;if b6 then b9()end end,isColor=function()return f.isColor()end,isColour=function()return f.isColor()end,write=function(i)i=tostring(i)if b6 then ba(i,s[b4]:rep(i:len()),s[b3]:rep(i:len()))end end,clearLine=function()if b6 then K(1,b2,(" "):rep(j))S(1,b2,s[b3]:rep(j))U(1,b2,s[b4]:rep(j))end;if b6 then b9()end end,clear=function()for l=1,n do K(1,l,(" "):rep(j))S(1,l,s[b3]:rep(j))U(1,l,s[b4]:rep(j))end;if b6 then b9()end end,blit=function(i,bP,bQ)if type(i)~="string"then error("bad argument #1 (expected string, got "..type(i)..")",2)end;if type(bP)~="string"then error("bad argument #2 (expected string, got "..type(bP)..")",2)end;if type(bQ)~="string"then error("bad argument #3 (expected string, got "..type(bQ)..")",2)end;if#bP~=#i or#bQ~=#i then error("Arguments must be the same length",2)end;if b6 then ba(i,bP,bQ)end end}return bG end;aT.w=30;aT.h=12;local bR=b0(1,1,aT.w,aT.h)local bS;local bT=false;local bU={}au={getType=function(self)return al end,show=function(self)aT.show(self)bR.setBackgroundColor(self.bgcolor)bR.setTextColor(self.fgcolor)bR.basalt_setVisible(true)return self end,hide=function(self)aT.hide(self)bR.basalt_setVisible(false)return self end,setPosition=function(self,L,M,aA)aT.setPosition(self,L,M,aA)bR.basalt_reposition(self:getAnchorPosition())return self end,getBasaltWindow=function()return bR end,getBasaltProcess=function()return bS end,setSize=function(self,j,n)aT.setSize(self,j,n)bR.basalt_resize(self.w,self.h)return self end,getStatus=function(self)if bS~=nil then return bS:getStatus()end;return"inactive"end,execute=function(self,ad,...)bS=ab:new(ad,bR,...)bR.setBackgroundColor(colors.black)bR.setTextColor(colors.white)bR.clear()bR.setCursorPos(1,1)bS:resume()bT=false;return self end,stop=function(self)if bS~=nil then if not bS:isDead()then bS:resume("terminate")if bS:isDead()then if self.parent~=nil then self.parent:setCursor(false)end end end end;return self end,pause=function(self,bV)bT=bV or not bT;if bS~=nil then if not bS:isDead()then if not bT then self:injectEvents(bU)bU={}end end end;return self end,isPaused=function(self)return bT end,injectEvent=function(self,a5,aO,aP,aQ,aR,bW)if bS~=nil then if not bS:isDead()then if bT==false or bW then bS:resume(a5,aO,aP,aQ,aR)else table.insert(bU,{event=a5,args={aO,aP,aQ,aR}})end end end;return self end,getQueuedEvents=function(self)return bU end,updateQueuedEvents=function(self,a3)bU=a3 or bU;return self end,injectEvents=function(self,a3)if bS~=nil then if not bS:isDead()then for aJ,a9 in pairs(a3)do bS:resume(a9.event,table.unpack(a9.args))end end end;return self end,mouseClickHandler=function(self,a5,aK,L,M)if aT.mouseClickHandler(self,a5,aK,L,M)then if bS==nil then return false end;if not bS:isDead()then if not bT then local bX,bY=self:getAbsolutePosition(self:getAnchorPosition(nil,nil,true))bS:resume(a5,aK,L-bX+1,M-bY+1)end end;return true end end,keyHandler=function(self,a5,aN)aT.keyHandler(self,a5,aN)if self:isFocused()then if bS==nil then return false end;if not bS:isDead()then if not bT then if self.draw then bS:resume(a5,aN)end end end end end,getFocusHandler=function(self)aT.getFocusHandler(self)if bS~=nil then if not bS:isDead()then if not bT then if self.parent~=nil then local bZ,b_=bR.getCursorPos()local aX,aY=self:getAnchorPosition()if self.parent~=nil then if aX+bZ-1>=1 and aX+bZ-1<=aX+self.w-1 and b_+aY-1>=1 and b_+aY-1<=aY+self.h-1 then self.parent:setCursor(bR.getCursorBlink(),aX+bZ-1,b_+aY-1,bR.getTextColor())end end end end end end end,loseFocusHandler=function(self)aT.loseFocusHandler(self)if bS~=nil then if not bS:isDead()then if self.parent~=nil then self.parent:setCursor(false)end end end end,eventHandler=function(self,a5,aO,aP,aQ,aR)if bS==nil then return end;if not bS:isDead()then if not bT then if a5~="mouse_click"and a5~="mouse_up"and a5~="mouse_scroll"and a5~="mouse_drag"and a5~="key_up"and a5~="key"and a5~="char"and a5~="terminate"then bS:resume(a5,aO,aP,aQ,aR)end;if self:isFocused()then local aX,aY=self:getAnchorPosition()local bZ,b_=bR.getCursorPos()if self.parent~=nil then if aX+bZ-1>=1 and aX+bZ-1<=aX+self.w-1 and b_+aY-1>=1 and b_+aY-1<=aY+self.h-1 then self.parent:setCursor(bR.getCursorBlink(),aX+bZ-1,b_+aY-1,bR.getTextColor())end end;if a5=="terminate"and self:isFocused()then self:stop()end end else if a5~="mouse_click"and a5~="mouse_up"and a5~="mouse_scroll"and a5~="mouse_drag"and a5~="key_up"and a5~="key"and a5~="char"and a5~="terminate"then table.insert(bU,{event=a5,args={aO,aP,aQ,aR}})end end end end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()bR.basalt_reposition(aX,aY)self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)bR.basalt_update()end end end}return setmetatable(au,aT)end;local function c0(ak)local aT=aj(ak)local al="Label"aT:setZIndex(3)local c1=true;aT:setValue("")local au={getType=function(self)return al end,setText=function(self,i)i=tostring(i)aT:setValue(i)if c1 then self.w=i:len()end;return self end,setSize=function(self,j,n)self.w,self.h=j,n;c1=false;return self end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()self.parent:writeText(aX,aY,self:getValue(),self.bgcolor,self.fgcolor)end end end}return setmetatable(au,aT)end;local function c2(ak)local aT=aj(ak)local al="Pane"local au={getType=function(self)return al end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)self.parent:drawForegroundBox(aX,aY,self.w,self.h,self.fgcolor)end end end}return setmetatable(au,aT)end;local function c3(ak)local aT=aj(ak)local al="Image"aT:setZIndex(2)local c4;local function c5()end;local au={getType=function(self)return al end,loadImage=function(self,ad)c4=paintutils.loadImage(ad)return self end,draw=function(self)if aT.draw(self)then if self.parent~=nil then if c4~=nil then local aX,aY=self:getAnchorPosition()for az=1,math.min(#c4,self.h)do local c6=c4[az]for ay=1,math.min(#c6,self.w)do if c6[ay]>0 then self.parent:drawBackgroundBox(aX+ay-1,aY+az-1,1,1,c6[ay])end end end end end end end}return setmetatable(au,aT)end;local function c7(ak)local aT=aj(ak)local al="Checkbox"aT:setZIndex(5)aT:setValue(false)aT.w=1;aT.h=1;aT.bgcolor=a.CheckboxBG;aT.fgcolor=a.CheckboxFG;local au={symbol="\42",getType=function(self)return al end,mouseClickHandler=function(self,a5,aK,L,M)if aT.mouseClickHandler(self,a5,aK,L,M)then if a5=="mouse_click"and aK==1 then if self:getValue()~=true and self:getValue()~=false then self:setValue(false)else self:setValue(not self:getValue())end end;return true end;return false end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()local aZ=m(self.h,"center")self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)for l=1,self.h do if l==aZ then if self:getValue()==true then self.parent:writeText(aX,aY+l-1,h(self.symbol,self.w,"center"),self.bgcolor,self.fgcolor)else self.parent:writeText(aX,aY+l-1,h(" ",self.w,"center"),self.bgcolor,self.fgcolor)end end end end end end}return setmetatable(au,aT)end;local function c8(ak)local aT=aj(ak)local al="Input"local c9="text"local ca=0;aT:setZIndex(5)aT:setValue("")aT.w=10;aT.h=1;aT.bgcolor=a.InputBG;aT.fgcolor=a.InputFG;local cb=1;local cc=1;local cd=""local ce;local cf;local cg=cd;local ch=false;local au={getType=function(self)return al end,setInputType=function(self,ci)if ci=="password"or ci=="number"or ci=="text"then c9=ci end;return self end,setDefaultText=function(self,i,cj,ck)cd=i;ce=ck or ce;cf=cj or cf;if self:isFocused()then cg=""else cg=cd end;return self end,getInputType=function(self)return c9 end,setValue=function(self,cl)aT.setValue(self,tostring(cl))if not ch then cb=tostring(cl):len()+1 end;return self end,getValue=function(self)local cl=aT.getValue(self)return c9=="number"and tonumber(cl)or cl end,setInputLimit=function(self,cm)ca=tonumber(cm)or ca;return self end,getInputLimit=function(self)return ca end,getFocusHandler=function(self)aT.getFocusHandler(self)if self.parent~=nil then local aX,aY=self:getAnchorPosition()cg=""if self.parent~=nil then self.parent:setCursor(true,aX+cb-cc,aY,self.fgcolor)end end end,loseFocusHandler=function(self)aT.loseFocusHandler(self)if self.parent~=nil then self.parent:setCursor(false)cg=cd end end,keyHandler=function(self,a5,aN)if aT.keyHandler(self,a5,aN)then ch=true;if a5=="key"then if aN==keys.backspace then local i=tostring(aT.getValue())if cb>1 then self:setValue(i:sub(1,cb-2)..i:sub(cb,i:len()))if cb>1 then cb=cb-1 end;if cc>1 then if cb<cc then cc=cc-1 end end end end;if aN==keys.enter then if self.parent~=nil then end end;if aN==keys.right then local cn=tostring(aT.getValue()):len()cb=cb+1;if cb>cn then cb=cn+1 end;if cb<1 then cb=1 end;if cb<cc or cb>=self.w+cc then cc=cb-self.w+1 end;if cc<1 then cc=1 end end;if aN==keys.left then cb=cb-1;if cb>=1 then if cb<cc or cb>=self.w+cc then cc=cb end end;if cb<1 then cb=1 end;if cc<1 then cc=1 end end end;if a5=="char"then local i=aT.getValue()if i:len()<ca or ca<=0 then if c9=="number"then local co=i;if aN=="."or tonumber(aN)~=nil then self:setValue(i:sub(1,cb-1)..aN..i:sub(cb,i:len()))cb=cb+1 end;if tonumber(aT.getValue())==nil then self:setValue(co)end else self:setValue(i:sub(1,cb-1)..aN..i:sub(cb,i:len()))cb=cb+1 end;if cb>=self.w+cc then cc=cc+1 end end end;local aX,aY=self:getAnchorPosition()local cl=tostring(aT.getValue())local cp=(cb<=cl:len()and cb-1 or cl:len())-(cc-1)if cp>self.x+self.w-1 then cp=self.x+self.w-1 end;if self.parent~=nil then self.parent:setCursor(true,aX+cp,aY,self.fgcolor)end;ch=false end end,mouseClickHandler=function(self,a5,aK,L,M)if aT.mouseClickHandler(self,a5,aK,L,M)then if a5=="mouse_click"and aK==1 then end;return true end;return false end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()local aZ=m(self.h,"center")self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)for l=1,self.h do if l==aZ then local cl=tostring(aT.getValue())local ck=self.bgcolor;local cj=self.fgcolor;local i;if cl:len()<=0 then i=cg;ck=ce or ck;cj=cf or cj end;i=cg;if cl~=""then i=cl end;i=i:sub(cc,self.w+cc-1)local cq=self.w-i:len()if cq<0 then cq=0 end;if c9=="password"and cl~=""then i=string.rep("*",i:len())end;i=i..string.rep(" ",cq)self.parent:writeText(aX,aY+l-1,i,ck,cj)end end end end end}return setmetatable(au,aT)end;local function cr(ak)local aT=aj(ak)local al="Textfield"local cs,cc,cb,ct=1,1,1,1;local cu={""}local cv={}local cw=colors.lightBlue;aT.w=20;aT.h=8;aT.bgcolor=a.textfieldBG;aT.fgcolor=a.textfieldFG;aT:setZIndex(5)local au={getType=function(self)return al end,getLines=function(self)return cu end,getLine=function(self,a4)return cu[a4]or""end,editLine=function(self,a4,i)cu[a4]=i or cu[a4]return self end,addLine=function(self,i,a4)if a4~=nil then table.insert(cu,a4,i)else table.insert(cu,i)end;return self end,removeLine=function(self,a4)table.remove(cu,a4 or#cu)if#cu<=0 then table.insert(cu,"")end;return self end,getTextCursor=function(self)return cb,ct end,getFocusHandler=function(self)aT.getFocusHandler(self)if self.parent~=nil then local aX,aY=self:getAnchorPosition()if self.parent~=nil then self.parent:setCursor(true,aX+cb-cc,aY+ct-cs,self.fgcolor)end end end,loseFocusHandler=function(self)aT.loseFocusHandler(self)if self.parent~=nil then self.parent:setCursor(false)end end,keyHandler=function(self,a5,aN)if aT.keyHandler(self,a5,aN)then local aX,aY=self:getAnchorPosition()if a5=="key"then if aN==keys.backspace then if cu[ct]==""then if ct>1 then table.remove(cu,ct)cb=cu[ct-1]:len()+1;cc=cb-self.w+1;if cc<1 then cc=1 end;ct=ct-1 end elseif cb<=1 then if ct>1 then cb=cu[ct-1]:len()+1;cc=cb-self.w+1;if cc<1 then cc=1 end;cu[ct-1]=cu[ct-1]..cu[ct]table.remove(cu,ct)ct=ct-1 end else cu[ct]=cu[ct]:sub(1,cb-2)..cu[ct]:sub(cb,cu[ct]:len())if cb>1 then cb=cb-1 end;if cc>1 then if cb<cc then cc=cc-1 end end end;if ct<cs then cs=cs-1 end;self:setValue("")end;if aN==keys.enter then table.insert(cu,ct+1,cu[ct]:sub(cb,cu[ct]:len()))cu[ct]=cu[ct]:sub(1,cb-1)ct=ct+1;cb=1;cc=1;if ct-cs>=self.h then cs=cs+1 end;self:setValue("")end;if aN==keys.up then if ct>1 then ct=ct-1;if cb>cu[ct]:len()+1 then cb=cu[ct]:len()+1 end;if cc>1 then if cb<cc then cc=cb-self.w+1;if cc<1 then cc=1 end end end;if cs>1 then if ct<cs then cs=cs-1 end end end end;if aN==keys.down then if ct<#cu then ct=ct+1;if cb>cu[ct]:len()+1 then cb=cu[ct]:len()+1 end;if ct>=cs+self.h then cs=cs+1 end end end;if aN==keys.right then cb=cb+1;if ct<#cu then if cb>cu[ct]:len()+1 then cb=1;ct=ct+1 end elseif cb>cu[ct]:len()then cb=cu[ct]:len()+1 end;if cb<1 then cb=1 end;if cb<cc or cb>=self.w+cc then cc=cb-self.w+1 end;if cc<1 then cc=1 end end;if aN==keys.left then cb=cb-1;if cb>=1 then if cb<cc or cb>=self.w+cc then cc=cb end end;if ct>1 then if cb<1 then ct=ct-1;cb=cu[ct]:len()+1;cc=cb-self.w+1 end end;if cb<1 then cb=1 end;if cc<1 then cc=1 end end end;if a5=="char"then cu[ct]=cu[ct]:sub(1,cb-1)..aN..cu[ct]:sub(cb,cu[ct]:len())cb=cb+1;if cb>=self.w+cc then cc=cc+1 end;self:setValue("")end;local cp=(cb<=cu[ct]:len()and cb-1 or cu[ct]:len())-(cc-1)if cp>self.x+self.w-1 then cp=self.x+self.w-1 end;local cx=ct-cs<self.h and ct-cs or ct-cs-1;if cp<1 then cp=0 end;self.parent:setCursor(true,aX+cp,aY+cx,self.fgcolor)return true end end,mouseClickHandler=function(self,a5,aK,L,M)if aT.mouseClickHandler(self,a5,aK,L,M)then local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())local cy,cz=self:getAnchorPosition()if a5=="mouse_click"then if cu[M-aY+cs]~=nil then cb=L-aX+cc;ct=M-aY+cs;if cb>cu[ct]:len()then cb=cu[ct]:len()+1 end;if cb<cc then cc=cb-1;if cc<1 then cc=1 end end;if self.parent~=nil then self.parent:setCursor(true,cy+cb-cc,cz+ct-cs)end end end;if a5=="mouse_scroll"then cs=cs+aK;if cs>#cu-(self.h-1)then cs=#cu-(self.h-1)end;if cs<1 then cs=1 end;if self.parent~=nil then if aX+cb-cc>=aX and aX+cb-cc<=aX+self.w and(aY+ct-cs>=aY and aY+ct-cs<=aY+self.h)then self.parent:setCursor(true,cy+cb-cc,cz+ct-cs)else self.parent:setCursor(false)end end end;self:setVisualChanged()return true end end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)self.parent:drawForegroundBox(aX,aY,self.w,self.h,self.fgcolor)for l=1,self.h do local i=""if cu[l+cs-1]~=nil then i=cu[l+cs-1]end;i=i:sub(cc,self.w+cc-1)local cq=self.w-i:len()if cq<0 then cq=0 end;i=i..string.rep(" ",cq)self.parent:setText(aX,aY+l-1,i)end end end end}return setmetatable(au,aT)end;local function cA(ak)local aT=aj(ak)local al="List"aT.w=16;aT.h=6;aT.bgcolor=a.listBG;aT.fgcolor=a.listFG;aT:setZIndex(5)local cB={}local cC=a.selectionBG;local cD=a.selectionFG;local cE=true;local cF="left"local cG=0;local cH=true;local au={getType=function(self)return al end,addItem=function(self,i,W,X,...)table.insert(cB,{text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})if#cB==1 then self:setValue(cB[1])end;return self end,setIndexOffset=function(self,cI)cG=cI;return self end,getIndexOffset=function(self)return cG end,removeItem=function(self,a4)table.remove(cB,a4)return self end,getItem=function(self,a4)return cB[a4]end,getItemIndex=function(self)local cJ=self:getValue()for a8,a9 in pairs(cB)do if a9==cJ then return a8 end end end,clear=function(self)cB={}self:setValue({})return self end,getItemCount=function(self)return#cB end,editItem=function(self,a4,i,W,X,...)table.remove(cB,a4)table.insert(cB,a4,{text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})return self end,selectItem=function(self,a4)self:setValue(cB[a4]or{})return self end,setSelectedItem=function(self,W,X,cK)cC=W or self.bgcolor;cD=X or self.fgcolor;cE=cK;return self end,setScrollable=function(self,cL)cH=cL;return self end,mouseClickHandler=function(self,a5,aK,L,M)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if aX<=L and aX+self.w>L and aY<=M and aY+self.h>M and self:isVisible()then if a5=="mouse_click"or a5=="mouse_drag"then if aK==1 then if#cB>0 then for l=1,self.h do if cB[l+cG]~=nil then if aX<=L and aX+self.w>L and aY+l-1==M then self:setValue(cB[l+cG])self:getEventSystem():sendEvent("mouse_click",self,"mouse_click",0,L,M,cB[l+cG])end end end end end end;if a5=="mouse_scroll"and cH then cG=cG+aK;if cG<0 then cG=0 end;if aK>=1 then if#cB>self.h then if cG>#cB-self.h then cG=#cB-self.h end;if cG>=#cB then cG=#cB-1 end else cG=cG-1 end end end;self:setVisualChanged()return true end end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)for l=1,self.h do if cB[l+cG]~=nil then if cB[l+cG]==self:getValue()then if cE then self.parent:writeText(aX,aY+l-1,h(cB[l+cG].text,self.w,cF),cC,cD)else self.parent:writeText(aX,aY+l-1,h(cB[l+cG].text,self.w,cF),cB[l+cG].bgCol,cB[l+cG].fgCol)end else self.parent:writeText(aX,aY+l-1,h(cB[l+cG].text,self.w,cF),cB[l+cG].bgCol,cB[l+cG].fgCol)end end end end end end}return setmetatable(au,aT)end;local function cM(ak)local aT=aj(ak)local al="Menubar"aT.w=30;aT.h=1;aT.bgcolor=colors.gray;aT.fgcolor=colors.lightGray;aT:setZIndex(5)local cB={}local cC=a.selectionBG;local cD=a.selectionFG;local cE=true;local cF="left"local cN=0;local cq=2;local cH=false;local function cO()local cP=0;local ay=1;for l=1,#cB do if ay+cB[l].text:len()+cq*2>aT.w then cP=cP+1 end;ay=ay+cB[l].text:len()+cq*2 end;return cP end;local au={getType=function(self)return al end,addItem=function(self,i,W,X,...)table.insert(cB,{text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})if#cB==1 then self:setValue(cB[1])end;return self end,getItemIndex=function(self)local cJ=self:getValue()for a8,a9 in pairs(cB)do if a9==cJ then return a8 end end end,clear=function(self)cB={}self:setValue({})return self end,setSpace=function(self,cQ)cq=cQ or cq;return self end,setButtonOffset=function(self,o)cN=o or 0;if cN<0 then cN=0 end;local cP=cO()if cN>cP then cN=cP end;return self end,setScrollable=function(self,cL)cH=cL;return self end,removeItem=function(self,a4)table.remove(cB,a4)return self end,getItem=function(self,a4)return cB[a4]end,getItemCount=function(self)return#cB end,editItem=function(self,a4,i,W,X,...)table.remove(cB,a4)table.insert(cB,a4,{text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})return self end,selectItem=function(self,a4)self:setValue(cB[a4]or{})return self end,setSelectedItem=function(self,W,X,cK)cC=W or self.bgcolor;cD=X or self.fgcolor;cE=cK;return self end,mouseClickHandler=function(self,a5,aK,L,M)local aL,aM=self:getAbsolutePosition(self:getAnchorPosition())if aL<=L and aL+self.w>L and aM<=M and aM+self.h>M and self:isVisible()then if self.parent~=nil then self.parent:setFocusedObject(self)end;if a5=="mouse_click"then local ay=1;for l=1+cN,#cB do if cB[l]~=nil then if ay+cB[l].text:len()+cq*2<=self.w then if aL+ay-1<=L and aL+ay-1+cB[l].text:len()+cq*2>L and aM==M then self:setValue(cB[l])self:getEventSystem():sendEvent("mouse_click",self,"mouse_click",0,L,M,cB[l])end;ay=ay+cB[l].text:len()+cq*2 else break end end end end;if a5=="mouse_scroll"and cH then cN=cN+aK;if cN<0 then cN=0 end;local cP=cO()if cN>cP then cN=cP end end;return true end;return false end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)local ay=1;for l=1+cN,#cB do if cB[l]~=nil then if ay+cB[l].text:len()+cq*2<=self.w then if cB[l]==self:getValue()then self.parent:writeText(aX+ay-1,aY,h((" "):rep(cq)..cB[l].text..(" "):rep(cq),cB[l].text:len()+cq*2,cF),cC or cB[l].bgCol,cD or cB[l].fgCol)else self.parent:writeText(aX+ay-1,aY,h((" "):rep(cq)..cB[l].text..(" "):rep(cq),cB[l].text:len()+cq*2,cF),cB[l].bgCol,cB[l].fgCol)end;ay=ay+cB[l].text:len()+cq*2 else break end end end end end end}return setmetatable(au,aT)end;local function cR(ak)local aT=aj(ak)local al="Dropdown"aT.w=12;aT.h=1;aT.bgcolor=a.dropdownBG;aT.fgcolor=a.dropdownFG;aT:setZIndex(6)local cB={}local cC=a.selectionBG;local cD=a.selectionFG;local cE=true;local cF="left"local cG=0;local cS=16;local cT=6;local cU="\16"local cV="\31"local cW=1;local au={getType=function(self)return al end,setIndexOffset=function(self,cI)cG=cI;return self end,getIndexOffset=function(self)return cG end,addItem=function(self,i,W,X,...)table.insert(cB,{text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})return self end,removeItem=function(self,a4)table.remove(cB,a4)return self end,getItem=function(self,a4)return cB[a4]end,getItemIndex=function(self)local cJ=self:getValue()for a8,a9 in pairs(cB)do if a9==cJ then return a8 end end end,clear=function(self)cB={}self:setValue({})return self end,getItemCount=function(self)return#cB end,editItem=function(self,a4,i,W,X,...)table.remove(cB,a4)table.insert(cB,a4,{text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})return self end,selectItem=function(self,a4)self:setValue(cB[a4]or{})return self end,setSelectedItem=function(self,W,X,cK)cC=W or self.bgcolor;cD=X or self.fgcolor;cE=cK;return self end,setDropdownSize=function(self,j,n)cS,cT=j,n;return self end,mouseClickHandler=function(self,a5,aK,L,M)if cW==2 then local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if a5=="mouse_click"then if aK==1 then if#cB>0 then for l=1,cT do if cB[l+cG]~=nil then if aX<=L and aX+cS>L and aY+l==M then self:setValue(cB[l+cG])return true end end end end end end;if a5=="mouse_scroll"then cG=cG+aK;if cG<0 then cG=0 end;if aK==1 then if#cB>cT then if cG>#cB-cT then cG=#cB-cT end else cG=cB-1 end end;return true end;self:setVisualChanged()end;if aT.mouseClickHandler(self,a5,aK,L,M)then cW=2 else cW=1 end end,draw=function(self)if aT.draw(self)then local aX,aY=self:getAnchorPosition()if self.parent~=nil then self.parent:drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)if#cB>=1 then if self:getValue()~=nil then if self:getValue().text~=nil then if cW==1 then self.parent:writeText(aX,aY,h(self:getValue().text,self.w,cF):sub(1,self.w-1)..cU,self.bgcolor,self.fgcolor)else self.parent:writeText(aX,aY,h(self:getValue().text,self.w,cF):sub(1,self.w-1)..cV,self.bgcolor,self.fgcolor)end end end;if cW==2 then for l=1,cT do if cB[l+cG]~=nil then if cB[l+cG]==self:getValue()then if cE then self.parent:writeText(aX,aY+l,h(cB[l+cG].text,cS,cF),cC,cD)else self.parent:writeText(aX,aY+l,h(cB[l+cG].text,cS,cF),cB[l+cG].bgCol,cB[l+cG].fgCol)end else self.parent:writeText(aX,aY+l,h(cB[l+cG].text,cS,cF),cB[l+cG].bgCol,cB[l+cG].fgCol)end end end end end end end end}return setmetatable(au,aT)end;local function cX(ak)local aT=aj(ak)local al="Radio"aT.w=8;aT.bgcolor=a.listBG;aT.fgcolor=a.listFG;aT:setZIndex(5)local cB={}local cC=a.selectionBG;local cD=a.selectionFG;local cY=aT.bgcolor;local cZ=aT.fgcolor;local cE=true;local Y="\7"local cF="left"local au={getType=function(self)return al end,addItem=function(self,i,L,M,W,X,...)table.insert(cB,{x=L or 1,y=M or 1,text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})if#cB==1 then self:setValue(cB[1])end;return self end,removeItem=function(self,a4)table.remove(cB,a4)return self end,getItem=function(self,a4)return cB[a4]end,getItemIndex=function(self)local cJ=self:getValue()for a8,a9 in pairs(cB)do if a9==cJ then return a8 end end end,clear=function(self)cB={}self:setValue({})return self end,getItemCount=function(self)return#cB end,editItem=function(self,a4,i,L,M,W,X,...)table.remove(cB,a4)table.insert(cB,a4,{x=L or 1,y=M or 1,text=i,bgCol=W or self.bgcolor,fgCol=X or self.fgcolor,args={...}})return self end,selectItem=function(self,a4)self:setValue(cB[a4]or{})return self end,setSelectedItem=function(self,W,X,c_,d0,cK)cC=W or cC;cD=X or cD;cY=c_ or cY;cZ=d0 or cZ;cE=cK;return self end,mouseClickHandler=function(self,a5,aK,L,M)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if a5=="mouse_click"then if aK==1 then if#cB>0 then for aJ,a9 in pairs(cB)do if aX+a9.x-1<=L and aX+a9.x-1+a9.text:len()+2>=L and aY+a9.y-1==M then self:setValue(a9)if self.parent~=nil then self.parent:setFocusedObject(self)end;self:setVisualChanged()return true end end end end end;return false end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()for aJ,a9 in pairs(cB)do if a9==self:getValue()then if cF=="left"then self.parent:writeText(a9.x+aX-1,a9.y+aY-1,Y,cY,cZ)self.parent:writeText(a9.x+2+aX-1,a9.y+aY-1,a9.text,cC,cD)end else self.parent:drawBackgroundBox(a9.x+aX-1,a9.y+aY-1,1,1,self.bgcolor)self.parent:writeText(a9.x+2+aX-1,a9.y+aY-1,a9.text,a9.bgCol,a9.fgCol)end end end end end}return setmetatable(au,aT)end;local function d1(ak)local al="Timer"local d2=0;local d3=0;local d4=0;local d5;local at=a2()local au={name=ak,getType=function(self)return al end,getZIndex=function(self)return 1 end,getName=function(self)return self.name end,setTime=function(self,d6,d7)d2=d6 or 0;d3=d7 or 1;return self end,start=function(self)d4=d3;d5=os.startTimer(d2)return self end,cancel=function(self)if d5~=nil then os.cancelTimer(d5)end;return self end,onCall=function(self,a7)at:registerEvent("timed_event",a7)return self end,eventHandler=function(self,a5,d8)if a5=="timer"and d8==d5 then at:sendEvent("timed_event",self)if d4>=1 then d4=d4-1;if d4>=1 then d5=os.startTimer(d2)end elseif d4==-1 then d5=os.startTimer(d2)end end end}au.__index=au;return au end;local function d9(ak)local au;local al="Thread"local a7;local da;local db=false;au={name=ak,getType=function(self)return al end,getZIndex=function(self)return 1 end,getName=function(self)return self.name end,start=function(self,dc)if dc==nil then error("function is nil")end;a7=dc;da=coroutine.create(a7)db=true;local ah,ai=coroutine.resume(da)if not ah then if ai~="Terminated"then error("Threaderror - "..ai)end end;return self end,getStatus=function(self,dc)if da~=nil then return coroutine.status(da)end;return nil end,stop=function(self,dc)db=false;return self end,eventHandler=function(self,a5,aO,aP,aQ)if db then if coroutine.status(da)~="dead"then local ah,ai=coroutine.resume(da,a5,aO,aP,aQ)if not ah then if ai~="Terminated"then error("Threaderror - "..ai)end end else db=false end end end}au.__index=au;return au end;local function dd(ak)local au={}local al="Animation"local d5;local de={}local a4=1;local df=0;local dg;local function dh()if de[a4]~=nil then de[a4].f(au,a4)end;a4=a4+1;if de[a4]~=nil then if de[a4].t>0 then d5=os.startTimer(de[a4].t)else dh()end end end;au={name=ak,getType=function(self)return al end,getZIndex=function(self)return 1 end,getName=function(self)return self.name end,add=function(self,a7,di)dg=a7;table.insert(de,{f=a7,t=di or df})return self end,wait=function(self,di)df=di;return self end,rep=function(self,dj)for L=1,dj do table.insert(de,{f=dg,t=df})end;return self end,clear=function(self)de={}dg=nil;df=0;a4=1;return self end,play=function(self)a4=1;if de[a4]~=nil then if de[a4].t>0 then d5=os.startTimer(de[a4].t)else dh()end end;return self end,cancel=function(self)os.cancelTimer(d5)return self end,eventHandler=function(self,a5,d8)if a5=="timer"and d8==d5 then if de[a4]~=nil then dh()end end end}au.__index=au;return au end;local function dk(ak)local aT=aj(ak)local al="Slider"aT.w=8;aT.bgcolor=colors.lightGray;aT.fgcolor=colors.gray;aT:setValue(1)local dl="horizontal"local Y=" "local dm=colors.black;local dn="\140"local dp=aT.w;local a4=1;local au={getType=function(self)return al end,setSymbol=function(self,dq)Y=dq:sub(1,1)self:setVisualChanged()return self end,setBackgroundSymbol=function(self,dr)dn=string.sub(dr,1,1)self:setVisualChanged()return self end,setSymbolColor=function(self,ds)dm=ds;self:setVisualChanged()return self end,setBarType=function(self,dt)dl=dt:lower()return self end,mouseClickHandler=function(self,a5,aK,L,M)if aT.mouseClickHandler(self,a5,aK,L,M)then local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if dl=="horizontal"then for du=0,self.w-1 do if aX+du==L and aY<=M and aY+self.h>M then a4=du+1;self:setValue(dp/self.w*a4)self:setVisualChanged()end end end;if dl=="vertical"then for du=0,self.h-1 do if aY+du==M and aX<=L and aX+self.w>L then a4=du+1;self:setValue(dp/self.h*a4)self:setVisualChanged()end end end end end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()if dl=="horizontal"then self.parent:writeText(aX,aY,dn:rep(a4-1),self.bgcolor,self.fgcolor)self.parent:writeText(aX+a4-1,aY,Y,dm,dm)self.parent:writeText(aX+a4,aY,dn:rep(self.w-a4),self.bgcolor,self.fgcolor)end;if dl=="vertical"then for l=0,self.h-1 do if l+1==a4 then self.parent:writeText(aX,aY+l,Y,dm,dm)else self.parent:writeText(aX,aY+l,dn,self.bgcolor,self.fgcolor)end end end end end end}return setmetatable(au,aT)end;local function dv(ak)local aT=aj(ak)local al="Scrollbar"aT.w=1;aT.h=8;aT.bgcolor=colors.lightGray;aT.fgcolor=colors.gray;aT:setValue(1)aT:setZIndex(2)local dl="vertical"local Y=" "local dm=colors.black;local dn="\127"local dp=aT.h;local a4=1;local dw=1;local au={getType=function(self)return al end,setSymbol=function(self,dq)Y=dq:sub(1,1)self:setVisualChanged()return self end,setSymbolSize=function(self,dx)dw=tonumber(dx)or 1;if dl=="vertical"then self:setValue(a4-1*dp/(self.h-(dw-1))-dp/(self.h-(dw-1)))elseif dl=="horizontal"then self:setValue(a4-1*dp/(self.w-(dw-1))-dp/(self.w-(dw-1)))end;self:setVisualChanged()return self end,setMaxValue=function(self,cl)dp=cl;return self end,setBackgroundSymbol=function(self,dr)dn=string.sub(dr,1,1)self:setVisualChanged()return self end,setSymbolColor=function(self,ds)dm=ds;self:setVisualChanged()return self end,setBarType=function(self,dt)dl=dt:lower()return self end,mouseClickHandler=function(self,a5,aK,L,M)if aT.mouseClickHandler(self,a5,aK,L,M)then local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if(a5=="mouse_click"or a5=="mouse_drag")and aK==1 then if dl=="horizontal"then for du=0,self.w do if aX+du==L and aY<=M and aY+self.h>M then a4=math.min(du+1,self.w-(dw-1))self:setValue(dp/self.w*a4)self:setVisualChanged()end end end;if dl=="vertical"then for du=0,self.h do if aY+du==M and aX<=L and aX+self.w>L then a4=math.min(du+1,self.h-(dw-1))self:setValue(dp/self.h*a4)self:setVisualChanged()end end end end;if a5=="mouse_scroll"then a4=a4+aK;if a4<1 then a4=1 end;a4=math.min(a4,(dl=="vertical"and self.h or self.w)-(dw-1))self:setValue(dp/(dl=="vertical"and self.h or self.w)*a4)end;return true end end,draw=function(self)if aT.draw(self)then if self.parent~=nil then local aX,aY=self:getAnchorPosition()if dl=="horizontal"then self.parent:writeText(aX,aY,dn:rep(a4-1),self.bgcolor,self.fgcolor)self.parent:writeText(aX+a4-1,aY,Y:rep(dw),dm,dm)self.parent:writeText(aX+a4+dw-1,aY,dn:rep(self.w-(a4+dw-1)),self.bgcolor,self.fgcolor)end;if dl=="vertical"then for l=0,self.h-1 do if a4==l+1 then for dy=0,math.min(dw-1,self.h)do self.parent:writeText(aX,aY+l+dy,Y,dm,dm)end else if l+1<a4 or l+1>a4-1+dw then self.parent:writeText(aX,aY+l,dn,self.bgcolor,self.fgcolor)end end end end end end end}return setmetatable(au,aT)end;local function dz(ak,dA)local aT=aj(ak)local al="Frame"local dB={}local dC={}local au={}local dD;aT:setZIndex(10)local b5=false;local b1=1;local b2=1;local dE=colors.white;local dF,cG=0,0;if dA~=nil then aT.parent=dA;aT.w,aT.h=dA.w,dA.h;aT.bgcolor=a.FrameBG;aT.fgcolor=a.FrameFG else local dG,dH=f.getSize()aT.w,aT.h=dG,dH;aT.bgcolor=a.basaltBG;aT.fgcolor=a.basaltFG end;local function dI(ak)for a8,a9 in pairs(dB)do for dJ,bD in pairs(a9)do if bD.name==ak then return a9 end end end end;local function dK(dL)local an=dL:getZIndex()if dI(dL.name)~=nil then return nil end;if dB[an]==nil then for L=1,#dC+1 do if dC[L]~=nil then if an==dC[L]then break end;if an>dC[L]then table.insert(dC,L,an)break end else table.insert(dC,an)end end;if#dC<=0 then table.insert(dC,an)end;dB[an]={}end;dL.parent=au;table.insert(dB[an],dL)return dL end;local function dM(dL)for dJ,bD in pairs(dB)do for a8,a9 in pairs(bD)do if a9==dL then table.remove(dB[dJ],a8)return true end end end;return false end;au={barActive=false,barBackground=colors.gray,barTextcolor=colors.black,barText="New Frame",barTextAlign="left",isMoveable=false,getType=function(self)return al end,setFocusedObject=function(self,dL)for aJ,a4 in pairs(dC)do for aJ,a9 in pairs(dB[a4])do if a9==dL then if dD~=nil then dD:loseFocusHandler()end;dD=dL;dD:getFocusHandler()end end end;return self end,setOffset=function(self,aG,aH)dF=aG~=nil and math.floor(aG<0 and math.abs(aG)or-aG)or dF;cG=aH~=nil and math.floor(aH<0 and math.abs(aH)or-aH)or cG;return self end,getFrameOffset=function(self)return dF,cG end,removeFocusedObject=function(self)if dD~=nil then dD:loseFocusHandler()end;dD=nil;return self end,getFocusedObject=function(self)return dD end,show=function(self)aT:show()if self.parent==nil then c=self end;return self end,setCursor=function(self,dN,dO,dP,aC)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())b5=dN or false;if dO~=nil then b1=aX+dO-1 end;if dP~=nil then b2=aY+dP-1 end;dE=aC or dE;self:setVisualChanged()return self end,setMoveable=function(self,dQ)self.isMoveable=dQ or not self.isMoveable;self:setVisualChanged()return self end,showBar=function(self,dR)self.barActive=dR or not self.barActive;self:setVisualChanged()return self end,setBar=function(self,i,W,X)self.barText=i or""self.barBackground=W or self.barBackground;self.barTextcolor=X or self.barTextcolor;self:setVisualChanged()return self end,setBarTextAlign=function(self,cF)self.barTextAlign=cF or"left"self:setVisualChanged()return self end,getVisualChanged=function(self)local dS=aT.getVisualChanged(self)for aJ,a4 in pairs(dC)do if dB[a4]~=nil then for aJ,a9 in pairs(dB[a4])do if a9.getVisualChanged~=nil and a9:getVisualChanged()then dS=true end end end end;return dS end,loseFocusHandler=function(self)aT.loseFocusHandler(self)end,getFocusHandler=function(self)aT.getFocusHandler(self)if self.parent~=nil then self.parent:removeObject(self)self.parent:addObject(self)end end,keyHandler=function(self,a5,aN)if dD~=nil then if dD.keyHandler~=nil then if dD:keyHandler(a5,aN)then return true end end end;return false end,backgroundKeyHandler=function(self,a5,aN)aT.backgroundKeyHandler(self,a5,aN)for aJ,a4 in pairs(dC)do if dB[a4]~=nil then for aJ,a9 in pairs(dB[a4])do if a9.backgroundKeyHandler~=nil then a9:backgroundKeyHandler(a5,aN)end end end end end,eventHandler=function(self,a5,aO,aP,aQ,aR)aT.eventHandler(self,a5,aO,aP,aQ,aR)for aJ,a4 in pairs(dC)do if dB[a4]~=nil then for aJ,a9 in pairs(dB[a4])do if a9.eventHandler~=nil then a9:eventHandler(a5,aO,aP,aQ,aR)end end end end;if a5=="terminate"then f.clear()f.setCursorPos(1,1)b.stop()end end,mouseClickHandler=function(self,a5,aK,L,M)local aG,aH=self:getOffset()aG=aG<0 and math.abs(aG)or-aG;aH=aH<0 and math.abs(aH)or-aH;if self.drag then if a5=="mouse_drag"then local dT=1;local dU=1;if self.parent~=nil then dT,dU=self.parent:getAbsolutePosition(self.parent:getAnchorPosition())end;self:setPosition(L+self.xToRem-(dT-1)+aG,M-(dU-1)+aH)end;if a5=="mouse_up"then self.drag=false end;return true end;if aT.mouseClickHandler(self,a5,aK,L,M)then local aD,aE=self:getAbsolutePosition(self:getAnchorPosition())for aJ,a4 in pairs(dC)do if dB[a4]~=nil then for aJ,a9 in p(dB[a4])do if a9.mouseClickHandler~=nil then if a9:mouseClickHandler(a5,aK,L+aG,M+aH)then return true end end end end end;if self.isMoveable then if L>=aD and L<=aD+self.w-1 and M==aE and a5=="mouse_click"then self.drag=true;self.xToRem=aD-L end end;if dD~=nil then dD:loseFocusHandler()dD=nil end;return true end;return false end,setText=function(self,L,M,i)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if M>=1 and M<=self.h then if self.parent~=nil then self.parent:setText(math.max(L+aX-1,aX)-(self.parent.x-1),aY+M-1-(self.parent.y-1),g(i,math.max(1-L+1,1),self.w-L+1))else V.setText(math.max(L+aX-1,aX),aY+M-1,g(i,math.max(1-L+1,1),self.w-L+1))end end end,setBG=function(self,L,M,W)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if M>=1 and M<=self.h then if self.parent~=nil then self.parent:setBG(math.max(L+aX-1,aX)-(self.parent.x-1),aY+M-1-(self.parent.y-1),g(W,math.max(1-L+1,1),self.w-L+1))else V.setBG(math.max(L+aX-1,aX),aY+M-1,g(W,math.max(1-L+1,1),self.w-L+1))end end end,setFG=function(self,L,M,X)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if M>=1 and M<=self.h then if self.parent~=nil then self.parent:setFG(math.max(L+aX-1,aX)-(self.parent.x-1),aY+M-1-(self.parent.y-1),g(X,math.max(1-L+1,1),self.w-L+1))else V.setFG(math.max(L+aX-1,aX),aY+M-1,g(X,math.max(1-L+1,1),self.w-L+1))end end end,writeText=function(self,L,M,i,W,X)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())if M>=1 and M<=self.h then if self.parent~=nil then self.parent:writeText(math.max(L+aX-1,aX)-(self.parent.x-1),aY+M-1-(self.parent.y-1),g(i,math.max(1-L+1,1),self.w-L+1),W,X)else V.writeText(math.max(L+aX-1,aX),aY+M-1,g(i,math.max(1-L+1,1),self.w-L+1),W,X)end end end,drawBackgroundBox=function(self,L,M,j,n,W)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())n=M<1 and(n+M>self.h and self.h or n+M-1)or(n+M>self.h and self.h-M+1 or n)j=L<1 and(j+L>self.w and self.w or j+L-1)or(j+L>self.w and self.w-L+1 or j)if self.parent~=nil then self.parent:drawBackgroundBox(math.max(L+aX-1,aX)-(self.parent.x-1),math.max(M+aY-1,aY)-(self.parent.y-1),j,n,W)else V.drawBackgroundBox(math.max(L+aX-1,aX),math.max(M+aY-1,aY),j,n,W)end end,drawTextBox=function(self,L,M,j,n,Y)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())n=M<1 and(n+M>self.h and self.h or n+M-1)or(n+M>self.h and self.h-M+1 or n)j=L<1 and(j+L>self.w and self.w or j+L-1)or(j+L>self.w and self.w-L+1 or j)if self.parent~=nil then self.parent:drawTextBox(math.max(L+aX-1,aX)-(self.parent.x-1),math.max(M+aY-1,aY)-(self.parent.y-1),j,n,Y:sub(1,1))else V.drawTextBox(math.max(L+aX-1,aX),math.max(M+aY-1,aY),j,n,Y:sub(1,1))end end,drawForegroundBox=function(self,L,M,j,n,X)local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())n=M<1 and(n+M>self.h and self.h or n+M-1)or(n+M>self.h and self.h-M+1 or n)j=L<1 and(j+L>self.w and self.w or j+L-1)or(j+L>self.w and self.w-L+1 or j)if self.parent~=nil then self.parent:drawForegroundBox(math.max(L+aX-1,aX)-(self.parent.x-1),math.max(M+aY-1,aY)-(self.parent.y-1),j,n,X)else V.drawForegroundBox(math.max(L+aX-1,aX),math.max(M+aY-1,aY),j,n,X)end end,draw=function(self)if self:getVisualChanged()then if aT.draw(self)then local aX,aY=self:getAbsolutePosition(self:getAnchorPosition())local cy,cz=self:getAnchorPosition()if self.parent~=nil then self.parent:drawBackgroundBox(cy,cz,self.w,self.h,self.bgcolor)self.parent:drawForegroundBox(cy,cz,self.w,self.h,self.fgcolor)self.parent:drawTextBox(cy,cz,self.w,self.h," ")else V.drawBackgroundBox(aX,aY,self.w,self.h,self.bgcolor)V.drawForegroundBox(aX,aY,self.w,self.h,self.fgcolor)V.drawTextBox(aX,aY,self.w,self.h," ")end;f.setCursorBlink(false)if self.barActive then if self.parent~=nil then self.parent:writeText(cy,cz,h(self.barText,self.w,self.barTextAlign),self.barBackground,self.barTextcolor)else V.writeText(aX,aY,h(self.barText,self.w,self.barTextAlign),self.barBackground,self.barTextcolor)end end;for aJ,a4 in p(dC)do if dB[a4]~=nil then for aJ,a9 in pairs(dB[a4])do if a9.draw~=nil then a9:draw()end end end end;if b5 then f.setTextColor(dE)f.setCursorPos(b1,b2)if self.parent~=nil then f.setCursorBlink(self:isFocused())else f.setCursorBlink(b5)end end;self:setVisualChanged(false)end end end,addObject=function(self,dL)return dK(dL)end,removeObject=function(self,dL)return dM(dL)end,getObject=function(self,dL)return dI(dL)end,addButton=function(self,ak)local dL=aS(ak)dL.name=ak;return dK(dL)end,addLabel=function(self,ak)local dL=c0(ak)dL.name=ak;dL.bgcolor=self.bgcolor;dL.fgcolor=self.fgcolor;return dK(dL)end,addCheckbox=function(self,ak)local dL=c7(ak)dL.name=ak;return dK(dL)end,addInput=function(self,ak)local dL=c8(ak)dL.name=ak;return dK(dL)end,addProgram=function(self,ak)local dL=a_(ak)dL.name=ak;return dK(dL)end,addTextfield=function(self,ak)local dL=cr(ak)dL.name=ak;return dK(dL)end,addList=function(self,ak)local dL=cA(ak)dL.name=ak;return dK(dL)end,addDropdown=function(self,ak)local dL=cR(ak)dL.name=ak;return dK(dL)end,addRadio=function(self,ak)local dL=cX(ak)dL.name=ak;return dK(dL)end,addTimer=function(self,ak)local dL=d1(ak)dL.name=ak;return dK(dL)end,addAnimation=function(self,ak)local dL=dd(ak)dL.name=ak;return dK(dL)end,addSlider=function(self,ak)local dL=dk(ak)dL.name=ak;return dK(dL)end,addScrollbar=function(self,ak)local dL=dv(ak)dL.name=ak;return dK(dL)end,addMenubar=function(self,ak)local dL=cM(ak)dL.name=ak;return dK(dL)end,addThread=function(self,ak)local dL=d9(ak)dL.name=ak;return dK(dL)end,addPane=function(self,ak)local dL=c2(ak)dL.name=ak;return dK(dL)end,addImage=function(self,ak)local dL=c3(ak)dL.name=ak;return dK(dL)end,addFrame=function(self,ak)local dL=dz(ak,self)dL.name=ak;return dK(dL)end}setmetatable(au,aT)if dA==nil then table.insert(d,au)end;return au end;local dV=false;local function dW(a5,aO,aP,aQ,aR)if a5=="mouse_click"then c:mouseClickHandler(a5,aO,aP,aQ,aR)end;if a5=="mouse_drag"then c:mouseClickHandler(a5,aO,aP,aQ,aR)end;if a5=="mouse_up"then c:mouseClickHandler(a5,aO,aP,aQ,aR)end;if a5=="mouse_scroll"then c:mouseClickHandler(a5,aO,aP,aQ,aR)end;if a5=="key"or a5=="char"then c:keyHandler(a5,aO)c:backgroundKeyHandler(a5,aO)end;for aJ,a9 in pairs(d)do a9:eventHandler(a5,aO,aP,aQ,aR)end;if dV then c:draw()V.update()end end;function b.autoUpdate(db)f.clear()dV=db or true;c:draw()V.update()while dV do local a5,aO,aP,aQ,aR=os.pullEventRaw()dW(a5,aO,aP,aQ,aR)end end;function b.update(a5,aO,aP,aQ,aR)if a5~="nil"then dW(a5,aO,aP,aQ,aR)else c:draw()V.update()end end;function b.stop()dV=false end;function b.getFrame(ak)for a8,a9 in pairs(d)do if a9.name==ak then return a9 end end end;function b.getActiveFrame()return c end;function b.setActiveFrame(av)if av:getType()=="Frame"then c=av;return true end;return false end;function b.createFrame(ak)local av=dz(ak)return av end;function b.removeFrame(ak)for a8,a9 in pairs(d)do if a9.name==ak then d[a8]=nil;return true end end;return false end;if b.debugger then b.debugFrame=b.createFrame("basaltDebuggingFrame"):showBar():setBackground(colors.lightGray):setBar("Debug",colors.black,colors.gray)b.debugList=b.debugFrame:addList("debugList"):setSize(b.debugFrame.w-2,b.debugFrame.h-3):setPosition(2,3):setScrollable(true):show()b.debugFrame:addButton("back"):setAnchor("right"):setSize(1,1):setText("\22"):onClick(function()b.oldFrame:show()end):setBackground(colors.red):show()b.debugLabel=b.debugFrame:addLabel("debugLabel"):onClick(function()b.oldFrame=c;b.debugFrame:show()end):setBackground(colors.black):setForeground(colors.white):setAnchor("bottom"):setZIndex(20):show()end;if b.debugger then function b.debug(...)local af={...}if c.name~="basaltDebuggingFrame"then if c~=b.debugLabel.frame then b.debugLabel:setParent(c)end end;local dX=""for a8,a9 in pairs(af)do dX=dX..tostring(a9)..(#af~=a8 and", "or"")end;b.debugLabel:setText("[Debug] "..dX)b.debugList:addItem(dX)if b.debugList:getItemCount()>50 then b.debugList:removeItem(1)end;b.debugList:setValue(b.debugList:getItem(b.debugList:getItemCount()))b.debugLabel:show()end end;return b |