diff --git a/docs/versions/basalt-1.7.0.lua b/docs/versions/basalt-1.7.0.lua new file mode 100644 index 0000000..5b39e84 --- /dev/null +++ b/docs/versions/basalt-1.7.0.lua @@ -0,0 +1,2978 @@ +local aa={}local ba=true;local ca=require +local da=function(ab) +for bb,cb in pairs(aa)do +if(type(cb)=="table")then for db,_c in pairs(cb)do if(db==ab)then +return _c()end end else if(bb==ab)then return cb()end end end;return ca(ab)end +local _b=function(ab)if(ab~=nil)then return aa[ab]end;return aa end +aa["loadObjects"]=function(...)local ab={}if(ba)then +for db,_c in pairs(_b("objects"))do ab[db]=_c()end;return ab end;local bb=table.pack(...)local cb=fs.getDir( +bb[2]or"Basalt")if(cb==nil)then +error("Unable to find directory "..bb[2].. +" please report this bug to our discord.")end +for db,_c in +pairs(fs.list(fs.combine(cb,"objects")))do if(_c~="example.lua")and not(_c:find(".disabled"))then +local ac=_c:gsub(".lua","")ab[ac]=da(ac)end end;return ab end +aa["plugin"]=function(...)local ab={...}local bb={}local cb={} +local db=fs.getDir(ab[2]or"Basalt")local _c=fs.combine(db,"plugins") +if(ba)then +for bc,cc in pairs(_b("plugins"))do +table.insert(cb,bc)local dc=cc() +if(type(dc)=="table")then for _d,ad in pairs(dc)do +if(type(_d)=="string")then if(bb[_d]==nil)then +bb[_d]={}end;table.insert(bb[_d],ad)end end end end else +if(fs.exists(_c))then +for bc,cc in pairs(fs.list(_c))do local dc +if +(fs.isDir(fs.combine(_c,cc)))then table.insert(cb,fs.combine(_c,cc)) +dc=da(cc.."/init")else table.insert(cb,cc)dc=da(cc:gsub(".lua",""))end +if(type(dc)=="table")then for _d,ad in pairs(dc)do +if(type(_d)=="string")then +if(bb[_d]==nil)then bb[_d]={}end;table.insert(bb[_d],ad)end end end end end end;local function ac(bc)return bb[bc]end +return +{get=ac,getAvailablePlugins=function()return cb end,addPlugin=function(bc) +if(fs.exists(bc))then +if(fs.isDir(bc))then +for cc,dc in +pairs(fs.list(bc))do table.insert(cb,dc) +if +not(fs.isDir(fs.combine(bc,dc)))then local _d=dc:gsub(".lua","")local ad=da(fs.combine(bc,_d)) +if( +type(ad)=="table")then for bd,cd in pairs(ad)do +if(type(bd)=="string")then +if(bb[bd]==nil)then bb[bd]={}end;table.insert(bb[bd],cd)end end end end end else local cc=da(bc:gsub(".lua","")) +table.insert(cb,bc:match("[\\/]?([^\\/]-([^%.]+))$")) +if(type(cc)=="table")then for dc,_d in pairs(cc)do +if(type(dc)=="string")then +if(bb[dc]==nil)then bb[dc]={}end;table.insert(bb[dc],_d)end end end end end end,loadPlugins=function(bc,cc) +for dc,_d in +pairs(bc)do local ad=bb[dc] +if(ad~=nil)then +bc[dc]=function(...)local bd=_d(...) +for cd,dd in pairs(ad)do local __a=dd(bd,cc,...) +__a.__index=__a;bd=setmetatable(__a,bd)end;return bd end end end;return bc end}end;aa["plugins"]={} +aa["plugins"]["pixelbox"]=function(...) +local ab,bb,cb=table.sort,table.concat,string.char;local function db(dc,_d)return dc[2]>_d[2]end +local _c={{5,256,16,8,64,32},{4,16,16384,256,128},[4]={4,64,1024,256,128},[8]={4,512,2048,256,1},[16]={4,2,16384,256,1},[32]={4,8192,4096,256,1},[64]={4,4,1024,256,1},[128]={6,32768,256,1024,2048,4096,16384},[256]={6,1,128,2,512,4,8192},[512]={4,8,2048,256,128},[1024]={4,4,64,128,32768},[2048]={4,512,8,128,32768},[4096]={4,8192,32,128,32768},[8192]={3,32,4096,256128},[16384]={4,2,16,128,32768},[32768]={5,128,1024,2048,4096,16384}}local ac={}for i=0,15 do ac[("%x"):format(i)]=2 ^i end +local bc={}for i=0,15 do bc[2 ^i]=("%x"):format(i)end +local function cc(dc,_d)_d=_d or"f"local ad,bd=# +dc[1],#dc;local cd={}local dd={}local __a=false +local function a_a() +for y=1,bd*3 do for x=1,ad*2 do +if not dd[y]then dd[y]={}end;dd[y][x]=_d end end;for _aa,aaa in ipairs(dc)do +for x=1,#aaa do local baa=aaa:sub(x,x)dd[_aa][x]=ac[baa]end end end;a_a()local function b_a(_aa,aaa)ad,bd=_aa,aaa;dd={}__a=false;a_a()end +local function c_a(_aa,aaa,baa,caa,daa,_ba) +local aba={_aa,aaa,baa,caa,daa,_ba}local bba={}local cba={}local dba=0 +for i=1,6 do local cca=aba[i]if not bba[cca]then dba=dba+1 +bba[cca]={0,dba}end;local dca=bba[cca]local _da=dca[1]+1;dca[1]=_da +cba[dca[2]]={cca,_da}end;local _ca=#cba +while _ca>2 do ab(cba,db)local cca=_c[cba[_ca][1]] +local dca,_da=1,false;local ada=_ca-1 +for i=2,cca[1]do if _da then break end;local dda=cca[i]for j=1,ada do if cba[j][1]==dda then dca=j +_da=true;break end end end;local bda,cda=cba[_ca][1],cba[dca][1] +for i=1,6 do if aba[i]==bda then aba[i]=cda +local dda=cba[dca]dda[2]=dda[2]+1 end end;cba[_ca]=nil;_ca=_ca-1 end;local aca=128;local bca=aba[6]if aba[1]~=bca then aca=aca+1 end;if aba[2]~=bca then aca=aca+ +2 end;if aba[3]~=bca then aca=aca+4 end;if +aba[4]~=bca then aca=aca+8 end;if aba[5]~=bca then aca=aca+16 end;if +cba[1][1]==aba[6]then return cb(aca),cba[2][1],aba[6]else +return cb(aca),cba[1][1],aba[6]end end +local function d_a()local _aa=ad*2;local aaa=0 +for y=1,bd*3,3 do aaa=aaa+1;local baa=dd[y]local caa=dd[y+1]local daa=dd[y+2] +local _ba,aba,bba={},{},{}local cba=0 +for x=1,_aa,2 do local dba=x+1 +local _ca,aca,bca,cca,dca,_da=baa[x],baa[dba],caa[x],caa[dba],daa[x],daa[dba]local ada,bda,cda=" ",1,_ca;if not( +aca==_ca and bca==_ca and cca==_ca and dca==_ca and _da==_ca)then +ada,bda,cda=c_a(_ca,aca,bca,cca,dca,_da)end;cba=cba+1 +_ba[cba]=ada;aba[cba]=bc[bda]bba[cba]=bc[cda]end;cd[aaa]={bb(_ba),bb(aba),bb(bba)}end;__a=true end +return +{convert=d_a,generateCanvas=a_a,setSize=b_a,getSize=function()return ad,bd end,set=function(_aa,aaa)dc=_aa;_d=aaa or _d;dd={}__a=false;a_a()end,get=function(_aa)if +not __a then d_a()end +return _aa~=nil and cd[_aa]or cd end}end +return +{Image=function(dc,_d) +return +{shrink=function(ad)local bd=ad:getImageFrame(1)local cd={}for __a,a_a in pairs(bd)do if(type(__a)=="number")then +table.insert(cd,a_a[3])end end +local dd=cc(cd,ad:getBackground()).get()ad:setImage(dd)return ad end,getShrinkedImage=function(ad) +local bd=ad:getImageFrame(1)local cd={}for dd,__a in pairs(bd)do +if(type(dd)=="number")then table.insert(cd,__a[3])end end;return +cc(cd,ad:getBackground()).get()end}end}end +aa["plugins"]["dynamicValues"]=function(...)local ab=da("utils")local bb=ab.tableCount +return +{VisualObject=function(cb,db) +local _c={}local ac={}local bc={x="getX",y="getY",w="getWidth",h="getHeight"} +local function cc(bd) +local cd,dd=pcall(load( +"return "..bd,"",nil,{math=math}))if not(cd)then +error(bd.." - is not a valid dynamic value string")end;return dd end +local function dc(bd,cd,dd)local __a={}local a_a=bc +for d_a,_aa in pairs(a_a)do for aaa in dd:gmatch("%a+%."..d_a)do +local baa=aaa:gsub("%."..d_a,"") +if(baa~="self")and(baa~="parent")then table.insert(__a,baa)end end end;local b_a=bd:getParent()local c_a={} +for d_a,_aa in pairs(__a)do +c_a[_aa]=b_a:getObject(_aa)if(c_a[_aa]==nil)then +error("Dynamic Values - unable to find object: ".._aa)end end;c_a["self"]=bd;c_a["parent"]=b_a +_c[cd]=function()local d_a=dd +for _aa,aaa in pairs(a_a)do +for baa in +dd:gmatch("%w+%.".._aa)do local caa=c_a[baa:gsub("%.".._aa,"")]if(caa~=nil)then +d_a=d_a:gsub(baa,caa[aaa](caa))else +error("Dynamic Values - unable to find object: "..baa)end end end;ac[cd]=math.floor(cc(d_a)+0.5)end;_c[cd]()end +local function _d(bd) +if(bb(_c)>0)then for dd,__a in pairs(_c)do __a()end +local cd={x="getX",y="getY",w="getWidth",h="getHeight"} +for dd,__a in pairs(cd)do +if(_c[dd]~=nil)then +if(ac[dd]~=bd[__a](bd))then if(dd=="x")or(dd=="y")then +cb.setPosition(bd, +ac["x"]or bd:getX(),ac["y"]or bd:getY())end;if(dd=="w")or(dd=="h")then +cb.setSize(bd, +ac["w"]or bd:getWidth(),ac["h"]or bd:getHeight())end end end end end end +local ad={updatePositions=_d,createDynamicValue=dc,setPosition=function(bd,cd,dd,__a)ac.x=cd;ac.y=dd +if(type(cd)=="string")then dc(bd,"x",cd)else _c["x"]=nil end +if(type(dd)=="string")then dc(bd,"y",dd)else _c["y"]=nil end;cb.setPosition(bd,ac.x,ac.y,__a)return bd end,setSize=function(bd,cd,dd,__a) +ac.w=cd;ac.h=dd +if(type(cd)=="string")then dc(bd,"w",cd)else _c["w"]=nil end +if(type(dd)=="string")then dc(bd,"h",dd)else _c["h"]=nil end;cb.setSize(bd,ac.w,ac.h,__a)return bd end,customEventHandler=function(bd,cd,...) +cb.customEventHandler(bd,cd,...)if +(cd=="basalt_FrameReposition")or(cd=="basalt_FrameResize")then _d(bd)end end}return ad end}end +aa["plugins"]["shadow"]=function(...)local ab=da("xmlParser") +return +{VisualObject=function(bb)local cb=false +local db={setShadow=function(_c,ac)cb=ac +_c:updateDraw()return _c end,getShadow=function(_c)return cb end,draw=function(_c)bb.draw(_c) +_c:addDraw("shadow",function() +if( +cb~=false)then local ac,bc=_c:getSize() +if(cb)then +_c:addBackgroundBox(ac+1,2,1,bc,cb)_c:addBackgroundBox(2,bc+1,ac,1,cb) +_c:addForegroundBox(ac+1,2,1,bc,cb)_c:addForegroundBox(2,bc+1,ac,1,cb)end end end)end}return db end}end +aa["plugins"]["bigfonts"]=function(...)local ab=da("tHex") +local bb={{"\32\32\32\137\156\148\158\159\148\135\135\144\159\139\32\136\157\32\159\139\32\32\143\32\32\143\32\32\32\32\32\32\32\32\147\148\150\131\148\32\32\32\151\140\148\151\140\147","\32\32\32\149\132\149\136\156\149\144\32\133\139\159\129\143\159\133\143\159\133\138\32\133\138\32\133\32\32\32\32\32\32\150\150\129\137\156\129\32\32\32\133\131\129\133\131\132","\32\32\32\130\131\32\130\131\32\32\129\32\32\32\32\130\131\32\130\131\32\32\32\32\143\143\143\32\32\32\32\32\32\130\129\32\130\135\32\32\32\32\131\32\32\131\32\131","\139\144\32\32\143\148\135\130\144\149\32\149\150\151\149\158\140\129\32\32\32\135\130\144\135\130\144\32\149\32\32\139\32\159\148\32\32\32\32\159\32\144\32\148\32\147\131\132","\159\135\129\131\143\149\143\138\144\138\32\133\130\149\149\137\155\149\159\143\144\147\130\132\32\149\32\147\130\132\131\159\129\139\151\129\148\32\32\139\131\135\133\32\144\130\151\32","\32\32\32\32\32\32\130\135\32\130\32\129\32\129\129\131\131\32\130\131\129\140\141\132\32\129\32\32\129\32\32\32\32\32\32\32\131\131\129\32\32\32\32\32\32\32\32\32","\32\32\32\32\149\32\159\154\133\133\133\144\152\141\132\133\151\129\136\153\32\32\154\32\159\134\129\130\137\144\159\32\144\32\148\32\32\32\32\32\32\32\32\32\32\32\151\129","\32\32\32\32\133\32\32\32\32\145\145\132\141\140\132\151\129\144\150\146\129\32\32\32\138\144\32\32\159\133\136\131\132\131\151\129\32\144\32\131\131\129\32\144\32\151\129\32","\32\32\32\32\129\32\32\32\32\130\130\32\32\129\32\129\32\129\130\129\129\32\32\32\32\130\129\130\129\32\32\32\32\32\32\32\32\133\32\32\32\32\32\129\32\129\32\32","\150\156\148\136\149\32\134\131\148\134\131\148\159\134\149\136\140\129\152\131\32\135\131\149\150\131\148\150\131\148\32\148\32\32\148\32\32\152\129\143\143\144\130\155\32\134\131\148","\157\129\149\32\149\32\152\131\144\144\131\148\141\140\149\144\32\149\151\131\148\32\150\32\150\131\148\130\156\133\32\144\32\32\144\32\130\155\32\143\143\144\32\152\129\32\134\32","\130\131\32\131\131\129\131\131\129\130\131\32\32\32\129\130\131\32\130\131\32\32\129\32\130\131\32\130\129\32\32\129\32\32\133\32\32\32\129\32\32\32\130\32\32\32\129\32","\150\140\150\137\140\148\136\140\132\150\131\132\151\131\148\136\147\129\136\147\129\150\156\145\138\143\149\130\151\32\32\32\149\138\152\129\149\32\32\157\152\149\157\144\149\150\131\148","\149\143\142\149\32\149\149\32\149\149\32\144\149\32\149\149\32\32\149\32\32\149\32\149\149\32\149\32\149\32\144\32\149\149\130\148\149\32\32\149\32\149\149\130\149\149\32\149","\130\131\129\129\32\129\131\131\32\130\131\32\131\131\32\131\131\129\129\32\32\130\131\32\129\32\129\130\131\32\130\131\32\129\32\129\131\131\129\129\32\129\129\32\129\130\131\32","\136\140\132\150\131\148\136\140\132\153\140\129\131\151\129\149\32\149\149\32\149\149\32\149\137\152\129\137\152\129\131\156\133\149\131\32\150\32\32\130\148\32\152\137\144\32\32\32","\149\32\32\149\159\133\149\32\149\144\32\149\32\149\32\149\32\149\150\151\129\138\155\149\150\130\148\32\149\32\152\129\32\149\32\32\32\150\32\32\149\32\32\32\32\32\32\32","\129\32\32\130\129\129\129\32\129\130\131\32\32\129\32\130\131\32\32\129\32\129\32\129\129\32\129\32\129\32\131\131\129\130\131\32\32\32\129\130\131\32\32\32\32\140\140\132","\32\154\32\159\143\32\149\143\32\159\143\32\159\144\149\159\143\32\159\137\145\159\143\144\149\143\32\32\145\32\32\32\145\149\32\144\32\149\32\143\159\32\143\143\32\159\143\32","\32\32\32\152\140\149\151\32\149\149\32\145\149\130\149\157\140\133\32\149\32\154\143\149\151\32\149\32\149\32\144\32\149\149\153\32\32\149\32\149\133\149\149\32\149\149\32\149","\32\32\32\130\131\129\131\131\32\130\131\32\130\131\129\130\131\129\32\129\32\140\140\129\129\32\129\32\129\32\137\140\129\130\32\129\32\130\32\129\32\129\129\32\129\130\131\32","\144\143\32\159\144\144\144\143\32\159\143\144\159\138\32\144\32\144\144\32\144\144\32\144\144\32\144\144\32\144\143\143\144\32\150\129\32\149\32\130\150\32\134\137\134\134\131\148","\136\143\133\154\141\149\151\32\129\137\140\144\32\149\32\149\32\149\154\159\133\149\148\149\157\153\32\154\143\149\159\134\32\130\148\32\32\149\32\32\151\129\32\32\32\32\134\32","\133\32\32\32\32\133\129\32\32\131\131\32\32\130\32\130\131\129\32\129\32\130\131\129\129\32\129\140\140\129\131\131\129\32\130\129\32\129\32\130\129\32\32\32\32\32\129\32","\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32","\32\32\32\32\145\32\159\139\32\151\131\132\155\143\132\134\135\145\32\149\32\158\140\129\130\130\32\152\147\155\157\134\32\32\144\144\32\32\32\32\32\32\152\131\155\131\131\129","\32\32\32\32\149\32\149\32\145\148\131\32\149\32\149\140\157\132\32\148\32\137\155\149\32\32\32\149\154\149\137\142\32\153\153\32\131\131\149\131\131\129\149\135\145\32\32\32","\32\32\32\32\129\32\130\135\32\131\131\129\134\131\132\32\129\32\32\129\32\131\131\32\32\32\32\130\131\129\32\32\32\32\129\129\32\32\32\32\32\32\130\131\129\32\32\32","\150\150\32\32\148\32\134\32\32\132\32\32\134\32\32\144\32\144\150\151\149\32\32\32\32\32\32\145\32\32\152\140\144\144\144\32\133\151\129\133\151\129\132\151\129\32\145\32","\130\129\32\131\151\129\141\32\32\142\32\32\32\32\32\149\32\149\130\149\149\32\143\32\32\32\32\142\132\32\154\143\133\157\153\132\151\150\148\151\158\132\151\150\148\144\130\148","\32\32\32\140\140\132\32\32\32\32\32\32\32\32\32\151\131\32\32\129\129\32\32\32\32\134\32\32\32\32\32\32\32\129\129\32\129\32\129\129\130\129\129\32\129\130\131\32","\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\150\151\129\150\131\132\140\143\144\143\141\145\137\140\148\141\141\144\157\142\32\159\140\32\151\134\32\157\141\32","\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\151\151\32\154\143\132\157\140\32\157\140\32\157\140\32\157\140\32\32\149\32\32\149\32\32\149\32\32\149\32","\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\131\129\32\134\32\131\131\129\131\131\129\131\131\129\131\131\129\130\131\32\130\131\32\130\131\32\130\131\32","\151\131\148\152\137\145\155\140\144\152\142\145\153\140\132\153\137\32\154\142\144\155\159\132\150\156\148\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\136\32\151\140\132","\151\32\149\151\155\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\152\137\144\157\129\149\149\32\149\149\32\149\149\32\149\149\32\149\130\150\32\32\157\129\149\32\149","\131\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\129\32\130\131\32\133\131\32","\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\159\159\144\152\140\144\156\143\32\159\141\129\153\140\132\157\141\32\130\145\32\32\147\32\136\153\32\130\146\32","\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\149\157\134\154\143\132\157\140\133\157\140\133\157\140\133\157\140\133\32\149\32\32\149\32\32\149\32\32\149\32","\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\130\131\32\134\32\130\131\129\130\131\129\130\131\129\130\131\129\32\129\32\32\129\32\32\129\32\32\129\32","\159\134\144\137\137\32\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\32\132\32\159\143\32\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\138\32\146\130\144","\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\131\147\129\138\134\149\149\32\149\149\32\149\149\32\149\149\32\149\154\143\149\32\157\129\154\143\149","\130\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\129\130\131\129\130\131\129\130\131\129\140\140\129\130\131\32\140\140\129"},{"000110000110110000110010101000000010000000100101","000000110110000000000010101000000010000000100101","000000000000000000000000000000000000000000000000","100010110100000010000110110000010100000100000110","000000110000000010110110000110000000000000110000","000000000000000000000000000000000000000000000000","000000110110000010000000100000100000000000000010","000000000110110100010000000010000000000000000100","000000000000000000000000000000000000000000000000","010000000000100110000000000000000000000110010000","000000000000000000000000000010000000010110000000","000000000000000000000000000000000000000000000000","011110110000000100100010110000000100000000000000","000000000000000000000000000000000000000000000000","000000000000000000000000000000000000000000000000","110000110110000000000000000000010100100010000000","000010000000000000110110000000000100010010000000","000000000000000000000000000000000000000000000000","010110010110100110110110010000000100000110110110","000000000000000000000110000000000110000000000000","000000000000000000000000000000000000000000000000","010100010110110000000000000000110000000010000000","110110000000000000110000110110100000000010000000","000000000000000000000000000000000000000000000000","000100011111000100011111000100011111000100011111","000000000000100100100100011011011011111111111111","000000000000000000000000000000000000000000000000","000100011111000100011111000100011111000100011111","000000000000100100100100011011011011111111111111","100100100100100100100100100100100100100100100100","000000110100110110000010000011110000000000011000","000000000100000000000010000011000110000000001000","000000000000000000000000000000000000000000000000","010000100100000000000000000100000000010010110000","000000000000000000000000000000110110110110110000","000000000000000000000000000000000000000000000000","110110110110110110000000110110110110110110110110","000000000000000000000110000000000000000000000000","000000000000000000000000000000000000000000000000","000000000000110110000110010000000000000000010010","000010000000000000000000000000000000000000000000","000000000000000000000000000000000000000000000000","110110110110110110110000110110110110000000000000","000000000000000000000110000000000000000000000000","000000000000000000000000000000000000000000000000","110110110110110110110000110000000000000000010000","000000000000000000000000100000000000000110000110","000000000000000000000000000000000000000000000000"}}local cb={}local db={} +do local cc=0;local dc=#bb[1]local _d=#bb[1][1] +for i=1,dc,3 do +for j=1,_d,3 do +local ad=string.char(cc)local bd={}bd[1]=bb[1][i]:sub(j,j+2) +bd[2]=bb[1][i+1]:sub(j,j+2)bd[3]=bb[1][i+2]:sub(j,j+2)local cd={}cd[1]=bb[2][i]:sub(j, +j+2)cd[2]=bb[2][i+1]:sub(j,j+2)cd[3]=bb[2][ +i+2]:sub(j,j+2)db[ad]={bd,cd}cc=cc+1 end end;cb[1]=db end +local function _c(cc,dc)local _d={["0"]="1",["1"]="0"}if cc<=#cb then return true end +for f=#cb+1,cc do local ad={}local bd=cb[ +f-1] +for char=0,255 do local cd=string.char(char)local dd={}local __a={} +local a_a=bd[cd][1]local b_a=bd[cd][2] +for i=1,#a_a do local c_a,d_a,_aa,aaa,baa,caa={},{},{},{},{},{} +for j=1,#a_a[1]do +local daa=db[a_a[i]:sub(j,j)][1]table.insert(c_a,daa[1]) +table.insert(d_a,daa[2])table.insert(_aa,daa[3]) +local _ba=db[a_a[i]:sub(j,j)][2] +if b_a[i]:sub(j,j)=="1"then +table.insert(aaa,(_ba[1]:gsub("[01]",_d))) +table.insert(baa,(_ba[2]:gsub("[01]",_d))) +table.insert(caa,(_ba[3]:gsub("[01]",_d)))else table.insert(aaa,_ba[1]) +table.insert(baa,_ba[2])table.insert(caa,_ba[3])end end;table.insert(dd,table.concat(c_a)) +table.insert(dd,table.concat(d_a))table.insert(dd,table.concat(_aa)) +table.insert(__a,table.concat(aaa))table.insert(__a,table.concat(baa)) +table.insert(__a,table.concat(caa))end;ad[cd]={dd,__a}if dc then dc="Font"..f.."Yeld"..char +os.queueEvent(dc)os.pullEvent(dc)end end;cb[f]=ad end;return true end +local function ac(cc,dc,_d,ad,bd) +if not type(dc)=="string"then error("Not a String",3)end +local cd=type(_d)=="string"and _d:sub(1,1)or ab[_d]or +error("Wrong Front Color",3) +local dd=type(ad)=="string"and ad:sub(1,1)or ab[ad]or +error("Wrong Back Color",3)if(cb[cc]==nil)then _c(3,false)end;local __a=cb[cc]or +error("Wrong font size selected",3)if dc==""then +return{{""},{""},{""}}end;local a_a={} +for caa in dc:gmatch('.')do table.insert(a_a,caa)end;local b_a={}local c_a=#__a[a_a[1]][1] +for nLine=1,c_a do local caa={}for i=1,#a_a do +caa[i]= +__a[a_a[i]]and __a[a_a[i]][1][nLine]or""end;b_a[nLine]=table.concat(caa)end;local d_a={}local _aa={}local aaa={["0"]=cd,["1"]=dd}local baa={["0"]=dd,["1"]=cd} +for nLine=1,c_a do +local caa={}local daa={} +for i=1,#a_a do +local _ba=__a[a_a[i]]and __a[a_a[i]][2][nLine]or"" +caa[i]=_ba:gsub("[01]", +bd and{["0"]=_d:sub(i,i),["1"]=ad:sub(i,i)}or aaa) +daa[i]=_ba:gsub("[01]", +bd and{["0"]=ad:sub(i,i),["1"]=_d:sub(i,i)}or baa)end;d_a[nLine]=table.concat(caa) +_aa[nLine]=table.concat(daa)end;return{b_a,d_a,_aa}end;local bc=da("xmlParser") +return +{Label=function(cc)local dc=1;local _d +local ad={setFontSize=function(bd,cd) +if(type(cd)=="number")then dc=cd +if(dc>1)then +bd:setDrawState("label",false) +_d=ac(dc-1,bd:getText(),bd:getForeground(),bd:getBackground()or colors.lightGray)if(bd:getAutoSize())then +bd:getBase():setSize(#_d[1][1],#_d[1]-1)end else +bd:setDrawState("label",true)end;bd:updateDraw()end;return bd end,getFontSize=function(bd)return +dc end,getSize=function(bd)local cd,dd=cc.getSize(bd) +if +(dc>1)and(bd:getAutoSize())then +return dc==2 and bd:getText():len()*3 or math.floor( +bd:getText():len()*8.5), +dc==2 and dd*2 or math.floor(dd)else return cd,dd end end,getWidth=function(bd) +local cd=cc.getWidth(bd)if(dc>1)and(bd:getAutoSize())then return dc==2 and +bd:getText():len()*3 or +math.floor(bd:getText():len()*8.5)else +return cd end end,getHeight=function(bd) +local cd=cc.getHeight(bd)if(dc>1)and(bd:getAutoSize())then return +dc==2 and cd*2 or math.floor(cd)else return cd end end,draw=function(bd) +cc.draw(bd) +bd:addDraw("bigfonts",function() +if(dc>1)then local cd,dd=bd:getPosition()local __a=bd:getParent() +local a_a,b_a=__a:getSize()local c_a,d_a=#_d[1][1],#_d[1]cd=cd or +math.floor((a_a-c_a)/2)+1;dd=dd or +math.floor((b_a-d_a)/2)+1 +for i=1,d_a do bd:addFG(1,i,_d[2][i]) +bd:addBG(1,i,_d[3][i])bd:addText(1,i,_d[1][i])end end end)end}return ad end}end +aa["plugins"]["border"]=function(...)local ab=da("xmlParser") +return +{VisualObject=function(bb)local cb=true +local db={top=false,bottom=false,left=false,right=false} +local _c={setBorder=function(ac,...)local bc={...} +if(bc~=nil)then +for cc,dc in pairs(bc)do +if(dc=="left")or(#bc==1)then db["left"]=bc[1]end;if(dc=="top")or(#bc==1)then db["top"]=bc[1]end;if +(dc=="right")or(#bc==1)then db["right"]=bc[1]end;if +(dc=="bottom")or(#bc==1)then db["bottom"]=bc[1]end end end;ac:updateDraw()return ac end,draw=function(ac) +bb.draw(ac) +ac:addDraw("border",function()local bc,cc=ac:getPosition()local dc,_d=ac:getSize() +local ad=ac:getBackground() +if(cb)then +if(db["left"]~=false)then ac:addTextBox(1,1,1,_d,"\149")if(ad~=false)then +ac:addBackgroundBox(1,1,1,_d,ad)end +ac:addForegroundBox(1,1,1,_d,db["left"])end +if(db["top"]~=false)then ac:addTextBox(1,1,dc,1,"\131")if(ad~=false)then +ac:addBackgroundBox(1,1,dc,1,ad)end +ac:addForegroundBox(1,1,dc,1,db["top"])end +if(db["left"]~=false)and(db["top"]~=false)then +ac:addTextBox(1,1,1,1,"\151") +if(ad~=false)then ac:addBackgroundBox(1,1,1,1,ad)end;ac:addForegroundBox(1,1,1,1,db["left"])end +if(db["right"]~=false)then ac:addTextBox(dc,1,1,_d,"\149")if +(ad~=false)then ac:addForegroundBox(dc,1,1,_d,ad)end +ac:addBackgroundBox(dc,1,1,_d,db["right"])end +if(db["bottom"]~=false)then ac:addTextBox(1,_d,dc,1,"\143")if +(ad~=false)then ac:addForegroundBox(1,_d,dc,1,ad)end +ac:addBackgroundBox(1,_d,dc,1,db["bottom"])end +if(db["top"]~=false)and(db["right"]~=false)then +ac:addTextBox(dc,1,1,1,"\148") +if(ad~=false)then ac:addForegroundBox(dc,1,1,1,ad)end;ac:addBackgroundBox(dc,1,1,1,db["right"])end +if(db["right"]~=false)and(db["bottom"]~=false)then +ac:addTextBox(dc,_d,1,1,"\133") +if(ad~=false)then ac:addForegroundBox(dc,_d,1,1,ad)end;ac:addBackgroundBox(dc,_d,1,1,db["right"])end +if(db["bottom"]~=false)and(db["left"]~=false)then +ac:addTextBox(1,_d,1,1,"\138") +if(ad~=false)then ac:addForegroundBox(0,_d,1,1,ad)end;ac:addBackgroundBox(1,_d,1,1,db["left"])end end end)end}return _c end}end +aa["plugins"]["reactive"]=function(...)local ab=da("xmlParser") +local bb={fromXML=function(bc) +local cc=ab.parseText(bc)local dc=nil +for _d,ad in ipairs(cc)do if(ad.tag=="script")then dc=ad.value;table.remove(cc,_d) +break end end;return{nodes=cc,script=dc}end} +local cb=function(bc,cc)return load(bc,nil,"t",cc)()end +local db=function(bc,cc,dc,_d) +cc(bc,function(...)local ad,bd=pcall(load(dc,nil,"t",_d))if not ad then +error("XML Error: "..bd)end end)end;local _c=nil +local ac=function(bc) +for cc,dc in ipairs(bc.dependencies)do for _d,ad in ipairs(dc)do +if(ad==bc)then table.remove(dc,_d)end end end;bc.dependencies={}end +return +{basalt=function(bc) +local cc=function(_d,ad)local bd=ad[_d.tag] +if(bd~=nil)then local __a={} +for a_a,b_a in pairs(_d.attributes)do __a[a_a]=load("return "..b_a, +nil,"t",ad)end;return bc.createObjectsFromLayout(bd,__a)end;local cd=_d.tag:gsub("^%l",string.upper) +local dd=bc:createObject(cd,_d.attributes["id"]) +for __a,a_a in pairs(_d.attributes)do +if(__a:sub(1,2)=="on")then +db(dd,dd[__a],a_a.."()",ad)else +local b_a=function()local c_a=load("return "..a_a,nil,"t",ad)() +dd:setProperty(__a,c_a)end;bc.effect(b_a)end end +for __a,a_a in ipairs(_d.children)do +local b_a=bc.createObjectsFromXMLNode(a_a,ad)for c_a,d_a in ipairs(b_a)do dd:addChild(d_a)end end;return{dd}end +local dc={reactive=function(_d)local ad=_d;local bd={} +local cd=function()if(_c~=nil)then table.insert(bd,_c) +table.insert(_c.dependencies,bd)end;return ad end +local dd=function(__a)ad=__a;local a_a={}for b_a,c_a in ipairs(bd)do a_a[b_a]=c_a end;for b_a,c_a in ipairs(a_a)do +c_a.execute()end end;return cd,dd end,untracked=function(_d) +local ad=_c;_c=nil;local bd=_d()_c=ad;return bd end,effect=function(_d) +local ad={dependencies={}} +local bd=function()ac(ad)local cd=_c;_c=ad;_d()_c=cd end;ad.execute=bd;ad.execute()end,derived=function(_d) +local ad,bd=bc.reactive()bc.effect(function()bd(_d())end)return ad end,layout=function(_d)if( +not fs.exists(_d))then +error("Can't open file ".._d)end;local ad=fs.open(_d,"r") +local bd=ad.readAll()ad.close()return bb.fromXML(bd)end,createObjectsFromLayout=function(_d,ad) +local bd=_ENV;bd.props={}local cd={}for __a,a_a in pairs(ad)do +cd[__a]=bc.derived(function()return a_a()end)end +setmetatable(bd.props,{__index=function(__a,a_a)return cd[a_a]()end})if(_d.script~=nil)then cb(_d.script,bd)end;local dd={}for __a,a_a in +ipairs(_d.nodes)do local b_a=cc(a_a,bd) +for c_a,d_a in ipairs(b_a)do table.insert(dd,d_a)end end;return dd end}return dc end,Container=function(bc,cc) +local dc={loadLayout=function(_d,ad,bd) +local cd={}if(bd==nil)then bd={}end +for a_a,b_a in pairs(bd)do cd[a_a]=function()return b_a end end;local dd=cc.layout(ad) +local __a=cc.createObjectsFromLayout(dd,cd)for a_a,b_a in ipairs(__a)do _d:addChild(b_a)end;return _d end}return dc end}end +aa["plugins"]["animations"]=function(...) +local ab,bb,cb,db,_c,ac=math.floor,math.sin,math.cos,math.pi,math.sqrt,math.pow;local function bc(aab,bab,cab)return aab+ (bab-aab)*cab end +local function cc(aab)return aab end;local function dc(aab)return 1 -aab end +local function _d(aab)return aab*aab*aab end;local function ad(aab)return dc(_d(dc(aab)))end;local function bd(aab)return +bc(_d(aab),ad(aab),aab)end +local function cd(aab)return bb((aab*db)/2)end;local function dd(aab)return dc(cb((aab*db)/2))end;local function __a(aab)return- ( +cb(db*x)-1)/2 end +local function a_a(aab)local bab=1.70158 +local cab=bab+1;return cab*aab^3 -bab*aab^2 end;local function b_a(aab)return aab^3 end;local function c_a(aab)local bab=(2 *db)/3 +return aab==0 and 0 or(aab==1 and 1 or +(-2 ^ (10 * +aab-10)*bb((aab*10 -10.75)*bab)))end +local function d_a(aab)return +aab==0 and 0 or 2 ^ (10 *aab-10)end +local function _aa(aab)return aab==0 and 0 or 2 ^ (10 *aab-10)end +local function aaa(aab)local bab=1.70158;local cab=bab*1.525;return +aab<0.5 and( (2 *aab)^2 * +( (cab+1)*2 *aab-cab))/2 or +( +(2 *aab-2)^2 * ( (cab+1)* (aab*2 -2)+cab)+2)/2 end;local function baa(aab)return +aab<0.5 and 4 *aab^3 or 1 - (-2 *aab+2)^3 /2 end +local function caa(aab) +local bab=(2 *db)/4.5 +return +aab==0 and 0 or(aab==1 and 1 or +( +aab<0.5 and- (2 ^ (20 *aab-10)* +bb((20 *aab-11.125)*bab))/2 or +(2 ^ (-20 *aab+10)*bb((20 *aab-11.125)*bab))/2 +1))end +local function daa(aab)return +aab==0 and 0 or(aab==1 and 1 or +( +aab<0.5 and 2 ^ (20 *aab-10)/2 or(2 -2 ^ (-20 *aab+10))/2))end;local function _ba(aab)return +aab<0.5 and 2 *aab^2 or 1 - (-2 *aab+2)^2 /2 end;local function aba(aab)return +aab<0.5 and 8 * +aab^4 or 1 - (-2 *aab+2)^4 /2 end;local function bba(aab)return +aab<0.5 and 16 * +aab^5 or 1 - (-2 *aab+2)^5 /2 end;local function cba(aab) +return aab^2 end;local function dba(aab)return aab^4 end +local function _ca(aab)return aab^5 end;local function aca(aab)local bab=1.70158;local cab=bab+1;return +1 +cab* (aab-1)^3 +bab* (aab-1)^2 end;local function bca(aab)return 1 - +(1 -aab)^3 end +local function cca(aab)local bab=(2 *db)/3;return + +aab==0 and 0 or(aab==1 and 1 or( +2 ^ (-10 *aab)*bb((aab*10 -0.75)*bab)+1))end +local function dca(aab)return aab==1 and 1 or 1 -2 ^ (-10 *aab)end;local function _da(aab)return 1 - (1 -aab)* (1 -aab)end;local function ada(aab)return 1 - ( +1 -aab)^4 end;local function bda(aab) +return 1 - (1 -aab)^5 end +local function cda(aab)return 1 -_c(1 -ac(aab,2))end;local function dda(aab)return _c(1 -ac(aab-1,2))end +local function __b(aab)return + +aab<0.5 and(1 -_c( +1 -ac(2 *aab,2)))/2 or(_c(1 -ac(-2 *aab+2,2))+1)/2 end +local function a_b(aab)local bab=7.5625;local cab=2.75 +if(aab<1 /cab)then return bab*aab*aab elseif(aab<2 /cab)then local dab=aab- +1.5 /cab;return bab*dab*dab+0.75 elseif(aab<2.5 /cab)then local dab=aab- +2.25 /cab;return bab*dab*dab+0.9375 else +local dab=aab-2.625 /cab;return bab*dab*dab+0.984375 end end;local function b_b(aab)return 1 -a_b(1 -aab)end;local function c_b(aab)return +x<0.5 and(1 - +a_b(1 -2 *aab))/2 or(1 +a_b(2 *aab-1))/2 end +local d_b={linear=cc,lerp=bc,flip=dc,easeIn=_d,easeInSine=dd,easeInBack=a_a,easeInCubic=b_a,easeInElastic=c_a,easeInExpo=_aa,easeInQuad=cba,easeInQuart=dba,easeInQuint=_ca,easeInCirc=cda,easeInBounce=b_b,easeOut=ad,easeOutSine=cd,easeOutBack=aca,easeOutCubic=bca,easeOutElastic=cca,easeOutExpo=dca,easeOutQuad=_da,easeOutQuart=ada,easeOutQuint=bda,easeOutCirc=dda,easeOutBounce=a_b,easeInOut=bd,easeInOutSine=__a,easeInOutBack=aaa,easeInOutCubic=baa,easeInOutElastic=caa,easeInOutExpo=daa,easeInOutQuad=_ba,easeInOutQuart=aba,easeInOutQuint=bba,easeInOutCirc=__b,easeInOutBounce=c_b}local _ab=da("xmlParser") +return +{VisualObject=function(aab,bab)local cab={}local dab="linear" +local function _bb(dbb,_cb)for acb,bcb in pairs(cab)do if(bcb.timerId==_cb)then +return bcb end end end +local function abb(dbb,_cb,acb,bcb,ccb,dcb,_db,adb,bdb,cdb)local ddb,__c=bdb(dbb)if(cab[_db]~=nil)then +os.cancelTimer(cab[_db].timerId)end;cab[_db]={} +cab[_db].call=function() +local a_c=cab[_db].progress +local b_c=math.floor(d_b.lerp(ddb,_cb,d_b[dcb](a_c/bcb))+0.5) +local c_c=math.floor(d_b.lerp(__c,acb,d_b[dcb](a_c/bcb))+0.5)cdb(dbb,b_c,c_c)end +cab[_db].finished=function()cdb(dbb,_cb,acb)if(adb~=nil)then adb(dbb)end end;cab[_db].timerId=os.startTimer(0.05 +ccb) +cab[_db].progress=0;cab[_db].duration=bcb;cab[_db].mode=dcb +dbb:listenEvent("other_event")end +local function bbb(dbb,_cb,acb,bcb,ccb,...)local dcb={...}if(cab[bcb]~=nil)then +os.cancelTimer(cab[bcb].timerId)end;cab[bcb]={}local _db=1;cab[bcb].call=function() +local adb=dcb[_db]ccb(dbb,adb)end end +local cbb={animatePosition=function(dbb,_cb,acb,bcb,ccb,dcb,_db)dcb=dcb or dab;bcb=bcb or 1;ccb=ccb or 0 +_cb=math.floor(_cb+0.5)acb=math.floor(acb+0.5) +abb(dbb,_cb,acb,bcb,ccb,dcb,"position",_db,dbb.getPosition,dbb.setPosition)return dbb end,animateSize=function(dbb,_cb,acb,bcb,ccb,dcb,_db)dcb= +dcb or dab;bcb=bcb or 1;ccb=ccb or 0 +abb(dbb,_cb,acb,bcb,ccb,dcb,"size",_db,dbb.getSize,dbb.setSize)return dbb end,animateOffset=function(dbb,_cb,acb,bcb,ccb,dcb,_db)dcb= +dcb or dab;bcb=bcb or 1;ccb=ccb or 0 +abb(dbb,_cb,acb,bcb,ccb,dcb,"offset",_db,dbb.getOffset,dbb.setOffset)return dbb end,animateBackground=function(dbb,_cb,acb,bcb,ccb,dcb)ccb= +ccb or dab;acb=acb or 1;bcb=bcb or 0 +bbb(dbb,_cb,nil,acb,bcb,ccb,"background",dcb,dbb.getBackground,dbb.setBackground)return dbb end,doneHandler=function(dbb,_cb,...) +for acb,bcb in +pairs(cab)do if(bcb.timerId==_cb)then cab[acb]=nil +dbb:sendEvent("animation_done",dbb,"animation_done",acb)end end end,onAnimationDone=function(dbb,...) +for _cb,acb in +pairs(table.pack(...))do if(type(acb)=="function")then +dbb:registerEvent("animation_done",acb)end end;return dbb end,eventHandler=function(dbb,_cb,acb,...) +aab.eventHandler(dbb,_cb,acb,...) +if(_cb=="timer")then local bcb=_bb(dbb,acb) +if(bcb~=nil)then +if(bcb.progress=_d)and(baa+_aa-1 <=bd)then daa=baa+ +_aa-1 end +if(caa+aaa-1 >=ad)and( +caa+aaa-1 <=cd)then _ba=caa+aaa-1 end;_c:setSize(daa,_ba)end) +cc=_c:addButton():setText("Close"):setPosition("parent.w - 6",1):setSize(7,1):setBackground(colors.red):setForeground(colors.white):onClick(function() +_c:animatePosition( +-dd,__a/2 -_c:getHeight()/2,0.5)end) +ac=_c:addList():setSize("parent.w - 2","parent.h - 3"):setPosition(2,3):setBackground(colors.gray):setForeground(colors.white):setSelectionColor(colors.gray,colors.white) +if(bc==nil)then +bc=db:addLabel():setPosition(1,"parent.h"):setBackground(colors.black):setForeground(colors.white):setZIndex(100):onClick(function() +_c:show() +_c:animatePosition(dd/2 -_c:getWidth()/2,__a/2 -_c:getHeight()/2,0.5)end)end end +return +{debug=function(...)local _d={...}if(db==nil)then db=cb.getMainFrame() +if(db~=nil)then dc()else print(...)return end end +if +(db:getName()~="basaltDebuggingFrame")then if(db~=_c)then bc:setParent(db)end end;local ad=""for bd,cd in pairs(_d)do +ad=ad..tostring(cd).. (#_d~=bd and", "or"")end +bc:setText("[Debug] "..ad) +for bd,cd in pairs(bb(ad,ac:getWidth()))do ac:addItem(cd)end +if(ac:getItemCount()>50)then ac:removeItem(1)end +ac:setValue(ac:getItem(ac:getItemCount())) +if(ac.getItemCount()>ac:getHeight())then ac:setOffset(ac:getItemCount()- +ac:getHeight())end;bc:show()end}end}end +aa["plugins"]["themes"]=function(...) +local ab={BaseFrameBG=colors.lightGray,BaseFrameText=colors.black,FrameBG=colors.gray,FrameText=colors.black,ButtonBG=colors.gray,ButtonText=colors.black,CheckboxBG=colors.lightGray,CheckboxText=colors.black,InputBG=colors.black,InputText=colors.lightGray,TextfieldBG=colors.black,TextfieldText=colors.white,ListBG=colors.gray,ListText=colors.black,MenubarBG=colors.gray,MenubarText=colors.black,DropdownBG=colors.gray,DropdownText=colors.black,RadioBG=colors.gray,RadioText=colors.black,SelectionBG=colors.black,SelectionText=colors.lightGray,GraphicBG=colors.black,ImageBG=colors.black,PaneBG=colors.black,ProgramBG=colors.black,ProgressbarBG=colors.gray,ProgressbarText=colors.black,ProgressbarActiveBG=colors.black,ScrollbarBG=colors.lightGray,ScrollbarText=colors.gray,ScrollbarSymbolColor=colors.black,SliderBG=false,SliderText=colors.gray,SliderSymbolColor=colors.black,SwitchBG=colors.lightGray,SwitchText=colors.gray,LabelBG=false,LabelText=colors.black,GraphBG=colors.gray,GraphText=colors.black} +local bb={Container=function(cb,db,_c)local ac={} +local bc={getTheme=function(cc,dc)local _d=cc:getParent()return ac[dc]or(_d~=nil and _d:getTheme(dc)or +ab[dc])end,setTheme=function(cc,dc,_d) +if( +type(dc)=="table")then ac=dc elseif(type(dc)=="string")then ac[dc]=_d end;cc:updateDraw()return cc end}return bc end,basalt=function() +return +{getTheme=function(cb)return +ab[cb]end,setTheme=function(cb,db)if(type(cb)=="table")then ab=cb elseif(type(cb)=="string")then +ab[cb]=db end end}end} +for cb,db in +pairs({"BaseFrame","Frame","ScrollableFrame","MovableFrame","Button","Checkbox","Dropdown","Graph","Graphic","Input","Label","List","Menubar","Pane","Program","Progressbar","Radio","Scrollbar","Slider","Switch","Textfield"})do +bb[db]=function(_c,ac,bc) +local cc={init=function(dc)if(_c.init(dc))then local _d=dc:getParent()or dc +dc:setBackground(_d:getTheme(db.."BG")) +dc:setForeground(_d:getTheme(db.."Text"))end end}return cc end end;return bb end +aa["plugins"]["textures"]=function(...)local ab=da("images")local bb=da("utils") +local cb=da("xmlParser") +return +{VisualObject=function(db)local _c,ac=1,true;local bc,cc,dc;local _d="default" +local ad={addTexture=function(bd,cd,dd)bc=ab.loadImageAsBimg(cd) +cc=bc[1] +if(dd)then if(bc.animated)then bd:listenEvent("other_event")local __a=bc[_c].duration or +bc.secondsPerFrame or 0.2 +dc=os.startTimer(__a)end end;bd:setBackground(false)bd:setForeground(false) +bd:setDrawState("texture-base",true)bd:updateDraw()return bd end,setTextureMode=function(bd,cd)_d= +cd or _d;bd:updateDraw()return bd end,setInfinitePlay=function(bd,cd)ac=cd +return bd end,eventHandler=function(bd,cd,dd,...)db.eventHandler(bd,cd,dd,...) +if(cd=="timer")then +if +(dd==dc)then +if(bc[_c+1]~=nil)then _c=_c+1;cc=bc[_c]local __a= +bc[_c].duration or bc.secondsPerFrame or 0.2 +dc=os.startTimer(__a)bd:updateDraw()else +if(ac)then _c=1;cc=bc[1]local __a= +bc[_c].duration or bc.secondsPerFrame or 0.2 +dc=os.startTimer(__a)bd:updateDraw()end end end end end,draw=function(bd) +db.draw(bd) +bd:addDraw("texture-base",function()local cd=bd:getParent()or bd +local dd,__a=bd:getPosition()local a_a,b_a=bd:getSize()local c_a,d_a=cd:getSize()local _aa=bc.width or +#bc[_c][1][1]local aaa=bc.height or#bc[_c] +local baa,caa=0,0 +if(_d=="center")then +baa=dd+math.floor((a_a-_aa)/2 +0.5)-1 +caa=__a+math.floor((b_a-aaa)/2 +0.5)-1 elseif(_d=="default")then baa,caa=dd,__a elseif(_d=="right")then +baa,caa=dd+a_a-_aa,__a+b_a-aaa end;local daa=dd-baa;local _ba=__a-caa;if baa
dd+a_a then +_aa=(dd+a_a)-baa end +if caa+aaa>__a+b_a then aaa=(__a+b_a)-caa end +for k=1,aaa do if(cc[k+_ba]~=nil)then local aba,bba,cba=table.unpack(cc[k+_ba]) +bd:addBlit(1,k,aba:sub(daa, +daa+_aa),bba:sub(daa,daa+_aa),cba:sub(daa,daa+_aa))end end end,1)bd:setDrawState("texture-base",false)end}return ad end}end;aa["libraries"]={} +aa["libraries"]["process"]=function(...)local ab={}local bb={}local cb=0 +local db=dofile("rom/modules/main/cc/require.lua").make +function bb:new(_c,ac,bc,...)local cc={...} +local dc=setmetatable({path=_c},{__index=self})dc.window=ac;ac.current=term.current;ac.redirect=term.redirect +dc.processId=cb +if(type(_c)=="string")then +dc.coroutine=coroutine.create(function() +local _d=shell.resolveProgram(_c)local ad=setmetatable(bc,{__index=_ENV})ad.shell=shell +ad.basaltProgram=true;ad.arg={[0]=_c,table.unpack(cc)} +if(_d==nil)then error("The path ".._c.. +" does not exist!")end;ad.require,ad.package=db(ad,fs.getDir(_d)) +if(fs.exists(_d))then +local bd=fs.open(_d,"r")local cd=bd.readAll()bd.close()local dd=load(cd,_c,"bt",ad)if(dd~=nil)then return +dd()end end end)elseif(type(_c)=="function")then +dc.coroutine=coroutine.create(function() +_c(table.unpack(cc))end)else return end;ab[cb]=dc;cb=cb+1;return dc end +function bb:resume(_c,...)local ac=term.current()term.redirect(self.window) +if( +self.filter~=nil)then if(_c~=self.filter)then return end;self.filter=nil end;local bc,cc=coroutine.resume(self.coroutine,_c,...)if bc then +self.filter=cc else printError(cc)end;term.redirect(ac) +return bc,cc end +function bb:isDead() +if(self.coroutine~=nil)then +if +(coroutine.status(self.coroutine)=="dead")then table.remove(ab,self.processId)return true end else return true end;return false end +function bb:getStatus()if(self.coroutine~=nil)then +return coroutine.status(self.coroutine)end;return nil end +function bb:start()coroutine.resume(self.coroutine)end;return bb end +aa["libraries"]["basaltDraw"]=function(...)local ab=da("tHex")local bb=da("utils") +local cb=bb.splitString;local db,_c=string.sub,string.rep +return +function(ac)local bc=ac or term.current() +local cc;local dc,_d=bc.getSize()local ad={}local bd={}local cd={}local dd;local __a={} +local function a_a()dd=_c(" ",dc)for n=0,15 do +local caa=2 ^n;local daa=ab[caa]__a[caa]=_c(daa,dc)end end;a_a() +local function b_a()a_a()local caa=dd;local daa=__a[colors.white] +local _ba=__a[colors.black] +for currentY=1,_d do +ad[currentY]=db(ad[currentY]==nil and caa or ad[currentY]..caa:sub(1,dc- +ad[currentY]:len()),1,dc) +cd[currentY]=db(cd[currentY]==nil and daa or cd[currentY]..daa:sub(1,dc- +cd[currentY]:len()),1,dc) +bd[currentY]=db(bd[currentY]==nil and _ba or bd[currentY].._ba:sub(1,dc- +bd[currentY]:len()),1,dc)end end;b_a() +local function c_a(caa,daa,_ba,aba,bba) +if#_ba==#aba and#_ba==#bba then +if daa>=1 and daa<=_d then +if +caa+#_ba>0 and caa<=dc then local cba,dba,_ca;local aca,bca,cca=ad[daa],cd[daa],bd[daa] +local dca,_da=1,#_ba +if caa<1 then dca=1 -caa+1;_da=dc-caa+1 elseif caa+#_ba>dc then _da=dc-caa+1 end;cba=db(aca,1,caa-1)..db(_ba,dca,_da)dba= +db(bca,1,caa-1)..db(aba,dca,_da)_ca=db(cca,1,caa-1).. +db(bba,dca,_da) +if caa+#_ba<=dc then cba=cba.. +db(aca,caa+#_ba,dc) +dba=dba..db(bca,caa+#_ba,dc)_ca=_ca..db(cca,caa+#_ba,dc)end;ad[daa],cd[daa],bd[daa]=cba,dba,_ca end end end end +local function d_a(caa,daa,_ba) +if daa>=1 and daa<=_d then +if caa+#_ba>0 and caa<=dc then local aba;local bba=ad[daa] +local cba,dba=1,#_ba +if caa<1 then cba=1 -caa+1;dba=dc-caa+1 elseif caa+#_ba>dc then dba=dc-caa+1 end;aba=db(bba,1,caa-1)..db(_ba,cba,dba) +if +caa+#_ba<=dc then aba=aba..db(bba,caa+#_ba,dc)end;ad[daa]=aba end end end +local function _aa(caa,daa,_ba) +if daa>=1 and daa<=_d then +if caa+#_ba>0 and caa<=dc then local aba;local bba=bd[daa] +local cba,dba=1,#_ba +if caa<1 then cba=1 -caa+1;dba=dc-caa+1 elseif caa+#_ba>dc then dba=dc-caa+1 end;aba=db(bba,1,caa-1)..db(_ba,cba,dba) +if +caa+#_ba<=dc then aba=aba..db(bba,caa+#_ba,dc)end;bd[daa]=aba end end end +local function aaa(caa,daa,_ba) +if daa>=1 and daa<=_d then +if caa+#_ba>0 and caa<=dc then local aba;local bba=cd[daa] +local cba,dba=1,#_ba +if caa<1 then cba=1 -caa+1;dba=dc-caa+1 elseif caa+#_ba>dc then dba=dc-caa+1 end;aba=db(bba,1,caa-1)..db(_ba,cba,dba) +if +caa+#_ba<=dc then aba=aba..db(bba,caa+#_ba,dc)end;cd[daa]=aba end end end +local baa={setSize=function(caa,daa)dc,_d=caa,daa;b_a()end,setMirror=function(caa)cc=caa end,setBG=function(caa,daa,_ba) +_aa(caa,daa,_ba)end,setText=function(caa,daa,_ba)d_a(caa,daa,_ba)end,setFG=function(caa,daa,_ba) +aaa(caa,daa,_ba)end,blit=function(caa,daa,_ba,aba,bba)c_a(caa,daa,_ba,aba,bba)end,drawBackgroundBox=function(caa,daa,_ba,aba,bba) +local cba=_c(ab[bba],_ba)for n=1,aba do _aa(caa,daa+ (n-1),cba)end end,drawForegroundBox=function(caa,daa,_ba,aba,bba) +local cba=_c(ab[bba],_ba)for n=1,aba do aaa(caa,daa+ (n-1),cba)end end,drawTextBox=function(caa,daa,_ba,aba,bba) +local cba=_c(bba,_ba)for n=1,aba do d_a(caa,daa+ (n-1),cba)end end,update=function() +local caa,daa=bc.getCursorPos()local _ba=false +if(bc.getCursorBlink~=nil)then _ba=bc.getCursorBlink()end;bc.setCursorBlink(false)if(cc~=nil)then +cc.setCursorBlink(false)end +for n=1,_d do bc.setCursorPos(1,n) +bc.blit(ad[n],cd[n],bd[n])if(cc~=nil)then cc.setCursorPos(1,n) +cc.blit(ad[n],cd[n],bd[n])end end;bc.setBackgroundColor(colors.black) +bc.setCursorBlink(_ba)bc.setCursorPos(caa,daa) +if(cc~=nil)then +cc.setBackgroundColor(colors.black)cc.setCursorBlink(_ba)cc.setCursorPos(caa,daa)end end,setTerm=function(caa) +bc=caa end}return baa end end +aa["libraries"]["basaltLogs"]=function(...)local ab=""local bb="basaltLog.txt"local cb="Debug" +fs.delete( +ab~=""and ab.."/"..bb or bb) +local db={__call=function(_c,ac,bc)if(ac==nil)then return end +local cc=ab~=""and ab.."/"..bb or bb +local dc=fs.open(cc,fs.exists(cc)and"a"or"w") +dc.writeLine("[Basalt][".. +os.date("%Y-%m-%d %H:%M:%S").."][".. (bc and bc or cb).. +"]: "..tostring(ac))dc.close()end}return setmetatable({},db)end +aa["libraries"]["basaltEvent"]=function(...) +return +function()local ab={} +local bb={registerEvent=function(cb,db,_c) +if(ab[db]==nil)then ab[db]={}end;table.insert(ab[db],_c)end,removeEvent=function(cb,db,_c)ab[db][_c[db]]= +nil end,hasEvent=function(cb,db)return ab[db]~=nil end,getEventCount=function(cb,db)return +ab[db]~=nil and#ab[db]or 0 end,getEvents=function(cb) +local db={}for _c,ac in pairs(ab)do table.insert(db,_c)end;return db end,clearEvent=function(cb,db)ab[db]= +nil end,clear=function(cb,db)ab={}end,sendEvent=function(cb,db,...)local _c +if(ab[db]~=nil)then for ac,bc in pairs(ab[db])do +local cc=bc(...)if(cc==false)then _c=cc end end end;return _c end}bb.__index=bb;return bb end end +aa["libraries"]["tHex"]=function(...)local ab={} +for i=0,15 do ab[2 ^i]=("%x"):format(i)end;return ab end +aa["libraries"]["basaltMon"]=function(...) +local ab={[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 bb,cb,db,_c=type,string.len,string.rep,string.sub +return +function(ac)local bc={} +for _ba,aba in pairs(ac)do +bc[_ba]={} +for bba,cba in pairs(aba)do local dba=peripheral.wrap(cba)if(dba==nil)then +error("Unable to find monitor "..cba)end;bc[_ba][bba]=dba +bc[_ba][bba].name=cba end end;local cc,dc,_d,ad,bd,cd,dd,__a=1,1,1,1,0,0,0,0;local a_a,b_a=false,1 +local c_a,d_a=colors.white,colors.black +local function _aa()local _ba,aba=0,0 +for bba,cba in pairs(bc)do local dba,_ca=0,0 +for aca,bca in pairs(cba)do local cca,dca=bca.getSize() +dba=dba+cca;_ca=dca>_ca and dca or _ca end;_ba=_ba>dba and _ba or dba;aba=aba+_ca end;dd,__a=_ba,aba end;_aa() +local function aaa()local _ba=0;local aba,bba=0,0 +for cba,dba in pairs(bc)do local _ca=0;local aca=0 +for bca,cca in pairs(dba)do +local dca,_da=cca.getSize()if(cc-_ca>=1)and(cc-_ca<=dca)then aba=bca end;cca.setCursorPos( +cc-_ca,dc-_ba)_ca=_ca+dca +if(aca<_da)then aca=_da end end;if(dc-_ba>=1)and(dc-_ba<=aca)then bba=cba end +_ba=_ba+aca end;_d,ad=aba,bba end;aaa() +local function baa(_ba,...)local aba={...}return +function()for bba,cba in pairs(bc)do for dba,_ca in pairs(cba)do +_ca[_ba](table.unpack(aba))end end end end +local function caa()baa("setCursorBlink",false)() +if not(a_a)then return end;if(bc[ad]==nil)then return end;local _ba=bc[ad][_d] +if(_ba==nil)then return end;_ba.setCursorBlink(a_a)end +local function daa(_ba,aba,bba)if(bc[ad]==nil)then return end;local cba=bc[ad][_d] +if(cba==nil)then return end;cba.blit(_ba,aba,bba)local dba,_ca=cba.getSize() +if +(cb(_ba)+cc>dba)then local aca=bc[ad][_d+1]if(aca~=nil)then aca.blit(_ba,aba,bba)_d=_d+1;cc=cc+ +cb(_ba)end end;aaa()end +return +{clear=baa("clear"),setCursorBlink=function(_ba)a_a=_ba;caa()end,getCursorBlink=function()return a_a end,getCursorPos=function()return cc,dc end,setCursorPos=function(_ba,aba) +cc,dc=_ba,aba;aaa()caa()end,setTextScale=function(_ba) +baa("setTextScale",_ba)()_aa()aaa()b_a=_ba end,getTextScale=function()return b_a end,blit=function(_ba,aba,bba) +daa(_ba,aba,bba)end,write=function(_ba)_ba=tostring(_ba)local aba=cb(_ba) +daa(_ba,db(ab[c_a],aba),db(ab[d_a],aba))end,getSize=function()return dd,__a end,setBackgroundColor=function(_ba) +baa("setBackgroundColor",_ba)()d_a=_ba end,setTextColor=function(_ba) +baa("setTextColor",_ba)()c_a=_ba end,calculateClick=function(_ba,aba,bba)local cba=0 +for dba,_ca in pairs(bc)do local aca=0;local bca=0 +for cca,dca in pairs(_ca)do +local _da,ada=dca.getSize()if(dca.name==_ba)then return aba+aca,bba+cba end +aca=aca+_da;if(ada>bca)then bca=ada end end;cba=cba+bca end;return aba,bba end}end end +aa["libraries"]["images"]=function(...)local ab,bb=string.sub,math.floor;local function cb(ad)return +{[1]={{},{},paintutils.loadImage(ad)}},"bimg"end;local function db(ad)return +paintutils.loadImage(ad),"nfp"end +local function _c(ad,bd) +local cd=fs.open(ad,bd and"rb"or"r")if(cd==nil)then +error("Path - "..ad.." doesn't exist!")end +local dd=textutils.unserialize(cd.readAll())cd.close()if(dd~=nil)then return dd,"bimg"end end;local function ac(ad)end;local function bc(ad)end;local function cc(ad,bd,cd) +if(ab(ad,-4)==".bimg")then return _c(ad,cd)elseif +(ab(ad,-3)==".bbf")then return ac(ad,cd)else return db(ad,cd)end end;local function dc(ad) +if +(ad:find(".bimg"))then return _c(ad)elseif(ad:find(".bbf"))then return bc(ad)else return cb(ad)end end +local function _d(ad,bd,cd)local dd,__a=ad.width or# +ad[1][1][1],ad.height or#ad[1]local a_a={} +for b_a,c_a in +pairs(ad)do +if(type(b_a)=="number")then local d_a={} +for y=1,cd do local _aa,aaa,baa="","","" +local caa=bb(y/cd*__a+0.5) +if(c_a[caa]~=nil)then +for x=1,bd do local daa=bb(x/bd*dd+0.5)_aa=_aa.. +ab(c_a[caa][1],daa,daa) +aaa=aaa..ab(c_a[caa][2],daa,daa)baa=baa..ab(c_a[caa][3],daa,daa)end;table.insert(d_a,{_aa,aaa,baa})end end;table.insert(a_a,b_a,d_a)else a_a[b_a]=c_a end end;a_a.width=bd;a_a.height=cd;return a_a end +return{loadNFP=db,loadBIMG=_c,loadImage=cc,resizeBIMG=_d,loadImageAsBimg=dc}end +aa["libraries"]["utils"]=function(...)local ab=da("tHex") +local bb,cb,db,_c,ac,bc=string.sub,string.find,string.reverse,string.rep,table.insert,string.len +local function cc(cd,dd)local __a={}if cd==""or dd==""then return __a end;local a_a=1 +local b_a,c_a=cb(cd,dd,a_a)while b_a do ac(__a,bb(cd,a_a,b_a-1))a_a=c_a+1 +b_a,c_a=cb(cd,dd,a_a)end;ac(__a,bb(cd,a_a))return __a end;local function dc(cd)return cd:gsub("{[^}]+}","")end +local function _d(cd,dd)cd=dc(cd)if +(cd=="")or(dd==0)then return{""}end;local __a=cc(cd,"\n")local a_a={} +for b_a,c_a in +pairs(__a)do +if#c_a==0 then table.insert(a_a,"")else +while#c_a>dd do local d_a=dd;for i=dd,1,-1 do if bb(c_a,i,i)==" "then +d_a=i;break end end +if d_a==dd then +local _aa=bb(c_a,1,d_a-1).."-"table.insert(a_a,_aa)c_a=bb(c_a,d_a)else +local _aa=bb(c_a,1,d_a-1)table.insert(a_a,_aa)c_a=bb(c_a,d_a+1)end;if#c_a<=dd then break end end;if#c_a>0 then table.insert(a_a,c_a)end end end;return a_a end +local function ad(cd)local dd={}local __a=1;local a_a=1 +while __a<=#cd do local b_a,c_a;local d_a,_aa;local aaa,baa +for _ba,aba in pairs(colors)do +local bba="{fg:".._ba.."}"local cba="{bg:".._ba.."}"local dba,_ca=cd:find(bba,__a) +local aca,bca=cd:find(cba,__a) +if dba and(not b_a or dba0 then +table.insert(dd,{color=nil,bgColor=nil,text=daa,position=a_a})a_a=a_a+#daa;__a=__a+#daa end +if b_a and(not c_a or b_a1 then if b_a+1 +bba<=dd then aaa({text=" "})b_a=b_a+1 else b_a=1;c_a=c_a+ +1 end end;while bba>0 do local cba=aba:sub(1,dd-b_a+1) +aba=aba:sub(dd-b_a+2)bba=#aba;aaa({text=cba}) +if bba>0 then b_a=1;c_a=c_a+1 else b_a=b_a+#cba end end end end;if b_a>dd then b_a=1;c_a=c_a+1 end end;return a_a end +return +{getTextHorizontalAlign=function(cd,dd,__a,a_a)cd=bb(cd,1,dd)local b_a=dd-bc(cd) +if(__a=="right")then +cd=_c(a_a or" ",b_a)..cd elseif(__a=="center")then +cd=_c(a_a or" ",math.floor(b_a/2))..cd.._c(a_a or" ",math.floor( +b_a/2)) +cd=cd.. (bc(cd)
c_a)then break end +if(aaa.text~=nil)then cd:addText(dd+aaa.x-1,__a+ +aaa.y-1,aaa.text)end;if(aaa.color~=nil)then +cd:addFG(dd+aaa.x-1,__a+aaa.y-1,ab[colors[aaa.color]]:rep( +#aaa.text))end;if(aaa.bgColor~=nil)then +cd:addBG(dd+ +aaa.x-1,__a+aaa.y-1,ab[colors[aaa.bgColor]]:rep(# +aaa.text))end end end,uuid=function() +return +string.gsub(string.format('%x-%x-%x-%x-%x',math.random(0,0xffff),math.random(0,0xffff),math.random(0,0xffff), +math.random(0,0x0fff)+0x4000,math.random(0,0x3fff)+0x8000),' ','0')end}end +aa["libraries"]["xmlParser"]=function(...) +local ab={new=function(db) +return +{tag=db,value=nil,attributes={},children={},addChild=function(_c,ac) +table.insert(_c.children,ac)end,addAttribute=function(_c,ac,bc)_c.attributes[ac]=bc end}end} +local bb=function(db,_c) +local ac,bc=string.gsub(_c,"(%w+)=([\"'])(.-)%2",function(_d,ad,bd) +db:addAttribute(_d,"\""..bd.."\"")end) +local cc,dc=string.gsub(_c,"(%w+)={(.-)}",function(_d,ad)db:addAttribute(_d,ad)end)end +local cb={parseText=function(db)local _c={}local ac=ab.new()table.insert(_c,ac)local bc,cc,dc,_d,ad;local bd,cd=1,1 +while true do +bc,cd,cc,dc,_d,ad=string.find(db,"<(%/?)([%w_:]+)(.-)(%/?)>",bd)if not bc then break end;local __a=string.sub(db,bd,bc-1)if not +string.find(__a,"^%s*$")then local a_a=(ac.value or"")..__a +_c[#_c].value=a_a end +if ad=="/"then local a_a=ab.new(dc) +bb(a_a,_d)ac:addChild(a_a)elseif cc==""then local a_a=ab.new(dc)bb(a_a,_d) +table.insert(_c,a_a)ac=a_a else local a_a=table.remove(_c)ac=_c[#_c] +if#_c<1 then error("XMLParser: nothing to close with ".. +dc)end;if a_a.tag~=dc then +error("XMLParser: trying to close "..a_a.tag.." with "..dc)end;ac:addChild(a_a)end;bd=cd+1 end;local dd=string.sub(db,bd)if#_c>1 then +error("XMLParser: unclosed ".._c[#_c].tag)end;return ac.children end}return cb end +aa["libraries"]["bimg"]=function(...)local ab,bb=string.sub,string.rep +local function cb(db,_c)local ac,bc=0,0 +local cc,dc,_d={},{},{}local ad,bd=1,1;local cd={} +local function dd() +for y=1,bc do if(cc[y]==nil)then cc[y]=bb(" ",ac)else cc[y]=cc[y].. +bb(" ",ac-#cc[y])end;if +(dc[y]==nil)then dc[y]=bb("0",ac)else +dc[y]=dc[y]..bb("0",ac-#dc[y])end +if(_d[y]==nil)then _d[y]=bb("f",ac)else _d[y]= +_d[y]..bb("f",ac-#_d[y])end end end +local __a=function(d_a,_aa,aaa)ad=_aa or ad;bd=aaa or bd +if(cc[bd]==nil)then cc[bd]=bb(" ",ad-1)..d_a.. +bb(" ",ac- (#d_a+ad))else cc[bd]= +ab(cc[bd],1,ad-1).. +bb(" ",ad-#cc[bd])..d_a..ab(cc[bd],ad+#d_a,ac)end;if(#cc[bd]>ac)then ac=#cc[bd]end;if(bd>bc)then bc=bd end +_c.updateSize(ac,bc)end +local a_a=function(d_a,_aa,aaa)ad=_aa or ad;bd=aaa or bd +if(_d[bd]==nil)then _d[bd]=bb("f",ad-1)..d_a.. +bb("f",ac- (#d_a+ad))else _d[bd]= +ab(_d[bd],1,ad-1).. +bb("f",ad-#_d[bd])..d_a..ab(_d[bd],ad+#d_a,ac)end;if(#_d[bd]>ac)then ac=#_d[bd]end;if(bd>bc)then bc=bd end +_c.updateSize(ac,bc)end +local b_a=function(d_a,_aa,aaa)ad=_aa or ad;bd=aaa or bd +if(dc[bd]==nil)then dc[bd]=bb("0",ad-1)..d_a.. +bb("0",ac- (#d_a+ad))else dc[bd]= +ab(dc[bd],1,ad-1).. +bb("0",ad-#dc[bd])..d_a..ab(dc[bd],ad+#d_a,ac)end;if(#dc[bd]>ac)then ac=#dc[bd]end;if(bd>bc)then bc=bd end +_c.updateSize(ac,bc)end +local function c_a(d_a)cd={}cc,dc,_d={},{},{} +for _aa,aaa in pairs(db)do if(type(_aa)=="string")then cd[_aa]=aaa else +cc[_aa],dc[_aa],_d[_aa]=aaa[1],aaa[2],aaa[3]end end;_c.updateSize(ac,bc)end +if(db~=nil)then if(#db>0)then ac=#db[1][1]bc=#db;c_a(db)end end +return +{recalculateSize=dd,setFrame=c_a,getFrame=function()local d_a={}for _aa,aaa in pairs(cc)do +table.insert(d_a,{aaa,dc[_aa],_d[_aa]})end +for _aa,aaa in pairs(cd)do d_a[_aa]=aaa end;return d_a,ac,bc end,getImage=function() +local d_a={}for _aa,aaa in pairs(cc)do +table.insert(d_a,{aaa,dc[_aa],_d[_aa]})end;return d_a end,setFrameData=function(d_a,_aa) +if( +_aa~=nil)then cd[d_a]=_aa else if(type(d_a)=="table")then cd=d_a end end end,setFrameImage=function(d_a) +for _aa,aaa in pairs(d_a.t)do +cc[_aa]=d_a.t[_aa]dc[_aa]=d_a.fg[_aa]_d[_aa]=d_a.bg[_aa]end end,getFrameImage=function() +return{t=cc,fg=dc,bg=_d}end,getFrameData=function(d_a)if(d_a~=nil)then return cd[d_a]else return cd end end,blit=function(d_a,_aa,aaa,baa,caa) +__a(d_a,baa,caa)b_a(_aa,baa,caa)a_a(aaa,baa,caa)end,text=__a,fg=b_a,bg=a_a,getSize=function()return +ac,bc end,setSize=function(d_a,_aa)local aaa,baa,caa={},{},{} +for _y=1,_aa do +if(cc[_y]~=nil)then aaa[_y]=ab(cc[_y],1,d_a)..bb(" ", +d_a-ac)else aaa[_y]=bb(" ",d_a)end;if(dc[_y]~=nil)then +baa[_y]=ab(dc[_y],1,d_a)..bb("0",d_a-ac)else baa[_y]=bb("0",d_a)end;if +(_d[_y]~=nil)then caa[_y]=ab(_d[_y],1,d_a)..bb("f",d_a-ac)else +caa[_y]=bb("f",d_a)end end;cc,dc,_d=aaa,baa,caa;ac,bc=d_a,_aa end}end +return +function(db)local _c={} +local ac={creator="Bimg Library by NyoriE",date=os.date("!%Y-%m-%dT%TZ")}local bc,cc=0,0;if(db~=nil)then +if(db[1][1][1]~=nil)then bc,cc=ac.width or#db[1][1][1], +ac.height or#db[1]end end;local dc={} +local function _d(cd,dd)cd=cd or#_c+1 +local __a=cb(dd,dc)table.insert(_c,cd,__a)if(dd==nil)then +_c[cd].setSize(bc,cc)end;return __a end;local function ad(cd)table.remove(_c,cd or#_c)end +local function bd(cd,dd) +local __a=_c[cd] +if(__a~=nil)then local a_a=cd+dd;if(a_a>=1)and(a_a<=#_c)then table.remove(_c,cd) +table.insert(_c,a_a,__a)end end end +dc={updateSize=function(cd,dd,__a)local a_a=__a==true and true or false +if(cd>bc)then a_a=true;bc=cd end;if(dd>cc)then a_a=true;cc=dd end +if(a_a)then for b_a,c_a in pairs(_c)do c_a.setSize(bc,cc) +c_a.recalculateSize()end end end,text=function(cd,dd,__a,a_a) +local b_a=_c[cd]if(b_a==nil)then b_a=_d(cd)end;b_a.text(dd,__a,a_a)end,fg=function(cd,dd,__a,a_a) +local b_a=_c[cd]if(b_a==nil)then b_a=_d(cd)end;b_a.fg(dd,__a,a_a)end,bg=function(cd,dd,__a,a_a) +local b_a=_c[cd]if(b_a==nil)then b_a=_d(cd)end;b_a.bg(dd,__a,a_a)end,blit=function(cd,dd,__a,a_a,b_a,c_a) +local d_a=_c[cd]if(d_a==nil)then d_a=_d(cd)end;d_a.blit(dd,__a,a_a,b_a,c_a)end,setSize=function(cd,dd) +bc=cd;cc=dd;for __a,a_a in pairs(_c)do a_a.setSize(cd,dd)end end,getFrame=function(cd)if( +_c[cd]~=nil)then return _c[cd].getFrame()end end,getFrameObjects=function()return +_c end,getFrames=function()local cd={}for dd,__a in pairs(_c)do local a_a=__a.getFrame() +table.insert(cd,a_a)end;return cd end,getFrameObject=function(cd)return +_c[cd]end,addFrame=function(cd)if(#_c<=1)then +if(ac.animated==nil)then ac.animated=true end +if(ac.secondsPerFrame==nil)then ac.secondsPerFrame=0.2 end end;return _d(cd)end,removeFrame=ad,moveFrame=bd,setFrameData=function(cd,dd,__a) +if( +_c[cd]~=nil)then _c[cd].setFrameData(dd,__a)end end,getFrameData=function(cd,dd)if(_c[cd]~=nil)then return +_c[cd].getFrameData(dd)end end,getSize=function()return +bc,cc end,setAnimation=function(cd)ac.animation=cd end,setMetadata=function(cd,dd)if(dd~=nil)then ac[cd]=dd else if( +type(cd)=="table")then ac=cd end end end,getMetadata=function(cd)if( +cd~=nil)then return ac[cd]else return ac end end,createBimg=function() +local cd={} +for dd,__a in pairs(_c)do local a_a=__a.getFrame()table.insert(cd,a_a)end;for dd,__a in pairs(ac)do cd[dd]=__a end;cd.width=bc;cd.height=cc;return cd end} +if(db~=nil)then +for cd,dd in pairs(db)do if(type(cd)=="string")then ac[cd]=dd end end +if(ac.width==nil)or(ac.height==nil)then +bc=ac.width or#db[1][1][1]cc=ac.height or#db[1]dc.updateSize(bc,cc,true)end +for cd,dd in pairs(db)do if(type(cd)=="number")then _d(cd,dd)end end else _d(1)end;return dc end end +aa["main"]=function(...)local ab=da("basaltEvent")() +local bb=da("loadObjects")local cb;local db=da("plugin")local _c=da("utils")local ac=da("basaltLogs") +local bc=_c.uuid;local cc=_c.wrapText;local dc=_c.tableCount;local _d=300;local ad=0;local bd=0;local cd={} +local dd=term.current()local __a="1.7.0" +local a_a=fs.getDir(table.pack(...)[2]or"")local b_a,c_a,d_a,_aa,aaa={},{},{},{},{}local baa,caa,daa,_ba;local aba={}if not term.isColor or +not term.isColor()then +error('Basalt requires an advanced (golden) computer to run.',0)end;local bba={} +for adb,bdb in +pairs(colors)do if(type(bdb)=="number")then +bba[adb]={dd.getPaletteColor(bdb)}end end +local function cba()_ba=false;dd.clear()dd.setCursorPos(1,1) +for adb,bdb in pairs(colors)do if(type(bdb)== +"number")then +dd.setPaletteColor(bdb,colors.packRGB(table.unpack(bba[adb])))end end end +local function dba(adb) +assert(adb~="function","Schedule needs a function in order to work!") +return function(...)local bdb=coroutine.create(adb) +local cdb,ddb=coroutine.resume(bdb,...) +if(cdb)then table.insert(aaa,bdb)else aba.basaltError(ddb)end end end;aba.log=function(...)ac(...)end +local _ca=function(adb,bdb)_aa[adb]=bdb end;local aca=function(adb)return _aa[adb]end +local bca=function()return cb end;local cca=function(adb)return bca()[adb]end;local dca=function(adb,bdb,cdb)return +cca(bdb)(cdb,adb)end +local _da={getDynamicValueEventSetting=function()return +aba.dynamicValueEvents end,getMainFrame=function()return baa end,setVariable=_ca,getVariable=aca,setMainFrame=function(adb)baa=adb end,getActiveFrame=function()return +caa end,setActiveFrame=function(adb)caa=adb end,getFocusedObject=function()return daa end,setFocusedObject=function(adb)daa=adb end,getMonitorFrame=function(adb)return +d_a[adb]or monGroups[adb][1]end,setMonitorFrame=function(adb,bdb,cdb)if( +baa==bdb)then baa=nil end;if(cdb)then monGroups[adb]={bdb,sides}else +d_a[adb]=bdb end +if(bdb==nil)then monGroups[adb]=nil end end,getTerm=function()return +dd end,schedule=dba,stop=cba,debug=aba.debug,log=aba.log,getObjects=bca,getObject=cca,createObject=dca,getDirectory=function()return a_a end} +local function ada(adb)dd.clear()dd.setBackgroundColor(colors.black) +dd.setTextColor(colors.red)local bdb,cdb=dd.getSize()if(aba.logging)then ac(adb,"Error")end;local ddb=cc( +"Basalt error: "..adb,bdb)local __c=1;for a_c,b_c in pairs(ddb)do +dd.setCursorPos(1,__c)dd.write(b_c)__c=__c+1 end;dd.setCursorPos(1, +__c+1)_ba=false end +local function bda(adb,bdb,cdb,ddb,__c) +if(#aaa>0)then local a_c={} +for n=1,#aaa do +if(aaa[n]~=nil)then +if +(coroutine.status(aaa[n])=="suspended")then +local b_c,c_c=coroutine.resume(aaa[n],adb,bdb,cdb,ddb,__c)if not(b_c)then aba.basaltError(c_c)end else +table.insert(a_c,n)end end end +for n=1,#a_c do table.remove(aaa,a_c[n]- (n-1))end end end +local function cda()if(_ba==false)then return end;if(baa~=nil)then baa:render() +baa:updateTerm()end;for adb,bdb in pairs(d_a)do bdb:render() +bdb:updateTerm()end end;local dda,__b,a_b=nil,nil,nil;local b_b=nil +local function c_b(adb,bdb,cdb,ddb)dda,__b,a_b=bdb,cdb,ddb;if(b_b==nil)then +b_b=os.startTimer(_d/1000)end end +local function d_b()b_b=nil;baa:hoverHandler(__b,a_b,dda)caa=baa end;local _ab,aab,bab=nil,nil,nil;local cab=nil;local function dab()cab=nil;baa:dragHandler(_ab,aab,bab) +caa=baa end;local function _bb(adb,bdb,cdb,ddb)_ab,aab,bab=bdb,cdb,ddb +if(ad<50)then dab()else if(cab==nil)then cab=os.startTimer( +ad/1000)end end end +local abb=nil;local function bbb()abb=nil;cda()end +local function cbb(adb)if(bd<50)then cda()else if(abb==nil)then +abb=os.startTimer(bd/1000)end end end +local function dbb(adb,...)local bdb={...}if +(ab:sendEvent("basaltEventCycle",adb,...)==false)then return end +if(adb=="terminate")then aba.stop()end +if(baa~=nil)then +local cdb={mouse_click=baa.mouseHandler,mouse_up=baa.mouseUpHandler,mouse_scroll=baa.scrollHandler,mouse_drag=_bb,mouse_move=c_b}local ddb=cdb[adb] +if(ddb~=nil)then ddb(baa,...)bda(adb,...)cbb()return end end +if(adb=="monitor_touch")then +for cdb,ddb in pairs(d_a)do if +(ddb:mouseHandler(1,bdb[2],bdb[3],true,bdb[1]))then caa=ddb end end;bda(adb,...)cbb()return end +if(caa~=nil)then +local cdb={char=caa.charHandler,key=caa.keyHandler,key_up=caa.keyUpHandler}local ddb=cdb[adb]if(ddb~=nil)then if(adb=="key")then b_a[bdb[1]]=true elseif(adb=="key_up")then +b_a[bdb[1]]=false end;ddb(caa,...)bda(adb,...) +cbb()return end end +if(adb=="timer")and(bdb[1]==b_b)then d_b()elseif +(adb=="timer")and(bdb[1]==cab)then dab()elseif(adb=="timer")and(bdb[1]==abb)then bbb()else for cdb,ddb in pairs(c_a)do +ddb:eventHandler(adb,...)end +for cdb,ddb in pairs(d_a)do ddb:eventHandler(adb,...)end;bda(adb,...)cbb()end end;local _cb=false;local acb=false +local function bcb() +if not(_cb)then +for adb,bdb in pairs(cd)do +if(fs.exists(bdb))then +if(fs.isDir(bdb))then +local cdb=fs.list(bdb) +for ddb,__c in pairs(cdb)do +if not(fs.isDir(bdb.."/"..__c))then +local a_c=__c:gsub(".lua","") +if +(a_c~="example.lua")and not(a_c:find(".disabled"))then +if(bb[a_c]==nil)then +bb[a_c]=da(bdb.."."..__c:gsub(".lua",""))else error("Duplicate object name: "..a_c)end end end end else local cdb=bdb:gsub(".lua","") +if(bb[cdb]==nil)then bb[cdb]=da(cdb)else error( +"Duplicate object name: "..cdb)end end end end;_cb=true end +if not(acb)then cb=db.loadPlugins(bb,_da)local adb=db.get("basalt") +if +(adb~=nil)then for cdb,ddb in pairs(adb)do +for __c,a_c in pairs(ddb(aba))do aba[__c]=a_c;_da[__c]=a_c end end end;local bdb=db.get("basaltInternal") +if(bdb~=nil)then for cdb,ddb in pairs(bdb)do for __c,a_c in pairs(ddb(aba))do +_da[__c]=a_c end end end;acb=true end end +local function ccb(adb)bcb() +for cdb,ddb in pairs(c_a)do if(ddb:getName()==adb)then return nil end end;local bdb=cb["BaseFrame"](adb,_da)bdb:init() +bdb:load()bdb:draw()table.insert(c_a,bdb) +if(baa==nil)and(bdb:getName()~= +"basaltDebuggingFrame")then bdb:show()end;return bdb end +aba={basaltError=ada,logging=false,dynamicValueEvents=false,drawFrames=cda,log=ac,getVersion=function()return __a end,memory=function()return +math.floor(collectgarbage("count")+0.5).."KB"end,addObject=function(adb)if +(fs.exists(adb))then table.insert(cd,adb)end end,addPlugin=function(adb) +db.addPlugin(adb)end,getAvailablePlugins=function()return db.getAvailablePlugins()end,getAvailableObjects=function() +local adb={}for bdb,cdb in pairs(bb)do table.insert(adb,bdb)end;return adb end,setVariable=_ca,getVariable=aca,getObjects=bca,getObject=cca,createObject=dca,setBaseTerm=function(adb) +dd=adb end,resetPalette=function() +for adb,bdb in pairs(colors)do if(type(bdb)=="number")then end end end,setMouseMoveThrottle=function(adb) +if(_HOST:find("CraftOS%-PC"))then if( +config.get("mouse_move_throttle")~=10)then +config.set("mouse_move_throttle",10)end +if(adb<100)then _d=100 else _d=adb end;return true end;return false end,setRenderingThrottle=function(adb)if( +adb<=0)then bd=0 else abb=nil;bd=adb end end,setMouseDragThrottle=function(adb)if +(adb<=0)then ad=0 else cab=nil;ad=adb end end,autoUpdate=function(adb)_ba=adb;if( +adb==nil)then _ba=true end;local function bdb()cda()while _ba do +dbb(os.pullEventRaw())end end +while _ba do +local cdb,ddb=xpcall(bdb,debug.traceback)if not(cdb)then aba.basaltError(ddb)end end end,update=function(adb,...) +if( +adb~=nil)then local bdb={...} +local cdb,ddb=xpcall(function()dbb(adb,table.unpack(bdb))end,debug.traceback)if not(cdb)then aba.basaltError(ddb)return end end end,stop=cba,stopUpdate=cba,isKeyDown=function(adb)if( +b_a[adb]==nil)then return false end;return b_a[adb]end,getFrame=function(adb)for bdb,cdb in +pairs(c_a)do if(cdb.name==adb)then return cdb end end end,getActiveFrame=function()return +caa end,setActiveFrame=function(adb) +if(adb:getType()=="Container")then caa=adb;return true end;return false end,getMainFrame=function()return baa end,onEvent=function(...) +for adb,bdb in +pairs(table.pack(...))do if(type(bdb)=="function")then +ab:registerEvent("basaltEventCycle",bdb)end end end,schedule=dba,addFrame=ccb,createFrame=ccb,addMonitor=function(adb) +bcb() +for cdb,ddb in pairs(c_a)do if(ddb:getName()==adb)then return nil end end;local bdb=cb["MonitorFrame"](adb,_da)bdb:init() +bdb:load()bdb:draw()table.insert(d_a,bdb)return bdb end,removeFrame=function(adb)c_a[adb]= +nil end,setProjectDir=function(adb)a_a=adb end}local dcb=db.get("basalt")if(dcb~=nil)then +for adb,bdb in pairs(dcb)do for cdb,ddb in pairs(bdb(aba))do +aba[cdb]=ddb;_da[cdb]=ddb end end end +local _db=db.get("basaltInternal")if(_db~=nil)then +for adb,bdb in pairs(_db)do for cdb,ddb in pairs(bdb(aba))do _da[cdb]=ddb end end end;return aba end;aa["objects"]={} +aa["objects"]["Dropdown"]=function(...)local ab=da("utils") +local bb=da("tHex") +return +function(cb,db)local _c=db.getObject("List")(cb,db)local ac="Dropdown" +_c:setSize(12,1)_c:setZIndex(6)local bc=true;local cc="left"local dc=0;local _d=0;local ad=0;local bd=true +local cd="\16"local dd="\31"local __a=false +local a_a={getType=function(b_a)return ac end,isType=function(b_a,c_a) +return ac==c_a or +_c.isType~=nil and _c.isType(c_a)or false end,load=function(b_a) +b_a:listenEvent("mouse_click",b_a)b_a:listenEvent("mouse_up",b_a) +b_a:listenEvent("mouse_scroll",b_a)b_a:listenEvent("mouse_drag",b_a)end,setOffset=function(b_a,c_a) +dc=c_a;b_a:updateDraw()return b_a end,getOffset=function(b_a)return dc end,addItem=function(b_a,c_a,...) +_c.addItem(b_a,c_a,...)if(bd)then _d=math.max(_d,#c_a)ad=ad+1 end;return b_a end,removeItem=function(b_a,c_a) +_c.removeItem(b_a,c_a)if(bd)then _d=0;ad=0 +for n=1,#list do _d=math.max(_d,#list[n].text)end;ad=#list end end,isOpened=function(b_a)return +__a end,setOpened=function(b_a,c_a)__a=c_a;b_a:updateDraw()return b_a end,setDropdownSize=function(b_a,c_a,d_a) +_d,ad=c_a,d_a;bd=false;b_a:updateDraw()return b_a end,setDropdownWidth=function(b_a,c_a)return +b_a:setDropdownSize(c_a,ad)end,setDropdownHeight=function(b_a,c_a) +return b_a:setDropdownSize(_d,c_a)end,getDropdownSize=function(b_a)return _d,ad end,getDropdownWidth=function(b_a)return _d end,getDropdownHeight=function(b_a)return ad end,mouseHandler=function(b_a,c_a,d_a,_aa,aaa) +if +(__a)then local caa,daa=b_a:getAbsolutePosition() +if(c_a==1)then local _ba=b_a:getAll() +if(# +_ba>0)then +for n=1,ad do +if(_ba[n+dc]~=nil)then +if +(caa<=d_a)and(caa+_d>d_a)and(daa+n==_aa)then b_a:setValue(_ba[n+dc])b_a:updateDraw() +local aba=b_a:sendEvent("mouse_click",b_a,"mouse_click",c_a,d_a,_aa)if(aba==false)then return aba end;if(aaa)then +db.schedule(function()sleep(0.1) +b_a:mouseUpHandler(c_a,d_a,_aa)end)()end;return true end end end end end end;local baa=_c:getBase() +if(baa.mouseHandler(b_a,c_a,d_a,_aa))then __a=not __a +b_a:getParent():setImportant(b_a)b_a:updateDraw()return true else +if(__a)then b_a:updateDraw()__a=false end;return false end end,mouseUpHandler=function(b_a,c_a,d_a,_aa) +if +(__a)then local aaa,baa=b_a:getAbsolutePosition() +if(c_a==1)then local caa=b_a:getAll() +if(# +caa>0)then +for n=1,ad do +if(caa[n+dc]~=nil)then +if +(aaa<=d_a)and(aaa+_d>d_a)and(baa+n==_aa)then __a=false;b_a:updateDraw() +local daa=b_a:sendEvent("mouse_up",b_a,"mouse_up",c_a,d_a,_aa)if(daa==false)then return daa end;return true end end end end end end end,dragHandler=function(b_a,c_a,d_a,_aa)if +(_c.dragHandler(b_a,c_a,d_a,_aa))then __a=true end end,scrollHandler=function(b_a,c_a,d_a,_aa) +if +(__a)then local aaa,baa=b_a:getAbsolutePosition()if +(d_a>=aaa)and(d_a<=aaa+_d)and(_aa>=baa)and(_aa<=baa+ad)then +b_a:setFocus()end end +if(__a)and(b_a:isFocused())then +local aaa,baa=b_a:getAbsolutePosition()if +(d_aaaa+_d)or(_aabaa+ad)then return false end;if(#b_a:getAll()<=ad)then return +false end;local caa=b_a:getAll()dc=dc+c_a +if(dc<0)then dc=0 end +if(c_a==1)then if(#caa>ad)then if(dc>#caa-ad)then dc=#caa-ad end else +dc=math.min(#caa-1,0)end end +local daa=b_a:sendEvent("mouse_scroll",b_a,"mouse_scroll",c_a,d_a,_aa)if(daa==false)then return daa end;b_a:updateDraw()return true end end,draw=function(b_a) +_c.draw(b_a)b_a:setDrawState("list",false) +b_a:addDraw("dropdown",function() +local c_a,d_a=b_a:getPosition()local _aa,aaa=b_a:getSize()local baa=b_a:getValue() +local caa=b_a:getAll()local daa,_ba=b_a:getBackground(),b_a:getForeground() +local aba=ab.getTextHorizontalAlign(( +baa~=nil and baa.text or""),_aa,cc):sub(1, +_aa-1).. (__a and dd or cd) +b_a:addBlit(1,1,aba,bb[_ba]:rep(#aba),bb[daa]:rep(#aba)) +if(__a)then b_a:addTextBox(1,2,_d,ad," ") +b_a:addBackgroundBox(1,2,_d,ad,daa)b_a:addForegroundBox(1,2,_d,ad,_ba) +for n=1,ad do +if(caa[n+dc]~=nil)then local bba=ab.getTextHorizontalAlign(caa[ +n+dc].text,_d,cc) +if( +caa[n+dc]==baa)then +if(bc)then local cba,dba=b_a:getSelectionColor() +b_a:addBlit(1,n+1,bba,bb[dba]:rep( +#bba),bb[cba]:rep(#bba))else +b_a:addBlit(1,n+1,bba,bb[caa[n+dc].fgCol]:rep(#bba),bb[caa[n+dc].bgCol]:rep( +#bba))end else +b_a:addBlit(1,n+1,bba,bb[caa[n+dc].fgCol]:rep(#bba),bb[caa[n+dc].bgCol]:rep( +#bba))end end end end end)end}a_a.__index=a_a;return setmetatable(a_a,_c)end end +aa["objects"]["Menubar"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("List")(cb,db)local ac="Menubar"local bc={}_c:setSize(30,1)_c:setZIndex(5)local cc=0 +local dc,_d=1,1;local ad=true +local function bd()local cd=0;local dd=_c:getWidth()local __a=_c:getAll()for n=1,#__a do cd=cd+ +__a[n].text:len()+dc*2 end;return +math.max(cd-dd,0)end +bc={init=function(cd)local dd=cd:getParent()cd:listenEvent("mouse_click") +cd:listenEvent("mouse_drag")cd:listenEvent("mouse_scroll")return _c.init(cd)end,getType=function(cd)return +ac end,getBase=function(cd)return _c end,setSpace=function(cd,dd)dc=dd or dc;cd:updateDraw() +return cd end,getSpace=function(cd)return dc end,setScrollable=function(cd,dd)ad=dd +if(dd==nil)then ad=true end;return cd end,getScrollable=function(cd)return ad end,mouseHandler=function(cd,dd,__a,a_a) +if +(_c:getBase().mouseHandler(cd,dd,__a,a_a))then local b_a,c_a=cd:getAbsolutePosition()local d_a,_aa=cd:getSize()local aaa=0 +local baa=cd:getAll() +for n=1,#baa do +if(baa[n]~=nil)then +if +(b_a+aaa<=__a+cc)and( +b_a+aaa+baa[n].text:len()+ (dc*2)>__a+cc)and(c_a==a_a)then +cd:setValue(baa[n])cd:sendEvent(event,cd,event,0,__a,a_a,baa[n])end;aaa=aaa+baa[n].text:len()+dc*2 end end;cd:updateDraw()return true end end,scrollHandler=function(cd,dd,__a,a_a) +if +(_c:getBase().scrollHandler(cd,dd,__a,a_a))then if(ad)then cc=cc+dd;if(cc<0)then cc=0 end;local b_a=bd()if(cc>b_a)then cc=b_a end +cd:updateDraw()end;return true end;return false end,draw=function(cd) +_c.draw(cd) +cd:addDraw("list",function()local dd=cd:getParent()local __a,a_a=cd:getSize()local b_a=""local c_a="" +local d_a=""local _aa,aaa=cd:getSelectionColor() +for baa,caa in pairs(cd:getAll())do +local daa= +(" "):rep(dc)..caa.text.. (" "):rep(dc)b_a=b_a..daa +if(caa==cd:getValue())then c_a=c_a.. +bb[_aa or caa.bgCol or +cd:getBackground()]:rep(daa:len())d_a=d_a.. +bb[aaa or +caa.FgCol or cd:getForeground()]:rep(daa:len())else c_a=c_a.. +bb[caa.bgCol or +cd:getBackground()]:rep(daa:len())d_a=d_a.. +bb[caa.FgCol or +cd:getForeground()]:rep(daa:len())end end +cd:addBlit(1,1,b_a:sub(cc+1,__a+cc),d_a:sub(cc+1,__a+cc),c_a:sub(cc+1,__a+cc))end)end}bc.__index=bc;return setmetatable(bc,_c)end end +aa["objects"]["Slider"]=function(...)local ab=da("tHex") +return +function(bb,cb) +local db=cb.getObject("ChangeableObject")(bb,cb)local _c="Slider"db:setSize(12,1)db:setValue(1) +db:setBackground(false,"\140",colors.black)local ac="horizontal"local bc=" "local cc=colors.black;local dc=colors.gray;local _d=12;local ad=1 +local bd=1 +local function cd(__a,a_a,b_a,c_a)local d_a,_aa=__a:getPosition()local aaa,baa=__a:getSize()local caa= +ac=="vertical"and baa or aaa +for i=0,caa do +if + +( +(ac=="vertical"and _aa+i==c_a)or(ac=="horizontal"and d_a+i==b_a))and(d_a<=b_a)and(d_a+aaa>b_a)and(_aa<=c_a)and +(_aa+baa>c_a)then ad=math.min(i+1,caa- (# +bc+bd-2)) +__a:setValue(_d/caa*ad)__a:updateDraw()end end end +local dd={getType=function(__a)return _c end,load=function(__a)__a:listenEvent("mouse_click") +__a:listenEvent("mouse_drag")__a:listenEvent("mouse_scroll")end,setSymbol=function(__a,a_a) +bc=a_a:sub(1,1)__a:updateDraw()return __a end,getSymbol=function(__a)return bc end,setIndex=function(__a,a_a) +ad=a_a;if(ad<1)then ad=1 end;local b_a,c_a=__a:getSize() +ad=math.min(ad,( +ac=="vertical"and c_a or b_a)- (bd-1)) +__a:setValue(_d/ (ac=="vertical"and c_a or b_a)*ad)__a:updateDraw()return __a end,getIndex=function(__a)return +ad end,setMaxValue=function(__a,a_a)_d=a_a;return __a end,getMaxValue=function(__a)return _d end,setSymbolColor=function(__a,a_a) +symbolColor=a_a;__a:updateDraw()return __a end,getSymbolColor=function(__a) +return symbolColor end,setBarType=function(__a,a_a)ac=a_a:lower()__a:updateDraw()return __a end,getBarType=function(__a)return +ac end,mouseHandler=function(__a,a_a,b_a,c_a)if(db.mouseHandler(__a,a_a,b_a,c_a))then cd(__a,a_a,b_a,c_a)return +true end;return false end,dragHandler=function(__a,a_a,b_a,c_a)if +(db.dragHandler(__a,a_a,b_a,c_a))then cd(__a,a_a,b_a,c_a)return true end +return false end,scrollHandler=function(__a,a_a,b_a,c_a) +if +(db.scrollHandler(__a,a_a,b_a,c_a))then local d_a,_aa=__a:getSize()ad=ad+a_a;if(ad<1)then ad=1 end +ad=math.min(ad,( +ac=="vertical"and _aa or d_a)- (bd-1)) +__a:setValue(_d/ (ac=="vertical"and _aa or d_a)*ad)__a:updateDraw()return true end;return false end,draw=function(__a) +db.draw(__a) +__a:addDraw("slider",function()local a_a,b_a=__a:getSize() +local c_a,d_a=__a:getBackground(),__a:getForeground() +if(ac=="horizontal")then __a:addText(ad,oby,bc:rep(bd)) +if(dc~=false)then __a:addBG(ad,1,ab[dc]:rep( +#bc*bd))end;if(cc~=false)then +__a:addFG(ad,1,ab[cc]:rep(#bc*bd))end end +if(ac=="vertical")then +for n=0,b_a-1 do +if(ad==n+1)then for curIndexOffset=0,math.min(bd-1,b_a)do +__a:addBlit(1,1 +n+curIndexOffset,bc,ab[symbolColor],ab[symbolColor])end else if(n+1 +ad-1 +bd)then +__a:addBlit(1,1 +n,bgSymbol,ab[d_a],ab[c_a])end end end end end)end}dd.__index=dd;return setmetatable(dd,db)end end +aa["objects"]["Flexbox"]=function(...) +local function ab(bb,cb)local db=0;local _c=0;local ac=6 +local bc={getFlexGrow=function(cc)return db end,setFlexGrow=function(cc,dc)db=dc;return cc end,getFlexShrink=function(cc)return +_c end,setFlexShrink=function(cc,dc)_c=dc;return cc end,getFlexBasis=function(cc)return ac end,setFlexBasis=function(cc,dc)ac=dc;return cc end}for cc,dc in pairs(bc)do bb[cc]=dc end;return bb end +return +function(bb,cb) +local db=cb.getObject("ScrollableFrame")(bb,cb)local _c="Flexbox"local ac="row"local bc=1;local cc="flex-start"local dc="nowrap"local _d={}local ad={} +local bd=false +local cd=ab({getHeight=function(d_a)return 0 end,getWidth=function(d_a)return 0 end,getPosition=function(d_a)return 0,0 end,getSize=function(d_a)return 0,0 end,isType=function(d_a)return +false end,getType=function(d_a)return"lineBreakFakeObject"end,setPosition=function(d_a)end,setSize=function(d_a)end}) +local function dd(d_a) +if(dc=="nowrap")then ad={}local _aa=1;local aaa=1;local baa=1 +for caa,daa in pairs(_d)do if(ad[_aa]==nil)then +ad[_aa]={offset=1}end +local _ba=ac=="row"and daa:getHeight()or daa:getWidth()if _ba>aaa then aaa=_ba end +if(daa==cd)then baa=baa+aaa+bc;aaa=1;_aa=_aa+1 +ad[_aa]={offset=baa,daa}else table.insert(ad[_aa],daa)end end elseif(dc=="wrap")then ad={}local _aa=1;local aaa=1;local baa=ac=="row"and d_a:getWidth()or +d_a:getHeight()local caa=0;local daa=1 +for _ba,aba in pairs(_d)do if( +ad[daa]==nil)then ad[daa]={offset=1}end;local bba= +ac=="row"and aba:getHeight()or aba:getWidth()if bba>_aa then +_aa=bba end +if aba==cd then aaa=aaa+_aa+bc;_aa=1;daa=daa+1 +ad[daa]={offset=aaa,aba}else +local cba=ac=="row"and aba:getWidth()or aba:getHeight() +if(cba+caa>baa)then aaa=aaa+_aa+bc;_aa=ac=="row"and aba:getHeight()or +aba:getWidth()daa=daa+1;caa=0 +ad[daa]={offset=aaa,aba}else caa=caa+cba;table.insert(ad[daa],aba)end end end end end +local function __a(d_a,_aa)local aaa,baa=d_a:getSize()local caa=0;local daa=0;local _ba=0 +for cba,dba in ipairs(_aa)do caa=caa+ +dba:getFlexGrow()daa=daa+dba:getFlexShrink()_ba=_ba+ +dba:getFlexBasis()end;local aba=aaa-_ba- (bc* (#_aa-1))local bba=1 +for cba,dba in ipairs(_aa)do +if(dba~=cd)then +local _ca;local aca=dba:getFlexGrow()local bca=dba:getFlexShrink()if caa>0 then _ca= +dba:getFlexBasis()+aca/caa*aba else +_ca=dba:getFlexBasis()end +if aba<0 and daa>0 then _ca= +dba:getFlexBasis()+bca/daa*aba end;dba:setPosition(bba,_aa.offset or 1) +dba:setSize(_ca,dba:getHeight())cb.log(_aa.offset)bba=bba+_ca+bc end end +if cc=="flex-end"then local cba=bba-bc;local dba=aaa-cba+1 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca+dba,cca)end elseif cc=="center"then local cba=bba-bc;local dba=(aaa-cba)/2 +1 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca+dba,cca)end elseif cc=="space-between"then local cba=bba-bc +local dba=(aaa-cba)/ (#_aa-1)+1 +for _ca,aca in ipairs(_aa)do if _ca>1 then local bca,cca=aca:getPosition() +aca:setPosition(bca+dba* (_ca-1),cca)end end elseif cc=="space-around"then local cba=bba-bc;local dba=(aaa-cba)/#_aa +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca+dba*_ca-dba/2,cca)end elseif cc=="space-evenly"then local cba=#_aa+1;local dba=0;for cca,dca in ipairs(_aa)do +dba=dba+dca:getWidth()end;local _ca=aaa-dba +local aca=math.floor(_ca/cba)local bca=_ca-aca*cba;bba=aca+ (bca>0 and 1 or 0)bca=bca> +0 and bca-1 or 0 +for cca,dca in ipairs(_aa)do +dca:setPosition(bba,1) +bba=bba+dca:getWidth()+aca+ (bca>0 and 1 or 0)bca=bca>0 and bca-1 or 0 end end end +local function a_a(d_a,_aa)local aaa,baa=d_a:getSize()local caa=0;local daa=0;local _ba=0 +for cba,dba in ipairs(_aa)do caa=caa+ +dba:getFlexGrow()daa=daa+dba:getFlexShrink()_ba=_ba+ +dba:getFlexBasis()end;local aba=baa-_ba- (bc* (#_aa-1))local bba=1 +for cba,dba in ipairs(_aa)do +if(dba~=cd)then +local _ca;local aca=dba:getFlexGrow()local bca=dba:getFlexShrink()if caa>0 then _ca= +dba:getFlexBasis()+aca/caa*aba else +_ca=dba:getFlexBasis()end +if aba<0 and daa>0 then _ca= +dba:getFlexBasis()+bca/daa*aba end;dba:setPosition(_aa.offset,bba) +dba:setSize(dba:getWidth(),_ca)bba=bba+_ca+bc end end +if cc=="flex-end"then local cba=bba-bc;local dba=baa-cba+1 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca,cca+dba)end elseif cc=="center"then local cba=bba-bc;local dba=(baa-cba)/2 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca,cca+dba)end elseif cc=="space-between"then local cba=bba-bc +local dba=(baa-cba)/ (#_aa-1)+1 +for _ca,aca in ipairs(_aa)do if _ca>1 then local bca,cca=aca:getPosition() +aca:setPosition(bca,cca+dba* (_ca-1))end end elseif cc=="space-around"then local cba=bba-bc;local dba=(baa-cba)/#_aa +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca,cca+dba*_ca-dba/2)end elseif cc=="space-evenly"then local cba=#_aa+1;local dba=0;for cca,dca in ipairs(_aa)do +dba=dba+dca:getHeight()end;local _ca=baa-dba +local aca=math.floor(_ca/cba)local bca=_ca-aca*cba;bba=aca+ (bca>0 and 1 or 0)bca=bca> +0 and bca-1 or 0 +for cca,dca in ipairs(_aa)do +local _da,ada=dca:getPosition()dca:setPosition(_da,bba)bba= +bba+dca:getHeight()+aca+ (bca>0 and 1 or 0)bca=bca>0 and +bca-1 or 0 end end end +local function b_a(d_a)dd(d_a) +if ac=="row"then for _aa,aaa in pairs(ad)do __a(d_a,aaa)end else for _aa,aaa in pairs(ad)do +a_a(d_a,aaa)end end;bd=false end +local c_a={getType=function()return _c end,isType=function(d_a,_aa)return +_c==_aa or db.isType~=nil and db.isType(_aa)or false end,setJustifyContent=function(d_a,_aa) +cc=_aa;bd=true;return d_a end,getJustifyContent=function(d_a)return cc end,setDirection=function(d_a,_aa)ac=_aa;bd=true;return d_a end,getDirection=function(d_a)return +ac end,setSpacing=function(d_a,_aa)bc=_aa;bd=true;return d_a end,getSpacing=function(d_a)return bc end,setFlexWrap=function(d_a,_aa) +dc=_aa;bd=true;return d_a end,updateLayout=function(d_a)bd=true end,addBreak=function(d_a) +table.insert(_d,cd)bd=true;return d_a end,draw=function(d_a)db.draw(d_a) +d_a:addDraw("flexboxDraw",function()if bd then +b_a(d_a)end end,1)end} +for d_a,_aa in pairs(cb.getObjects())do +c_a["add"..d_a]=function(aaa,baa) +local caa=ab(db["add"..d_a](aaa,baa),cb)table.insert(_d,caa)bd=true;return caa end end;c_a.__index=c_a;return setmetatable(c_a,db)end end +aa["objects"]["MovableFrame"]=function(...) +local ab,bb,cb,db=math.max,math.min,string.sub,string.rep +return +function(_c,ac)local bc=ac.getObject("Frame")(_c,ac)local cc="MovableFrame" +local dc;local _d,ad,bd=0,0,false;local cd={{x1=1,x2="width",y1=1,y2=1}} +local dd={getType=function()return cc end,setDraggingMap=function(__a,a_a) +cd=a_a;return __a end,getDraggingMap=function(__a)return cd end,isType=function(__a,a_a) +return cc==a_a or(bc.isType~=nil and +bc.isType(a_a))or false end,getBase=function(__a)return bc end,load=function(__a) +bc.load(__a)__a:listenEvent("mouse_click") +__a:listenEvent("mouse_up")__a:listenEvent("mouse_drag")end,removeChildren=function(__a) +bc.removeChildren(__a)__a:listenEvent("mouse_click") +__a:listenEvent("mouse_up")__a:listenEvent("mouse_drag")end,dragHandler=function(__a,a_a,b_a,c_a) +if +(bc.dragHandler(__a,a_a,b_a,c_a))then +if(bd)then local d_a,_aa=dc:getOffset() +d_a=d_a<0 and math.abs(d_a)or-d_a;_aa=_aa<0 and math.abs(_aa)or-_aa;local aaa=1 +local baa=1;aaa,baa=dc:getAbsolutePosition() +__a:setPosition(b_a+_d- (aaa-1)+d_a, +c_a+ad- (baa-1)+_aa)__a:updateDraw()end;return true end end,mouseHandler=function(__a,a_a,b_a,c_a,...) +if +(bc.mouseHandler(__a,a_a,b_a,c_a,...))then dc:setImportant(__a)local d_a,_aa=__a:getAbsolutePosition() +local aaa,baa=__a:getSize() +for caa,daa in pairs(cd)do local _ba,aba=daa.x1 =="width"and aaa or daa.x1,daa.x2 =="width"and +aaa or daa.x2;local bba,cba= +daa.y1 =="height"and baa or daa.y1, +daa.y2 =="height"and baa or daa.y2 +if +(b_a>= +d_a+_ba-1)and(b_a<=d_a+aba-1)and(c_a>=_aa+bba-1)and(c_a<=_aa+cba-1)then bd=true +_d=d_a-b_a;ad=_aa-c_a;return true end end;return true end end,mouseUpHandler=function(__a,...) +bd=false;return bc.mouseUpHandler(__a,...)end,setParent=function(__a,a_a,...) +bc.setParent(__a,a_a,...)dc=a_a;return __a end}dd.__index=dd;return setmetatable(dd,bc)end end +aa["objects"]["ScrollableFrame"]=function(...) +local ab,bb,cb,db=math.max,math.min,string.sub,string.rep +return +function(_c,ac)local bc=ac.getObject("Frame")(_c,ac) +local cc="ScrollableFrame"local dc;local _d=0;local ad=0;local bd=true +local function cd(b_a)local c_a=0;local d_a=b_a:getChildren() +for _aa,aaa in pairs(d_a)do +if( +aaa.element.getWidth~=nil)and(aaa.element.getX~=nil)then +local baa,caa=aaa.element:getWidth(),aaa.element:getX()local daa=b_a:getWidth() +if +(aaa.element:getType()=="Dropdown")then if(aaa.element:isOpened())then +local _ba=aaa.element:getDropdownSize() +if(_ba+caa-daa>=c_a)then c_a=ab(_ba+caa-daa,0)end end end +if(h+caa-daa>=c_a)then c_a=ab(baa+caa-daa,0)end end end;return c_a end +local function dd(b_a)local c_a=0;local d_a=b_a:getChildren() +for _aa,aaa in pairs(d_a)do +if +(aaa.element.getHeight~=nil)and(aaa.element.getY~=nil)then +local baa,caa=aaa.element:getHeight(),aaa.element:getY()local daa=b_a:getHeight() +if +(aaa.element:getType()=="Dropdown")then if(aaa.element:isOpened())then +local _ba,aba=aaa.element:getDropdownSize() +if(aba+caa-daa>=c_a)then c_a=ab(aba+caa-daa,0)end end end +if(baa+caa-daa>=c_a)then c_a=ab(baa+caa-daa,0)end end end;return c_a end +local function __a(b_a,c_a)local d_a,_aa=b_a:getOffset()local aaa +if(_d==1)then +aaa=bd and cd(b_a)or ad +b_a:setOffset(bb(aaa,ab(0,d_a+c_a)),_aa)elseif(_d==0)then aaa=bd and dd(b_a)or ad +b_a:setOffset(d_a,bb(aaa,ab(0,_aa+c_a)))end;b_a:updateDraw()end +local a_a={getType=function()return cc end,isType=function(b_a,c_a)return +cc==c_a or bc.isType~=nil and bc.isType(c_a)or false end,setDirection=function(b_a,c_a)_d= +c_a=="horizontal"and 1 or c_a=="vertical"and 0 or +_d;return b_a end,setScrollAmount=function(b_a,c_a) +ad=c_a;bd=false;return b_a end,getBase=function(b_a)return bc end,load=function(b_a)bc.load(b_a) +b_a:listenEvent("mouse_scroll")end,removeChildren=function(b_a)bc.removeChildren(b_a) +b_a:listenEvent("mouse_scroll")end,setParent=function(b_a,c_a,...)bc.setParent(b_a,c_a,...) +dc=c_a;return b_a end,scrollHandler=function(b_a,c_a,d_a,_aa) +if +(bc:getBase().scrollHandler(b_a,c_a,d_a,_aa))then b_a:sortChildren() +for aaa,baa in +ipairs(b_a:getEvents("mouse_scroll"))do +if(baa.element.scrollHandler~=nil)then local caa,daa=0,0;if(b_a.getOffset~=nil)then +caa,daa=b_a:getOffset()end +if(baa.element.getIgnoreOffset())then caa,daa=0,0 end;if(baa.element.scrollHandler(baa.element,c_a,d_a+caa,_aa+daa))then +return true end end end;__a(b_a,c_a,d_a,_aa)b_a:clearFocusedChild()return true end end,draw=function(b_a) +bc.draw(b_a) +b_a:addDraw("scrollableFrame",function()if(bd)then __a(b_a,0)end end,0)end}a_a.__index=a_a;return setmetatable(a_a,bc)end end +aa["objects"]["Switch"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("ChangeableObject")(ab,bb)local db="Switch"cb:setSize(4,1)cb:setValue(false) +cb:setZIndex(5)local _c=colors.black;local ac=colors.red;local bc=colors.green +local cc={getType=function(dc)return db end,setSymbol=function(dc,_d) +_c=_d;return dc end,getSymbol=function(dc)return _c end,setActiveBackground=function(dc,_d)bc=_d;return dc end,getActiveBackground=function(dc)return bc end,setInactiveBackground=function(dc,_d) +ac=_d;return dc end,getInactiveBackground=function(dc)return ac end,load=function(dc) +dc:listenEvent("mouse_click")end,mouseHandler=function(dc,...) +if(cb.mouseHandler(dc,...))then +dc:setValue(not dc:getValue())dc:updateDraw()return true end end,draw=function(dc)cb.draw(dc) +dc:addDraw("switch",function() +local _d=dc:getParent()local ad,bd=dc:getBackground(),dc:getForeground() +local cd,dd=dc:getSize() +if(dc:getValue())then dc:addBackgroundBox(1,1,cd,dd,bc) +dc:addBackgroundBox(cd,1,1,dd,_c)else dc:addBackgroundBox(1,1,cd,dd,ac) +dc:addBackgroundBox(1,1,1,dd,_c)end end)end}cc.__index=cc;return setmetatable(cc,cb)end end +aa["objects"]["Scrollbar"]=function(...)local ab=da("tHex") +return +function(bb,cb) +local db=cb.getObject("VisualObject")(bb,cb)local _c="Scrollbar"db:setZIndex(2)db:setSize(1,8) +db:setBackground(colors.lightGray,"\127",colors.gray)local ac="vertical"local bc=" "local cc=colors.black;local dc=colors.black;local _d=3;local ad=1 +local bd=1;local cd=true +local function dd()local b_a,c_a=db:getSize()if(cd)then +bd=math.max((ac=="vertical"and c_a or +b_a- (#bc))- (_d-1),1)end end;dd() +local function __a(b_a,c_a,d_a,_aa)local aaa,baa=b_a:getAbsolutePosition() +local caa,daa=b_a:getSize()dd()local _ba=ac=="vertical"and daa or caa +for i=0,_ba do +if + +( ( +ac=="vertical"and baa+i==_aa)or(ac=="horizontal"and aaa+i==d_a))and(aaa<=d_a)and(aaa+caa>d_a)and(baa<=_aa)and +(baa+daa>_aa)then ad=math.min(i+1, +_ba- (#bc+bd-2)) +b_a:scrollbarMoveHandler()b_a:updateDraw()end end end +local a_a={getType=function(b_a)return _c end,load=function(b_a)db.load(b_a)local c_a=b_a:getParent() +b_a:listenEvent("mouse_click")b_a:listenEvent("mouse_up") +b_a:listenEvent("mouse_scroll")b_a:listenEvent("mouse_drag")end,setSymbol=function(b_a,c_a,d_a,_aa) +bc=c_a:sub(1,1)cc=d_a or cc;dc=_aa or dc;dd()b_a:updateDraw()return b_a end,setSymbolBG=function(b_a,c_a)return b_a:setSymbol(bc,c_a, +nil)end,setSymbolFG=function(b_a,c_a)return +b_a:setSymbol(bc,nil,c_a)end,getSymbol=function(b_a)return bc end,getSymbolBG=function(b_a)return cc end,getSymbolFG=function(b_a)return +dc end,setIndex=function(b_a,c_a)ad=c_a;if(ad<1)then ad=1 end;local d_a,_aa=b_a:getSize()dd() +b_a:updateDraw()return b_a end,setScrollAmount=function(b_a,c_a)_d=c_a;dd() +b_a:updateDraw()return b_a end,getScrollAmount=function(b_a)return _d end,getIndex=function(b_a) +local c_a,d_a=b_a:getSize()return +_d> (ac=="vertical"and d_a or c_a)and +math.floor(_d/ ( +ac=="vertical"and d_a or c_a)*ad)or ad end,setSymbolSize=function(b_a,c_a)bd= +tonumber(c_a)or 1;cd=c_a~=false and false or true +dd()b_a:updateDraw()return b_a end,getSymbolSize=function(b_a)return +bd end,setBarType=function(b_a,c_a)ac=c_a:lower()dd()b_a:updateDraw()return b_a end,getBarType=function(b_a)return +ac end,mouseHandler=function(b_a,c_a,d_a,_aa,...)if(db.mouseHandler(b_a,c_a,d_a,_aa,...))then +__a(b_a,c_a,d_a,_aa)return true end;return false end,dragHandler=function(b_a,c_a,d_a,_aa)if +(db.dragHandler(b_a,c_a,d_a,_aa))then __a(b_a,c_a,d_a,_aa)return true end;return +false end,setSize=function(b_a,...) +db.setSize(b_a,...)dd()return b_a end,scrollHandler=function(b_a,c_a,d_a,_aa) +if(db.scrollHandler(b_a,c_a,d_a,_aa))then +local aaa,baa=b_a:getSize()dd()ad=ad+c_a;if(ad<1)then ad=1 end +ad=math.min(ad, +(ac=="vertical"and baa or aaa)- (ac=="vertical"and bd-1 or#bc+bd-2))b_a:scrollbarMoveHandler()b_a:updateDraw()end end,onChange=function(b_a,...) +for c_a,d_a in +pairs(table.pack(...))do if(type(d_a)=="function")then +b_a:registerEvent("scrollbar_moved",d_a)end end;return b_a end,scrollbarMoveHandler=function(b_a) +b_a:sendEvent("scrollbar_moved",b_a:getIndex())end,customEventHandler=function(b_a,c_a,...) +db.customEventHandler(b_a,c_a,...)if(c_a=="basalt_FrameResize")then dd()end end,draw=function(b_a) +db.draw(b_a) +b_a:addDraw("scrollbar",function()local c_a=b_a:getParent()local d_a,_aa=b_a:getSize() +local aaa,baa=b_a:getBackground(),b_a:getForeground() +if(ac=="horizontal")then for n=0,_aa-1 do +b_a:addBlit(ad,1 +n,bc:rep(bd),ab[dc]:rep(#bc*bd),ab[cc]:rep( +#bc*bd))end elseif(ac=="vertical")then +for n=0,_aa-1 do +if(ad==n+1)then +for curIndexOffset=0,math.min( +bd-1,_aa)do +b_a:addBlit(1,ad+curIndexOffset,bc:rep(math.max(#bc,d_a)),ab[dc]:rep(math.max( +#bc,d_a)),ab[cc]:rep(math.max(#bc,d_a)))end end end end end)end}a_a.__index=a_a;return setmetatable(a_a,db)end end +aa["objects"]["Radio"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("List")(cb,db)local ac="Radio"_c:setSize(1,1)_c:setZIndex(5)local bc={} +local cc=colors.black;local dc=colors.green;local _d=colors.black;local ad=colors.red;local bd=true;local cd="\7" +local dd="left" +local __a={getType=function(a_a)return ac end,addItem=function(a_a,b_a,c_a,d_a,_aa,aaa,...)_c.addItem(a_a,b_a,_aa,aaa,...)table.insert(bc,{x=c_a or 1,y= +d_a or#bc*2}) +return a_a end,removeItem=function(a_a,b_a) +_c.removeItem(a_a,b_a)table.remove(bc,b_a)return a_a end,clear=function(a_a) +_c.clear(a_a)bc={}return a_a end,editItem=function(a_a,b_a,c_a,d_a,_aa,aaa,baa,...) +_c.editItem(a_a,b_a,c_a,aaa,baa,...)table.remove(bc,b_a) +table.insert(bc,b_a,{x=d_a or 1,y=_aa or 1})return a_a end,setBoxSelectionColor=function(a_a,b_a,c_a) +cc=b_a;dc=c_a;return a_a end,setBoxSelectionBG=function(a_a,b_a) +return a_a:setBoxSelectionColor(b_a,dc)end,setBoxSelectionFG=function(a_a,b_a) +return a_a:setBoxSelectionColor(cc,b_a)end,getBoxSelectionColor=function(a_a)return cc,dc end,getBoxSelectionBG=function(a_a)return cc end,getBoxSelectionFG=function(a_a) +return dc end,setBoxDefaultColor=function(a_a,b_a,c_a)_d=b_a;ad=c_a;return a_a end,setBoxDefaultBG=function(a_a,b_a)return +a_a:setBoxDefaultColor(b_a,ad)end,setBoxDefaultFG=function(a_a,b_a)return +a_a:setBoxDefaultColor(_d,b_a)end,getBoxDefaultColor=function(a_a)return _d,ad end,getBoxDefaultBG=function(a_a)return _d end,getBoxDefaultFG=function(a_a)return +ad end,mouseHandler=function(a_a,b_a,c_a,d_a,...) +if(#bc>0)then local _aa,aaa=a_a:getAbsolutePosition() +local baa=a_a:getAll() +for caa,daa in pairs(baa)do +if + +(_aa+bc[caa].x-1 <=c_a)and(_aa+bc[caa].x-1 + +daa.text:len()+1 >=c_a)and(aaa+bc[caa].y-1 ==d_a)then a_a:setValue(daa) +local _ba=a_a:sendEvent("mouse_click",a_a,"mouse_click",b_a,c_a,d_a,...)a_a:updateDraw()if(_ba==false)then return _ba end;return true end end end end,draw=function(a_a) +a_a:addDraw("radio",function() +local b_a,c_a=a_a:getSelectionColor()local d_a=a_a:getAll() +for _aa,aaa in pairs(d_a)do +if(aaa==a_a:getValue())then +a_a:addBlit(bc[_aa].x,bc[_aa].y,cd,bb[dc],bb[cc]) +a_a:addBlit(bc[_aa].x+2,bc[_aa].y,aaa.text,bb[c_a]:rep(#aaa.text),bb[b_a]:rep( +#aaa.text))else +a_a:addBackgroundBox(bc[_aa].x,bc[_aa].y,1,1,_d or colors.black) +a_a:addBlit(bc[_aa].x+2,bc[_aa].y,aaa.text,bb[aaa.fgCol]:rep(#aaa.text),bb[aaa.bgCol]:rep( +#aaa.text))end end;return true end)end}__a.__index=__a;return setmetatable(__a,_c)end end +aa["objects"]["MonitorFrame"]=function(...)local ab=da("basaltMon") +local bb,cb,db,_c=math.max,math.min,string.sub,string.rep +return +function(ac,bc)local cc=bc.getObject("BaseFrame")(ac,bc) +local dc="MonitorFrame"cc:setTerm(nil)local _d=false;local ad +local bd={getType=function()return dc end,isType=function(cd,dd) +return dc==dd or cc.isType~=nil and +cc.isType(dd)or false end,getBase=function(cd)return cc end,setMonitor=function(cd,dd) +if +(type(dd)=="string")then local __a=peripheral.wrap(dd) +if(__a~=nil)then cd:setTerm(__a)end elseif(type(dd)=="table")then cd:setTerm(dd)end;return cd end,setMonitorGroup=function(cd,dd) +ad=ab(dd)cd:setTerm(ad)_d=true;return cd end,render=function(cd)if(cd:getTerm()~= +nil)then cc.render(cd)end end,show=function(cd) +cc:getBase().show(cd)bc.setActiveFrame(cd) +for dd,__a in pairs(colors)do if(type(__a)=="number")then +termObject.setPaletteColor(__a,colors.packRGB(term.nativePaletteColor((__a))))end end +for dd,__a in pairs(colorTheme)do +if(type(__a)=="number")then +termObject.setPaletteColor( +type(dd)=="number"and dd or colors[dd],__a)else local a_a,b_a,c_a=table.unpack(__a) +termObject.setPaletteColor( +type(dd)=="number"and dd or colors[dd],a_a,b_a,c_a)end end;return cd end} +bd.mouseHandler=function(cd,dd,__a,a_a,b_a,c_a,...) +if(_d)then __a,a_a=ad.calculateClick(c_a,__a,a_a)end;cc.mouseHandler(cd,dd,__a,a_a,b_a,c_a,...)end;bd.__index=bd;return setmetatable(bd,cc)end end +aa["objects"]["VisualObject"]=function(...)local ab=da("utils")local bb=da("tHex") +local cb,db,_c=string.sub,string.find,table.insert +return +function(ac,bc)local cc=bc.getObject("Object")(ac,bc) +local dc="VisualObject"local _d,ad,bd,cd,dd=true,false,false,false,false;local __a=1;local a_a,b_a,c_a,d_a=1,1,1,1 +local _aa,aaa,baa,caa=0,0,0,0;local daa,_ba,aba=colors.black,colors.white,false;local bba;local cba={}local dba={}local _ca={} +local aca={} +local function bca(dca,_da)local ada={}if dca==""then return ada end;_da=_da or" "local bda=1 +local cda,dda=db(dca,_da,bda) +while cda do +_c(ada,{x=bda,value=cb(dca,bda,cda-1)})bda=dda+1;cda,dda=db(dca,_da,bda)end;_c(ada,{x=bda,value=cb(dca,bda)})return ada end +local cca={getType=function(dca)return dc end,getBase=function(dca)return cc end,isType=function(dca,_da) +return dc==_da or +cc.isType~=nil and cc.isType(_da)or false end,getBasalt=function(dca)return bc end,show=function(dca)_d=true +dca:updateDraw()return dca end,hide=function(dca)_d=false;dca:updateDraw()return dca end,isVisible=function(dca)return +_d end,setVisible=function(dca,_da)_d=_da or not _d;dca:updateDraw()return dca end,setTransparency=function(dca,_da)aba= +_da~=nil and _da or true;dca:updateDraw() +return dca end,setParent=function(dca,_da,ada) +cc.setParent(dca,_da,ada)bba=_da;return dca end,setFocus=function(dca)if(bba~=nil)then +bba:setFocusedChild(dca)end;return dca end,setZIndex=function(dca,_da)__a=_da +if +(bba~=nil)then bba:updateZIndex(dca,__a)dca:updateDraw()end;return dca end,getZIndex=function(dca)return __a end,updateDraw=function(dca)if( +bba~=nil)then bba:updateDraw()end;return dca end,setPosition=function(dca,_da,ada,bda) +local cda,dda=a_a,b_a +if(type(_da)=="number")then a_a=bda and a_a+_da or _da end +if(type(ada)=="number")then b_a=bda and b_a+ada or ada end;if(bba~=nil)then +bba:customEventHandler("basalt_FrameReposition",dca)end;if(dca:getType()=="Container")then +bba:customEventHandler("basalt_FrameReposition",dca)end;dca:updateDraw() +dca:repositionHandler(cda,dda)return dca end,getX=function(dca)return +a_a end,setX=function(dca,_da)return dca:setPosition(_da,b_a)end,getY=function(dca)return +b_a end,setY=function(dca,_da)return dca:setPosition(a_a,_da)end,getPosition=function(dca)return +a_a,b_a end,setSize=function(dca,_da,ada,bda)local cda,dda=c_a,d_a;if(type(_da)=="number")then c_a= +bda and c_a+_da or _da end;if +(type(ada)=="number")then d_a=bda and d_a+ada or ada end +if +(bba~=nil)then bba:customEventHandler("basalt_FrameResize",dca)if( +dca:getType()=="Container")then +bba:customEventHandler("basalt_FrameResize",dca)end end;dca:resizeHandler(cda,dda)dca:updateDraw()return dca end,getHeight=function(dca)return +d_a end,setHeight=function(dca,_da)return dca:setSize(c_a,_da)end,getWidth=function(dca)return +c_a end,setWidth=function(dca,_da)return dca:setSize(_da,d_a)end,getSize=function(dca)return +c_a,d_a end,setBackground=function(dca,_da)daa=_da;dca:updateDraw()return dca end,getBackground=function(dca)return +daa end,setForeground=function(dca,_da)_ba=_da or false;dca:updateDraw()return dca end,getForeground=function(dca)return +_ba end,getAbsolutePosition=function(dca,_da,ada)if(_da==nil)or(ada==nil)then +_da,ada=dca:getPosition()end +if(bba~=nil)then +local bda,cda=bba:getAbsolutePosition()_da=bda+_da-1;ada=cda+ada-1 end;return _da,ada end,ignoreOffset=function(dca,_da) +ad=_da;if(_da==nil)then ad=true end;return dca end,getIgnoreOffset=function(dca)return ad end,isCoordsInObject=function(dca,_da,ada) +if +(_d)and(dca:isEnabled())then +if(_da==nil)or(ada==nil)then return false end;local bda,cda=dca:getAbsolutePosition()local dda,__b=dca:getSize()if + +(bda<=_da)and(bda+dda>_da)and(cda<=ada)and(cda+__b>ada)then return true end end;return false end,onGetFocus=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("get_focus",ada)end end;return dca end,onLoseFocus=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("lose_focus",ada)end end;return dca end,isFocused=function(dca) +if( +bba~=nil)then return bba:getFocusedObject()==dca end;return true end,resizeHandler=function(dca,...) +if(dca:isEnabled())then +local _da=dca:sendEvent("basalt_resize",...)if(_da==false)then return false end end;return true end,repositionHandler=function(dca,...)if +(dca:isEnabled())then local _da=dca:sendEvent("basalt_reposition",...)if(_da==false)then +return false end end;return +true end,onResize=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("basalt_resize",ada)end end;return dca end,onReposition=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("basalt_reposition",ada)end end;return dca end,mouseHandler=function(dca,_da,ada,bda,cda) +if +(dca:isCoordsInObject(ada,bda))then local dda,__b=dca:getAbsolutePosition() +local a_b=dca:sendEvent("mouse_click",_da,ada- (dda-1), +bda- (__b-1),ada,bda,cda)if(a_b==false)then return false end;if(bba~=nil)then +bba:setFocusedChild(dca)end;cd=true;dd=true;_aa,aaa=ada,bda;return true end end,mouseUpHandler=function(dca,_da,ada,bda) +dd=false +if(cd)then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_release",_da,ada- (cda-1), +bda- (dda-1),ada,bda)cd=false end +if(dca:isCoordsInObject(ada,bda))then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_up",_da, +ada- (cda-1),bda- (dda-1),ada,bda)if(__b==false)then return false end;return true end end,dragHandler=function(dca,_da,ada,bda) +if +(dd)then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_drag",_da,ada- (cda-1),bda- ( +dda-1),_aa-ada,aaa-bda,ada,bda)_aa,aaa=ada,bda;if(__b~=nil)then return __b end;if(bba~=nil)then +bba:setFocusedChild(dca)end;return true end +if(dca:isCoordsInObject(ada,bda))then local cda,dda=dca:getAbsolutePosition() +_aa,aaa=ada,bda;baa,caa=cda-ada,dda-bda end end,scrollHandler=function(dca,_da,ada,bda) +if +(dca:isCoordsInObject(ada,bda))then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_scroll",_da,ada- (cda-1), +bda- (dda-1))if(__b==false)then return false end;if(bba~=nil)then +bba:setFocusedChild(dca)end;return true end end,hoverHandler=function(dca,_da,ada,bda) +if +(dca:isCoordsInObject(_da,ada))then local cda=dca:sendEvent("mouse_hover",_da,ada,bda)if(cda==false)then return +false end;bd=true;return true end +if(bd)then local cda=dca:sendEvent("mouse_leave",_da,ada,bda)if +(cda==false)then return false end;bd=false end end,keyHandler=function(dca,_da,ada)if +(dca:isEnabled())and(_d)then +if(dca:isFocused())then +local bda=dca:sendEvent("key",_da,ada)if(bda==false)then return false end;return true end end end,keyUpHandler=function(dca,_da)if +(dca:isEnabled())and(_d)then +if(dca:isFocused())then +local ada=dca:sendEvent("key_up",_da)if(ada==false)then return false end;return true end end end,charHandler=function(dca,_da)if +(dca:isEnabled())and(_d)then +if(dca:isFocused())then local ada=dca:sendEvent("char",_da)if(ada== +false)then return false end;return true end end end,getFocusHandler=function(dca) +local _da=dca:sendEvent("get_focus")if(_da~=nil)then return _da end;return true end,loseFocusHandler=function(dca) +dd=false;local _da=dca:sendEvent("lose_focus") +if(_da~=nil)then return _da end;return true end,addDraw=function(dca,_da,ada,bda,cda,dda) +local __b= +(cda==nil or cda==1)and dba or cda==2 and cba or cda==3 and _ca;bda=bda or#__b+1 +if(_da~=nil)then for b_b,c_b in pairs(__b)do if(c_b.name==_da)then +table.remove(__b,b_b)break end end +local a_b={name=_da,f=ada,pos=bda,active= +dda~=nil and dda or true}table.insert(__b,bda,a_b)end;dca:updateDraw()return dca end,addPreDraw=function(dca,_da,ada,bda,cda) +dca:addDraw(_da,ada,bda,2)return dca end,addPostDraw=function(dca,_da,ada,bda,cda) +dca:addDraw(_da,ada,bda,3)return dca end,setDrawState=function(dca,_da,ada,bda) +local cda= +(bda==nil or bda==1)and dba or bda==2 and cba or bda==3 and _ca +for dda,__b in pairs(cda)do if(__b.name==_da)then __b.active=ada;break end end;dca:updateDraw()return dca end,getDrawId=function(dca,_da,ada)local bda= + +ada==1 and dba or ada==2 and cba or ada==3 and _ca or dba;for cda,dda in pairs(bda)do if( +dda.name==_da)then return cda end end end,addText=function(dca,_da,ada,bda)local cda= +dca:getParent()or dca;local dda,__b=dca:getPosition()if(bba~=nil)then +local b_b,c_b=bba:getOffset()dda=ad and dda or dda-b_b +__b=ad and __b or __b-c_b end +if not(aba)then cda:setText(_da+dda-1, +ada+__b-1,bda)return end;local a_b=bca(bda,"\0") +for b_b,c_b in pairs(a_b)do if +(c_b.value~="")and(c_b.value~="\0")then +cda:setText(_da+c_b.x+dda-2,ada+__b-1,c_b.value)end end end,addBG=function(dca,_da,ada,bda,cda)local dda= +bba or dca;local __b,a_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()__b=ad and __b or __b-c_b +a_b=ad and a_b or a_b-d_b end +if not(aba)then dda:setBG(_da+__b-1, +ada+a_b-1,bda)return end;local b_b=bca(bda) +for c_b,d_b in pairs(b_b)do +if(d_b.value~="")and(d_b.value~=" ")then +if(cda~= +true)then +dda:setText(_da+d_b.x+__b-2,ada+a_b-1,(" "):rep(#d_b.value)) +dda:setBG(_da+d_b.x+__b-2,ada+a_b-1,d_b.value)else +table.insert(aca,{x=_da+d_b.x-1,y=ada,bg=d_b.value})dda:setBG(_da+__b-1,ada+a_b-1,fg)end end end end,addFG=function(dca,_da,ada,bda)local cda= +bba or dca;local dda,__b=dca:getPosition()if(bba~=nil)then +local b_b,c_b=bba:getOffset()dda=ad and dda or dda-b_b +__b=ad and __b or __b-c_b end +if not(aba)then cda:setFG(_da+dda-1, +ada+__b-1,bda)return end;local a_b=bca(bda) +for b_b,c_b in pairs(a_b)do if(c_b.value~="")and(c_b.value~=" ")then +cda:setFG( +_da+c_b.x+dda-2,ada+__b-1,c_b.value)end end end,addBlit=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local aab,bab=bba:getOffset()a_b=ad and a_b or a_b-aab +b_b=ad and b_b or b_b-bab end +if not(aba)then __b:blit(_da+a_b-1, +ada+b_b-1,bda,cda,dda)return end;local c_b=bca(bda,"\0")local d_b=bca(cda)local _ab=bca(dda) +for aab,bab in pairs(c_b)do if +(bab.value~="")or(bab.value~="\0")then +__b:setText(_da+bab.x+a_b-2,ada+b_b-1,bab.value)end end;for aab,bab in pairs(_ab)do +if(bab.value~="")or(bab.value~=" ")then __b:setBG( +_da+bab.x+a_b-2,ada+b_b-1,bab.value)end end;for aab,bab in pairs(d_b)do +if( +bab.value~="")or(bab.value~=" ")then __b:setFG(_da+bab.x+a_b-2,ada+ +b_b-1,bab.value)end end end,addTextBox=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()a_b=ad and a_b or a_b-c_b +b_b=ad and b_b or b_b-d_b end;__b:drawTextBox(_da+a_b-1, +ada+b_b-1,bda,cda,dda)end,addForegroundBox=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()a_b=ad and a_b or a_b-c_b +b_b=ad and b_b or b_b-d_b end;__b:drawForegroundBox(_da+a_b-1, +ada+b_b-1,bda,cda,dda)end,addBackgroundBox=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()a_b=ad and a_b or a_b-c_b +b_b=ad and b_b or b_b-d_b end;__b:drawBackgroundBox(_da+a_b-1, +ada+b_b-1,bda,cda,dda)end,render=function(dca)if +(_d)then dca:redraw()end end,redraw=function(dca)for _da,ada in pairs(cba)do if(ada.active)then +ada.f(dca)end end;for _da,ada in pairs(dba)do if(ada.active)then +ada.f(dca)end end;for _da,ada in pairs(_ca)do if(ada.active)then +ada.f(dca)end end;return true end,draw=function(dca) +dca:addDraw("base",function() +local _da,ada=dca:getSize()if(daa~=false)then dca:addTextBox(1,1,_da,ada," ") +dca:addBackgroundBox(1,1,_da,ada,daa)end;if(_ba~=false)then +dca:addForegroundBox(1,1,_da,ada,_ba)end end,1)end}cca.__index=cca;return setmetatable(cca,cc)end end +aa["objects"]["Treeview"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="Treeview"local bc={}local cc=colors.black;local dc=colors.lightGray;local _d=true +local ad="left"local bd,cd=0,0;local dd=true;_c:setSize(16,8)_c:setZIndex(5) +local function __a(c_a,d_a) +c_a=c_a or""d_a=d_a or false;local _aa=false;local aaa=nil;local baa={}local caa={}local daa +caa={getChildren=function()return baa end,setParent=function(_ba)if( +aaa~=nil)then +aaa.removeChild(aaa.findChildrenByText(caa.getText()))end;aaa=_ba;_c:updateDraw()return caa end,getParent=function()return +aaa end,addChild=function(_ba,aba)local bba=__a(_ba,aba)bba.setParent(caa) +table.insert(baa,bba)_c:updateDraw()return bba end,setExpanded=function(_ba)if +(d_a)then _aa=_ba end;_c:updateDraw()return caa end,isExpanded=function()return +_aa end,onSelect=function(...)for _ba,aba in pairs(table.pack(...))do if(type(aba)=="function")then +daa=aba end end;return caa end,callOnSelect=function()if( +daa~=nil)then daa(caa)end end,setExpandable=function(_ba)_ba=_ba +_c:updateDraw()return caa end,isExpandable=function()return d_a end,removeChild=function(_ba) +if(type(_ba)=="table")then for aba,bba in +pairs(_ba)do if(bba==_ba)then _ba=aba;break end end end;table.remove(baa,_ba)_c:updateDraw()return caa end,findChildrenByText=function(_ba) +local aba={} +for bba,cba in ipairs(baa)do if string.find(cba.getText(),_ba)then +table.insert(aba,cba)end end;return aba end,getText=function()return +c_a end,setText=function(_ba)c_a=_ba;_c:updateDraw()return caa end}return caa end;local a_a=__a("Root",true)a_a.setExpanded(true) +local b_a={init=function(c_a) +local d_a=c_a:getParent()c_a:listenEvent("mouse_click") +c_a:listenEvent("mouse_scroll")return _c.init(c_a)end,getBase=function(c_a)return +_c end,getType=function(c_a)return ac end,isType=function(c_a,d_a) +return ac==d_a or +_c.isType~=nil and _c.isType(d_a)or false end,setOffset=function(c_a,d_a,_aa)bd=d_a;cd=_aa;return c_a end,setXOffset=function(c_a,d_a)return +c_a:setOffset(d_a,cd)end,setYOffset=function(c_a,d_a)return c_a:setOffset(bd,d_a)end,getOffset=function(c_a)return +bd,cd end,getXOffset=function(c_a)return bd end,getYOffset=function(c_a)return cd end,setScrollable=function(c_a,d_a)dd=d_a;return c_a end,getScrollable=function(c_a,d_a)return +dd end,setSelectionColor=function(c_a,d_a,_aa,aaa)cc=d_a or c_a:getBackground()dc=_aa or +c_a:getForeground()_d=aaa~=nil and aaa or true +c_a:updateDraw()return c_a end,setSelectionBG=function(c_a,d_a)return c_a:setSelectionColor(d_a, +nil,_d)end,setSelectionFG=function(c_a,d_a)return c_a:setSelectionColor( +nil,d_a,_d)end,getSelectionColor=function(c_a) +return cc,dc end,getSelectionBG=function(c_a)return cc end,getSelectionFG=function(c_a)return dc end,isSelectionColorActive=function(c_a)return _d end,getRoot=function(c_a) +return a_a end,setRoot=function(c_a,d_a)a_a=d_a;d_a.setParent(nil)return c_a end,onSelect=function(c_a,...) +for d_a,_aa in +pairs(table.pack(...))do if(type(_aa)=="function")then +c_a:registerEvent("treeview_select",_aa)end end;return c_a end,selectionHandler=function(c_a,d_a) +d_a.callOnSelect(d_a)c_a:sendEvent("treeview_select",d_a)return c_a end,mouseHandler=function(c_a,d_a,_aa,aaa) +if +_c.mouseHandler(c_a,d_a,_aa,aaa)then local baa=1 -cd;local caa,daa=c_a:getAbsolutePosition() +local _ba,aba=c_a:getSize() +local function bba(cba,dba) +if aaa==daa+baa-1 then +if _aa>=caa and _aa=1 then local daa=0 +local function _ba(aba,bba) +daa=daa+1;if aba.isExpanded()then +for cba,dba in ipairs(aba.getChildren())do _ba(dba,bba+1)end end end;for aba,bba in ipairs(a_a.getChildren())do _ba(bba,1)end +if +daa>caa then if cd>daa-caa then cd=daa-caa end else cd=cd-1 end end;c_a:updateDraw()end;return true end;return false end,draw=function(c_a) +_c.draw(c_a) +c_a:addDraw("treeview",function()local d_a=1 -cd;local _aa=c_a:getValue() +local function aaa(baa,caa) +local daa,_ba=c_a:getSize() +if d_a>=1 and d_a<=_ba then +local aba=(baa==_aa)and cc or c_a:getBackground() +local bba=(baa==_aa)and dc or c_a:getForeground()local cba=baa.getText() +c_a:addBlit(1 +caa+bd,d_a,cba,bb[bba]:rep(#cba),bb[aba]:rep( +#cba))end;d_a=d_a+1;if baa.isExpanded()then for aba,bba in ipairs(baa.getChildren())do +aaa(bba,caa+1)end end end;for baa,caa in ipairs(a_a.getChildren())do aaa(caa,1)end end)end}b_a.__index=b_a;return setmetatable(b_a,_c)end end +aa["objects"]["Thread"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("Object")(ab,bb)local db="Thread"local _c;local ac;local bc=false;local cc +local dc={getType=function(_d)return db end,start=function(_d,ad)if(ad==nil)then +error("Function provided to thread is nil")end;_c=ad;ac=coroutine.create(_c) +bc=true;cc=nil;local bd,cd=coroutine.resume(ac)cc=cd;if not(bd)then +if(cd~="Terminated")then error( +"Thread Error Occurred - "..cd)end end +_d:listenEvent("mouse_click")_d:listenEvent("mouse_up") +_d:listenEvent("mouse_scroll")_d:listenEvent("mouse_drag")_d:listenEvent("key") +_d:listenEvent("key_up")_d:listenEvent("char") +_d:listenEvent("other_event")return _d end,getStatus=function(_d,ad)if( +ac~=nil)then return coroutine.status(ac)end;return nil end,stop=function(_d,ad) +bc=false;_d:listenEvent("mouse_click",false) +_d:listenEvent("mouse_up",false)_d:listenEvent("mouse_scroll",false) +_d:listenEvent("mouse_drag",false)_d:listenEvent("key",false) +_d:listenEvent("key_up",false)_d:listenEvent("char",false) +_d:listenEvent("other_event",false)return _d end,mouseHandler=function(_d,...) +_d:eventHandler("mouse_click",...)end,mouseUpHandler=function(_d,...)_d:eventHandler("mouse_up",...)end,mouseScrollHandler=function(_d,...) +_d:eventHandler("mouse_scroll",...)end,mouseDragHandler=function(_d,...) +_d:eventHandler("mouse_drag",...)end,mouseMoveHandler=function(_d,...) +_d:eventHandler("mouse_move",...)end,keyHandler=function(_d,...)_d:eventHandler("key",...)end,keyUpHandler=function(_d,...) +_d:eventHandler("key_up",...)end,charHandler=function(_d,...)_d:eventHandler("char",...)end,eventHandler=function(_d,ad,...) +cb.eventHandler(_d,ad,...) +if(bc)then +if(coroutine.status(ac)=="suspended")then if(cc~=nil)then +if(ad~=cc)then return end;cc=nil end +local bd,cd=coroutine.resume(ac,ad,...)cc=cd;if not(bd)then if(cd~="Terminated")then +error("Thread Error Occurred - "..cd)end end else +_d:stop()end end end}dc.__index=dc;return setmetatable(dc,cb)end end +aa["objects"]["Object"]=function(...)local ab=da("basaltEvent") +local bb=da("utils")local cb=bb.uuid;local db,_c=table.unpack,string.sub +return +function(ac,bc)ac=ac or cb() +assert(bc~=nil, +"Unable to find basalt instance! ID: "..ac)local cc="Object"local dc,_d=true,false;local ad=ab()local bd={}local cd={}local dd +local __a={init=function(a_a) +if(_d)then return false end;_d=true;return true end,load=function(a_a)end,getType=function(a_a)return cc end,isType=function(a_a,b_a)return cc== +b_a end,getProperty=function(a_a,b_a) +local c_a=a_a["get"..b_a:gsub("^%l",string.upper)]if(c_a~=nil)then return c_a(a_a)end end,setProperty=function(a_a,b_a,...) +local c_a=a_a[ +"set"..b_a:gsub("^%l",string.upper)]if(c_a~=nil)then return c_a(a_a,...)end end,getName=function(a_a)return +ac end,getParent=function(a_a)return dd end,setParent=function(a_a,b_a,c_a)if(c_a)then dd=b_a;return a_a end +if(b_a.getType~= +nil and b_a:isType("Container"))then a_a:remove() +b_a:addChild(a_a)if(a_a.show)then a_a:show()end;dd=b_a end;return a_a end,updateEvents=function(a_a)for b_a,c_a in +pairs(cd)do dd:removeEvent(b_a,a_a) +if(c_a)then dd:addEvent(b_a,a_a)end end;return a_a end,listenEvent=function(a_a,b_a,c_a)if( +dd~=nil)then +if(c_a)or(c_a==nil)then cd[b_a]=true;dd:addEvent(b_a,a_a)elseif +(c_a==false)then cd[b_a]=false;dd:removeEvent(b_a,a_a)end end +return a_a end,getZIndex=function(a_a)return +1 end,enable=function(a_a)dc=true;return a_a end,disable=function(a_a)dc=false;return a_a end,isEnabled=function(a_a)return +dc end,remove=function(a_a)if(dd~=nil)then dd:removeChild(a_a)end +a_a:updateDraw()return a_a end,getBaseFrame=function(a_a)if(dd~=nil)then +return dd:getBaseFrame()end;return a_a end,onEvent=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("other_event",c_a)end end;return a_a end,getEventSystem=function(a_a)return +ad end,getRegisteredEvents=function(a_a)return bd end,registerEvent=function(a_a,b_a,c_a) +if(dd~=nil)then dd:addEvent(b_a,a_a)end;ad:registerEvent(b_a,c_a) +if(bd[b_a]==nil)then bd[b_a]={}end;table.insert(bd[b_a],c_a)end,removeEvent=function(a_a,b_a,c_a)if( +ad:getEventCount(b_a)<1)then +if(dd~=nil)then dd:removeEvent(b_a,a_a)end end;ad:removeEvent(b_a,c_a)if( +bd[b_a]~=nil)then table.remove(bd[b_a],c_a)if(#bd[b_a]==0)then +bd[b_a]=nil end end end,eventHandler=function(a_a,b_a,...) +local c_a=a_a:sendEvent("other_event",b_a,...)if(c_a~=nil)then return c_a end end,customEventHandler=function(a_a,b_a,...) +local c_a=a_a:sendEvent("custom_event",b_a,...)if(c_a~=nil)then return c_a end;return true end,sendEvent=function(a_a,b_a,...)if( +b_a=="other_event")or(b_a=="custom_event")then return +ad:sendEvent(b_a,a_a,...)end;return +ad:sendEvent(b_a,a_a,b_a,...)end,onClick=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_click",c_a)end end;return a_a end,onClickUp=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("mouse_up",c_a)end end;return a_a end,onRelease=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_release",c_a)end end;return a_a end,onScroll=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_scroll",c_a)end end;return a_a end,onHover=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_hover",c_a)end end;return a_a end,onLeave=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_leave",c_a)end end;return a_a end,onDrag=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_drag",c_a)end end;return a_a end,onKey=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("key",c_a)end end;return a_a end,onChar=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("char",c_a)end end;return a_a end,onKeyUp=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("key_up",c_a)end end;return a_a end}__a.__index=__a;return __a end end +aa["objects"]["Image"]=function(...)local ab=da("images")local bb=da("bimg") +local cb,db,_c,ac=table.unpack,string.sub,math.max,math.min +return +function(bc,cc)local dc=cc.getObject("VisualObject")(bc,cc) +local _d="Image"local ad=bb()local bd=ad.getFrameObject(1)local cd;local dd;local __a=1;local a_a=false;local b_a +local c_a=false;local d_a=true;local _aa,aaa=0,0;dc:setSize(24,8)dc:setZIndex(2) +local function baa(_ba)local aba={} +for dba,_ca in +pairs(colors)do if(type(_ca)=="number")then +aba[dba]={term.nativePaletteColor(_ca)}end end;local bba=ad.getMetadata("palette")if(bba~=nil)then for dba,_ca in pairs(bba)do +aba[dba]=tonumber(_ca)end end +local cba=ad.getFrameData("palette")cc.log(cba)if(cba~=nil)then +for dba,_ca in pairs(cba)do aba[dba]=tonumber(_ca)end end;return aba end;local function caa() +if(d_a)then if(ad~=nil)then dc:setSize(ad.getSize())end end end +local daa={getType=function(_ba)return _d end,isType=function(_ba,aba)return +_d==aba or +dc.isType~=nil and dc.isType(aba)or false end,setOffset=function(_ba,aba,bba,cba) +if(cba)then _aa=_aa+ +aba or 0;aaa=aaa+bba or 0 else _aa=aba or _aa;aaa=bba or aaa end;_ba:updateDraw()return _ba end,setXOffset=function(_ba,aba)return _ba:setOffset(_ba,aba, +nil)end,setYOffset=function(_ba,aba)return +_ba:setOffset(_ba,nil,aba)end,setSize=function(_ba,aba,bba)dc:setSize(aba,bba) +d_a=false;return _ba end,getOffset=function(_ba)return _aa,aaa end,getXOffset=function(_ba)return _aa end,getYOffset=function(_ba)return +aaa end,selectFrame=function(_ba,aba)if(ad.getFrameObject(aba)==nil)then +ad.addFrame(aba)end;bd=ad.getFrameObject(aba) +dd=bd.getImage(aba)__a=aba;_ba:updateDraw()end,addFrame=function(_ba,aba) +ad.addFrame(aba)return _ba end,getFrame=function(_ba,aba)return ad.getFrame(aba)end,getFrameObject=function(_ba,aba)return +ad.getFrameObject(aba)end,removeFrame=function(_ba,aba)ad.removeFrame(aba)return _ba end,moveFrame=function(_ba,aba,bba) +ad.moveFrame(aba,bba)return _ba end,getFrames=function(_ba)return ad.getFrames()end,getFrameCount=function(_ba)return +#ad.getFrames()end,getActiveFrame=function(_ba)return __a end,loadImage=function(_ba,aba)if +(fs.exists(aba))then local bba=ab.loadBIMG(aba)ad=bb(bba)__a=1 +bd=ad.getFrameObject(1)cd=ad.createBimg()dd=bd.getImage()caa() +_ba:updateDraw()end;return +_ba end,setPath=function(_ba,aba)return +_ba:loadImage(aba)end,setImage=function(_ba,aba)if(type(aba)=="table")then ad=bb(aba)__a=1 +bd=ad.getFrameObject(1)cd=ad.createBimg()dd=bd.getImage()caa() +_ba:updateDraw()end;return _ba end,clear=function(_ba) +ad=bb()bd=ad.getFrameObject(1)dd=nil;_ba:updateDraw()return _ba end,getImage=function(_ba)return +ad.createBimg()end,getImageFrame=function(_ba,aba)return bd.getImage(aba)end,usePalette=function(_ba,aba)c_a= +aba~=nil and aba or true;return _ba end,getUsePalette=function(_ba)return +c_a end,setUsePalette=function(_ba,aba)return _ba:usePalette(aba)end,play=function(_ba,aba) +if +(ad.getMetadata("animated"))then +local bba= +ad.getMetadata("duration")or ad.getMetadata("secondsPerFrame")or 0.2;_ba:listenEvent("other_event") +b_a=os.startTimer(bba)a_a=aba or false end;return _ba end,setPlay=function(_ba,aba)return +_ba:play(aba)end,stop=function(_ba)os.cancelTimer(b_a)b_a=nil;a_a=false +return _ba end,eventHandler=function(_ba,aba,bba,...) +dc.eventHandler(_ba,aba,bba,...) +if(aba=="timer")then +if(bba==b_a)then +if(ad.getFrame(__a+1)~=nil)then __a=__a+1 +_ba:selectFrame(__a) +local cba= +ad.getFrameData(__a,"duration")or ad.getMetadata("secondsPerFrame")or 0.2;b_a=os.startTimer(cba)else +if(a_a)then __a=1;_ba:selectFrame(__a) +local cba= +ad.getFrameData(__a,"duration")or ad.getMetadata("secondsPerFrame")or 0.2;b_a=os.startTimer(cba)end end;_ba:updateDraw()end end end,setMetadata=function(_ba,aba,bba) +ad.setMetadata(aba,bba)return _ba end,getMetadata=function(_ba,aba)return ad.getMetadata(aba)end,getFrameMetadata=function(_ba,aba,bba)return +ad.getFrameData(aba,bba)end,setFrameMetadata=function(_ba,aba,bba,cba) +ad.setFrameData(aba,bba,cba)return _ba end,blit=function(_ba,aba,bba,cba,dba,_ca)x=dba or x;y=_ca or y +bd.blit(aba,bba,cba,x,y)dd=bd.getImage()_ba:updateDraw()return _ba end,setText=function(_ba,aba,bba,cba)x= +bba or x;y=cba or y;bd.text(aba,x,y)dd=bd.getImage() +_ba:updateDraw()return _ba end,setBg=function(_ba,aba,bba,cba)x=bba or x;y= +cba or y;bd.bg(aba,x,y)dd=bd.getImage() +_ba:updateDraw()return _ba end,setFg=function(_ba,aba,bba,cba)x=bba or x +y=cba or y;bd.fg(aba,x,y)dd=bd.getImage()_ba:updateDraw()return _ba end,getImageSize=function(_ba)return +ad.getSize()end,setImageSize=function(_ba,aba,bba)ad.setSize(aba,bba) +dd=bd.getImage()_ba:updateDraw()return _ba end,resizeImage=function(_ba,aba,bba) +local cba=ab.resizeBIMG(cd,aba,bba)ad=bb(cba)__a=1;bd=ad.getFrameObject(1)dd=bd.getImage() +_ba:updateDraw()return _ba end,draw=function(_ba) +dc.draw(_ba) +_ba:addDraw("image",function()local aba,bba=_ba:getSize()local cba,dba=_ba:getPosition() +local _ca,aca=_ba:getParent():getSize()local bca,cca=_ba:getParent():getOffset() +if +(cba-bca>_ca)or(dba-cca>aca)or(cba-bca+aba<1)or(dba- +cca+bba<1)then return end +if(c_a)then _ba:getParent():setPalette(baa(__a))end +if(dd~=nil)then +for dca,_da in pairs(dd)do +if(dca+aaa<=bba)and(dca+aaa>=1)then +local ada,bda,cda=_da[1],_da[2],_da[3]local dda=_c(1 -_aa,1)local __b=ac(aba-_aa,#ada) +ada=db(ada,dda,__b)bda=db(bda,dda,__b)cda=db(cda,dda,__b) +_ba:addBlit(_c(1 +_aa,1),dca+aaa,ada,bda,cda)end end end end)end}daa.__index=daa;return setmetatable(daa,dc)end end +aa["objects"]["Button"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("VisualObject")(cb,db)local ac="Button"local bc="center"local cc="center"local dc="Button"_c:setSize(12,3) +_c:setZIndex(5) +local _d={getType=function(ad)return ac end,isType=function(ad,bd)return +ac==bd or _c.isType~=nil and _c.isType(bd)or false end,getBase=function(ad)return +_c end,getHorizontalAlign=function(ad)return bc end,setHorizontalAlign=function(ad,bd)bc=bd;ad:updateDraw()return ad end,getVerticalAlign=function(ad)return +cc end,setVerticalAlign=function(ad,bd)cc=bd;ad:updateDraw()return ad end,getText=function(ad) +return dc end,setText=function(ad,bd)dc=bd;ad:updateDraw()return ad end,draw=function(ad) +_c.draw(ad) +ad:addDraw("button",function()local bd,cd=ad:getSize() +local dd=ab.getTextVerticalAlign(cd,cc)local __a +if(bc=="center")then +__a=math.floor((bd-dc:len())/2)elseif(bc=="right")then __a=bd-dc:len()end;ad:addText(__a+1,dd,dc) +ad:addFG(__a+1,dd,bb[ad:getForeground()or colors.white]:rep(dc:len()))end)end}_d.__index=_d;return setmetatable(_d,_c)end end +aa["objects"]["Input"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="Input"local bc="text"local cc=0;_c:setZIndex(5)_c:setValue("") +_c:setSize(12,1)local dc=1;local _d=1;local ad=""local bd=colors.black;local cd=colors.lightGray;local dd=ad +local __a=false +local a_a={load=function(b_a)b_a:listenEvent("mouse_click") +b_a:listenEvent("key")b_a:listenEvent("char") +b_a:listenEvent("other_event")b_a:listenEvent("mouse_drag")end,getType=function(b_a)return +ac end,isType=function(b_a,c_a)return +ac==c_a or _c.isType~=nil and _c.isType(c_a)or false end,setDefaultFG=function(b_a,c_a)return b_a:setDefaultText(b_a,ad,c_a, +nil)end,setDefaultBG=function(b_a,c_a)return b_a:setDefaultText(b_a,ad, +nil,c_a)end,setDefaultText=function(b_a,c_a,d_a,_aa) +ad=c_a;cd=d_a or cd;bd=_aa or bd;if(b_a:isFocused())then dd=""else dd=ad end +b_a:updateDraw()return b_a end,getDefaultText=function(b_a)return ad,cd, +bd end,setOffset=function(b_a,c_a)_d=c_a;b_a:updateDraw()return b_a end,getOffset=function(b_a)return +_d end,setTextOffset=function(b_a,c_a)dc=c_a;b_a:updateDraw()return b_a end,getTextOffset=function(b_a)return +dc end,setInputType=function(b_a,c_a)bc=c_a;b_a:updateDraw()return b_a end,getInputType=function(b_a)return +bc end,setValue=function(b_a,c_a)_c.setValue(b_a,tostring(c_a)) +if not(__a)then dc= +tostring(c_a):len()+1 +_d=math.max(1,dc-b_a:getWidth()+1) +if(b_a:isFocused())then local d_a=b_a:getParent() +local _aa,aaa=b_a:getPosition() +d_a:setCursor(true,_aa+dc-_d,aaa+math.floor(b_a:getHeight()/2),b_a:getForeground())end end;b_a:updateDraw()return b_a end,getValue=function(b_a) +local c_a=_c.getValue(b_a) +return bc=="number"and tonumber(c_a)or c_a end,setInputLimit=function(b_a,c_a) +cc=tonumber(c_a)or cc;b_a:updateDraw()return b_a end,getInputLimit=function(b_a)return cc end,getFocusHandler=function(b_a) +_c.getFocusHandler(b_a)local c_a=b_a:getParent() +if(c_a~=nil)then local d_a,_aa=b_a:getPosition()dd=""if(ad~= +"")then b_a:updateDraw()end +c_a:setCursor(true,d_a+dc-_d,_aa+math.max(math.ceil( +b_a:getHeight()/2 -1,1)),b_a:getForeground())end end,loseFocusHandler=function(b_a) +_c.loseFocusHandler(b_a)local c_a=b_a:getParent()dd=ad +if(ad~="")then b_a:updateDraw()end;c_a:setCursor(false)end,keyHandler=function(b_a,c_a) +if +(_c.keyHandler(b_a,c_a))then local d_a,_aa=b_a:getSize()local aaa=b_a:getParent()__a=true +if +(c_a==keys.backspace)then local _ba=tostring(_c.getValue()) +if(dc>1)then b_a:setValue(_ba:sub(1,dc-2).. +_ba:sub(dc,_ba:len()))dc=math.max( +dc-1,1)if(dc<_d)then _d=math.max(_d-1,1)end end end +if(c_a==keys.enter)then aaa:clearFocusedChild(b_a)end +if(c_a==keys.right)then +local _ba=tostring(_c.getValue()):len()dc=dc+1;if(dc>_ba)then dc=_ba+1 end;dc=math.max(dc,1)if(dc<_d)or +(dc>=d_a+_d)then _d=dc-d_a+1 end;_d=math.max(_d,1)end;if(c_a==keys.left)then dc=dc-1;if(dc>=1)then +if(dc<_d)or(dc>=d_a+_d)then _d=dc end end;dc=math.max(dc,1) +_d=math.max(_d,1)end +local baa,caa=b_a:getPosition()local daa=tostring(_c.getValue())b_a:updateDraw() +__a=false;return true end end,charHandler=function(b_a,c_a) +if +(_c.charHandler(b_a,c_a))then __a=true;local d_a,_aa=b_a:getSize()local aaa=_c.getValue() +if( +aaa:len()0)then +if( +tonumber(_c.getValue())==nil)then b_a:setValue(_ba)dc=dc-1 end end end else +b_a:setValue(aaa:sub(1,dc-1)..c_a..aaa:sub(dc,aaa:len()))dc=dc+1 end;if(dc>=d_a+_d)then _d=_d+1 end end;local baa,caa=b_a:getPosition() +local daa=tostring(_c.getValue())__a=false;b_a:updateDraw()return true end end,mouseHandler=function(b_a,c_a,d_a,_aa) +if +(_c.mouseHandler(b_a,c_a,d_a,_aa))then local aaa=b_a:getParent()local baa,caa=b_a:getPosition() +local daa,_ba=b_a:getAbsolutePosition(baa,caa)local aba,bba=b_a:getSize()dc=d_a-daa+_d;local cba=_c.getValue()if(dc> +cba:len())then dc=cba:len()+1 end;if(dc<_d)then _d=dc-1 +if(_d<1)then _d=1 end end +aaa:setCursor(true,baa+dc-_d,caa+ +math.max(math.ceil(bba/2 -1,1)),b_a:getForeground())return true end end,dragHandler=function(b_a,c_a,d_a,_aa,aaa,baa) +if +(b_a:isFocused())then if(b_a:isCoordsInObject(d_a,_aa))then +if(_c.dragHandler(b_a,c_a,d_a,_aa,aaa,baa))then return true end end +local caa=b_a:getParent()caa:clearFocusedChild()end end,draw=function(b_a) +_c.draw(b_a) +b_a:addDraw("input",function()local c_a=b_a:getParent()local d_a,_aa=b_a:getPosition() +local aaa,baa=b_a:getSize()local caa=ab.getTextVerticalAlign(baa,textVerticalAlign) +local daa=tostring(_c.getValue())local _ba=b_a:getBackground()local aba=b_a:getForeground()local bba;if( +daa:len()<=0)then bba=dd;_ba=bd or _ba;aba=cd or aba end +bba=dd;if(daa~="")then bba=daa end;bba=bba:sub(_d,aaa+_d-1)local cba=aaa- +bba:len()if(cba<0)then cba=0 end +if +(bc=="password")and(daa~="")then bba=string.rep("*",bba:len())end;bba=bba..string.rep(" ",cba) +b_a:addBlit(1,caa,bba,bb[aba]:rep(bba:len()),bb[_ba]:rep(bba:len()))if(b_a:isFocused())then +c_a:setCursor(true,d_a+dc-_d,_aa+ +math.floor(b_a:getHeight()/2),b_a:getForeground())end end)end}a_a.__index=a_a;return setmetatable(a_a,_c)end end +aa["objects"]["Textfield"]=function(...)local ab=da("tHex") +local bb,cb,db,_c,ac=string.rep,string.find,string.gmatch,string.sub,string.len +return +function(bc,cc) +local dc=cc.getObject("ChangeableObject")(bc,cc)local _d="Textfield"local ad,bd,cd,dd=1,1,1,1;local __a={""}local a_a={""}local b_a={""}local c_a={}local d_a={} +local _aa,aaa,baa,caa;local daa,_ba=colors.lightBlue,colors.black;dc:setSize(30,12) +dc:setZIndex(5) +local function aba()if +(_aa~=nil)and(aaa~=nil)and(baa~=nil)and(caa~=nil)then return true end;return false end +local function bba()local cca,dca,_da,ada=_aa,aaa,baa,caa +if aba()then +if _aaaaa and baa>=caa then +cca=aaa;dca=_aa;if baa>caa then _da=caa;ada=baa else _da=baa;ada=caa end elseif baa>caa then +cca=aaa;dca=_aa;_da=caa;ada=baa end;return cca,dca,_da,ada end end +local function cba(cca)local dca,_da,ada,bda=bba(cca)local cda=__a[ada]local dda=__a[bda] +__a[ada]= +cda:sub(1,dca-1)..dda:sub(_da+1,dda:len())a_a[ada]=a_a[ada]:sub(1,dca-1).. +a_a[bda]:sub(_da+1,a_a[bda]:len()) +b_a[ada]=b_a[ada]:sub(1, +dca-1)..b_a[bda]:sub(_da+1,b_a[bda]:len()) +for i=bda,ada+1,-1 do if i~=ada then table.remove(__a,i)table.remove(a_a,i) +table.remove(b_a,i)end end;cd,dd=dca,ada;_aa,aaa,baa,caa=nil,nil,nil,nil;return cca end +local function dba(cca,dca)local _da={} +if(cca:len()>0)then +for ada in db(cca,dca)do local bda,cda=cb(cca,ada) +if +(bda~=nil)and(cda~=nil)then table.insert(_da,bda)table.insert(_da,cda) +local dda=_c(cca,1,(bda-1))local __b=_c(cca,cda+1,cca:len())cca=dda.. (":"):rep(ada:len()).. +__b end end end;return _da end +local function _ca(cca,dca)dca=dca or dd +local _da=ab[cca:getForeground()]:rep(b_a[dca]:len()) +local ada=ab[cca:getBackground()]:rep(a_a[dca]:len()) +for bda,cda in pairs(d_a)do local dda=dba(__a[dca],cda[1]) +if(#dda>0)then +for x=1,#dda/2 do +local __b=x*2 -1;if(cda[2]~=nil)then +_da=_da:sub(1,dda[__b]-1)..ab[cda[2]]:rep(dda[__b+1]- ( +dda[__b]-1)).. +_da:sub(dda[__b+1]+1,_da:len())end;if +(cda[3]~=nil)then +ada=ada:sub(1,dda[__b]-1).. + +ab[cda[3]]:rep(dda[__b+1]- (dda[__b]-1))..ada:sub(dda[__b+1]+1,ada:len())end end end end +for bda,cda in pairs(c_a)do +for dda,__b in pairs(cda)do local a_b=dba(__a[dca],__b) +if(#a_b>0)then for x=1,#a_b/2 do +local b_b=x*2 -1 +_da=_da:sub(1,a_b[b_b]-1).. + +ab[bda]:rep(a_b[b_b+1]- (a_b[b_b]-1)).._da:sub(a_b[b_b+1]+1,_da:len())end end end end;b_a[dca]=_da;a_a[dca]=ada;cca:updateDraw()end;local function aca(cca)for n=1,#__a do _ca(cca,n)end end +local bca={getType=function(cca)return _d end,setBackground=function(cca,dca) +dc.setBackground(cca,dca)aca(cca)return cca end,setForeground=function(cca,dca) +dc.setForeground(cca,dca)aca(cca)return cca end,setSelection=function(cca,dca,_da)_ba=dca or _ba +daa=_da or daa;return cca end,setSelectionFG=function(cca,dca) +return cca:setSelection(dca,nil)end,setSelectionBG=function(cca,dca)return cca:setSelection(nil,dca)end,getSelection=function(cca)return +_ba,daa end,getSelectionFG=function(cca)return _ba end,getSelectionBG=function(cca)return daa end,getLines=function(cca)return __a end,getLine=function(cca,dca)return +__a[dca]end,editLine=function(cca,dca,_da)__a[dca]=_da or __a[dca] +_ca(cca,dca)cca:updateDraw()return cca end,clear=function(cca) +__a={""}a_a={""}b_a={""}_aa,aaa,baa,caa=nil,nil,nil,nil;ad,bd,cd,dd=1,1,1,1 +cca:updateDraw()return cca end,addLine=function(cca,dca,_da) +if(dca~=nil)then +local ada=cca:getBackground()local bda=cca:getForeground() +if(#__a==1)and(__a[1]=="")then +__a[1]=dca;a_a[1]=ab[ada]:rep(dca:len()) +b_a[1]=ab[bda]:rep(dca:len())_ca(cca,1)return cca end +if(_da~=nil)then table.insert(__a,_da,dca) +table.insert(a_a,_da,ab[ada]:rep(dca:len())) +table.insert(b_a,_da,ab[bda]:rep(dca:len()))else table.insert(__a,dca) +table.insert(a_a,ab[ada]:rep(dca:len())) +table.insert(b_a,ab[bda]:rep(dca:len()))end end;_ca(cca,_da or#__a)cca:updateDraw()return cca end,addKeywords=function(cca,dca,_da)if( +c_a[dca]==nil)then c_a[dca]={}end;for ada,bda in pairs(_da)do +table.insert(c_a[dca],bda)end;cca:updateDraw()return cca end,addRule=function(cca,dca,_da,ada) +table.insert(d_a,{dca,_da,ada})cca:updateDraw()return cca end,editRule=function(cca,dca,_da,ada)for bda,cda in +pairs(d_a)do +if(cda[1]==dca)then d_a[bda][2]=_da;d_a[bda][3]=ada end end;cca:updateDraw()return cca end,removeRule=function(cca,dca) +for _da,ada in +pairs(d_a)do if(ada[1]==dca)then table.remove(d_a,_da)end end;cca:updateDraw()return cca end,setKeywords=function(cca,dca,_da) +c_a[dca]=_da;cca:updateDraw()return cca end,removeLine=function(cca,dca) +if(#__a>1)then table.remove(__a, +dca or#__a) +table.remove(a_a,dca or#a_a)table.remove(b_a,dca or#b_a)else __a={""}a_a={""}b_a={""}end;cca:updateDraw()return cca end,getTextCursor=function(cca)return +cd,dd end,getOffset=function(cca)return bd,ad end,setOffset=function(cca,dca,_da)bd=dca or bd;ad=_da or ad +cca:updateDraw()return cca end,getXOffset=function(cca,dca)return bd end,setXOffset=function(cca,dca)return +cca:setOffset(dca,nil)end,getYOffset=function(cca,dca)return ad end,setYOffset=function(cca,dca)return +cca:setOffset(nil,dca)end,getFocusHandler=function(cca)dc.getFocusHandler(cca) +local dca,_da=cca:getPosition() +cca:getParent():setCursor(true,dca+cd-bd,_da+dd-ad,cca:getForeground())end,loseFocusHandler=function(cca) +dc.loseFocusHandler(cca)cca:getParent():setCursor(false)end,keyHandler=function(cca,dca) +if +(dc.keyHandler(cca,event,dca))then local _da=cca:getParent()local ada,bda=cca:getPosition() +local cda,dda=cca:getSize() +if(dca==keys.backspace)then +if(aba())then cba(cca)else +if(__a[dd]=="")then +if(dd>1)then +table.remove(__a,dd)table.remove(b_a,dd)table.remove(a_a,dd)cd= +__a[dd-1]:len()+1;bd=cd-cda+1;if(bd<1)then bd=1 end;dd=dd-1 end elseif(cd<=1)then +if(dd>1)then cd=__a[dd-1]:len()+1;bd=cd-cda+1;if(bd<1)then +bd=1 end;__a[dd-1]=__a[dd-1]..__a[dd]b_a[dd-1]= +b_a[dd-1]..b_a[dd] +a_a[dd-1]=a_a[dd-1]..a_a[dd]table.remove(__a,dd)table.remove(b_a,dd) +table.remove(a_a,dd)dd=dd-1 end else __a[dd]=__a[dd]:sub(1,cd-2).. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]= +b_a[dd]:sub(1,cd-2)..b_a[dd]:sub(cd,b_a[dd]:len())a_a[dd]=a_a[dd]:sub(1,cd-2).. +a_a[dd]:sub(cd,a_a[dd]:len()) +if(cd>1)then cd=cd-1 end;if(bd>1)then if(cd +__a[dd]:len())then if(__a[dd+1]~=nil)then __a[dd]=__a[dd]..__a[dd+1]table.remove(__a, +dd+1)table.remove(a_a,dd+1) +table.remove(b_a,dd+1)end else +__a[dd]=__a[dd]:sub(1, +cd-1)..__a[dd]:sub(cd+1,__a[dd]:len())b_a[dd]=b_a[dd]:sub(1,cd-1).. +b_a[dd]:sub(cd+1,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1, +cd-1)..a_a[dd]:sub(cd+1,a_a[dd]:len())end end;_ca(cca)elseif(dca==keys.enter)then if(aba())then cba(cca)end +table.insert(__a,dd+1,__a[dd]:sub(cd,__a[dd]:len())) +table.insert(b_a,dd+1,b_a[dd]:sub(cd,b_a[dd]:len())) +table.insert(a_a,dd+1,a_a[dd]:sub(cd,a_a[dd]:len()))__a[dd]=__a[dd]:sub(1,cd-1) +b_a[dd]=b_a[dd]:sub(1,cd-1)a_a[dd]=a_a[dd]:sub(1,cd-1)dd=dd+1;cd=1;bd=1;if(dd-ad>=dda)then +ad=ad+1 end;cca:setValue("")elseif(dca==keys.up)then +_aa,baa,aaa,caa=nil,nil,nil,nil +if(dd>1)then dd=dd-1;if(cd>__a[dd]:len()+1)then +cd=__a[dd]:len()+1 end;if(bd>1)then +if(cd1)then if(dd +__a[dd]:len()+1)then cd=__a[dd]:len()+1 end +if(bd>1)then if(cd=ad+dda)then ad=ad+1 end end elseif(dca==keys.right)then _aa,baa,aaa,caa=nil,nil,nil,nil;cd=cd+1 +if(dd<#__a)then if(cd> +__a[dd]:len()+1)then cd=1;dd=dd+1 end elseif +(cd>__a[dd]:len())then cd=__a[dd]:len()+1 end;if(cd<1)then cd=1 end +if(cd=cda+bd)then bd=cd-cda+1 end;if(bd<1)then bd=1 end elseif(dca==keys.left)then _aa,baa,aaa,caa=nil,nil,nil,nil;cd=cd-1 +if(cd>=1)then if( +cd=cda+bd)then bd=cd end end;if(dd>1)then +if(cd<1)then dd=dd-1;cd=__a[dd]:len()+1;bd=cd-cda+1 end end;if(cd<1)then cd=1 end;if(bd<1)then bd=1 end elseif(dca== +keys.tab)then +if(cd%3 ==0)then +__a[dd]=__a[dd]:sub(1,cd-1).." ".. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]=b_a[dd]:sub(1,cd-1)..ab[cca:getForeground()].. +b_a[dd]:sub(cd,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1,cd-1)..ab[cca:getBackground()].. +a_a[dd]:sub(cd,a_a[dd]:len())cd=cd+1 end +while cd%3 ~=0 do +__a[dd]=__a[dd]:sub(1,cd-1).." ".. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]=b_a[dd]:sub(1,cd-1)..ab[cca:getForeground()].. +b_a[dd]:sub(cd,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1,cd-1)..ab[cca:getBackground()].. +a_a[dd]:sub(cd,a_a[dd]:len())cd=cd+1 end end +if not +( (ada+cd-bd>=ada and ada+cd-bd=bda and bda+dd-adcca:getX()+ +cda-1)then __b=cca:getX()+cda-1 end;local a_b=(dd-ad=cda+bd)then bd=bd+1 end;_ca(cca) +cca:setValue("") +if not +( (ada+cd-bd>=ada and ada+cd-bd=bda and bda+dd-adcca:getX()+ +cda-1)then __b=cca:getX()+cda-1 end;local a_b=(dd-ad_da-cda+bd then cd=_da-cda+bd;dd=ada-dda+ +ad;if cd>__a[dd]:len()then +cd=__a[dd]:len()+1 end;aaa=cd;caa=dd +if cd#__a- (c_b-1))then +ad=#__a- (c_b-1)end;if(ad<1)then ad=1 end +if(cda+cd-bd>=cda and cda+cd-bd< +cda+b_b)and +(a_b+dd-ad>=a_b and a_b+dd-ad__a[dd]:len())then +cd=__a[dd]:len()+1;_aa=cd end +if(cd__a[caa]:len())then aaa=__a[caa]:len()+1 end +if(_aa==aaa)and(baa==caa)then _aa,aaa,baa,caa=nil,nil,nil,nil end;cca:updateDraw()end;return true end end,eventHandler=function(cca,dca,_da,ada,bda,cda) +if +(dc.eventHandler(cca,dca,_da,ada,bda,cda))then +if(dca=="paste")then +if(cca:isFocused())then local dda=cca:getParent() +local __b,a_b=cca:getForeground(),cca:getBackground()local b_b,c_b=cca:getSize() +__a[dd]=__a[dd]:sub(1,cd-1).._da.. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]=b_a[dd]:sub(1,cd-1)..ab[__b]:rep(_da:len()).. +b_a[dd]:sub(cd,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1,cd-1)..ab[a_b]:rep(_da:len()).. +a_a[dd]:sub(cd,a_a[dd]:len())cd=cd+_da:len()if(cd>=b_b+bd)then bd=(cd+1)-b_b end +local d_b,_ab=cca:getPosition() +dda:setCursor(true,d_b+cd-bd,_ab+dd-ad,__b)_ca(cca)cca:updateDraw()end end end end,draw=function(cca) +dc.draw(cca) +cca:addDraw("textfield",function()local dca=cca:getParent()local _da,ada=cca:getPosition() +local bda,cda=cca:getSize()local dda=ab[cca:getBackground()] +local __b=ab[cca:getForeground()] +for n=1,cda do local a_b=""local b_b=""local c_b=""if __a[n+ad-1]then a_b=__a[n+ad-1] +c_b=b_a[n+ad-1]b_b=a_a[n+ad-1]end +a_b=_c(a_b,bd,bda+bd-1)b_b=bb(dda,bda)c_b=bb(__b,bda)cca:addText(1,n,a_b) +cca:addBG(1,n,b_b)cca:addFG(1,n,c_b)cca:addBlit(1,n,a_b,c_b,b_b)end +if _aa and aaa and baa and caa then local a_b,b_b,c_b,d_b=bba(cca) +for n=c_b,d_b do +local _ab=#__a[n]local aab=0 +if n==c_b and n==d_b then aab=a_b-1 +_ab=_ab- (a_b-1)- (_ab-b_b)elseif n==d_b then _ab=_ab- (_ab-b_b)elseif n==c_b then _ab=_ab- (a_b-1)aab=a_b-1 end;cca:addBG(1 +aab,n,bb(ab[daa],_ab)) +cca:addFG(1 +aab,n,bb(ab[_ba],_ab))end end end)end,load=function(cca) +cca:listenEvent("mouse_click")cca:listenEvent("mouse_up") +cca:listenEvent("mouse_scroll")cca:listenEvent("mouse_drag") +cca:listenEvent("key")cca:listenEvent("char") +cca:listenEvent("other_event")end}bca.__index=bca;return setmetatable(bca,dc)end end +aa["objects"]["Progressbar"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("ChangeableObject")(ab,bb)local db="Progressbar"local _c=0;cb:setZIndex(5)cb:setValue(false) +cb:setSize(25,3)local ac=colors.black;local bc=""local cc=colors.white;local dc=""local _d=0 +local ad={getType=function(bd)return db end,setDirection=function(bd,cd) +_d=cd;bd:updateDraw()return bd end,getDirection=function(bd)return _d end,setProgressBar=function(bd,cd,dd,__a) +ac=cd or ac;bc=dd or bc;cc=__a or cc;bd:updateDraw()return bd end,getProgressBar=function(bd)return +ac,bc,cc end,setActiveBarColor=function(bd,cd)return bd:setProgressBar(cd,nil,nil)end,getActiveBarColor=function(bd)return +ac end,setActiveBarSymbol=function(bd,cd)return bd:setProgressBar(nil,cd,nil)end,getActiveBarSymbol=function(bd)return +bc end,setActiveBarSymbolColor=function(bd,cd)return bd:setProgressBar(nil,nil,cd)end,getActiveBarSymbolColor=function(bd)return +cc end,setBackgroundSymbol=function(bd,cd)dc=cd:sub(1,1)bd:updateDraw()return bd end,getBackgroundSymbol=function(bd)return +dc end,setProgress=function(bd,cd) +if(cd>=0)and(cd<=100)and(_c~=cd)then _c=cd +bd:setValue(_c)if(_c==100)then bd:progressDoneHandler()end end;bd:updateDraw()return bd end,getProgress=function(bd)return +_c end,onProgressDone=function(bd,cd)bd:registerEvent("progress_done",cd) +return bd end,progressDoneHandler=function(bd) +bd:sendEvent("progress_done")end,draw=function(bd)cb.draw(bd) +bd:addDraw("progressbar",function() +local cd,dd=bd:getPosition()local __a,a_a=bd:getSize() +local b_a,c_a=bd:getBackground(),bd:getForeground() +if(b_a~=false)then bd:addBackgroundBox(1,1,__a,a_a,b_a)end;if(dc~="")then bd:addTextBox(1,1,__a,a_a,dc)end +if +(c_a~=false)then bd:addForegroundBox(1,1,__a,a_a,c_a)end +if(_d==1)then bd:addBackgroundBox(1,1,__a,a_a/100 *_c,ac)bd:addForegroundBox(1,1,__a, +a_a/100 *_c,cc) +bd:addTextBox(1,1,__a,a_a/100 *_c,bc)elseif(_d==3)then +bd:addBackgroundBox(1,1 +math.ceil(a_a-a_a/100 *_c),__a, +a_a/100 *_c,ac) +bd:addForegroundBox(1,1 +math.ceil(a_a-a_a/100 *_c),__a, +a_a/100 *_c,cc) +bd:addTextBox(1,1 +math.ceil(a_a-a_a/100 *_c),__a,a_a/100 *_c,bc)elseif(_d==2)then +bd:addBackgroundBox(1 +math.ceil(__a-__a/100 *_c),1,__a/ +100 *_c,a_a,ac) +bd:addForegroundBox(1 +math.ceil(__a-__a/100 *_c),1,__a/100 *_c,a_a,cc) +bd:addTextBox(1 +math.ceil(__a-__a/100 *_c),1,__a/100 *_c,a_a,bc)else +bd:addBackgroundBox(1,1,math.ceil(__a/100 *_c),a_a,ac) +bd:addForegroundBox(1,1,math.ceil(__a/100 *_c),a_a,cc) +bd:addTextBox(1,1,math.ceil(__a/100 *_c),a_a,bc)end end)end}ad.__index=ad;return setmetatable(ad,cb)end end +aa["objects"]["Timer"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("Object")(ab,bb)local db="Timer"local _c=0;local ac=0;local bc=0;local cc;local dc=false +local _d={getType=function(ad)return db end,setTime=function(ad,bd,cd)_c=bd or 0 +ac=cd or 1;return ad end,getTime=function(ad)return _c end,start=function(ad)if(dc)then +os.cancelTimer(cc)end;bc=ac;cc=os.startTimer(_c)dc=true +ad:listenEvent("other_event")return ad end,isActive=function(ad)return dc end,cancel=function(ad)if( +cc~=nil)then os.cancelTimer(cc)end;dc=false +ad:removeEvent("other_event")return ad end,setStart=function(ad,bd)if(bd==true)then +return ad:start()else return ad:cancel()end end,onCall=function(ad,bd) +ad:registerEvent("timed_event",bd)return ad end,eventHandler=function(ad,bd,...)cb.eventHandler(ad,bd,...) +if +bd=="timer"and tObj==cc and dc then +ad:sendEvent("timed_event")if(bc>=1)then bc=bc-1;if(bc>=1)then cc=os.startTimer(_c)end elseif(bc==-1)then +cc=os.startTimer(_c)end end end}_d.__index=_d;return setmetatable(_d,cb)end end +aa["objects"]["Program"]=function(...)local ab=da("tHex")local bb=da("process") +local cb=string.sub +return +function(db,_c)local ac=_c.getObject("VisualObject")(db,_c) +local bc="Program"local cc;local dc;local _d={} +local function ad(_aa,aaa,baa,caa)local daa,_ba=1,1;local aba,bba=colors.black,colors.white;local cba=false +local dba=false;local _ca={}local aca={}local bca={}local cca={}local dca;local _da={}for i=0,15 do local cab=2 ^i +cca[cab]={_c.getTerm().getPaletteColour(cab)}end;local function ada()dca=(" "):rep(baa) +for n=0,15 do +local cab=2 ^n;local dab=ab[cab]_da[cab]=dab:rep(baa)end end +local function bda()ada()local cab=dca +local dab=_da[colors.white]local _bb=_da[colors.black] +for n=1,caa do +_ca[n]=cb(_ca[n]==nil and cab or _ca[n]..cab:sub(1, +baa-_ca[n]:len()),1,baa) +bca[n]=cb(bca[n]==nil and dab or bca[n].. +dab:sub(1,baa-bca[n]:len()),1,baa) +aca[n]=cb(aca[n]==nil and _bb or aca[n].. +_bb:sub(1,baa-aca[n]:len()),1,baa)end;ac.updateDraw(ac)end;bda()local function cda()if +daa>=1 and _ba>=1 and daa<=baa and _ba<=caa then else end end +local function dda(cab,dab,_bb)if + +_ba<1 or _ba>caa or daa<1 or daa+#cab-1 >baa then return end +_ca[_ba]=cb(_ca[_ba],1,daa-1)..cab..cb(_ca[_ba], +daa+#cab,baa)bca[_ba]=cb(bca[_ba],1,daa-1).. +dab..cb(bca[_ba],daa+#cab,baa) +aca[_ba]= +cb(aca[_ba],1,daa-1).._bb..cb(aca[_ba],daa+#cab,baa)daa=daa+#cab;if dba then cda()end;cc:updateDraw()end +local function __b(cab,dab,_bb) +if(_bb~=nil)then local abb=_ca[dab]if(abb~=nil)then +_ca[dab]=cb(abb:sub(1,cab-1).._bb..abb:sub(cab+ +(_bb:len()),baa),1,baa)end end;cc:updateDraw()end +local function a_b(cab,dab,_bb) +if(_bb~=nil)then local abb=aca[dab]if(abb~=nil)then +aca[dab]=cb(abb:sub(1,cab-1).._bb..abb:sub(cab+ +(_bb:len()),baa),1,baa)end end;cc:updateDraw()end +local function b_b(cab,dab,_bb) +if(_bb~=nil)then local abb=bca[dab]if(abb~=nil)then +bca[dab]=cb(abb:sub(1,cab-1).._bb..abb:sub(cab+ +(_bb:len()),baa),1,baa)end end;cc:updateDraw()end +local c_b=function(cab) +if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)elseif ab[cab]==nil then +error("Invalid color (got "..cab..")",2)end;bba=cab end +local d_b=function(cab) +if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)elseif ab[cab]==nil then +error("Invalid color (got "..cab..")",2)end;aba=cab end +local _ab=function(cab,dab,_bb,abb)if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)end +if ab[cab]==nil then error("Invalid color (got ".. +cab..")",2)end;local bbb +if +type(dab)=="number"and _bb==nil and abb==nil then bbb={colours.rgb8(dab)}cca[cab]=bbb else if +type(dab)~="number"then +error("bad argument #2 (expected number, got "..type(dab)..")",2)end;if type(_bb)~="number"then +error( +"bad argument #3 (expected number, got "..type(_bb)..")",2)end;if type(abb)~="number"then +error( +"bad argument #4 (expected number, got "..type(abb)..")",2)end;bbb=cca[cab]bbb[1]=dab +bbb[2]=_bb;bbb[3]=abb end end +local aab=function(cab)if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)end +if ab[cab]==nil then error("Invalid color (got ".. +cab..")",2)end;local dab=cca[cab]return dab[1],dab[2],dab[3]end +local bab={setCursorPos=function(cab,dab)if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)end;if type(dab)~="number"then +error( +"bad argument #2 (expected number, got "..type(dab)..")",2)end;daa=math.floor(cab) +_ba=math.floor(dab)if(dba)then cda()end end,getCursorPos=function()return +daa,_ba end,setCursorBlink=function(cab)if type(cab)~="boolean"then +error("bad argument #1 (expected boolean, got ".. +type(cab)..")",2)end;cba=cab end,getCursorBlink=function()return +cba end,getPaletteColor=aab,getPaletteColour=aab,setBackgroundColor=d_b,setBackgroundColour=d_b,setTextColor=c_b,setTextColour=c_b,setPaletteColor=_ab,setPaletteColour=_ab,getBackgroundColor=function()return aba end,getBackgroundColour=function()return aba end,getSize=function() +return baa,caa end,getTextColor=function()return bba end,getTextColour=function()return bba end,basalt_resize=function(cab,dab)baa,caa=cab,dab;bda()end,basalt_reposition=function(cab,dab) +_aa,aaa=cab,dab end,basalt_setVisible=function(cab)dba=cab end,drawBackgroundBox=function(cab,dab,_bb,abb,bbb)for n=1,abb do +a_b(cab,dab+ (n-1),ab[bbb]:rep(_bb))end end,drawForegroundBox=function(cab,dab,_bb,abb,bbb) +for n=1,abb do b_b(cab, +dab+ (n-1),ab[bbb]:rep(_bb))end end,drawTextBox=function(cab,dab,_bb,abb,bbb)for n=1,abb do +__b(cab,dab+ (n-1),bbb:rep(_bb))end end,basalt_update=function()for n=1,caa do +cc:addBlit(1,n,_ca[n],bca[n],aca[n])end end,scroll=function(cab) +assert(type(cab)== +"number","bad argument #1 (expected number, got "..type(cab)..")") +if cab~=0 then +for newY=1,caa do local dab=newY+cab;if dab<1 or dab>caa then _ca[newY]=dca +bca[newY]=_da[bba]aca[newY]=_da[aba]else _ca[newY]=_ca[dab]aca[newY]=aca[dab] +bca[newY]=bca[dab]end end end;if(dba)then cda()end end,isColor=function()return +_c.getTerm().isColor()end,isColour=function() +return _c.getTerm().isColor()end,write=function(cab)cab=tostring(cab)if(dba)then +dda(cab,ab[bba]:rep(cab:len()),ab[aba]:rep(cab:len()))end end,clearLine=function() +if +(dba)then __b(1,_ba,(" "):rep(baa)) +a_b(1,_ba,ab[aba]:rep(baa))b_b(1,_ba,ab[bba]:rep(baa))end;if(dba)then cda()end end,clear=function() +for n=1,caa +do __b(1,n,(" "):rep(baa)) +a_b(1,n,ab[aba]:rep(baa))b_b(1,n,ab[bba]:rep(baa))end;if(dba)then cda()end end,blit=function(cab,dab,_bb)if +type(cab)~="string"then +error("bad argument #1 (expected string, got "..type(cab)..")",2)end;if type(dab)~="string"then +error( +"bad argument #2 (expected string, got "..type(dab)..")",2)end;if type(_bb)~="string"then +error( +"bad argument #3 (expected string, got "..type(_bb)..")",2)end +if +#dab~=#cab or#_bb~=#cab then error("Arguments must be the same length",2)end;if(dba)then dda(cab,dab,_bb)end end}return bab end;ac:setZIndex(5)ac:setSize(30,12)local bd=ad(1,1,30,12)local cd +local dd=false;local __a={} +local function a_a(_aa)local aaa=_aa:getParent()local baa,caa=bd.getCursorPos() +local daa,_ba=_aa:getPosition()local aba,bba=_aa:getSize() +if(daa+baa-1 >=1 and +daa+baa-1 <=daa+aba-1 and caa+_ba-1 >=1 and +caa+_ba-1 <=_ba+bba-1)then +aaa:setCursor( +_aa:isFocused()and bd.getCursorBlink(),daa+baa-1,caa+_ba-1,bd.getTextColor())end end +local function b_a(_aa,aaa,...)local baa,caa=cd:resume(aaa,...) +if(baa==false)and(caa~=nil)and +(caa~="Terminated")then +local daa=_aa:sendEvent("program_error",caa) +if(daa~=false)then error("Basalt Program - "..caa)end end +if(cd:getStatus()=="dead")then _aa:sendEvent("program_done")end end +local function c_a(_aa,aaa,baa,caa,daa)if(cd==nil)then return false end +if not(cd:isDead())then if not(dd)then +local _ba,aba=_aa:getAbsolutePosition()b_a(_aa,aaa,baa,caa-_ba+1,daa-aba+1) +a_a(_aa)end end end +local function d_a(_aa,aaa,baa,caa)if(cd==nil)then return false end +if not(cd:isDead())then if not(dd)then if(_aa.draw)then +b_a(_aa,aaa,baa,caa)a_a(_aa)end end end end +cc={getType=function(_aa)return bc end,show=function(_aa)ac.show(_aa) +bd.setBackgroundColor(_aa:getBackground())bd.setTextColor(_aa:getForeground()) +bd.basalt_setVisible(true)return _aa end,hide=function(_aa) +ac.hide(_aa)bd.basalt_setVisible(false)return _aa end,setPosition=function(_aa,aaa,baa,caa) +ac.setPosition(_aa,aaa,baa,caa)bd.basalt_reposition(_aa:getPosition())return _aa end,getBasaltWindow=function()return +bd end,getBasaltProcess=function()return cd end,setSize=function(_aa,aaa,baa,caa)ac.setSize(_aa,aaa,baa,caa) +bd.basalt_resize(_aa:getWidth(),_aa:getHeight())return _aa end,getStatus=function(_aa)if(cd~=nil)then return +cd:getStatus()end;return"inactive"end,setEnviroment=function(_aa,aaa)_d= +aaa or{}return _aa end,execute=function(_aa,aaa,...)dc=aaa or dc +cd=bb:new(dc,bd,_d,...)bd.setBackgroundColor(colors.black) +bd.setTextColor(colors.white)bd.clear()bd.setCursorPos(1,1) +bd.setBackgroundColor(_aa:getBackground()) +bd.setTextColor(_aa:getForeground()or colors.white)bd.basalt_setVisible(true)b_a(_aa)dd=false +_aa:listenEvent("mouse_click",_aa)_aa:listenEvent("mouse_up",_aa) +_aa:listenEvent("mouse_drag",_aa)_aa:listenEvent("mouse_scroll",_aa) +_aa:listenEvent("key",_aa)_aa:listenEvent("key_up",_aa) +_aa:listenEvent("char",_aa)_aa:listenEvent("other_event",_aa)return _aa end,setExecute=function(_aa,aaa,...)return +_aa:execute(aaa,...)end,stop=function(_aa)local aaa=_aa:getParent() +if(cd~=nil)then if not +(cd:isDead())then b_a(_aa,"terminate")if(cd:isDead())then +aaa:setCursor(false)end end end;aaa:removeEvents(_aa)return _aa end,pause=function(_aa,aaa)dd= +aaa or(not dd)if(cd~=nil)then +if not(cd:isDead())then if not(dd)then +_aa:injectEvents(table.unpack(__a))__a={}end end end;return _aa end,isPaused=function(_aa)return +dd end,injectEvent=function(_aa,aaa,baa,...) +if(cd~=nil)then if not(cd:isDead())then +if(dd==false)or(baa)then +b_a(_aa,aaa,...)else table.insert(__a,{event=aaa,args={...}})end end end;return _aa end,getQueuedEvents=function(_aa)return +__a end,updateQueuedEvents=function(_aa,aaa)__a=aaa or __a;return _aa end,injectEvents=function(_aa,...)if(cd~=nil)then +if not +(cd:isDead())then for aaa,baa in pairs({...})do +b_a(_aa,baa.event,table.unpack(baa.args))end end end;return _aa end,mouseHandler=function(_aa,aaa,baa,caa) +if +(ac.mouseHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_click",aaa,baa,caa)return true end;return false end,mouseUpHandler=function(_aa,aaa,baa,caa) +if +(ac.mouseUpHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_up",aaa,baa,caa)return true end;return false end,scrollHandler=function(_aa,aaa,baa,caa) +if +(ac.scrollHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_scroll",aaa,baa,caa)return true end;return false end,dragHandler=function(_aa,aaa,baa,caa) +if +(ac.dragHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_drag",aaa,baa,caa)return true end;return false end,keyHandler=function(_aa,aaa,baa)if +(ac.keyHandler(_aa,aaa,baa))then d_a(_aa,"key",aaa,baa)return true end;return +false end,keyUpHandler=function(_aa,aaa)if +(ac.keyUpHandler(_aa,aaa))then d_a(_aa,"key_up",aaa)return true end +return false end,charHandler=function(_aa,aaa)if +(ac.charHandler(_aa,aaa))then d_a(_aa,"char",aaa)return true end +return false end,getFocusHandler=function(_aa) +ac.getFocusHandler(_aa) +if(cd~=nil)then +if not(cd:isDead())then +if not(dd)then local aaa=_aa:getParent() +if(aaa~=nil)then +local baa,caa=bd.getCursorPos()local daa,_ba=_aa:getPosition()local aba,bba=_aa:getSize() +if +( + +daa+baa-1 >=1 and daa+baa-1 <=daa+aba-1 and caa+_ba-1 >=1 and caa+_ba-1 <=_ba+bba-1)then +aaa:setCursor(bd.getCursorBlink(),daa+baa-1,caa+_ba-1,bd.getTextColor())end end end end end end,loseFocusHandler=function(_aa) +ac.loseFocusHandler(_aa) +if(cd~=nil)then if not(cd:isDead())then local aaa=_aa:getParent()if(aaa~=nil)then +aaa:setCursor(false)end end end end,eventHandler=function(_aa,aaa,...) +ac.eventHandler(_aa,aaa,...)if cd==nil then return end +if not cd:isDead()then +if not dd then b_a(_aa,aaa,...) +if +_aa:isFocused()then local baa=_aa:getParent()local caa,daa=_aa:getPosition() +local _ba,aba=bd.getCursorPos()local bba,cba=_aa:getSize() +if caa+_ba-1 >=1 and +caa+_ba-1 <=caa+bba-1 and aba+daa-1 >=1 and +aba+daa-1 <=daa+cba-1 then +baa:setCursor(bd.getCursorBlink(), +caa+_ba-1,aba+daa-1,bd.getTextColor())end end else table.insert(__a,{event=aaa,args={...}})end end end,resizeHandler=function(_aa,...) +ac.resizeHandler(_aa,...) +if(cd~=nil)then +if not(cd:isDead())then +if not(dd)then +bd.basalt_resize(_aa:getSize())b_a(_aa,"term_resize",_aa:getSize())else +bd.basalt_resize(_aa:getSize()) +table.insert(__a,{event="term_resize",args={_aa:getSize()}})end end end end,repositionHandler=function(_aa,...) +ac.repositionHandler(_aa,...) +if(cd~=nil)then if not(cd:isDead())then +bd.basalt_reposition(_aa:getPosition())end end end,draw=function(_aa) +ac.draw(_aa) +_aa:addDraw("program",function()local aaa=_aa:getParent()local baa,caa=_aa:getPosition() +local daa,_ba=bd.getCursorPos()local aba,bba=_aa:getSize()bd.basalt_update()end)end,onError=function(_aa,...) +for baa,caa in +pairs(table.pack(...))do if(type(caa)=="function")then +_aa:registerEvent("program_error",caa)end end;local aaa=_aa:getParent()_aa:listenEvent("other_event") +return _aa end,onDone=function(_aa,...) +for baa,caa in +pairs(table.pack(...))do if(type(caa)=="function")then +_aa:registerEvent("program_done",caa)end end;local aaa=_aa:getParent()_aa:listenEvent("other_event") +return _aa end}cc.__index=cc;return setmetatable(cc,ac)end end +aa["objects"]["Checkbox"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="Checkbox"_c:setZIndex(5)_c:setValue(false) +_c:setSize(1,1)local bc,cc,dc,_d="\42"," ","","right" +local ad={load=function(bd)bd:listenEvent("mouse_click",bd) +bd:listenEvent("mouse_up",bd)end,getType=function(bd)return ac end,isType=function(bd,cd)return +ac==cd or +_c.isType~=nil and _c.isType(cd)or false end,setSymbol=function(bd,cd,dd) +bc=cd or bc;cc=dd or cc;bd:updateDraw()return bd end,setActiveSymbol=function(bd,cd)return bd:setSymbol(cd, +nil)end,setInactiveSymbol=function(bd,cd) +return bd:setSymbol(nil,cd)end,getSymbol=function(bd)return bc,cc end,getActiveSymbol=function(bd)return bc end,getInactiveSymbol=function(bd)return cc end,setText=function(bd,cd) +dc=cd;return bd end,getText=function(bd)return dc end,setTextPosition=function(bd,cd)_d=cd or _d;return bd end,getTextPosition=function(bd)return +_d end,setChecked=_c.setValue,getChecked=_c.getValue,mouseHandler=function(bd,cd,dd,__a) +if(_c.mouseHandler(bd,cd,dd,__a))then +if(cd==1)then +if( +bd:getValue()~=true)and(bd:getValue()~=false)then +bd:setValue(false)else bd:setValue(not bd:getValue())end;bd:updateDraw()return true end end;return false end,draw=function(bd) +_c.draw(bd) +bd:addDraw("checkbox",function()local cd,dd=bd:getPosition()local __a,a_a=bd:getSize() +local b_a=ab.getTextVerticalAlign(a_a,"center")local c_a,d_a=bd:getBackground(),bd:getForeground() +if +(bd:getValue())then +bd:addBlit(1,b_a,ab.getTextHorizontalAlign(bc,__a,"center"),bb[d_a],bb[c_a])else +bd:addBlit(1,b_a,ab.getTextHorizontalAlign(cc,__a,"center"),bb[d_a],bb[c_a])end;if(dc~="")then local _aa=_d=="left"and-dc:len()or 3 +bd:addText(_aa,b_a,dc)end end)end}ad.__index=ad;return setmetatable(ad,_c)end end +aa["objects"]["List"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="List"local bc={}local cc=colors.black;local dc=colors.lightGray;local _d=true +local ad="left"local bd=0;local cd=true;_c:setSize(16,8)_c:setZIndex(5) +local dd={init=function(__a) +local a_a=__a:getParent()__a:listenEvent("mouse_click") +__a:listenEvent("mouse_drag")__a:listenEvent("mouse_scroll")return _c.init(__a)end,getBase=function(__a)return +_c end,setTextAlign=function(__a,a_a)ad=a_a;return __a end,getTextAlign=function(__a)return ad end,getBase=function(__a)return _c end,getType=function(__a)return +ac end,isType=function(__a,a_a)return +ac==a_a or _c.isType~=nil and _c.isType(a_a)or false end,addItem=function(__a,a_a,b_a,c_a,...) +table.insert(bc,{text=a_a,bgCol= +b_a or __a:getBackground(),fgCol=c_a or __a:getForeground(),args={...}})if(#bc<=1)then __a:setValue(bc[1],false)end +__a:updateDraw()return __a end,setOptions=function(__a,...) +bc={} +for a_a,b_a in pairs(...)do +if(type(b_a)=="string")then +table.insert(bc,{text=b_a,bgCol=__a:getBackground(),fgCol=__a:getForeground(),args={}})else +table.insert(bc,{text=b_a[1],bgCol=b_a[2]or __a:getBackground(),fgCol=b_a[3]or +__a:getForeground(),args=b_a[4]or{}})end end;__a:setValue(bc[1],false)__a:updateDraw()return __a end,setOffset=function(__a,a_a) +bd=a_a;__a:updateDraw()return __a end,getOffset=function(__a)return bd end,removeItem=function(__a,a_a) +if( +type(a_a)=="number")then table.remove(bc,a_a)elseif(type(a_a)=="table")then +for b_a,c_a in +pairs(bc)do if(c_a==a_a)then table.remove(bc,b_a)break end end end;__a:updateDraw()return __a end,getItem=function(__a,a_a)return +bc[a_a]end,getAll=function(__a)return bc end,getOptions=function(__a)return bc end,getItemIndex=function(__a) +local a_a=__a:getValue()for b_a,c_a in pairs(bc)do if(c_a==a_a)then return b_a end end end,clear=function(__a) +bc={}__a:setValue({},false)__a:updateDraw()return __a end,getItemCount=function(__a)return +#bc end,editItem=function(__a,a_a,b_a,c_a,d_a,...)table.remove(bc,a_a) +table.insert(bc,a_a,{text=b_a,bgCol=c_a or +__a:getBackground(),fgCol=d_a or __a:getForeground(),args={...}})__a:updateDraw()return __a end,selectItem=function(__a,a_a)__a:setValue( +bc[a_a]or{},false)__a:updateDraw()return __a end,setSelectionColor=function(__a,a_a,b_a,c_a)cc= +a_a or __a:getBackground() +dc=b_a or __a:getForeground()_d=c_a~=nil and c_a or true;__a:updateDraw() +return __a end,setSelectionBG=function(__a,a_a)return __a:setSelectionColor(a_a, +nil,_d)end,setSelectionFG=function(__a,a_a)return __a:setSelectionColor( +nil,a_a,_d)end,getSelectionColor=function(__a) +return cc,dc end,getSelectionBG=function(__a)return cc end,getSelectionFG=function(__a)return dc end,isSelectionColorActive=function(__a)return _d end,setScrollable=function(__a,a_a) +cd=a_a;if(a_a==nil)then cd=true end;__a:updateDraw()return __a end,getScrollable=function(__a)return +cd end,scrollHandler=function(__a,a_a,b_a,c_a) +if(_c.scrollHandler(__a,a_a,b_a,c_a))then +if(cd)then +local d_a,_aa=__a:getSize()bd=bd+a_a;if(bd<0)then bd=0 end;if(a_a>=1)then +if(#bc>_aa)then +if(bd>#bc-_aa)then bd=#bc-_aa end;if(bd>=#bc)then bd=#bc-1 end else bd=bd-1 end end +__a:updateDraw()end;return true end;return false end,mouseHandler=function(__a,a_a,b_a,c_a) +if +(_c.mouseHandler(__a,a_a,b_a,c_a))then local d_a,_aa=__a:getAbsolutePosition()local aaa,baa=__a:getSize() +if +(#bc>0)then +for n=1,baa do +if(bc[n+bd]~=nil)then if +(d_a<=b_a)and(d_a+aaa>b_a)and(_aa+n-1 ==c_a)then __a:setValue(bc[n+bd])__a:selectHandler() +__a:updateDraw()end end end end;return true end;return false end,dragHandler=function(__a,a_a,b_a,c_a)return +__a:mouseHandler(a_a,b_a,c_a)end,touchHandler=function(__a,a_a,b_a)return +__a:mouseHandler(1,a_a,b_a)end,onSelect=function(__a,...) +for a_a,b_a in +pairs(table.pack(...))do if(type(b_a)=="function")then +__a:registerEvent("select_item",b_a)end end;return __a end,selectHandler=function(__a) +__a:sendEvent("select_item",__a:getValue())end,draw=function(__a)_c.draw(__a) +__a:addDraw("list",function() +local a_a,b_a=__a:getSize() +for n=1,b_a do +if bc[n+bd]then local c_a=bc[n+bd].text +local d_a,_aa=bc[n+bd].fgCol,bc[n+bd].bgCol +if bc[n+bd]==__a:getValue()and _d then d_a,_aa=dc,cc end;__a:addText(1,n,c_a:sub(1,a_a)) +__a:addBG(1,n,bb[_aa]:rep(a_a))__a:addFG(1,n,bb[d_a]:rep(a_a))end end end)end}dd.__index=dd;return setmetatable(dd,_c)end end +aa["objects"]["Graph"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("ChangeableObject")(ab,bb)local db="Graph"cb:setZIndex(5)cb:setSize(30,10)local _c={} +local ac=colors.gray;local bc="\7"local cc=colors.black;local dc=100;local _d=0;local ad="line"local bd=10 +local cd={getType=function(dd)return db end,setGraphColor=function(dd,__a)ac= +__a or ac;dd:updateDraw()return dd end,setGraphSymbol=function(dd,__a,a_a) +bc=__a or bc;cc=a_a or cc;dd:updateDraw()return dd end,setGraphSymbolColor=function(dd,__a)return dd:setGraphSymbolColor( +nil,__a)end,getGraphSymbol=function(dd) +return bc,cc end,getGraphSymbolColor=function(dd)return cc end,addDataPoint=function(dd,__a)if __a>=_d and __a<=dc then +table.insert(_c,__a)dd:updateDraw()end;if(#_c>100)then +table.remove(_c,1)end;return dd end,setMaxValue=function(dd,__a) +dc=__a;dd:updateDraw()return dd end,getMaxValue=function(dd)return dc end,setMinValue=function(dd,__a) +_d=__a;dd:updateDraw()return dd end,getMinValue=function(dd)return _d end,setGraphType=function(dd,__a)if __a== +"scatter"or __a=="line"or __a=="bar"then ad=__a +dd:updateDraw()end;return dd end,getGraphType=function(dd)return +ad end,setMaxEntries=function(dd,__a)bd=__a;dd:updateDraw()return dd end,getMaxEntries=function(dd)return +bd end,clear=function(dd)_c={}dd:updateDraw()return dd end,draw=function(dd) +cb.draw(dd) +dd:addDraw("graph",function()local __a,a_a=dd:getPosition()local b_a,c_a=dd:getSize() +local d_a,_aa=dd:getBackground(),dd:getForeground()local aaa=dc-_d;local baa,caa;local daa=#_c-bd+1;if daa<1 then daa=1 end +for i=daa,#_c do local _ba=_c[i] +local aba=math.floor(( ( +b_a-1)/ (bd-1))* (i-daa)+1.5) +local bba=math.floor((c_a-1)- ( (c_a-1)/aaa)* (_ba-_d)+1.5) +if ad=="scatter"then dd:addBackgroundBox(aba,bba,1,1,ac) +dd:addForegroundBox(aba,bba,1,1,cc)dd:addTextBox(aba,bba,1,1,bc)elseif ad=="line"then +if baa and caa then +local cba=math.abs(aba-baa)local dba=math.abs(bba-caa)local _ca=baa-dba then +bca=bca-dba;baa=baa+_ca end +if ccadba.evId else return +cba.zIndex>dba.zIndex end end;local function a_a(cba)cba:sortChildren()return bc end +local function b_a(cba,dba)if +(type(dba)=="table")then dba=dba:getName()end +for _ca,aca in ipairs(bc)do if +aca.element:getName()==dba then return aca.element end end end +local function c_a(cba,dba)local _ca=b_a(dba)if(_ca~=nil)then return _ca end;for aca,bca in ipairs(bc)do +if +(bca:getType()=="Container")then local cca=bca:getDeepChild(dba)if(cca~=nil)then return cca end end end end +local function d_a(cba,dba)if(b_a(dba:getName())~=nil)then return end;bd=bd+1 +local _ca=dba:getZIndex() +table.insert(bc,{element=dba,zIndex=_ca,objId=bd})ad=false;dba:setParent(cba,true)for aca,bca in +pairs(dba:getRegisteredEvents())do cba:addEvent(aca,dba)end;if(dba.init~= +nil)then dba:init()end +if(dba.load~=nil)then dba:load()end;if(dba.draw~=nil)then dba:draw()end;return dba end +local function _aa(cba,dba) +if(type(dba)=="string")then dba=b_a(dba:getName())end;if(dba==nil)then return end +for _ca,aca in ipairs(bc)do if aca.element==dba then +table.remove(bc,_ca)return true end end;cba:removeEvents(dba)ad=false end;local function aaa(cba)local dba=cba:getParent()bc={}cc={}ad=false;bd=0;cd=0;_d=nil +dba:removeEvents(cba)end +local function baa(cba,dba,_ca)bd=bd+1;cd=cd+1;for aca,bca in +pairs(bc)do +if(bca.element==dba)then bca.zIndex=_ca;bca.objId=bd;break end end;for aca,bca in pairs(cc)do +for cca,dca in pairs(bca)do if +(dca.element==dba)then dca.zIndex=_ca;dca.evId=cd end end end;ad=false +cba:updateDraw()end +local function caa(cba,dba)local _ca=cba:getParent() +for aca,bca in pairs(cc)do for cca,dca in pairs(bca)do if(dca.element==dba)then +table.remove(cc[aca],cca)end end +if( +bb(cc[aca])<=0)then if(_ca~=nil)then _ca:removeEvent(aca,cba)end end end;ad=false end +local function daa(cba,dba,_ca)if(type(_ca)=="table")then _ca=_ca:getName()end +if(cc[dba]~= +nil)then for aca,bca in pairs(cc[dba])do +if(bca.element:getName()==_ca)then return bca end end end end +local function _ba(cba,dba,_ca) +if(daa(cba,dba,_ca:getName())~=nil)then return end;local aca=_ca:getZIndex()cd=cd+1 +if(cc[dba]==nil)then cc[dba]={}end +table.insert(cc[dba],{element=_ca,zIndex=aca,evId=cd})ad=false;cba:listenEvent(dba)return _ca end +local function aba(cba,dba,_ca) +if(cc[dba]~=nil)then for aca,bca in pairs(cc[dba])do if(bca.element==_ca)then +table.remove(cc[dba],aca)end end;if( +bb(cc[dba])<=0)then cba:listenEvent(dba,false)end end;ad=false end +local function bba(cba,dba)return dba~=nil and cc[dba]or cc end +dc={getType=function()return ac end,getBase=function(cba)return _c end,isType=function(cba,dba) +return ac==dba or +_c.isType~=nil and _c.isType(dba)or false end,setSize=function(cba,...)_c.setSize(cba,...) +cba:customEventHandler("basalt_FrameResize")return cba end,setPosition=function(cba,...) +_c.setPosition(cba,...)cba:customEventHandler("basalt_FrameReposition") +return cba end,searchChildren=function(cba,dba)local _ca={} +for aca,bca in pairs(bc)do if +(string.find(bca.element:getName(),dba))then table.insert(_ca,bca)end end;return _ca end,getChildrenByType=function(cba,dba) +local _ca={}for aca,bca in pairs(bc)do +if(bca.element:isType(dba))then table.insert(_ca,bca)end end;return _ca end,setImportant=function(cba,dba)bd= +bd+1;cd=cd+1 +for _ca,aca in pairs(cc)do for bca,cca in pairs(aca)do +if(cca.element==dba)then cca.evId=cd +table.remove(cc[_ca],bca)table.insert(cc[_ca],cca)break end end end +for _ca,aca in ipairs(bc)do if aca.element==dba then aca.objId=bd;table.remove(bc,_ca) +table.insert(bc,aca)break end end;if(cba.updateDraw~=nil)then cba:updateDraw()end +ad=false end,sortChildren=function(cba)if +(ad)then return end;table.sort(bc,dd)for dba,_ca in pairs(cc)do +table.sort(cc[dba],__a)end;ad=true end,clearFocusedChild=function(cba)if( +_d~=nil)then +if(b_a(cba,_d)~=nil)then _d:loseFocusHandler()end end;_d=nil;return cba end,setFocusedChild=function(cba,dba) +if( +_d~=dba)then if(_d~=nil)then +if(b_a(cba,_d)~=nil)then _d:loseFocusHandler()end end;if(dba~=nil)then if(b_a(cba,dba)~=nil)then +dba:getFocusHandler()end end;_d=dba;return true end;return false end,getFocused=function(cba)return +_d end,getChild=b_a,getChildren=a_a,getDeepChildren=c_a,addChild=d_a,removeChild=_aa,removeChildren=aaa,getEvents=bba,getEvent=daa,addEvent=_ba,removeEvent=aba,removeEvents=caa,updateZIndex=baa,listenEvent=function(cba,dba,_ca)_c.listenEvent(cba,dba,_ca)if( +cc[dba]==nil)then cc[dba]={}end;return cba end,customEventHandler=function(cba,...) +_c.customEventHandler(cba,...) +for dba,_ca in pairs(bc)do if(_ca.element.customEventHandler~=nil)then +_ca.element:customEventHandler(...)end end end,loseFocusHandler=function(cba) +_c.loseFocusHandler(cba)if(_d~=nil)then _d:loseFocusHandler()_d=nil end end,getBasalt=function(cba)return +db end,setPalette=function(cba,dba,...)local _ca=cba:getParent() +_ca:setPalette(dba,...)return cba end,eventHandler=function(cba,...) +if(_c.eventHandler~=nil)then +_c.eventHandler(cba,...) +if(cc["other_event"]~=nil)then cba:sortChildren() +for dba,_ca in +ipairs(cc["other_event"])do if(_ca.element.eventHandler~=nil)then +_ca.element.eventHandler(_ca.element,...)end end end end end} +for cba,dba in +pairs({mouse_click={"mouseHandler",true},mouse_up={"mouseUpHandler",false},mouse_drag={"dragHandler",false},mouse_scroll={"scrollHandler",true},mouse_hover={"hoverHandler",false}})do +dc[dba[1]]=function(_ca,aca,bca,cca,...) +if(_c[dba[1]]~=nil)then +if(_c[dba[1]](_ca,aca,bca,cca,...))then +if +(cc[cba]~=nil)then _ca:sortChildren() +for dca,_da in ipairs(cc[cba])do +if +(_da.element[dba[1]]~=nil)then local ada,bda=0,0 +if(_ca.getOffset~=nil)then ada,bda=_ca:getOffset()end +if(_da.element.getIgnoreOffset~=nil)then if(_da.element.getIgnoreOffset())then +ada,bda=0,0 end end;if(_da.element[dba[1]](_da.element,aca,bca+ada,cca+bda,...))then return +true end end end;if(dba[2])then _ca:clearFocusedChild()end end;return true end end end end +for cba,dba in +pairs({key="keyHandler",key_up="keyUpHandler",char="charHandler"})do +dc[dba]=function(_ca,...) +if(_c[dba]~=nil)then +if(_c[dba](_ca,...))then +if(cc[cba]~=nil)then +_ca:sortChildren()for aca,bca in ipairs(cc[cba])do +if(bca.element[dba]~=nil)then if +(bca.element[dba](bca.element,...))then return true end end end end end end end end;for cba,dba in pairs(db.getObjects())do +dc["add"..cba]=function(_ca,aca)return +_ca:addChild(db:createObject(cba,aca))end end +dc.__index=dc;return setmetatable(dc,_c)end end +aa["objects"]["Frame"]=function(...)local ab=da("utils") +local bb,cb,db,_c,ac=math.max,math.min,string.sub,string.rep,string.len +return +function(bc,cc)local dc=cc.getObject("Container")(bc,cc)local _d="Frame" +local ad;local bd=true;local cd,dd=0,0;dc:setSize(30,10)dc:setZIndex(10) +local __a={getType=function()return _d end,isType=function(a_a,b_a)return + +_d==b_a or dc.isType~=nil and dc.isType(b_a)or false end,getBase=function(a_a) +return dc end,getOffset=function(a_a)return cd,dd end,setOffset=function(a_a,b_a,c_a)cd=b_a or cd;dd=c_a or dd +a_a:updateDraw()return a_a end,getXOffset=function(a_a)return cd end,setXOffset=function(a_a,b_a)return +a_a:setOffset(b_a,nil)end,getYOffset=function(a_a)return dd end,setYOffset=function(a_a,b_a)return +a_a:setOffset(nil,b_a)end,setParent=function(a_a,b_a,...) +dc.setParent(a_a,b_a,...)ad=b_a;return a_a end,render=function(a_a) +if(dc.render~=nil)then +if +(a_a:isVisible())then dc.render(a_a)local b_a=a_a:getChildren()for c_a,d_a in ipairs(b_a)do +if( +d_a.element.render~=nil)then d_a.element:render()end end end end end,updateDraw=function(a_a)if( +ad~=nil)then ad:updateDraw()end;return a_a end,blit=function(a_a,b_a,c_a,d_a,_aa,aaa) +local baa,caa=a_a:getPosition()local daa,_ba=ad:getOffset()baa=baa-daa;caa=caa-_ba +local aba,bba=a_a:getSize() +if c_a>=1 and c_a<=bba then +local cba=db(d_a,bb(1 -b_a+1,1),bb(aba-b_a+1,1)) +local dba=db(_aa,bb(1 -b_a+1,1),bb(aba-b_a+1,1)) +local _ca=db(aaa,bb(1 -b_a+1,1),bb(aba-b_a+1,1)) +ad:blit(bb(b_a+ (baa-1),baa),caa+c_a-1,cba,dba,_ca)end end,setCursor=function(a_a,b_a,c_a,d_a,_aa) +local aaa,baa=a_a:getPosition()local caa,daa=a_a:getOffset() +ad:setCursor(b_a or false,(c_a or 0)+aaa-1 -caa,( +d_a or 0)+baa-1 -daa,_aa or colors.white)return a_a end} +for a_a,b_a in +pairs({"drawBackgroundBox","drawForegroundBox","drawTextBox"})do +__a[b_a]=function(c_a,d_a,_aa,aaa,baa,caa)local daa,_ba=c_a:getPosition()local aba,bba=ad:getOffset() +daa=daa-aba;_ba=_ba-bba +baa=(_aa<1 and( +baa+_aa>c_a:getHeight()and c_a:getHeight()or baa+_aa-1)or( +baa+ +_aa>c_a:getHeight()and c_a:getHeight()-_aa+1 or baa)) +aaa=(d_a<1 and(aaa+d_a>c_a:getWidth()and c_a:getWidth()or aaa+ +d_a-1)or( + +aaa+d_a>c_a:getWidth()and c_a:getWidth()-d_a+1 or aaa)) +ad[b_a](ad,bb(d_a+ (daa-1),daa),bb(_aa+ (_ba-1),_ba),aaa,baa,caa)end end +for a_a,b_a in pairs({"setBG","setFG","setText"})do +__a[b_a]=function(c_a,d_a,_aa,aaa) +local baa,caa=c_a:getPosition()local daa,_ba=ad:getOffset()baa=baa-daa;caa=caa-_ba +local aba,bba=c_a:getSize()if(_aa>=1)and(_aa<=bba)then +ad[b_a](ad,bb(d_a+ (baa-1),baa),caa+_aa-1,db(aaa,bb( +1 -d_a+1,1),bb(aba-d_a+1,1)))end end end;__a.__index=__a;return setmetatable(__a,dc)end end +aa["objects"]["ChangeableObject"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("VisualObject")(ab,bb)local db="ChangeableObject"local _c +local ac={setValue=function(bc,cc,dc)if(_c~=cc)then _c=cc;bc:updateDraw()if(dc~=false)then +bc:valueChangedHandler()end end;return bc end,getValue=function(bc)return +_c end,onChange=function(bc,...) +for cc,dc in pairs(table.pack(...))do if(type(dc)=="function")then +bc:registerEvent("value_changed",dc)end end;return bc end,valueChangedHandler=function(bc) +bc:sendEvent("value_changed",_c)end}ac.__index=ac;return setmetatable(ac,cb)end end +aa["objects"]["BaseFrame"]=function(...)local ab=da("basaltDraw") +local bb=da("utils")local cb,db,_c,ac=math.max,math.min,string.sub,string.rep +return +function(bc,cc) +local dc=cc.getObject("Container")(bc,cc)local _d="BaseFrame"local ad,bd=0,0;local cd={}local dd=true;local __a=cc.getTerm() +local a_a=ab(__a)local b_a,c_a,d_a,_aa=1,1,false,colors.white +local aaa={getType=function()return _d end,isType=function(baa,caa) +return _d==caa or dc.isType~=nil and +dc.isType(caa)or false end,getBase=function(baa)return dc end,getOffset=function(baa)return ad,bd end,setOffset=function(baa,caa,daa)ad= +caa or ad;bd=daa or bd;baa:updateDraw()return baa end,getXOffset=function(baa)return +ad end,setXOffset=function(baa,caa)return baa:setOffset(caa,nil)end,getYOffset=function(baa)return +bd end,setYOffset=function(baa,caa)return baa:setOffset(nil,caa)end,setPalette=function(baa,caa,...) +if( +baa==cc.getActiveFrame())then +if(type(caa)=="string")then cd[caa]=... +__a.setPaletteColor( +type(caa)=="number"and caa or colors[caa],...)elseif(type(caa)=="table")then +for daa,_ba in pairs(caa)do cd[daa]=_ba +if(type(_ba)=="number")then +__a.setPaletteColor( +type(daa)=="number"and daa or colors[daa],_ba)else local aba,bba,cba=table.unpack(_ba) +__a.setPaletteColor( +type(daa)=="number"and daa or colors[daa],aba,bba,cba)end end end end;return baa end,setSize=function(baa,...) +dc.setSize(baa,...)a_a=ab(__a)return baa end,getSize=function()return __a.getSize()end,getWidth=function(baa)return +({__a.getSize()})[1]end,getHeight=function(baa) +return({__a.getSize()})[2]end,show=function(baa)dc.show(baa)cc.setActiveFrame(baa) +for caa,daa in +pairs(colors)do if(type(daa)=="number")then +__a.setPaletteColor(daa,colors.packRGB(term.nativePaletteColor((daa))))end end +for caa,daa in pairs(cd)do +if(type(daa)=="number")then +__a.setPaletteColor( +type(caa)=="number"and caa or colors[caa],daa)else local _ba,aba,bba=table.unpack(daa) +__a.setPaletteColor( +type(caa)=="number"and caa or colors[caa],_ba,aba,bba)end end;cc.setMainFrame(baa)return baa end,render=function(baa) +if( +dc.render~=nil)then +if(baa:isVisible())then +if(dd)then dc.render(baa) +local caa=baa:getChildren()for daa,_ba in ipairs(caa)do if(_ba.element.render~=nil)then +_ba.element:render()end end +dd=false end end end end,updateDraw=function(baa) +dd=true;return baa end,eventHandler=function(baa,caa,...)dc.eventHandler(baa,caa,...)if +(caa=="term_resize")then baa:setSize(__a.getSize())end end,updateTerm=function(baa)if( +a_a~=nil)then a_a.update()end end,setTerm=function(baa,caa)__a=caa;if(caa== +nil)then a_a=nil else a_a=ab(__a)end;return baa end,getTerm=function()return +__a end,blit=function(baa,caa,daa,_ba,aba,bba)local cba,dba=baa:getPosition() +local _ca,aca=baa:getSize() +if daa>=1 and daa<=aca then +local bca=_c(_ba,cb(1 -caa+1,1),cb(_ca-caa+1,1)) +local cca=_c(aba,cb(1 -caa+1,1),cb(_ca-caa+1,1)) +local dca=_c(bba,cb(1 -caa+1,1),cb(_ca-caa+1,1)) +a_a.blit(cb(caa+ (cba-1),cba),dba+daa-1,bca,cca,dca)end end,setCursor=function(baa,caa,daa,_ba,aba) +local bba,cba=baa:getAbsolutePosition()local dba,_ca=baa:getOffset()d_a=caa or false;if(daa~=nil)then +b_a=bba+daa-1 -dba end +if(_ba~=nil)then c_a=cba+_ba-1 -_ca end;_aa=aba or _aa +if(d_a)then __a.setTextColor(_aa) +__a.setCursorPos(b_a,c_a)__a.setCursorBlink(d_a)else __a.setCursorBlink(false)end;return baa end} +for baa,caa in +pairs({mouse_click={"mouseHandler",true},mouse_up={"mouseUpHandler",false},mouse_drag={"dragHandler",false},mouse_scroll={"scrollHandler",true},mouse_hover={"hoverHandler",false}})do +aaa[caa[1]]=function(daa,_ba,aba,bba,...)if(dc[caa[1]](daa,_ba,aba,bba,...))then +cc.setActiveFrame(daa)end end end +for baa,caa in +pairs({"drawBackgroundBox","drawForegroundBox","drawTextBox"})do +aaa[caa]=function(daa,_ba,aba,bba,cba,dba)local _ca,aca=daa:getPosition()local bca,cca=daa:getSize() +cba=(aba<1 and(cba+ +aba>daa:getHeight()and daa:getHeight()or cba+aba- +1)or(cba+aba> +daa:getHeight()and daa:getHeight()-aba+1 or +cba)) +bba=(_ba<1 and(bba+_ba>daa:getWidth()and daa:getWidth()or bba+ +_ba-1)or( + +bba+_ba>daa:getWidth()and daa:getWidth()-_ba+1 or bba)) +a_a[caa](cb(_ba+ (_ca-1),_ca),cb(aba+ (aca-1),aca),bba,cba,dba)end end +for baa,caa in pairs({"setBG","setFG","setText"})do +aaa[caa]=function(daa,_ba,aba,bba) +local cba,dba=daa:getPosition()local _ca,aca=daa:getSize()if(aba>=1)and(aba<=aca)then +a_a[caa](cb(_ba+ (cba-1),cba), +dba+aba-1,_c(bba,cb(1 -_ba+1,1),cb(_ca-_ba+1,1)))end end end;aaa.__index=aaa;return setmetatable(aaa,dc)end end +aa["objects"]["Pane"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("VisualObject")(ab,bb)local db="Pane"cb:setSize(25,10) +local _c={getType=function(ac)return db end}_c.__index=_c;return setmetatable(_c,cb)end end +aa["objects"]["Label"]=function(...)local ab=da("utils")local bb=ab.wrapText +local cb=ab.writeWrappedText;local db=da("tHex") +return +function(_c,ac) +local bc=ac.getObject("VisualObject")(_c,ac)local cc="Label"bc:setZIndex(3)bc:setSize(5,1) +bc:setBackground(false)local dc=true;local _d,ad="Label","left" +local bd={getType=function(cd)return cc end,getBase=function(cd)return bc end,setText=function(cd,dd) +_d=tostring(dd) +if(dc)then local __a=bb(_d,#_d)local a_a,b_a=1,1;for c_a,d_a in pairs(__a)do b_a=b_a+1 +a_a=math.max(a_a,d_a:len())end;cd:setSize(a_a,b_a)dc=true end;cd:updateDraw()return cd end,getAutoSize=function(cd)return +dc end,setAutoSize=function(cd,dd)dc=dd;return cd end,getText=function(cd)return _d end,setSize=function(cd,dd,__a) +bc.setSize(cd,dd,__a)dc=false;return cd end,getTextAlign=function(cd)return ad end,setTextAlign=function(cd,dd)ad=dd or ad;return +cd end,draw=function(cd)bc.draw(cd) +cd:addDraw("label",function()local dd,__a=cd:getSize() +local a_a= + + +ad=="center"and math.floor(dd/2 -_d:len()/2 +0.5)or ad=="right"and dd- (_d:len()-1)or 1;cb(cd,a_a,1,_d,dd+1,__a)end)end,init=function(cd) +bc.init(cd)local dd=cd:getParent() +cd:setForeground(dd:getForeground())end}bd.__index=bd;return setmetatable(bd,bc)end end;return aa["main"]() \ No newline at end of file diff --git a/docs/versions/latest.lua b/docs/versions/latest.lua index 9500d83..5b39e84 100644 --- a/docs/versions/latest.lua +++ b/docs/versions/latest.lua @@ -4,2625 +4,627 @@ for bb,cb in pairs(aa)do if(type(cb)=="table")then for db,_c in pairs(cb)do if(db==ab)then return _c()end end else if(bb==ab)then return cb()end end end;return ca(ab)end local _b=function(ab)if(ab~=nil)then return aa[ab]end;return aa end -aa["module"]=function(...)return -function(ab)local bb,cb=pcall(da,ab)return bb and cb or nil end end -aa["Frame"]=function(...)local ab=da("module")local bb=da("Object") -local cb=da("loadObjects")local db=da("basaltDraw")local _c=da("utils")local ac=ab("layout") -local bc=ab("basaltMon")local cc=_c.uuid;local dc=_c.rpairs;local _d=_c.getValueFromXML;local ad=_c.tableCount -local bd,cd,dd=string.sub,math.min,math.max -return -function(__a,a_a,b_a,c_a)local d_a=bb(__a)local _aa="Frame"local aaa={}local baa={}local caa={}local daa={}local _ba={}local aba={} -local bba={}local cba={}local dba=0;local _ca=b_a or term.current()local aca=""local bca=false -local cca=false;local dca=false;local _da=0;local ada=0;local bda=false;local cda=0;local dda=false;local __b=false;local a_b=""local b_b=false -local c_b=false;local d_b;local _ab;local aab=true;local bab=true;local cab=false;local dab={}local _bb={} -d_a:setZIndex(10)local abb=db(_ca)local bbb=false;local cbb=1;local dbb=1;local _cb=colors.white;local acb,bcb=0,0;local ccb={} -local function dcb(dbc,_cc)if(_cc~= -nil)then _cc:setValuesByXMLData(dbc)end end -local function _db(dbc,_cc,acc) -if(dbc~=nil)then if(dbc.properties~=nil)then dbc={dbc}end;for bcc,ccc in pairs(dbc)do local dcc=_cc(acc, -ccc["@id"]or cc()) -table.insert(ccb,dcc)dcb(ccc,dcc)end end end -local function adb(dbc)if(type(dbc)~="string")then dbc=dbc.name end;for _cc,acc in pairs(aaa)do -for bcc,ccc in -pairs(acc)do if(ccc:getName()==dbc)then return ccc end end end end -local function bdb(dbc)local _cc=adb(dbc)if(_cc~=nil)then return _cc end -for acc,bcc in pairs(aaa)do -for ccc,dcc in pairs(bcc)do if( -dcc:getType()=="Frame")then local _dc=dcc:getDeepObject(dbc) -if(_dc~=nil)then return _dc end end end end end -local function cdb(dbc)local _cc=dbc:getZIndex() -if(adb(dbc.name)~=nil)then return nil end -if(aaa[_cc]==nil)then -for x=1,#baa+1 do if(baa[x]~=nil)then if(_cc==baa[x])then break end;if -(_cc>baa[x])then table.insert(baa,x,_cc)break end else -table.insert(baa,_cc)end end;if(#baa<=0)then table.insert(baa,_cc)end;aaa[_cc]={}end;dbc.parent=caa;if(dbc.init~=nil)then dbc:init()end -table.insert(aaa[_cc],dbc)return dbc end -local function ddb(dbc,_cc) -for acc,bcc in pairs(daa)do -for ccc,dcc in pairs(bcc)do -for _dc,adc in pairs(dcc)do -if(adc==_cc)then -table.remove(daa[acc][ccc],_dc)if(dbc.parent~=nil)then if(ad(daa[acc])<=0)then -dbc.parent:removeEvent(acc,dbc)end end end end end end end -local function __c(dbc,_cc) -for acc,bcc in pairs(aaa)do -for ccc,dcc in pairs(bcc)do -if(type(_cc)=="string")then -if(dcc:getName()==_cc)then -table.remove(aaa[acc],ccc)ddb(caa,dcc)dbc:updateDraw()return true end else if(dcc==_cc)then table.remove(aaa[acc],ccc)ddb(caa,dcc) -dbc:updateDraw()return true end end end end;return false end;local function a_c(dbc,_cc,acc) -for bcc,ccc in pairs(daa[_cc])do for dcc,_dc in pairs(ccc)do -if(_dc:getName()==acc)then return _dc end end end end -local function b_c(dbc,_cc,acc) -local bcc=acc:getZIndex()if(daa[_cc]==nil)then daa[_cc]={}end;if(_ba[_cc]==nil)then -_ba[_cc]={}end -if(a_c(dbc,_cc,acc.name)~=nil)then return nil end -if(dbc.parent~=nil)then dbc.parent:addEvent(_cc,dbc)end;dab[_cc]=true -if(daa[_cc][bcc]==nil)then -for x=1,#_ba[_cc]+1 do -if -(_ba[_cc][x]~=nil)then if(bcc==_ba[_cc][x])then break end;if(bcc>_ba[_cc][x])then -table.insert(_ba[_cc],x,bcc)break end else -table.insert(_ba[_cc],bcc)end end -if(#_ba[_cc]<=0)then table.insert(_ba[_cc],bcc)end;daa[_cc][bcc]={}end;table.insert(daa[_cc][bcc],acc)return acc end -local function c_c(dbc,_cc,acc) -if(daa[_cc]~=nil)then -for bcc,ccc in pairs(daa[_cc])do -for dcc,_dc in pairs(ccc)do -if(_dc==acc)then -table.remove(daa[_cc][bcc],dcc)if(#daa[_cc][bcc]<=0)then daa[_cc][bcc]=nil -if(dbc.parent~=nil)then if( -ad(daa[_cc])<=0)then dab[_cc]=false -dbc.parent:removeEvent(_cc,dbc)end end end;return -true end end end end;return false end;local d_c=math -local function _ac(dbc) -local _cc,acc=pcall(load("return "..dbc,"",nil,{math=d_c}))if not(_cc)then -error(dbc.." is not a valid dynamic code")end;return acc end -local function aac(dbc,_cc,acc)for bcc,ccc in pairs(cba)do -if(ccc[2]==acc)and(ccc[4]==_cc)then return ccc end end;dba=dba+1 -cba[dba]={0,acc,{},_cc,dba}return cba[dba]end -local function bac(dbc,_cc)local acc={}local bcc={}for ccc in _cc:gmatch("%a+%.x")do local dcc=ccc:gsub("%.x","") -if -(dcc~="self")and(dcc~="parent")then table.insert(acc,dcc)end end -for ccc in -_cc:gmatch("%w+%.y")do local dcc=ccc:gsub("%.y","")if(dcc~="self")and(dcc~="parent")then -table.insert(acc,dcc)end end;for ccc in _cc:gmatch("%a+%.w")do local dcc=ccc:gsub("%.w","") -if(dcc~="self")and -(dcc~="parent")then table.insert(acc,dcc)end end -for ccc in -_cc:gmatch("%a+%.h")do local dcc=ccc:gsub("%.h","")if(dcc~="self")and(dcc~="parent")then -table.insert(acc,dcc)end end -for ccc,dcc in pairs(acc)do bcc[dcc]=adb(dcc)if(bcc[dcc]==nil)then -error("Dynamic Values - unable to find object "..dcc)end end;bcc["self"]=dbc;bcc["parent"]=dbc:getParent()return bcc end -local function cac(dbc,_cc)local acc=dbc;for bcc in dbc:gmatch("%w+%.x")do -acc=acc:gsub(bcc,_cc[bcc:gsub("%.x","")]:getX())end;for bcc in dbc:gmatch("%w+%.y")do -acc=acc:gsub(bcc,_cc[bcc:gsub("%.y","")]:getY())end;for bcc in dbc:gmatch("%w+%.w")do -acc=acc:gsub(bcc,_cc[bcc:gsub("%.w","")]:getWidth())end;for bcc in dbc:gmatch("%w+%.h")do -acc=acc:gsub(bcc,_cc[bcc:gsub("%.h","")]:getHeight())end;return acc end -local function dac(dbc) -if(#cba>0)then -for n=1,dba do -if(cba[n]~=nil)then local _cc;if(#cba[n][3]<=0)then -cba[n][3]=bac(cba[n][4],cba[n][2])end -_cc=cac(cba[n][2],cba[n][3])cba[n][1]=_ac(_cc)if(cba[n][4]:getType()=="Frame")then -cba[n][4]:recalculateDynamicValues()end end end -for _cc,acc in pairs(baa)do -if(aaa[acc]~=nil)then -for bcc,ccc in pairs(aaa[acc])do -if -(c_a.getDynamicValueEventSetting())then if(ccc.eventHandler~=nil)then -ccc:eventHandler("basalt_dynamicvalue",dbc)end end;if(ccc.customEventHandler~=nil)then -ccc:customEventHandler("basalt_resize",dbc)end end end end end end;local function _bc(dbc)return cba[dbc][1]end -local function abc(dbc)local _cc=0 -for acc,bcc in pairs(aaa)do -for ccc,dcc in pairs(bcc)do -if( -dcc.getHeight~=nil)and(dcc.getY~=nil)then -if -(dcc:getType()=="Dropdown")then local _dc,adc=dcc:getHeight(),dcc:getY() -local bdc,cdc=dcc:getDropdownSize()_dc=_dc+cdc-1 -if(_dc+adc-dbc:getHeight()>=_cc)then _cc=dd( -_dc+adc-dbc:getHeight(),0)end else local _dc,adc=dcc:getHeight(),dcc:getY()if( -_dc+adc-dbc:getHeight()>=_cc)then -_cc=dd(_dc+adc-dbc:getHeight(),0)end end end end end;return _cc end -local function bbc(dbc)local _cc=0 -for acc,bcc in pairs(aaa)do -for ccc,dcc in pairs(bcc)do -if -(dcc.getWidth~=nil)and(dcc.getX~=nil)then local _dc,adc=dcc:getWidth(),dcc:getX()if( -_dc+adc-dbc:getWidth()>=_cc)then -_cc=dd(_dc+adc-dbc:getWidth(),0)end end end end;return _cc end;local function cbc(dbc)if(bab)then cda=abc(dbc)end end -caa={barActive=false,barBackground=colors.gray,barTextcolor=colors.black,barText="New Frame",barTextAlign="left",addEvent=b_c,removeEvent=c_c,removeEvents=ddb,getEvent=a_c,newDynamicValue=aac,recalculateDynamicValues=dac,getDynamicValue=_bc,getType=function(dbc)return -_aa end,setZIndex=function(dbc,_cc)d_a.setZIndex(dbc,_cc)for acc,bcc in pairs(dab)do if(bcc)then -dbc.parent:addEvent(acc,dbc)end end;return dbc end,setFocusedObject=function(dbc,_cc) -if( -_ab~=_cc)then if(_ab~=nil)then -if(adb(_ab)~=nil)then _ab:loseFocusHandler()end end;if(_cc~=nil)then if(adb(_cc)~=nil)then -_cc:getFocusHandler()end end;_ab=_cc end;return dbc end,getVariable=function(dbc,_cc)return -c_a.getVariable(_cc)end,setSize=function(dbc,_cc,acc,bcc) -d_a.setSize(dbc,_cc,acc,bcc)if(dbc.parent==nil)then abb=db(_ca)end -for ccc,dcc in pairs(baa)do if(aaa[dcc]~=nil)then -for _dc,adc in -pairs(aaa[dcc])do if(adc.customEventHandler~=nil)then -adc:customEventHandler("basalt_resize",dbc)end end end end;dbc:recalculateDynamicValues()aab=false;return dbc end,setTheme=function(dbc,_cc,acc) -if( -type(_cc)=="table")then bba=_cc elseif(type(_cc)=="string")then bba[_cc]=acc end;dbc:updateDraw()return dbc end,getTheme=function(dbc,_cc) -return -bba[_cc]or(dbc.parent~=nil and dbc.parent:getTheme(_cc)or -c_a.getTheme(_cc))end,getThemeColor=function(dbc,_cc)return -_cc~=nil and _bb[_cc]or _bb end,setThemeColor=function(dbc,_cc,...) -if -(dbc.parent==nil)then -if(dbc==c_a.getActiveFrame())then -if(type(_cc)=="string")then _bb[_cc]=... -_ca.setPaletteColor( -type(_cc)=="number"and _cc or colors[_cc],...)elseif(type(_cc)=="table")then -for acc,bcc in pairs(_cc)do _bb[acc]=bcc -if(type(bcc)=="number")then -_ca.setPaletteColor( -type(acc)=="number"and acc or colors[acc],bcc)else local ccc,dcc,_dc=table.unpack(bcc) -_ca.setPaletteColor( -type(acc)=="number"and acc or colors[acc],ccc,dcc,_dc)end end end end end;return dbc end,setPosition=function(dbc,_cc,acc,bcc) -d_a.setPosition(dbc,_cc,acc,bcc)dbc:recalculateDynamicValues()return dbc end,getBasaltInstance=function(dbc)return -c_a end,setOffset=function(dbc,_cc,acc) -acb=_cc~=nil and -d_c.floor(_cc<0 and d_c.abs(_cc)or-_cc)or acb -bcb=acc~=nil and -d_c.floor(acc<0 and d_c.abs(acc)or-acc)or bcb;dbc:updateDraw()return dbc end,getOffsetInternal=function(dbc)return -acb,bcb end,getOffset=function(dbc)return acb<0 and d_c.abs(acb)or-acb,bcb<0 and -d_c.abs(bcb)or-bcb end,removeFocusedObject=function(dbc)if( -_ab~=nil)then -if(adb(_ab)~=nil)then _ab:loseFocusHandler()end end;_ab=nil;return dbc end,getFocusedObject=function(dbc)return -_ab end,setCursor=function(dbc,_cc,acc,bcc,ccc) -if(dbc.parent~=nil)then -local dcc,_dc=dbc:getAnchorPosition() -dbc.parent:setCursor(_cc or false,(acc or 0)+dcc-1,(bcc or 0)+_dc-1, -ccc or _cb)else -local dcc,_dc=dbc:getAbsolutePosition(dbc:getAnchorPosition(dbc:getX(),dbc:getY(),true))bbb=_cc or false;if(acc~=nil)then cbb=dcc+acc-1 end;if(bcc~=nil)then dbb=_dc+ -bcc-1 end;_cb=ccc or _cb;if(bbb)then -_ca.setTextColor(_cb)_ca.setCursorPos(cbb,dbb)_ca.setCursorBlink(bbb)else -_ca.setCursorBlink(false)end end;return dbc end,setMovable=function(dbc,_cc) -if( -dbc.parent~=nil)then b_b=_cc or not b_b -dbc.parent:addEvent("mouse_click",dbc)dab["mouse_click"]=true -dbc.parent:addEvent("mouse_up",dbc)dab["mouse_up"]=true -dbc.parent:addEvent("mouse_drag",dbc)dab["mouse_drag"]=true end;return dbc end,setScrollable=function(dbc,_cc)bda=( -_cc or _cc==nil)and true or false -if( -dbc.parent~=nil)then dbc.parent:addEvent("mouse_scroll",dbc)end;dab["mouse_scroll"]=true;return dbc end,setScrollAmount=function(dbc,_cc)cda= -_cc or cda;bab=false;return dbc end,getScrollAmount=function(dbc)return bab and cbc(dbc)or -cda end,getCalculatedVerticalScroll=abc,getCalculatedHorizontalScroll=bbc,show=function(dbc)d_a.show(dbc) -if( -dbc.parent==nil)then c_a.setActiveFrame(dbc) -for _cc,acc in pairs(colors)do if -(type(acc)=="number")then -_ca.setPaletteColor(acc,colors.packRGB(term.nativePaletteColor((acc))))end end -for _cc,acc in pairs(_bb)do -if(type(acc)=="number")then -_ca.setPaletteColor( -type(_cc)=="number"and _cc or colors[_cc],acc)else local bcc,ccc,dcc=table.unpack(acc) -_ca.setPaletteColor( -type(_cc)=="number"and _cc or colors[_cc],bcc,ccc,dcc)end end -if(bca)and not(cca)then c_a.setMonitorFrame(aca,dbc)elseif(cca)then -c_a.setMonitorFrame(dbc:getName(),dbc,aca)else c_a.setMainFrame(dbc)end end;return dbc end,hide=function(dbc) -d_a.hide(dbc) -if(dbc.parent==nil)then if(activeFrame==dbc)then activeFrame=nil end -if(bca)and -not(cca)then if(c_a.getMonitorFrame(aca)==dbc)then -c_a.setActiveFrame(nil)end elseif(cca)then -if( -c_a.getMonitorFrame(dbc:getName())==dbc)then c_a.setActiveFrame(nil)end else -if(c_a.getMainFrame()==dbc)then c_a.setMainFrame(nil)end end end;return dbc end,addLayout=function(dbc,_cc) -if( -_cc~=nil)then -if(fs.exists(_cc))then local acc=fs.open(_cc,"r") -local bcc=ac:ParseXmlText(acc.readAll())acc.close()ccb={}dbc:setValuesByXMLData(bcc)end end;return dbc end,getLastLayout=function(dbc)return -ccb end,addLayoutFromString=function(dbc,_cc)if(_cc~=nil)then local acc=ac:ParseXmlText(_cc) -dbc:setValuesByXMLData(acc)end;return dbc end,setValuesByXMLData=function(dbc,_cc) -d_a.setValuesByXMLData(dbc,_cc)if(_d("movable",_cc)~=nil)then if(_d("movable",_cc))then -dbc:setMovable(true)end end;if( -_d("scrollable",_cc)~=nil)then -if(_d("scrollable",_cc))then dbc:setScrollable(true)end end;if -(_d("monitor",_cc)~=nil)then -dbc:setMonitor(_d("monitor",_cc)):show()end;if(_d("mirror",_cc)~=nil)then -dbc:setMirror(_d("mirror",_cc))end -if(_d("bar",_cc)~=nil)then if(_d("bar",_cc))then -dbc:showBar(true)else dbc:showBar(false)end end -if(_d("barText",_cc)~=nil)then dbc.barText=_d("barText",_cc)end;if(_d("barBG",_cc)~=nil)then -dbc.barBackground=colors[_d("barBG",_cc)]end;if(_d("barFG",_cc)~=nil)then -dbc.barTextcolor=colors[_d("barFG",_cc)]end;if(_d("barAlign",_cc)~=nil)then -dbc.barTextAlign=_d("barAlign",_cc)end;if(_d("layout",_cc)~=nil)then -dbc:addLayout(_d("layout",_cc))end;if(_d("xOffset",_cc)~=nil)then -dbc:setOffset(_d("xOffset",_cc),bcb)end;if(_d("yOffset",_cc)~=nil)then -dbc:setOffset(bcb,_d("yOffset",_cc))end;if(_d("scrollAmount",_cc)~=nil)then -dbc:setScrollAmount(_d("scrollAmount",_cc))end;local acc=_cc:children() -for bcc,ccc in -pairs(acc)do if(ccc.___name~="animation")then -local dcc=ccc.___name:gsub("^%l",string.upper) -if(cb[dcc]~=nil)then _db(ccc,dbc["add"..dcc],dbc)end end end;_db(_cc["frame"],dbc.addFrame,dbc) -_db(_cc["animation"],dbc.addAnimation,dbc)return dbc end,showBar=function(dbc,_cc)dbc.barActive= -_cc or not dbc.barActive;dbc:updateDraw() -return dbc end,setBar=function(dbc,_cc,acc,bcc)dbc.barText=_cc or""dbc.barBackground= -acc or dbc.barBackground -dbc.barTextcolor=bcc or dbc.barTextcolor;dbc:updateDraw()return dbc end,setBarTextAlign=function(dbc,_cc)dbc.barTextAlign= -_cc or"left"dbc:updateDraw()return dbc end,setMirror=function(dbc,_cc)if( -dbc.parent~=nil)then -error("Frame has to be a base frame in order to attach a mirror.")end;a_b=_cc;if(mirror~=nil)then -abb.setMirror(mirror)end;dda=true;return dbc end,removeMirror=function(dbc)mirror= -nil;dda=false;abb.setMirror(nil)return dbc end,setMonitorScale=function(dbc,_cc)if -(bca)then _ca.setTextScale(_cc)end;return dbc end,setMonitor=function(dbc,_cc,acc) -if( -_cc~=nil)and(_cc~=false)then -if(type(_cc)=="string")then -if( -peripheral.getType(_cc)=="monitor")then _ca=peripheral.wrap(_cc)dca=true end -if(dbc.parent~=nil)then dbc.parent:removeObject(dbc)end;bca=true;c_a.setMonitorFrame(_cc,dbc)elseif(type(_cc)=="table")then -_ca=bc(_cc)dca=true;bca=true;cca=true -c_a.setMonitorFrame(dbc:getName(),dbc,true)end else _ca=parentTerminal;bca=false;cca=false -if(type(aca)=="string")then -if( -c_a.getMonitorFrame(aca)==dbc)then c_a.setMonitorFrame(aca,nil)end else -if(c_a.getMonitorFrame(dbc:getName())==dbc)then c_a.setMonitorFrame(dbc:getName(), -nil)end end end;if(acc~=nil)then _ca.setTextScale(acc)end;abb=db(_ca) -dbc:setSize(_ca.getSize())aab=true;aca=_cc or nil;dbc:updateDraw()return dbc end,loseFocusHandler=function(dbc) -d_a.loseFocusHandler(dbc)if(_ab~=nil)then _ab:loseFocusHandler()_ab=nil end end,getFocusHandler=function(dbc) -d_a.getFocusHandler(dbc) -if(dbc.parent~=nil)then -if(b_b)then dbc.parent:removeEvents(dbc) -dbc.parent:removeObject(dbc)dbc.parent:addObject(dbc)for _cc,acc in pairs(dab)do if(acc)then -dbc.parent:addEvent(_cc,dbc)end end -dbc:updateDraw()end end;if(_ab~=nil)then _ab:getFocusHandler()end end,eventHandler=function(dbc,_cc,...) -d_a.eventHandler(dbc,_cc,...) -if(daa["other_event"]~=nil)then -for acc,bcc in ipairs(_ba["other_event"])do if( -daa["other_event"][bcc]~=nil)then -for ccc,dcc in dc(daa["other_event"][bcc])do if -(dcc.eventHandler~=nil)then dcc:eventHandler(_cc,...)end end end end end -if(aab)and not(bca)then if(dbc.parent==nil)then -if(_cc=="term_resize")then -dbc:sendEvent("basalt_resize",dbc,_cc,...)dbc:setSize(_ca.getSize())aab=true end end end -if(bca)then -if(aab)then -if(_cc=="monitor_resize")then -if(type(aca)=="string")then -dbc:setSize(_ca.getSize())elseif(type(aca)=="table")then -for acc,bcc in pairs(aca)do for ccc,dcc in pairs(bcc)do if(p1 ==dcc)then -dbc:setSize(_ca.getSize())end end end end;aab=true;dbc:updateDraw()end end -if(_cc=="peripheral")and(p1 ==aca)then if -(peripheral.getType(aca)=="monitor")then dca=true;_ca=peripheral.wrap(aca)abb=db(_ca) -dbc:updateDraw()end end -if(_cc=="peripheral_detach")and(p1 ==aca)then dca=false end end -if(dda)then if(peripheral.getType(a_b)=="monitor")then __b=true -abb.setMirror(peripheral.wrap(a_b))end;if(_cc=="peripheral_detach")and -(p1 ==a_b)then dca=false end -if -(_cc=="monitor_touch")and(a_b==p1)then dbc:mouseHandler(1,p2,p3,true)end end end,mouseHandler=function(dbc,_cc,acc,bcc,ccc,dcc) -if -(cca)then if(_ca.calculateClick~=nil)then -acc,bcc=_ca.calculateClick(dcc,acc,bcc)end end -if(d_a.mouseHandler(dbc,_cc,acc,bcc,ccc))then -if(daa["mouse_click"]~=nil)then -dbc:setCursor(false) -for _dc,adc in ipairs(_ba["mouse_click"])do -if -(daa["mouse_click"][adc]~=nil)then for bdc,cdc in dc(daa["mouse_click"][adc])do -if(cdc.mouseHandler~=nil)then if -(cdc:mouseHandler(_cc,acc,bcc,ccc))then return true end end end end end end -if(b_b)then -local _dc,adc=dbc:getAbsolutePosition(dbc:getAnchorPosition())if -(acc>=_dc)and(acc<=_dc+dbc:getWidth()-1)and(bcc==adc)then c_b=true;_da=_dc-acc -ada=yOff and 1 or 0 end end;dbc:removeFocusedObject()return true end;return false end,mouseUpHandler=function(dbc,_cc,acc,bcc)if -(c_b)then c_b=false end -if(d_a.mouseUpHandler(dbc,_cc,acc,bcc))then -if -(daa["mouse_up"]~=nil)then -for ccc,dcc in ipairs(_ba["mouse_up"])do -if(daa["mouse_up"][dcc]~=nil)then -for _dc,adc in -dc(daa["mouse_up"][dcc])do if(adc.mouseUpHandler~=nil)then -if(adc:mouseUpHandler(_cc,acc,bcc))then return true end end end end end end;return true end;return false end,scrollHandler=function(dbc,_cc,acc,bcc) -if -(d_a.scrollHandler(dbc,_cc,acc,bcc))then -if(daa["mouse_scroll"]~=nil)then -for dcc,_dc in pairs(_ba["mouse_scroll"])do -if( -daa["mouse_scroll"][_dc]~=nil)then -for adc,bdc in dc(daa["mouse_scroll"][_dc])do if(bdc.scrollHandler~= -nil)then -if(bdc:scrollHandler(_cc,acc,bcc))then return true end end end end end end;local ccc=bcb -if(bda)then cbc(dbc)if(_cc>0)or(_cc<0)then -bcb=dd(cd(bcb-_cc,0),-cda)dbc:updateDraw()end end;if(bcb==ccc)then return false end;dbc:removeFocusedObject() -return true end;return false end,hoverHandler=function(dbc,_cc,acc,bcc) -if -(d_a.hoverHandler(dbc,_cc,acc,bcc))then -if(daa["mouse_move"]~=nil)then -for ccc,dcc in pairs(_ba["mouse_move"])do -if( -daa["mouse_move"][dcc]~=nil)then for _dc,adc in dc(daa["mouse_move"][dcc])do -if -(adc.hoverHandler~=nil)then if(adc:hoverHandler(_cc,acc,bcc))then return true end end end end end end end;return false end,dragHandler=function(dbc,_cc,acc,bcc) -if -(c_b)then local ccc,dcc=dbc.parent:getOffsetInternal()ccc=ccc<0 and -d_c.abs(ccc)or-ccc;dcc=dcc<0 and d_c.abs(dcc)or- -dcc;local _dc=1;local adc=1;if(dbc.parent~=nil)then -_dc,adc=dbc.parent:getAbsolutePosition(dbc.parent:getAnchorPosition())end -dbc:setPosition( -acc+_da- (_dc-1)+ccc,bcc+ada- (adc-1)+dcc)dbc:updateDraw()return true end -if(dbc:isVisible())and(dbc:isEnabled())then -if -(daa["mouse_drag"]~=nil)then -for ccc,dcc in ipairs(_ba["mouse_drag"])do -if -(daa["mouse_drag"][dcc]~=nil)then for _dc,adc in dc(daa["mouse_drag"][dcc])do -if(adc.dragHandler~=nil)then if -(adc:dragHandler(_cc,acc,bcc))then return true end end end end end end end;d_a.dragHandler(dbc,_cc,acc,bcc)return false end,keyHandler=function(dbc,_cc,acc) -if -(dbc:isFocused())or(dbc.parent==nil)then -local bcc=dbc:getEventSystem():sendEvent("key",dbc,"key",_cc)if(bcc==false)then return false end -if(daa["key"]~=nil)then -for ccc,dcc in pairs(_ba["key"])do -if( -daa["key"][dcc]~=nil)then -for _dc,adc in dc(daa["key"][dcc])do if(adc.keyHandler~=nil)then if -(adc:keyHandler(_cc,acc))then return true end end end end end end end;return false end,keyUpHandler=function(dbc,_cc) -if -(dbc:isFocused())or(dbc.parent==nil)then -local acc=dbc:getEventSystem():sendEvent("key_up",dbc,"key_up",_cc)if(acc==false)then return false end -if(daa["key_up"]~=nil)then -for bcc,ccc in -pairs(_ba["key_up"])do -if(daa["key_up"][ccc]~=nil)then for dcc,_dc in dc(daa["key_up"][ccc])do -if( -_dc.keyUpHandler~=nil)then if(_dc:keyUpHandler(_cc))then return true end end end end end end end;return false end,charHandler=function(dbc,_cc) -if -(dbc:isFocused())or(dbc.parent==nil)then -local acc=dbc:getEventSystem():sendEvent("char",dbc,"char",_cc)if(acc==false)then return false end -if(daa["char"]~=nil)then -for bcc,ccc in -pairs(_ba["char"])do -if(daa["char"][ccc]~=nil)then for dcc,_dc in dc(daa["char"][ccc])do -if -(_dc.charHandler~=nil)then if(_dc:charHandler(_cc))then return true end end end end end end end;return false end,setText=function(dbc,_cc,acc,bcc) -local ccc,dcc=dbc:getAnchorPosition() -if(acc>=1)and(acc<=dbc:getHeight())then -if(dbc.parent~=nil)then -dbc.parent:setText(dd( -_cc+ (ccc-1),ccc),dcc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)))else -abb.setText(dd(_cc+ (ccc-1),ccc),dcc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)))end end end,setBG=function(dbc,_cc,acc,bcc) -local ccc,dcc=dbc:getAnchorPosition() -if(acc>=1)and(acc<=dbc:getHeight())then -if(dbc.parent~=nil)then -dbc.parent:setBG(dd( -_cc+ (ccc-1),ccc),dcc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)))else -abb.setBG(dd(_cc+ (ccc-1),ccc),dcc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)))end end end,setFG=function(dbc,_cc,acc,bcc) -local ccc,dcc=dbc:getAnchorPosition() -if(acc>=1)and(acc<=dbc:getHeight())then -if(dbc.parent~=nil)then -dbc.parent:setFG(dd( -_cc+ (ccc-1),ccc),dcc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)))else -abb.setFG(dd(_cc+ (ccc-1),ccc),dcc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)))end end end,writeText=function(dbc,_cc,acc,bcc,ccc,dcc) -local _dc,adc=dbc:getAnchorPosition() -if(acc>=1)and(acc<=dbc:getHeight())then -if(dbc.parent~=nil)then -dbc.parent:writeText(dd( -_cc+ (_dc-1),_dc),adc+acc-1,bd(bcc,dd(1 -_cc+1,1), -dbc:getWidth()-_cc+1),ccc,dcc)else -abb.writeText(dd(_cc+ (_dc-1),_dc),adc+acc-1,bd(bcc,dd(1 -_cc+1,1),dd( -dbc:getWidth()-_cc+1,1)),ccc,dcc)end end end,blit=function(dbc,_cc,acc,bcc,ccc,dcc) -local _dc,adc=dbc:getAnchorPosition() -if(acc>=1)and(acc<=dbc:getHeight())then -local bdc=dbc:getWidth() -if(dbc.parent~=nil)then -bcc=bd(bcc,dd(1 -_cc+1,1),bdc-_cc+1)ccc=bd(ccc,dd(1 -_cc+1,1),bdc-_cc+1)dcc=bd(dcc,dd( -1 -_cc+1,1),bdc-_cc+1) -dbc.parent:blit(dd( -_cc+ (_dc-1),_dc),adc+acc-1,bcc,ccc,dcc)else -bcc=bd(bcc,dd(1 -_cc+1,1),dd(bdc-_cc+1,1)) -ccc=bd(ccc,dd(1 -_cc+1,1),dd(bdc-_cc+1,1)) -dcc=bd(dcc,dd(1 -_cc+1,1),dd(bdc-_cc+1,1)) -abb.blit(dd(_cc+ (_dc-1),_dc),adc+acc-1,bcc,ccc,dcc)end end end,drawBackgroundBox=function(dbc,_cc,acc,bcc,ccc,dcc) -local _dc,adc=dbc:getAnchorPosition() -ccc=(acc<1 and( -ccc+acc>dbc:getHeight()and dbc:getHeight()or ccc+acc-1)or( -ccc+ -acc>dbc:getHeight()and dbc:getHeight()-acc+1 or ccc)) -bcc=(_cc<1 and(bcc+_cc>dbc:getWidth()and dbc:getWidth()or bcc+ -_cc-1)or( - -bcc+_cc>dbc:getWidth()and dbc:getWidth()-_cc+1 or bcc)) -if(dbc.parent~=nil)then -dbc.parent:drawBackgroundBox(dd(_cc+ (_dc-1),_dc),dd(acc+ (adc-1),adc),bcc,ccc,dcc)else -abb.drawBackgroundBox(dd(_cc+ (_dc-1),_dc),dd(acc+ (adc-1),adc),bcc,ccc,dcc)end end,drawTextBox=function(dbc,_cc,acc,bcc,ccc,dcc) -local _dc,adc=dbc:getAnchorPosition() -ccc=(acc<1 and( -ccc+acc>dbc:getHeight()and dbc:getHeight()or ccc+acc-1)or( -ccc+ -acc>dbc:getHeight()and dbc:getHeight()-acc+1 or ccc)) -bcc=(_cc<1 and(bcc+_cc>dbc:getWidth()and dbc:getWidth()or bcc+ -_cc-1)or( - -bcc+_cc>dbc:getWidth()and dbc:getWidth()-_cc+1 or bcc)) -if(dbc.parent~=nil)then -dbc.parent:drawTextBox(dd(_cc+ (_dc-1),_dc),dd(acc+ (adc-1),adc),bcc,ccc,bd(dcc,1,1))else -abb.drawTextBox(dd(_cc+ (_dc-1),_dc),dd(acc+ (adc-1),adc),bcc,ccc,bd(dcc,1,1))end end,drawForegroundBox=function(dbc,_cc,acc,bcc,ccc,dcc) -local _dc,adc=dbc:getAnchorPosition() -ccc=(acc<1 and( -ccc+acc>dbc:getHeight()and dbc:getHeight()or ccc+acc-1)or( -ccc+ -acc>dbc:getHeight()and dbc:getHeight()-acc+1 or ccc)) -bcc=(_cc<1 and(bcc+_cc>dbc:getWidth()and dbc:getWidth()or bcc+ -_cc-1)or( - -bcc+_cc>dbc:getWidth()and dbc:getWidth()-_cc+1 or bcc)) -if(dbc.parent~=nil)then -dbc.parent:drawForegroundBox(dd(_cc+ (_dc-1),_dc),dd(acc+ (adc-1),adc),bcc,ccc,dcc)else -abb.drawForegroundBox(dd(_cc+ (_dc-1),_dc),dd(acc+ (adc-1),adc),bcc,ccc,dcc)end end,draw=function(dbc,_cc)if -(bca)and not(dca)then return false end -if(dbc.parent==nil)then if(dbc:getDraw()== -false)then return false end end -if(d_a.draw(dbc))then -local acc,bcc=dbc:getAbsolutePosition(dbc:getAnchorPosition())local ccc,dcc=dbc:getAnchorPosition()local _dc,adc=dbc:getSize() -if( -dbc.parent==nil)then -if(dbc.bgColor~=false)then -abb.drawBackgroundBox(ccc,dcc,_dc,adc,dbc.bgColor)abb.drawTextBox(ccc,dcc,_dc,adc," ")end;if(dbc.fgColor~=false)then -abb.drawForegroundBox(ccc,dcc,_dc,adc,dbc.fgColor)end end -if(dbc.barActive)then -if(dbc.parent~=nil)then -dbc.parent:writeText(ccc,dcc,_c.getTextHorizontalAlign(dbc.barText,_dc,dbc.barTextAlign),dbc.barBackground,dbc.barTextcolor)else -abb.writeText(ccc,dcc,_c.getTextHorizontalAlign(dbc.barText,_dc,dbc.barTextAlign),dbc.barBackground,dbc.barTextcolor)end -if(dbc:getBorder("left"))then -if(dbc.parent~=nil)then -dbc.parent:drawBackgroundBox(ccc-1,dcc,1,1,dbc.barBackground)if(dbc.bgColor~=false)then -dbc.parent:drawBackgroundBox(ccc-1,dcc+1,1,adc-1,dbc.bgColor)end end end -if(dbc:getBorder("top"))then if(dbc.parent~=nil)then -dbc.parent:drawBackgroundBox(ccc-1,dcc-1,_dc+1,1,dbc.barBackground)end end end;for bdc,cdc in dc(baa)do -if(aaa[cdc]~=nil)then for ddc,__d in pairs(aaa[cdc])do -if(__d.draw~=nil)then __d:draw()end end end end end end,updateTerm=function(dbc)if -(bca)and not(dca)then return false end;abb.update()end,addObject=function(dbc,_cc)return -cdb(_cc)end,removeObject=__c,getObject=function(dbc,_cc)return adb(_cc)end,getDeepObject=function(dbc,_cc)return bdb(_cc)end,addFrame=function(dbc,_cc)local acc=c_a.newFrame( -_cc or cc(),dbc,nil,c_a)return cdb(acc)end,init=function(dbc) -if -not(cab)then -if(a_a~=nil)then d_a.width,d_a.height=a_a:getSize() -dbc:setBackground(a_a:getTheme("FrameBG")) -dbc:setForeground(a_a:getTheme("FrameText"))else d_a.width,d_a.height=_ca.getSize() -dbc:setBackground(c_a.getTheme("BasaltBG")) -dbc:setForeground(c_a.getTheme("BasaltText"))end;cab=true end end} -for dbc,_cc in pairs(cb)do caa["add"..dbc]=function(acc,bcc) -return cdb(_cc(bcc or cc(),acc))end end;setmetatable(caa,d_a)return caa end end aa["loadObjects"]=function(...)local ab={}if(ba)then for db,_c in pairs(_b("objects"))do ab[db]=_c()end;return ab end;local bb=table.pack(...)local cb=fs.getDir( bb[2]or"Basalt")if(cb==nil)then error("Unable to find directory "..bb[2].. -" please report this bug to our discord.")end;for db,_c in -pairs(fs.list(fs.combine(cb,"objects")))do -if(_c~="example.lua")then local ac=_c:gsub(".lua","")ab[ac]=da(ac)end end;return ab end -aa["main"]=function(...)local ab=da("basaltEvent")()local bb=da("Frame") -local cb=da("theme")local db=da("utils")local _c=da("basaltLogs")local ac=db.uuid -local bc=db.createText;local cc=db.tableCount;local dc=300;local _d=50;local ad=term.current()local bd="1.6.4"local cd=fs.getDir( -table.pack(...)[2]or"") -local dd,__a,a_a,b_a,c_a,d_a={},{},{},{},{},{}local _aa,aaa,baa,caa;local daa={}if -not term.isColor or not term.isColor()then -error('Basalt requires an advanced (golden) computer to run.',0)end;local _ba={} -for dab,_bb in -pairs(colors)do if(type(_bb)=="number")then -_ba[dab]={ad.getPaletteColor(_bb)}end end -local function aba()caa=false;ad.clear()ad.setCursorPos(1,1) -for dab,_bb in pairs(colors)do if(type(_bb)== -"number")then -ad.setPaletteColor(_bb,colors.packRGB(table.unpack(_ba[dab])))end end end -local function bba(dab)ad.clear()ad.setBackgroundColor(colors.black) -ad.setTextColor(colors.red)local _bb,abb=ad.getSize()if(daa.logging)then _c(dab,"Error")end;local bbb=bc( -"Basalt error: "..dab,_bb)local cbb=1;for dbb,_cb in pairs(bbb)do -ad.setCursorPos(1,cbb)ad.write(_cb)cbb=cbb+1 end;ad.setCursorPos(1, -cbb+1)caa=false end -local function cba(dab) -assert(dab~="function","Schedule needs a function in order to work!") -return function(...)local _bb=coroutine.create(dab) -local abb,bbb=coroutine.resume(_bb,...) -if(abb)then table.insert(d_a,{_bb,bbb})else bba(bbb)end end end;local dba=function(dab,_bb)c_a[dab]=_bb end -local _ca=function(dab)return c_a[dab]end;local aca=function(dab)cb=dab end -local bca=function(dab)return cb[dab]end -local cca={getDynamicValueEventSetting=function()return daa.dynamicValueEvents end,getMainFrame=function()return _aa end,setVariable=dba,getVariable=_ca,getTheme=bca,setMainFrame=function(dab) -_aa=dab end,getActiveFrame=function()return aaa end,setActiveFrame=function(dab)aaa=dab end,getFocusedObject=function()return baa end,setFocusedObject=function(dab)baa=dab end,getMonitorFrame=function(dab)return -a_a[dab]or b_a[dab][1]end,setMonitorFrame=function(dab,_bb,abb)if(_aa==_bb)then -_aa=nil end -if(abb)then b_a[dab]={_bb,sides}else a_a[dab]=_bb end;if(_bb==nil)then b_a[dab]=nil end end,getBaseTerm=function()return -ad end,schedule=cba,stop=aba,newFrame=bb,getDirectory=function()return cd end} -local function dca(dab,...) -if(#d_a>0)then local _bb={} -for n=1,#d_a do -if(d_a[n]~=nil)then +" please report this bug to our discord.")end +for db,_c in +pairs(fs.list(fs.combine(cb,"objects")))do if(_c~="example.lua")and not(_c:find(".disabled"))then +local ac=_c:gsub(".lua","")ab[ac]=da(ac)end end;return ab end +aa["plugin"]=function(...)local ab={...}local bb={}local cb={} +local db=fs.getDir(ab[2]or"Basalt")local _c=fs.combine(db,"plugins") +if(ba)then +for bc,cc in pairs(_b("plugins"))do +table.insert(cb,bc)local dc=cc() +if(type(dc)=="table")then for _d,ad in pairs(dc)do +if(type(_d)=="string")then if(bb[_d]==nil)then +bb[_d]={}end;table.insert(bb[_d],ad)end end end end else +if(fs.exists(_c))then +for bc,cc in pairs(fs.list(_c))do local dc if -(coroutine.status(d_a[n][1])=="suspended")then -if(d_a[n][2]~=nil)then -if(d_a[n][2]==dab)then -local abb,bbb=coroutine.resume(d_a[n][1],dab,...)d_a[n][2]=bbb;if not(abb)then bba(bbb)end end else local abb,bbb=coroutine.resume(d_a[n][1],dab,...) -d_a[n][2]=bbb;if not(abb)then bba(bbb)end end else table.insert(_bb,n)end end end -for n=1,#_bb do table.remove(d_a,_bb[n]- (n-1))end end end -local function _da()if(caa==false)then return end;if(_aa~=nil)then _aa:draw() -_aa:updateTerm()end -for dab,_bb in pairs(a_a)do _bb:draw()_bb:updateTerm()end -for dab,_bb in pairs(b_a)do _bb[1]:draw()_bb[1]:updateTerm()end end;local ada,bda,cda=nil,nil,nil;local dda=nil -local function __b(dab,_bb,abb,bbb)ada,bda,cda=_bb,abb,bbb;if(dda==nil)then -dda=os.startTimer(dc/1000)end end -local function a_b()dda=nil;_aa:hoverHandler(bda,cda,ada)aaa=_aa end;local b_b,c_b,d_b=nil,nil,nil;local _ab=nil;local function aab()_ab=nil;_aa:dragHandler(b_b,c_b,d_b) -aaa=_aa end;local function bab(dab,_bb,abb,bbb)b_b,c_b,d_b=_bb,abb,bbb -if(_d<50)then aab()else if(_ab==nil)then _ab=os.startTimer( -_d/1000)end end end -local function cab(dab,...) -local _bb={...} -if(ab:sendEvent("basaltEventCycle",dab,...)==false)then return end;if(dab=="terminate")then daa.stop()end -if(_aa~=nil)then -local abb={mouse_click=_aa.mouseHandler,mouse_up=_aa.mouseUpHandler,mouse_scroll=_aa.scrollHandler,mouse_drag=bab,mouse_move=__b}local bbb=abb[dab] -if(bbb~=nil)then bbb(_aa,...)dca(dab,...)_da()return end end -if(dab=="monitor_touch")then if(a_a[_bb[1]]~=nil)then -a_a[_bb[1]]:mouseHandler(1,_bb[2],_bb[3],true)aaa=a_a[_bb[1]]end -if -(cc(b_a)>0)then for abb,bbb in pairs(b_a)do -bbb[1]:mouseHandler(1,_bb[2],_bb[3],true,_bb[1])end end;dca(dab,...)_da()return end -if(aaa~=nil)then -local abb={char=aaa.charHandler,key=aaa.keyHandler,key_up=aaa.keyUpHandler}local bbb=abb[dab]if(bbb~=nil)then if(dab=="key")then dd[_bb[1]]=true elseif(dab=="key_up")then -dd[_bb[1]]=false end;bbb(aaa,...)dca(dab,...) -_da()return end end -if(dab=="timer")and(_bb[1]==dda)then a_b()elseif -(dab=="timer")and(_bb[1]==_ab)then aab()else -for abb,bbb in pairs(__a)do bbb:eventHandler(dab,...)end end;dca(dab,...)_da()end -daa={logging=false,dynamicValueEvents=false,setTheme=aca,getTheme=bca,drawFrames=_da,getVersion=function()return bd end,setVariable=dba,getVariable=_ca,setBaseTerm=function(dab)ad=dab end,log=function(...)_c(...)end,setMouseMoveThrottle=function(dab) -if -(_HOST:find("CraftOS%-PC"))then if(config.get("mouse_move_throttle")~=10)then -config.set("mouse_move_throttle",10)end -if(dab<100)then dc=100 else dc=dab end;return true end;return false end,setMouseDragThrottle=function(dab)if( -dab<=0)then _d=0 else _ab=nil;_d=dab end end,autoUpdate=function(dab) -caa=dab;if(dab==nil)then caa=true end;local function _bb()_da()while caa do -cab(os.pullEventRaw())end end -local abb,bbb=xpcall(_bb,debug.traceback)if not(abb)then bba(bbb)return end end,update=function(dab,...)if( -dab~=nil)then local _bb,abb=xpcall(cab,debug.traceback,dab,...)if not(_bb)then -bba(abb)return end end end,stop=aba,stopUpdate=aba,isKeyDown=function(dab)if( -dd[dab]==nil)then return false end;return dd[dab]end,getFrame=function(dab)for _bb,abb in -pairs(__a)do if(abb.name==dab)then return abb end end end,getActiveFrame=function()return -aaa end,setActiveFrame=function(dab) -if(dab:getType()=="Frame")then aaa=dab;return true end;return false end,onEvent=function(...) -for dab,_bb in -pairs(table.pack(...))do if(type(_bb)=="function")then -ab:registerEvent("basaltEventCycle",_bb)end end end,schedule=cba,createFrame=function(dab) -dab=dab or ac() -for abb,bbb in pairs(__a)do if(bbb.name==dab)then return nil end end;local _bb=bb(dab,nil,nil,cca)_bb:init() -table.insert(__a,_bb)if -(_aa==nil)and(_bb:getName()~="basaltDebuggingFrame")then _bb:show()end;return _bb end,removeFrame=function(dab)__a[dab]= -nil end,setProjectDir=function(dab)cd=dab end,forceRenderUpdate=function()_da()end,debug=function(...)local dab={...}if -(_aa==nil)then print(...)return end;if(_aa.name~="basaltDebuggingFrame")then -if(_aa~= -daa.debugFrame)then daa.debugLabel:setParent(_aa)end end;local _bb=""for abb,bbb in pairs(dab)do -_bb=_bb.. -tostring(bbb).. (#dab~=abb and", "or"")end -daa.debugLabel:setText("[Debug] ".._bb)for abb,bbb in pairs(bc(_bb,daa.debugList:getWidth()))do -daa.debugList:addItem(bbb)end -if( -daa.debugList:getItemCount()>50)then daa.debugList:removeItem(1)end -daa.debugList:setValue(daa.debugList:getItem(daa.debugList:getItemCount()))if -(daa.debugList.getItemCount()>daa.debugList:getHeight())then -daa.debugList:setOffset(daa.debugList:getItemCount()- -daa.debugList:getHeight())end -daa.debugLabel:show()end} -daa.debugFrame=daa.createFrame("basaltDebuggingFrame"):showBar():setBackground(colors.lightGray):setBar("Debug",colors.black,colors.gray) -daa.debugFrame:addButton("back"):setAnchor("topRight"):setSize(1,1):setText("\22"):onClick(function()if( -daa.oldFrame~=nil)then daa.oldFrame:show()end end):setBackground(colors.red):show() -daa.debugList=daa.debugFrame:addList("debugList"):setSize("parent.w - 2","parent.h - 3"):setPosition(2,3):setScrollable(true):show() -daa.debugLabel=daa.debugFrame:addLabel("debugLabel"):onClick(function() -daa.oldFrame=_aa;daa.debugFrame:show()end):setBackground(colors.black):setForeground(colors.white):setAnchor("bottomLeft"):ignoreOffset():setZIndex(20):show()return daa end -aa["Object"]=function(...)local ab=da("basaltEvent")local bb=da("utils") -local cb=da("module")local db=cb("images")local _c=bb.splitString;local ac=bb.numberFromString -local bc=bb.getValueFromXML;local cc,dc=table.unpack,string.sub +(fs.isDir(fs.combine(_c,cc)))then table.insert(cb,fs.combine(_c,cc)) +dc=da(cc.."/init")else table.insert(cb,cc)dc=da(cc:gsub(".lua",""))end +if(type(dc)=="table")then for _d,ad in pairs(dc)do +if(type(_d)=="string")then +if(bb[_d]==nil)then bb[_d]={}end;table.insert(bb[_d],ad)end end end end end end;local function ac(bc)return bb[bc]end return -function(_d)local ad="Object"local bd={}local cd=1;local dd -local __a="topLeft"local a_a=false;local b_a=true;local c_a=false;local d_a=false;local _aa=false;local aaa=false -local baa={left=false,right=false,top=false,bottom=false}local caa=colors.black;local daa=true;local _ba=false;local aba,bba,cba,dba=0,0,0,0;local _ca;local aca;local bca=1;local cca -local dca;local _da=true;local ada=true;local bda={}local cda=ab() -bd={x=1,y=1,width=1,height=1,bgColor=colors.black,bgSymbol=" ",bgSymbolColor=colors.black,fgColor=colors.white,transparentColor=false,name=_d or"Object",parent= -nil,show=function(dda)b_a=true;dda:updateDraw()return dda end,hide=function(dda)b_a=false -dda:updateDraw()return dda end,enable=function(dda)daa=true;return dda end,disable=function(dda)daa=false -return dda end,isEnabled=function(dda)return daa end,generateXMLEventFunction=function(dda,__b,a_b) -local b_b=function(c_b) -if(c_b:sub(1,1)=="#")then -local d_b=dda:getBaseFrame():getDeepObject(c_b:sub(2,c_b:len())) -if(d_b~=nil)and(d_b.internalObjetCall~=nil)then __b(dda,function() -d_b:internalObjetCall()end)end else -__b(dda,dda:getBaseFrame():getVariable(c_b))end end;if(type(a_b)=="string")then b_b(a_b)elseif(type(a_b)=="table")then -for c_b,d_b in pairs(a_b)do b_b(d_b)end end;return dda end,setValuesByXMLData=function(dda,__b) -local a_b=dda:getBaseFrame()local b_b,c_b,d_b -if(bc("texture",__b)~=nil)then b_b=bc("texture",__b)end;if(bc("mode",__b)~=nil)then c_b=bc("mode",__b)end -if( -bc("texturePlay",__b)~=nil)then d_b=bc("texturePlay",__b)end;local _ab,aab;if(bc("x",__b)~=nil)then _ab=bc("x",__b)end;if( -bc("y",__b)~=nil)then aab=bc("y",__b)end;if -(_ab~=nil)or(aab~=nil)then dda:setPosition(_ab,aab)end;local bab,cab;if( -bc("width",__b)~=nil)then bab=bc("width",__b)end;if( -bc("height",__b)~=nil)then cab=bc("height",__b)end;if(bab~=nil)or( -cab~=nil)then dda:setSize(bab,cab)end;if( -bc("bg",__b)~=nil)then -dda:setBackground(colors[bc("bg",__b)])end;if(bc("bgSymbol",__b)~=nil)then -dda:setBackground(dda.bgColor,bc("bgSymbol",__b))end;if -(bc("bgSymbolColor",__b)~=nil)then -dda:setBackground(dda.bgColor,dda.bgSymbol,colors[bc("bgSymbolColor",__b)])end +{get=ac,getAvailablePlugins=function()return cb end,addPlugin=function(bc) +if(fs.exists(bc))then +if(fs.isDir(bc))then +for cc,dc in +pairs(fs.list(bc))do table.insert(cb,dc) if -(bc("fg",__b)~=nil)then dda:setForeground(colors[bc("fg",__b)])end;if(bc("value",__b)~=nil)then -dda:setValue(colors[bc("value",__b)])end -if(bc("visible",__b)~=nil)then if -(bc("visible",__b))then dda:show()else dda:hide()end end -if(bc("enabled",__b)~=nil)then if(bc("enabled",__b))then dda:enable()else -dda:disable()end end;if(bc("zIndex",__b)~=nil)then -dda:setZIndex(bc("zIndex",__b))end;if(bc("anchor",__b)~=nil)then -dda:setAnchor(bc("anchor",__b))end;if(bc("shadowColor",__b)~=nil)then -dda:setShadow(colors[bc("shadowColor",__b)])end;if(bc("border",__b)~=nil)then -dda:setBorder(colors[bc("border",__b)])end;if(bc("borderLeft",__b)~=nil)then -baa["left"]=colors[bc("borderLeft",__b)]end;if(bc("borderTop",__b)~=nil)then -baa["top"]=colors[bc("borderTop",__b)]end;if(bc("borderRight",__b)~=nil)then -baa["right"]=colors[bc("borderRight",__b)]end -if -(bc("borderBottom",__b)~=nil)then baa["bottom"]=colors[bc("borderBottom",__b)]end;if(bc("borderColor",__b)~=nil)then -dda:setBorder(colors[bc("borderColor",__b)])end;if -(bc("ignoreOffset",__b)~=nil)then -if(bc("ignoreOffset",__b))then dda:ignoreOffset(true)end end;if -(bc("onClick",__b)~=nil)then -dda:generateXMLEventFunction(dda.onClick,bc("onClick",__b))end;if -(bc("onClickUp",__b)~=nil)then -dda:generateXMLEventFunction(dda.onClickUp,bc("onClickUp",__b))end;if -(bc("onScroll",__b)~=nil)then -dda:generateXMLEventFunction(dda.onScroll,bc("onScroll",__b))end;if -(bc("onDrag",__b)~=nil)then -dda:generateXMLEventFunction(dda.onDrag,bc("onDrag",__b))end;if(bc("onHover",__b)~=nil)then -dda:generateXMLEventFunction(dda.onHover,bc("onHover",__b))end;if -(bc("onLeave",__b)~=nil)then -dda:generateXMLEventFunction(dda.onLeave,bc("onLeave",__b))end;if(bc("onKey",__b)~=nil)then -dda:generateXMLEventFunction(dda.onKey,bc("onKey",__b))end;if(bc("onKeyUp",__b)~=nil)then -dda:generateXMLEventFunction(dda.onKeyUp,bc("onKeyUp",__b))end;if -(bc("onChange",__b)~=nil)then -dda:generateXMLEventFunction(dda.onChange,bc("onChange",__b))end;if -(bc("onResize",__b)~=nil)then -dda:generateXMLEventFunction(dda.onResize,bc("onResize",__b))end;if -(bc("onReposition",__b)~=nil)then -dda:generateXMLEventFunction(dda.onReposition,bc("onReposition",__b))end;if -(bc("onEvent",__b)~=nil)then -dda:generateXMLEventFunction(dda.onEvent,bc("onEvent",__b))end;if -(bc("onGetFocus",__b)~=nil)then -dda:generateXMLEventFunction(dda.onGetFocus,bc("onGetFocus",__b))end;if -(bc("onLoseFocus",__b)~=nil)then -dda:generateXMLEventFunction(dda.onLoseFocus,bc("onLoseFocus",__b))end;if(b_b~=nil)then -dda:setTexture(b_b,c_b,d_b)end;dda:updateDraw()return dda end,isVisible=function(dda)return -b_a end,setFocus=function(dda)if(dda.parent~=nil)then -dda.parent:setFocusedObject(dda)end;return dda end,setZIndex=function(dda,__b) -cd=__b -if(dda.parent~=nil)then dda.parent:removeObject(dda) -dda.parent:addObject(dda)dda:updateEventHandlers()end;return dda end,updateEventHandlers=function(dda) -for __b,a_b in -pairs(bda)do if(a_b)then dda.parent:addEvent(__b,dda)end end end,getZIndex=function(dda)return cd end,getType=function(dda)return ad end,getName=function(dda)return -dda.name end,remove=function(dda)if(dda.parent~=nil)then -dda.parent:removeObject(dda)end;dda:updateDraw()return dda end,setParent=function(dda,__b) +not(fs.isDir(fs.combine(bc,dc)))then local _d=dc:gsub(".lua","")local ad=da(fs.combine(bc,_d)) if( -__b.getType~=nil and __b:getType()=="Frame")then -dda:remove()__b:addObject(dda)if(dda.draw)then dda:show()end end;return dda end,setValue=function(dda,__b,a_b)if( -dd~=__b)then dd=__b;dda:updateDraw()if(a_b~=false)then -dda:valueChangedHandler()end end -return dda end,getValue=function(dda)return dd end,getDraw=function(dda)return -ada end,updateDraw=function(dda,__b)ada=__b;if(__b==nil)then ada=true end;if(ada)then if(dda.parent~=nil)then -dda.parent:updateDraw()end end;return dda end,getEventSystem=function(dda)return -cda end,getParent=function(dda)return dda.parent end,setPosition=function(dda,__b,a_b,b_b) -if(type(__b)=="number")then dda.x= -b_b and dda:getX()+__b or __b end;if(type(a_b)=="number")then -dda.y=b_b and dda:getY()+a_b or a_b end -if(dda.parent~=nil)then if(type(__b)=="string")then -dda.x=dda.parent:newDynamicValue(dda,__b)end;if(type(a_b)=="string")then -dda.y=dda.parent:newDynamicValue(dda,a_b)end -dda.parent:recalculateDynamicValues()end;dda:customEventHandler("basalt_reposition") -dda:updateDraw()return dda end,getX=function(dda)return - -type(dda.x)=="number"and dda.x or math.floor(dda.x[1]+0.5)end,getY=function(dda)return - -type(dda.y)=="number"and dda.y or math.floor(dda.y[1]+0.5)end,getPosition=function(dda)return -dda:getX(),dda:getY()end,getVisibility=function(dda)return b_a end,setVisibility=function(dda,__b) -b_a=__b or not b_a;dda:updateDraw()return dda end,setSize=function(dda,__b,a_b,b_b)if(type(__b)== -"number")then -dda.width=b_b and dda:getWidth()+__b or __b end -if(type(a_b)=="number")then dda.height=b_b and -dda:getHeight()+a_b or a_b end -if(dda.parent~=nil)then if(type(__b)=="string")then -dda.width=dda.parent:newDynamicValue(dda,__b)end;if(type(a_b)=="string")then -dda.height=dda.parent:newDynamicValue(dda,a_b)end -dda.parent:recalculateDynamicValues()end;if(_ca~=nil)and(dca=="stretch")then -aca=db.resizeBIMG(_ca,dda:getSize())[bca]end -dda:customEventHandler("basalt_resize")dda:updateDraw()return dda end,getHeight=function(dda) +type(ad)=="table")then for bd,cd in pairs(ad)do +if(type(bd)=="string")then +if(bb[bd]==nil)then bb[bd]={}end;table.insert(bb[bd],cd)end end end end end else local cc=da(bc:gsub(".lua","")) +table.insert(cb,bc:match("[\\/]?([^\\/]-([^%.]+))$")) +if(type(cc)=="table")then for dc,_d in pairs(cc)do +if(type(dc)=="string")then +if(bb[dc]==nil)then bb[dc]={}end;table.insert(bb[dc],_d)end end end end end end,loadPlugins=function(bc,cc) +for dc,_d in +pairs(bc)do local ad=bb[dc] +if(ad~=nil)then +bc[dc]=function(...)local bd=_d(...) +for cd,dd in pairs(ad)do local __a=dd(bd,cc,...) +__a.__index=__a;bd=setmetatable(__a,bd)end;return bd end end end;return bc end}end;aa["plugins"]={} +aa["plugins"]["pixelbox"]=function(...) +local ab,bb,cb=table.sort,table.concat,string.char;local function db(dc,_d)return dc[2]>_d[2]end +local _c={{5,256,16,8,64,32},{4,16,16384,256,128},[4]={4,64,1024,256,128},[8]={4,512,2048,256,1},[16]={4,2,16384,256,1},[32]={4,8192,4096,256,1},[64]={4,4,1024,256,1},[128]={6,32768,256,1024,2048,4096,16384},[256]={6,1,128,2,512,4,8192},[512]={4,8,2048,256,128},[1024]={4,4,64,128,32768},[2048]={4,512,8,128,32768},[4096]={4,8192,32,128,32768},[8192]={3,32,4096,256128},[16384]={4,2,16,128,32768},[32768]={5,128,1024,2048,4096,16384}}local ac={}for i=0,15 do ac[("%x"):format(i)]=2 ^i end +local bc={}for i=0,15 do bc[2 ^i]=("%x"):format(i)end +local function cc(dc,_d)_d=_d or"f"local ad,bd=# +dc[1],#dc;local cd={}local dd={}local __a=false +local function a_a() +for y=1,bd*3 do for x=1,ad*2 do +if not dd[y]then dd[y]={}end;dd[y][x]=_d end end;for _aa,aaa in ipairs(dc)do +for x=1,#aaa do local baa=aaa:sub(x,x)dd[_aa][x]=ac[baa]end end end;a_a()local function b_a(_aa,aaa)ad,bd=_aa,aaa;dd={}__a=false;a_a()end +local function c_a(_aa,aaa,baa,caa,daa,_ba) +local aba={_aa,aaa,baa,caa,daa,_ba}local bba={}local cba={}local dba=0 +for i=1,6 do local cca=aba[i]if not bba[cca]then dba=dba+1 +bba[cca]={0,dba}end;local dca=bba[cca]local _da=dca[1]+1;dca[1]=_da +cba[dca[2]]={cca,_da}end;local _ca=#cba +while _ca>2 do ab(cba,db)local cca=_c[cba[_ca][1]] +local dca,_da=1,false;local ada=_ca-1 +for i=2,cca[1]do if _da then break end;local dda=cca[i]for j=1,ada do if cba[j][1]==dda then dca=j +_da=true;break end end end;local bda,cda=cba[_ca][1],cba[dca][1] +for i=1,6 do if aba[i]==bda then aba[i]=cda +local dda=cba[dca]dda[2]=dda[2]+1 end end;cba[_ca]=nil;_ca=_ca-1 end;local aca=128;local bca=aba[6]if aba[1]~=bca then aca=aca+1 end;if aba[2]~=bca then aca=aca+ +2 end;if aba[3]~=bca then aca=aca+4 end;if +aba[4]~=bca then aca=aca+8 end;if aba[5]~=bca then aca=aca+16 end;if +cba[1][1]==aba[6]then return cb(aca),cba[2][1],aba[6]else +return cb(aca),cba[1][1],aba[6]end end +local function d_a()local _aa=ad*2;local aaa=0 +for y=1,bd*3,3 do aaa=aaa+1;local baa=dd[y]local caa=dd[y+1]local daa=dd[y+2] +local _ba,aba,bba={},{},{}local cba=0 +for x=1,_aa,2 do local dba=x+1 +local _ca,aca,bca,cca,dca,_da=baa[x],baa[dba],caa[x],caa[dba],daa[x],daa[dba]local ada,bda,cda=" ",1,_ca;if not( +aca==_ca and bca==_ca and cca==_ca and dca==_ca and _da==_ca)then +ada,bda,cda=c_a(_ca,aca,bca,cca,dca,_da)end;cba=cba+1 +_ba[cba]=ada;aba[cba]=bc[bda]bba[cba]=bc[cda]end;cd[aaa]={bb(_ba),bb(aba),bb(bba)}end;__a=true end return -type(dda.height)=="number"and dda.height or -math.floor(dda.height[1]+0.5)end,getWidth=function(dda)return - -type(dda.width)=="number"and dda.width or math.floor(dda.width[1]+0.5)end,getSize=function(dda)return -dda:getWidth(),dda:getHeight()end,calculateDynamicValues=function(dda) +{convert=d_a,generateCanvas=a_a,setSize=b_a,getSize=function()return ad,bd end,set=function(_aa,aaa)dc=_aa;_d=aaa or _d;dd={}__a=false;a_a()end,get=function(_aa)if +not __a then d_a()end +return _aa~=nil and cd[_aa]or cd end}end +return +{Image=function(dc,_d) +return +{shrink=function(ad)local bd=ad:getImageFrame(1)local cd={}for __a,a_a in pairs(bd)do if(type(__a)=="number")then +table.insert(cd,a_a[3])end end +local dd=cc(cd,ad:getBackground()).get()ad:setImage(dd)return ad end,getShrinkedImage=function(ad) +local bd=ad:getImageFrame(1)local cd={}for dd,__a in pairs(bd)do +if(type(dd)=="number")then table.insert(cd,__a[3])end end;return +cc(cd,ad:getBackground()).get()end}end}end +aa["plugins"]["dynamicValues"]=function(...)local ab=da("utils")local bb=ab.tableCount +return +{VisualObject=function(cb,db) +local _c={}local ac={}local bc={x="getX",y="getY",w="getWidth",h="getHeight"} +local function cc(bd) +local cd,dd=pcall(load( +"return "..bd,"",nil,{math=math}))if not(cd)then +error(bd.." - is not a valid dynamic value string")end;return dd end +local function dc(bd,cd,dd)local __a={}local a_a=bc +for d_a,_aa in pairs(a_a)do for aaa in dd:gmatch("%a+%."..d_a)do +local baa=aaa:gsub("%."..d_a,"") +if(baa~="self")and(baa~="parent")then table.insert(__a,baa)end end end;local b_a=bd:getParent()local c_a={} +for d_a,_aa in pairs(__a)do +c_a[_aa]=b_a:getObject(_aa)if(c_a[_aa]==nil)then +error("Dynamic Values - unable to find object: ".._aa)end end;c_a["self"]=bd;c_a["parent"]=b_a +_c[cd]=function()local d_a=dd +for _aa,aaa in pairs(a_a)do +for baa in +dd:gmatch("%w+%.".._aa)do local caa=c_a[baa:gsub("%.".._aa,"")]if(caa~=nil)then +d_a=d_a:gsub(baa,caa[aaa](caa))else +error("Dynamic Values - unable to find object: "..baa)end end end;ac[cd]=math.floor(cc(d_a)+0.5)end;_c[cd]()end +local function _d(bd) +if(bb(_c)>0)then for dd,__a in pairs(_c)do __a()end +local cd={x="getX",y="getY",w="getWidth",h="getHeight"} +for dd,__a in pairs(cd)do +if(_c[dd]~=nil)then +if(ac[dd]~=bd[__a](bd))then if(dd=="x")or(dd=="y")then +cb.setPosition(bd, +ac["x"]or bd:getX(),ac["y"]or bd:getY())end;if(dd=="w")or(dd=="h")then +cb.setSize(bd, +ac["w"]or bd:getWidth(),ac["h"]or bd:getHeight())end end end end end end +local ad={updatePositions=_d,createDynamicValue=dc,setPosition=function(bd,cd,dd,__a)ac.x=cd;ac.y=dd +if(type(cd)=="string")then dc(bd,"x",cd)else _c["x"]=nil end +if(type(dd)=="string")then dc(bd,"y",dd)else _c["y"]=nil end;cb.setPosition(bd,ac.x,ac.y,__a)return bd end,setSize=function(bd,cd,dd,__a) +ac.w=cd;ac.h=dd +if(type(cd)=="string")then dc(bd,"w",cd)else _c["w"]=nil end +if(type(dd)=="string")then dc(bd,"h",dd)else _c["h"]=nil end;cb.setSize(bd,ac.w,ac.h,__a)return bd end,customEventHandler=function(bd,cd,...) +cb.customEventHandler(bd,cd,...)if +(cd=="basalt_FrameReposition")or(cd=="basalt_FrameResize")then _d(bd)end end}return ad end}end +aa["plugins"]["shadow"]=function(...)local ab=da("xmlParser") +return +{VisualObject=function(bb)local cb=false +local db={setShadow=function(_c,ac)cb=ac +_c:updateDraw()return _c end,getShadow=function(_c)return cb end,draw=function(_c)bb.draw(_c) +_c:addDraw("shadow",function() if( -type(dda.width)=="table")then dda.width:calculate()end -if(type(dda.height)=="table")then dda.height:calculate()end -if(type(dda.x)=="table")then dda.x:calculate()end -if(type(dda.y)=="table")then dda.y:calculate()end;dda:updateDraw()return dda end,setBackground=function(dda,__b,a_b,b_b)dda.bgColor= -__b or false -dda.bgSymbol=a_b or(dda.bgColor~=false and dda.bgSymbol or -false)dda.bgSymbolColor=b_b or dda.bgSymbolColor -dda:updateDraw()return dda end,setTexture=function(dda,__b,a_b,b_b)if( -type(__b)=="string")then _ca=db.loadImageAsBimg(__b)elseif(type(__b)=="table")then -_ca=__b end -if(_ca.animated)then local c_b=_ca[bca].duration or -_ca.secondsPerFrame or 0.2 -cca=os.startTimer(c_b)dda.parent:addEvent("other_event",dda) -bda["other_event"]=true end;_da=b_b==false and false or true;bca=1 -dca=a_b or"normal"if(dca=="stretch")then -aca=db.resizeBIMG(_ca,dda:getSize())[1]else aca=_ca[1]end -dda:updateDraw()return dda end,setTransparent=function(dda,__b)dda.transparentColor= -__b or false;if(__b~=false)then dda.bgSymbol=false -dda.bgSymbolColor=false end;dda:updateDraw()return dda end,getBackground=function(dda)return -dda.bgColor end,setForeground=function(dda,__b)dda.fgColor=__b or false -dda:updateDraw()return dda end,getForeground=function(dda)return dda.fgColor end,setShadow=function(dda,__b)if( -__b==false)then aaa=false else caa=__b;aaa=true end -dda:updateDraw()return dda end,isShadowActive=function(dda)return aaa end,setBorder=function(dda,...) -if( -...~=nil)then local __b={...} -for a_b,b_b in pairs(__b)do if(b_b=="left")or(#__b==1)then -baa["left"]=__b[1]end;if(b_b=="top")or(#__b==1)then -baa["top"]=__b[1]end;if(b_b=="right")or(#__b==1)then -baa["right"]=__b[1]end;if(b_b=="bottom")or(#__b==1)then -baa["bottom"]=__b[1]end end end;dda:updateDraw()return dda end,getBorder=function(dda,__b)if( -__b=="left")then return borderLeft end -if(__b=="top")then return borderTop end;if(__b=="right")then return borderRight end;if(__b=="bottom")then -return borderBottom end end,draw=function(dda) -if -(b_a)then -if(dda.parent~=nil)then local __b,a_b=dda:getAnchorPosition() -local b_b,c_b=dda:getSize()local d_b,_ab=dda.parent:getSize() -if(__b+b_b<1)or(__b>d_b)or(a_b+ -c_b<1)or(a_b>_ab)then return false end;if(dda.transparentColor~=false)then -dda.parent:drawForegroundBox(__b,a_b,b_b,c_b,dda.transparentColor)end;if(dda.bgColor~=false)then -dda.parent:drawBackgroundBox(__b,a_b,b_b,c_b,dda.bgColor)end -if(dda.bgSymbol~=false)then -dda.parent:drawTextBox(__b,a_b,b_b,c_b,dda.bgSymbol)if(dda.bgSymbol~=" ")then -dda.parent:drawForegroundBox(__b,a_b,b_b,c_b,dda.bgSymbolColor)end end -if(aca~=nil)then -if(dca=="center")then local bab,cab=#aca[1][1],#aca -local dab=bab__b)and(c_b<=a_b)and(c_b+_ab>a_b)then return true end end;return false end,mouseHandler=function(dda,__b,a_b,b_b,c_b) -if -(dda:isCoordsInObject(a_b,b_b))then local d_b,_ab=dda:getAbsolutePosition() -local aab=cda:sendEvent("mouse_click",dda,"mouse_click",__b,a_b- -(d_b-1),b_b- (_ab-1),a_b,b_b,c_b)if(aab==false)then return false end;if(dda.parent~=nil)then -dda.parent:setFocusedObject(dda)end;_aa=true;_ba=true;aba,bba=a_b,b_b;return true end;return false end,mouseUpHandler=function(dda,__b,a_b,b_b) -_ba=false -if(_aa)then local c_b,d_b=dda:getAbsolutePosition() -local _ab=cda:sendEvent("mouse_release",dda,"mouse_release",__b,a_b- ( -c_b-1),b_b- (d_b-1),a_b,b_b)_aa=false end -if(dda:isCoordsInObject(a_b,b_b))then local c_b,d_b=dda:getAbsolutePosition() -local _ab=cda:sendEvent("mouse_up",dda,"mouse_up",__b, -a_b- (c_b-1),b_b- (d_b-1),a_b,b_b)if(_ab==false)then return false end;return true end;return false end,dragHandler=function(dda,__b,a_b,b_b) -if -(_ba)then local c_b,d_b=dda:getAbsolutePosition() -local _ab=cda:sendEvent("mouse_drag",dda,"mouse_drag",__b,a_b- (c_b-1), -b_b- (d_b-1),aba-a_b,bba-b_b,a_b,b_b)aba,bba=a_b,b_b;if(_ab~=nil)then return _ab end;if(dda.parent~=nil)then -dda.parent:setFocusedObject(dda)end;return true end -if(dda:isCoordsInObject(a_b,b_b))then -local c_b,d_b=dda:getAbsolutePosition(dda:getAnchorPosition())aba,bba=a_b,b_b;cba,dba=c_b-a_b,d_b-b_b end;return false end,scrollHandler=function(dda,__b,a_b,b_b) -if -(dda:isCoordsInObject(a_b,b_b))then local c_b,d_b=dda:getAbsolutePosition() -local _ab=cda:sendEvent("mouse_scroll",dda,"mouse_scroll",__b,a_b- -(c_b-1),b_b- (d_b-1))if(_ab==false)then return false end;if(dda.parent~=nil)then -dda.parent:setFocusedObject(dda)end;return true end;return false end,hoverHandler=function(dda,__b,a_b,b_b) -if -(dda:isCoordsInObject(__b,a_b))then -local c_b=cda:sendEvent("mouse_hover",dda,"mouse_hover",__b,a_b,b_b)if(c_b==false)then return false end;d_a=true;return true end -if(d_a)then -local c_b=cda:sendEvent("mouse_leave",dda,"mouse_leave",__b,a_b,b_b)if(c_b==false)then return false end;d_a=false end;return false end,keyHandler=function(dda,__b,a_b)if -(daa)and(b_a)then -if(dda:isFocused())then -local b_b=cda:sendEvent("key",dda,"key",__b,a_b)if(b_b==false)then return false end;return true end end;return -false end,keyUpHandler=function(dda,__b)if -(daa)and(b_a)then -if(dda:isFocused())then -local a_b=cda:sendEvent("key_up",dda,"key_up",__b)if(a_b==false)then return false end;return true end end;return -false end,charHandler=function(dda,__b)if -(daa)and(b_a)then -if(dda:isFocused())then -local a_b=cda:sendEvent("char",dda,"char",__b)if(a_b==false)then return false end;return true end end;return -false end,valueChangedHandler=function(dda) -cda:sendEvent("value_changed",dda,dd)end,eventHandler=function(dda,__b,...)local a_b={...} -if -(__b=="timer")and(a_b[1]==cca)then -if(_ca[bca+1]~=nil)then bca=bca+1;if(dca=="stretch")then -aca=db.resizeBIMG(_ca,dda:getSize())[bca]else aca=_ca[bca]end;local c_b=_ca[bca].duration or -_ca.secondsPerFrame or 0.2 -cca=os.startTimer(c_b)else -if(_da)then bca=1;if(dca=="stretch")then -aca=db.resizeBIMG(_ca,dda:getSize())[1]else aca=_ca[1]end;local c_b= -_ca[1].duration or _ca.secondsPerFrame or 0.2 -cca=os.startTimer(c_b)end end;dda:updateDraw()end;local b_b=cda:sendEvent("other_event",dda,__b,...)if(b_b~=nil)then -return b_b end end,customEventHandler=function(dda,__b,...) +cb~=false)then local ac,bc=_c:getSize() +if(cb)then +_c:addBackgroundBox(ac+1,2,1,bc,cb)_c:addBackgroundBox(2,bc+1,ac,1,cb) +_c:addForegroundBox(ac+1,2,1,bc,cb)_c:addForegroundBox(2,bc+1,ac,1,cb)end end end)end}return db end}end +aa["plugins"]["bigfonts"]=function(...)local ab=da("tHex") +local bb={{"\32\32\32\137\156\148\158\159\148\135\135\144\159\139\32\136\157\32\159\139\32\32\143\32\32\143\32\32\32\32\32\32\32\32\147\148\150\131\148\32\32\32\151\140\148\151\140\147","\32\32\32\149\132\149\136\156\149\144\32\133\139\159\129\143\159\133\143\159\133\138\32\133\138\32\133\32\32\32\32\32\32\150\150\129\137\156\129\32\32\32\133\131\129\133\131\132","\32\32\32\130\131\32\130\131\32\32\129\32\32\32\32\130\131\32\130\131\32\32\32\32\143\143\143\32\32\32\32\32\32\130\129\32\130\135\32\32\32\32\131\32\32\131\32\131","\139\144\32\32\143\148\135\130\144\149\32\149\150\151\149\158\140\129\32\32\32\135\130\144\135\130\144\32\149\32\32\139\32\159\148\32\32\32\32\159\32\144\32\148\32\147\131\132","\159\135\129\131\143\149\143\138\144\138\32\133\130\149\149\137\155\149\159\143\144\147\130\132\32\149\32\147\130\132\131\159\129\139\151\129\148\32\32\139\131\135\133\32\144\130\151\32","\32\32\32\32\32\32\130\135\32\130\32\129\32\129\129\131\131\32\130\131\129\140\141\132\32\129\32\32\129\32\32\32\32\32\32\32\131\131\129\32\32\32\32\32\32\32\32\32","\32\32\32\32\149\32\159\154\133\133\133\144\152\141\132\133\151\129\136\153\32\32\154\32\159\134\129\130\137\144\159\32\144\32\148\32\32\32\32\32\32\32\32\32\32\32\151\129","\32\32\32\32\133\32\32\32\32\145\145\132\141\140\132\151\129\144\150\146\129\32\32\32\138\144\32\32\159\133\136\131\132\131\151\129\32\144\32\131\131\129\32\144\32\151\129\32","\32\32\32\32\129\32\32\32\32\130\130\32\32\129\32\129\32\129\130\129\129\32\32\32\32\130\129\130\129\32\32\32\32\32\32\32\32\133\32\32\32\32\32\129\32\129\32\32","\150\156\148\136\149\32\134\131\148\134\131\148\159\134\149\136\140\129\152\131\32\135\131\149\150\131\148\150\131\148\32\148\32\32\148\32\32\152\129\143\143\144\130\155\32\134\131\148","\157\129\149\32\149\32\152\131\144\144\131\148\141\140\149\144\32\149\151\131\148\32\150\32\150\131\148\130\156\133\32\144\32\32\144\32\130\155\32\143\143\144\32\152\129\32\134\32","\130\131\32\131\131\129\131\131\129\130\131\32\32\32\129\130\131\32\130\131\32\32\129\32\130\131\32\130\129\32\32\129\32\32\133\32\32\32\129\32\32\32\130\32\32\32\129\32","\150\140\150\137\140\148\136\140\132\150\131\132\151\131\148\136\147\129\136\147\129\150\156\145\138\143\149\130\151\32\32\32\149\138\152\129\149\32\32\157\152\149\157\144\149\150\131\148","\149\143\142\149\32\149\149\32\149\149\32\144\149\32\149\149\32\32\149\32\32\149\32\149\149\32\149\32\149\32\144\32\149\149\130\148\149\32\32\149\32\149\149\130\149\149\32\149","\130\131\129\129\32\129\131\131\32\130\131\32\131\131\32\131\131\129\129\32\32\130\131\32\129\32\129\130\131\32\130\131\32\129\32\129\131\131\129\129\32\129\129\32\129\130\131\32","\136\140\132\150\131\148\136\140\132\153\140\129\131\151\129\149\32\149\149\32\149\149\32\149\137\152\129\137\152\129\131\156\133\149\131\32\150\32\32\130\148\32\152\137\144\32\32\32","\149\32\32\149\159\133\149\32\149\144\32\149\32\149\32\149\32\149\150\151\129\138\155\149\150\130\148\32\149\32\152\129\32\149\32\32\32\150\32\32\149\32\32\32\32\32\32\32","\129\32\32\130\129\129\129\32\129\130\131\32\32\129\32\130\131\32\32\129\32\129\32\129\129\32\129\32\129\32\131\131\129\130\131\32\32\32\129\130\131\32\32\32\32\140\140\132","\32\154\32\159\143\32\149\143\32\159\143\32\159\144\149\159\143\32\159\137\145\159\143\144\149\143\32\32\145\32\32\32\145\149\32\144\32\149\32\143\159\32\143\143\32\159\143\32","\32\32\32\152\140\149\151\32\149\149\32\145\149\130\149\157\140\133\32\149\32\154\143\149\151\32\149\32\149\32\144\32\149\149\153\32\32\149\32\149\133\149\149\32\149\149\32\149","\32\32\32\130\131\129\131\131\32\130\131\32\130\131\129\130\131\129\32\129\32\140\140\129\129\32\129\32\129\32\137\140\129\130\32\129\32\130\32\129\32\129\129\32\129\130\131\32","\144\143\32\159\144\144\144\143\32\159\143\144\159\138\32\144\32\144\144\32\144\144\32\144\144\32\144\144\32\144\143\143\144\32\150\129\32\149\32\130\150\32\134\137\134\134\131\148","\136\143\133\154\141\149\151\32\129\137\140\144\32\149\32\149\32\149\154\159\133\149\148\149\157\153\32\154\143\149\159\134\32\130\148\32\32\149\32\32\151\129\32\32\32\32\134\32","\133\32\32\32\32\133\129\32\32\131\131\32\32\130\32\130\131\129\32\129\32\130\131\129\129\32\129\140\140\129\131\131\129\32\130\129\32\129\32\130\129\32\32\32\32\32\129\32","\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32","\32\32\32\32\145\32\159\139\32\151\131\132\155\143\132\134\135\145\32\149\32\158\140\129\130\130\32\152\147\155\157\134\32\32\144\144\32\32\32\32\32\32\152\131\155\131\131\129","\32\32\32\32\149\32\149\32\145\148\131\32\149\32\149\140\157\132\32\148\32\137\155\149\32\32\32\149\154\149\137\142\32\153\153\32\131\131\149\131\131\129\149\135\145\32\32\32","\32\32\32\32\129\32\130\135\32\131\131\129\134\131\132\32\129\32\32\129\32\131\131\32\32\32\32\130\131\129\32\32\32\32\129\129\32\32\32\32\32\32\130\131\129\32\32\32","\150\150\32\32\148\32\134\32\32\132\32\32\134\32\32\144\32\144\150\151\149\32\32\32\32\32\32\145\32\32\152\140\144\144\144\32\133\151\129\133\151\129\132\151\129\32\145\32","\130\129\32\131\151\129\141\32\32\142\32\32\32\32\32\149\32\149\130\149\149\32\143\32\32\32\32\142\132\32\154\143\133\157\153\132\151\150\148\151\158\132\151\150\148\144\130\148","\32\32\32\140\140\132\32\32\32\32\32\32\32\32\32\151\131\32\32\129\129\32\32\32\32\134\32\32\32\32\32\32\32\129\129\32\129\32\129\129\130\129\129\32\129\130\131\32","\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\150\151\129\150\131\132\140\143\144\143\141\145\137\140\148\141\141\144\157\142\32\159\140\32\151\134\32\157\141\32","\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\151\151\32\154\143\132\157\140\32\157\140\32\157\140\32\157\140\32\32\149\32\32\149\32\32\149\32\32\149\32","\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\131\129\32\134\32\131\131\129\131\131\129\131\131\129\131\131\129\130\131\32\130\131\32\130\131\32\130\131\32","\151\131\148\152\137\145\155\140\144\152\142\145\153\140\132\153\137\32\154\142\144\155\159\132\150\156\148\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\136\32\151\140\132","\151\32\149\151\155\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\152\137\144\157\129\149\149\32\149\149\32\149\149\32\149\149\32\149\130\150\32\32\157\129\149\32\149","\131\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\129\32\130\131\32\133\131\32","\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\159\159\144\152\140\144\156\143\32\159\141\129\153\140\132\157\141\32\130\145\32\32\147\32\136\153\32\130\146\32","\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\149\157\134\154\143\132\157\140\133\157\140\133\157\140\133\157\140\133\32\149\32\32\149\32\32\149\32\32\149\32","\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\130\131\32\134\32\130\131\129\130\131\129\130\131\129\130\131\129\32\129\32\32\129\32\32\129\32\32\129\32","\159\134\144\137\137\32\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\32\132\32\159\143\32\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\138\32\146\130\144","\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\131\147\129\138\134\149\149\32\149\149\32\149\149\32\149\149\32\149\154\143\149\32\157\129\154\143\149","\130\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\129\130\131\129\130\131\129\130\131\129\140\140\129\130\131\32\140\140\129"},{"000110000110110000110010101000000010000000100101","000000110110000000000010101000000010000000100101","000000000000000000000000000000000000000000000000","100010110100000010000110110000010100000100000110","000000110000000010110110000110000000000000110000","000000000000000000000000000000000000000000000000","000000110110000010000000100000100000000000000010","000000000110110100010000000010000000000000000100","000000000000000000000000000000000000000000000000","010000000000100110000000000000000000000110010000","000000000000000000000000000010000000010110000000","000000000000000000000000000000000000000000000000","011110110000000100100010110000000100000000000000","000000000000000000000000000000000000000000000000","000000000000000000000000000000000000000000000000","110000110110000000000000000000010100100010000000","000010000000000000110110000000000100010010000000","000000000000000000000000000000000000000000000000","010110010110100110110110010000000100000110110110","000000000000000000000110000000000110000000000000","000000000000000000000000000000000000000000000000","010100010110110000000000000000110000000010000000","110110000000000000110000110110100000000010000000","000000000000000000000000000000000000000000000000","000100011111000100011111000100011111000100011111","000000000000100100100100011011011011111111111111","000000000000000000000000000000000000000000000000","000100011111000100011111000100011111000100011111","000000000000100100100100011011011011111111111111","100100100100100100100100100100100100100100100100","000000110100110110000010000011110000000000011000","000000000100000000000010000011000110000000001000","000000000000000000000000000000000000000000000000","010000100100000000000000000100000000010010110000","000000000000000000000000000000110110110110110000","000000000000000000000000000000000000000000000000","110110110110110110000000110110110110110110110110","000000000000000000000110000000000000000000000000","000000000000000000000000000000000000000000000000","000000000000110110000110010000000000000000010010","000010000000000000000000000000000000000000000000","000000000000000000000000000000000000000000000000","110110110110110110110000110110110110000000000000","000000000000000000000110000000000000000000000000","000000000000000000000000000000000000000000000000","110110110110110110110000110000000000000000010000","000000000000000000000000100000000000000110000110","000000000000000000000000000000000000000000000000"}}local cb={}local db={} +do local cc=0;local dc=#bb[1]local _d=#bb[1][1] +for i=1,dc,3 do +for j=1,_d,3 do +local ad=string.char(cc)local bd={}bd[1]=bb[1][i]:sub(j,j+2) +bd[2]=bb[1][i+1]:sub(j,j+2)bd[3]=bb[1][i+2]:sub(j,j+2)local cd={}cd[1]=bb[2][i]:sub(j, +j+2)cd[2]=bb[2][i+1]:sub(j,j+2)cd[3]=bb[2][ +i+2]:sub(j,j+2)db[ad]={bd,cd}cc=cc+1 end end;cb[1]=db end +local function _c(cc,dc)local _d={["0"]="1",["1"]="0"}if cc<=#cb then return true end +for f=#cb+1,cc do local ad={}local bd=cb[ +f-1] +for char=0,255 do local cd=string.char(char)local dd={}local __a={} +local a_a=bd[cd][1]local b_a=bd[cd][2] +for i=1,#a_a do local c_a,d_a,_aa,aaa,baa,caa={},{},{},{},{},{} +for j=1,#a_a[1]do +local daa=db[a_a[i]:sub(j,j)][1]table.insert(c_a,daa[1]) +table.insert(d_a,daa[2])table.insert(_aa,daa[3]) +local _ba=db[a_a[i]:sub(j,j)][2] +if b_a[i]:sub(j,j)=="1"then +table.insert(aaa,(_ba[1]:gsub("[01]",_d))) +table.insert(baa,(_ba[2]:gsub("[01]",_d))) +table.insert(caa,(_ba[3]:gsub("[01]",_d)))else table.insert(aaa,_ba[1]) +table.insert(baa,_ba[2])table.insert(caa,_ba[3])end end;table.insert(dd,table.concat(c_a)) +table.insert(dd,table.concat(d_a))table.insert(dd,table.concat(_aa)) +table.insert(__a,table.concat(aaa))table.insert(__a,table.concat(baa)) +table.insert(__a,table.concat(caa))end;ad[cd]={dd,__a}if dc then dc="Font"..f.."Yeld"..char +os.queueEvent(dc)os.pullEvent(dc)end end;cb[f]=ad end;return true end +local function ac(cc,dc,_d,ad,bd) +if not type(dc)=="string"then error("Not a String",3)end +local cd=type(_d)=="string"and _d:sub(1,1)or ab[_d]or +error("Wrong Front Color",3) +local dd=type(ad)=="string"and ad:sub(1,1)or ab[ad]or +error("Wrong Back Color",3)if(cb[cc]==nil)then _c(3,false)end;local __a=cb[cc]or +error("Wrong font size selected",3)if dc==""then +return{{""},{""},{""}}end;local a_a={} +for caa in dc:gmatch('.')do table.insert(a_a,caa)end;local b_a={}local c_a=#__a[a_a[1]][1] +for nLine=1,c_a do local caa={}for i=1,#a_a do +caa[i]= +__a[a_a[i]]and __a[a_a[i]][1][nLine]or""end;b_a[nLine]=table.concat(caa)end;local d_a={}local _aa={}local aaa={["0"]=cd,["1"]=dd}local baa={["0"]=dd,["1"]=cd} +for nLine=1,c_a do +local caa={}local daa={} +for i=1,#a_a do +local _ba=__a[a_a[i]]and __a[a_a[i]][2][nLine]or"" +caa[i]=_ba:gsub("[01]", +bd and{["0"]=_d:sub(i,i),["1"]=ad:sub(i,i)}or aaa) +daa[i]=_ba:gsub("[01]", +bd and{["0"]=ad:sub(i,i),["1"]=_d:sub(i,i)}or baa)end;d_a[nLine]=table.concat(caa) +_aa[nLine]=table.concat(daa)end;return{b_a,d_a,_aa}end;local bc=da("xmlParser") +return +{Label=function(cc)local dc=1;local _d +local ad={setFontSize=function(bd,cd) +if(type(cd)=="number")then dc=cd +if(dc>1)then +bd:setDrawState("label",false) +_d=ac(dc-1,bd:getText(),bd:getForeground(),bd:getBackground()or colors.lightGray)if(bd:getAutoSize())then +bd:getBase():setSize(#_d[1][1],#_d[1]-1)end else +bd:setDrawState("label",true)end;bd:updateDraw()end;return bd end,getFontSize=function(bd)return +dc end,getSize=function(bd)local cd,dd=cc.getSize(bd) if +(dc>1)and(bd:getAutoSize())then +return dc==2 and bd:getText():len()*3 or math.floor( +bd:getText():len()*8.5), +dc==2 and dd*2 or math.floor(dd)else return cd,dd end end,getWidth=function(bd) +local cd=cc.getWidth(bd)if(dc>1)and(bd:getAutoSize())then return dc==2 and +bd:getText():len()*3 or +math.floor(bd:getText():len()*8.5)else +return cd end end,getHeight=function(bd) +local cd=cc.getHeight(bd)if(dc>1)and(bd:getAutoSize())then return +dc==2 and cd*2 or math.floor(cd)else return cd end end,draw=function(bd) +cc.draw(bd) +bd:addDraw("bigfonts",function() +if(dc>1)then local cd,dd=bd:getPosition()local __a=bd:getParent() +local a_a,b_a=__a:getSize()local c_a,d_a=#_d[1][1],#_d[1]cd=cd or +math.floor((a_a-c_a)/2)+1;dd=dd or +math.floor((b_a-d_a)/2)+1 +for i=1,d_a do bd:addFG(1,i,_d[2][i]) +bd:addBG(1,i,_d[3][i])bd:addText(1,i,_d[1][i])end end end)end}return ad end}end +aa["plugins"]["border"]=function(...)local ab=da("xmlParser") +return +{VisualObject=function(bb)local cb=true +local db={top=false,bottom=false,left=false,right=false} +local _c={setBorder=function(ac,...)local bc={...} +if(bc~=nil)then +for cc,dc in pairs(bc)do +if(dc=="left")or(#bc==1)then db["left"]=bc[1]end;if(dc=="top")or(#bc==1)then db["top"]=bc[1]end;if +(dc=="right")or(#bc==1)then db["right"]=bc[1]end;if +(dc=="bottom")or(#bc==1)then db["bottom"]=bc[1]end end end;ac:updateDraw()return ac end,draw=function(ac) +bb.draw(ac) +ac:addDraw("border",function()local bc,cc=ac:getPosition()local dc,_d=ac:getSize() +local ad=ac:getBackground() +if(cb)then +if(db["left"]~=false)then ac:addTextBox(1,1,1,_d,"\149")if(ad~=false)then +ac:addBackgroundBox(1,1,1,_d,ad)end +ac:addForegroundBox(1,1,1,_d,db["left"])end +if(db["top"]~=false)then ac:addTextBox(1,1,dc,1,"\131")if(ad~=false)then +ac:addBackgroundBox(1,1,dc,1,ad)end +ac:addForegroundBox(1,1,dc,1,db["top"])end +if(db["left"]~=false)and(db["top"]~=false)then +ac:addTextBox(1,1,1,1,"\151") +if(ad~=false)then ac:addBackgroundBox(1,1,1,1,ad)end;ac:addForegroundBox(1,1,1,1,db["left"])end +if(db["right"]~=false)then ac:addTextBox(dc,1,1,_d,"\149")if +(ad~=false)then ac:addForegroundBox(dc,1,1,_d,ad)end +ac:addBackgroundBox(dc,1,1,_d,db["right"])end +if(db["bottom"]~=false)then ac:addTextBox(1,_d,dc,1,"\143")if +(ad~=false)then ac:addForegroundBox(1,_d,dc,1,ad)end +ac:addBackgroundBox(1,_d,dc,1,db["bottom"])end +if(db["top"]~=false)and(db["right"]~=false)then +ac:addTextBox(dc,1,1,1,"\148") +if(ad~=false)then ac:addForegroundBox(dc,1,1,1,ad)end;ac:addBackgroundBox(dc,1,1,1,db["right"])end +if(db["right"]~=false)and(db["bottom"]~=false)then +ac:addTextBox(dc,_d,1,1,"\133") +if(ad~=false)then ac:addForegroundBox(dc,_d,1,1,ad)end;ac:addBackgroundBox(dc,_d,1,1,db["right"])end +if(db["bottom"]~=false)and(db["left"]~=false)then +ac:addTextBox(1,_d,1,1,"\138") +if(ad~=false)then ac:addForegroundBox(0,_d,1,1,ad)end;ac:addBackgroundBox(1,_d,1,1,db["left"])end end end)end}return _c end}end +aa["plugins"]["reactive"]=function(...)local ab=da("xmlParser") +local bb={fromXML=function(bc) +local cc=ab.parseText(bc)local dc=nil +for _d,ad in ipairs(cc)do if(ad.tag=="script")then dc=ad.value;table.remove(cc,_d) +break end end;return{nodes=cc,script=dc}end} +local cb=function(bc,cc)return load(bc,nil,"t",cc)()end +local db=function(bc,cc,dc,_d) +cc(bc,function(...)local ad,bd=pcall(load(dc,nil,"t",_d))if not ad then +error("XML Error: "..bd)end end)end;local _c=nil +local ac=function(bc) +for cc,dc in ipairs(bc.dependencies)do for _d,ad in ipairs(dc)do +if(ad==bc)then table.remove(dc,_d)end end end;bc.dependencies={}end +return +{basalt=function(bc) +local cc=function(_d,ad)local bd=ad[_d.tag] +if(bd~=nil)then local __a={} +for a_a,b_a in pairs(_d.attributes)do __a[a_a]=load("return "..b_a, +nil,"t",ad)end;return bc.createObjectsFromLayout(bd,__a)end;local cd=_d.tag:gsub("^%l",string.upper) +local dd=bc:createObject(cd,_d.attributes["id"]) +for __a,a_a in pairs(_d.attributes)do +if(__a:sub(1,2)=="on")then +db(dd,dd[__a],a_a.."()",ad)else +local b_a=function()local c_a=load("return "..a_a,nil,"t",ad)() +dd:setProperty(__a,c_a)end;bc.effect(b_a)end end +for __a,a_a in ipairs(_d.children)do +local b_a=bc.createObjectsFromXMLNode(a_a,ad)for c_a,d_a in ipairs(b_a)do dd:addChild(d_a)end end;return{dd}end +local dc={reactive=function(_d)local ad=_d;local bd={} +local cd=function()if(_c~=nil)then table.insert(bd,_c) +table.insert(_c.dependencies,bd)end;return ad end +local dd=function(__a)ad=__a;local a_a={}for b_a,c_a in ipairs(bd)do a_a[b_a]=c_a end;for b_a,c_a in ipairs(a_a)do +c_a.execute()end end;return cd,dd end,untracked=function(_d) +local ad=_c;_c=nil;local bd=_d()_c=ad;return bd end,effect=function(_d) +local ad={dependencies={}} +local bd=function()ac(ad)local cd=_c;_c=ad;_d()_c=cd end;ad.execute=bd;ad.execute()end,derived=function(_d) +local ad,bd=bc.reactive()bc.effect(function()bd(_d())end)return ad end,layout=function(_d)if( +not fs.exists(_d))then +error("Can't open file ".._d)end;local ad=fs.open(_d,"r") +local bd=ad.readAll()ad.close()return bb.fromXML(bd)end,createObjectsFromLayout=function(_d,ad) +local bd=_ENV;bd.props={}local cd={}for __a,a_a in pairs(ad)do +cd[__a]=bc.derived(function()return a_a()end)end +setmetatable(bd.props,{__index=function(__a,a_a)return cd[a_a]()end})if(_d.script~=nil)then cb(_d.script,bd)end;local dd={}for __a,a_a in +ipairs(_d.nodes)do local b_a=cc(a_a,bd) +for c_a,d_a in ipairs(b_a)do table.insert(dd,d_a)end end;return dd end}return dc end,Container=function(bc,cc) +local dc={loadLayout=function(_d,ad,bd) +local cd={}if(bd==nil)then bd={}end +for a_a,b_a in pairs(bd)do cd[a_a]=function()return b_a end end;local dd=cc.layout(ad) +local __a=cc.createObjectsFromLayout(dd,cd)for a_a,b_a in ipairs(__a)do _d:addChild(b_a)end;return _d end}return dc end}end +aa["plugins"]["animations"]=function(...) +local ab,bb,cb,db,_c,ac=math.floor,math.sin,math.cos,math.pi,math.sqrt,math.pow;local function bc(aab,bab,cab)return aab+ (bab-aab)*cab end +local function cc(aab)return aab end;local function dc(aab)return 1 -aab end +local function _d(aab)return aab*aab*aab end;local function ad(aab)return dc(_d(dc(aab)))end;local function bd(aab)return +bc(_d(aab),ad(aab),aab)end +local function cd(aab)return bb((aab*db)/2)end;local function dd(aab)return dc(cb((aab*db)/2))end;local function __a(aab)return- ( +cb(db*x)-1)/2 end +local function a_a(aab)local bab=1.70158 +local cab=bab+1;return cab*aab^3 -bab*aab^2 end;local function b_a(aab)return aab^3 end;local function c_a(aab)local bab=(2 *db)/3 +return aab==0 and 0 or(aab==1 and 1 or +(-2 ^ (10 * +aab-10)*bb((aab*10 -10.75)*bab)))end +local function d_a(aab)return +aab==0 and 0 or 2 ^ (10 *aab-10)end +local function _aa(aab)return aab==0 and 0 or 2 ^ (10 *aab-10)end +local function aaa(aab)local bab=1.70158;local cab=bab*1.525;return +aab<0.5 and( (2 *aab)^2 * +( (cab+1)*2 *aab-cab))/2 or ( -_ca~=nil)and(dca=="stretch")and(__b=="basalt_resize")then -aca=db.resizeBIMG(_ca,dda:getSize())[bca]dda:updateDraw()end;local a_b=cda:sendEvent("custom_event",dda,__b,...)if(a_b~=nil)then -return a_b end;return true end,getFocusHandler=function(dda) -local __b=cda:sendEvent("get_focus",dda)if(__b~=nil)then return __b end;return true end,loseFocusHandler=function(dda) -_ba=false;local __b=cda:sendEvent("lose_focus",dda) -if(__b~=nil)then return __b end;return true end,init=function(dda) -if -(dda.parent~=nil)then for __b,a_b in pairs(bda)do -if(a_b)then dda.parent:addEvent(__b,dda)end end end;if not(c_a)then c_a=true;return true end;return false end}bd.__index=bd;return bd end end -aa["theme"]=function(...) +(2 *aab-2)^2 * ( (cab+1)* (aab*2 -2)+cab)+2)/2 end;local function baa(aab)return +aab<0.5 and 4 *aab^3 or 1 - (-2 *aab+2)^3 /2 end +local function caa(aab) +local bab=(2 *db)/4.5 return -{BasaltBG=colors.lightGray,BasaltText=colors.black,FrameBG=colors.gray,FrameText=colors.black,ButtonBG=colors.gray,ButtonText=colors.black,CheckboxBG=colors.gray,CheckboxText=colors.black,InputBG=colors.gray,InputText=colors.black,TextfieldBG=colors.gray,TextfieldText=colors.black,ListBG=colors.gray,ListText=colors.black,MenubarBG=colors.gray,MenubarText=colors.black,DropdownBG=colors.gray,DropdownText=colors.black,RadioBG=colors.gray,RadioText=colors.black,SelectionBG=colors.black,SelectionText=colors.lightGray,GraphicBG=colors.black,ImageBG=colors.black,PaneBG=colors.black,ProgramBG=colors.black,ProgressbarBG=colors.gray,ProgressbarText=colors.black,ProgressbarActiveBG=colors.black,ScrollbarBG=colors.lightGray,ScrollbarText=colors.gray,ScrollbarSymbolColor=colors.black,SliderBG=false,SliderText=colors.gray,SliderSymbolColor=colors.black,SwitchBG=colors.lightGray,SwitchText=colors.gray,SwitchBGSymbol=colors.black,SwitchInactive=colors.red,SwitchActive=colors.green,LabelBG=false,LabelText=colors.black,GraphBG=colors.gray,GraphText=colors.black}end;aa["objects"]={} -aa["objects"]["Timer"]=function(...) -local ab=da("basaltEvent")local bb=da("utils").getValueFromXML -return -function(cb)local db="Timer"local _c=0;local ac=0;local bc=0;local cc -local dc=ab()local _d=false -local ad=function(cd,dd,__a) -local a_a=function(b_a) -if(b_a:sub(1,1)=="#")then -local c_a=cd:getBaseFrame():getDeepObject(b_a:sub(2,b_a:len())) -if(c_a~=nil)and(c_a.internalObjetCall~=nil)then dd(cd,function() -c_a:internalObjetCall()end)end else -dd(cd,cd:getBaseFrame():getVariable(b_a))end end;if(type(__a)=="string")then a_a(__a)elseif(type(__a)=="table")then -for b_a,c_a in pairs(__a)do a_a(c_a)end end;return cd end -local bd={name=cb,getType=function(cd)return db end,setValuesByXMLData=function(cd,dd) -if(bb("time",dd)~=nil)then _c=bb("time",dd)end;if(bb("repeat",dd)~=nil)then ac=bb("repeat",dd)end -if( -bb("start",dd)~=nil)then if(bb("start",dd))then cd:start()end end;if(bb("onCall",dd)~=nil)then -ad(cd,cd.onCall,bb("onCall",dd))end;return cd end,getBaseFrame=function(cd) -if( -cd.parent~=nil)then return cd.parent:getBaseFrame()end;return cd end,getZIndex=function(cd)return 1 end,getName=function(cd) -return cd.name end,setTime=function(cd,dd,__a)_c=dd or 0;ac=__a or 1;return cd end,start=function(cd)if(_d)then -os.cancelTimer(cc)end;bc=ac;cc=os.startTimer(_c)_d=true -cd.parent:addEvent("other_event",cd)return cd end,isActive=function(cd)return _d end,cancel=function(cd)if( -cc~=nil)then os.cancelTimer(cc)end;_d=false -cd.parent:removeEvent("other_event",cd)return cd end,onCall=function(cd,dd) -dc:registerEvent("timed_event",dd)return cd end,eventHandler=function(cd,dd,__a) -if -dd=="timer"and __a==cc and _d then dc:sendEvent("timed_event",cd) -if(bc>=1)then bc=bc-1;if(bc>=1)then -cc=os.startTimer(_c)end elseif(bc==-1)then cc=os.startTimer(_c)end end end}bd.__index=bd;return bd end end -aa["objects"]["Label"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=bb.getValueFromXML;local db=bb.createText;local _c=da("tHex")local ac=da("bigfont") -return -function(bc)local cc=ab(bc) -local dc="Label"cc:setZIndex(3)local _d=true;cc:setValue("Label")cc.width=5 -local ad="left"local bd="top"local cd=0;local dd,__a=false,false -local a_a={getType=function(b_a)return dc end,setText=function(b_a,c_a)c_a=tostring(c_a) -cc:setValue(c_a) -if(_d)then local d_a=b_a.parent:getOffset() -if( -c_a:len()+b_a:getX()>b_a.parent:getWidth()+d_a)then local _aa= -b_a.parent:getWidth()+d_a-b_a:getX()cc.setSize(b_a,_aa, -#db(c_a,_aa))else -cc.setSize(b_a,c_a:len(),1)end end;b_a:updateDraw()return b_a end,setBackground=function(b_a,c_a) -cc.setBackground(b_a,c_a)__a=true;b_a:updateDraw()return b_a end,setForeground=function(b_a,c_a) -cc.setForeground(b_a,c_a)dd=true;b_a:updateDraw()return b_a end,setTextAlign=function(b_a,c_a,d_a)ad= -c_a or ad;bd=d_a or bd;b_a:updateDraw()return b_a end,setFontSize=function(b_a,c_a)if( -c_a>0)and(c_a<=4)then cd=c_a-1 or 0 end -b_a:updateDraw()return b_a end,getFontSize=function(b_a)return cd+1 end,setValuesByXMLData=function(b_a,c_a) -cc.setValuesByXMLData(b_a,c_a) -if(cb("text",c_a)~=nil)then b_a:setText(cb("text",c_a))end -if(cb("verticalAlign",c_a)~=nil)then bd=cb("verticalAlign",c_a)end;if(cb("horizontalAlign",c_a)~=nil)then -ad=cb("horizontalAlign",c_a)end;if(cb("font",c_a)~=nil)then -b_a:setFontSize(cb("font",c_a))end;return b_a end,setSize=function(b_a,c_a,d_a,_aa) -cc.setSize(b_a,c_a,d_a,_aa)_d=false;b_a:updateDraw()return b_a end,eventHandler=function(b_a,c_a) -if( -c_a=="basalt_resize")then -if(_d)then local d_a=b_a:getValue() -if( -d_a:len()+b_a:getX()>b_a.parent:getWidth())then local _aa= -b_a.parent:getWidth()-b_a:getX() -cc.setSize(b_a,_aa,#db(d_a,_aa))else cc.setSize(b_a,d_a:len(),1)end else end end end,draw=function(b_a) -if -(cc.draw(b_a))then -if(b_a.parent~=nil)then local c_a,d_a=b_a:getAnchorPosition() -local _aa,aaa=b_a:getSize()local baa=bb.getTextVerticalAlign(aaa,bd) -if(cd==0)then -if not(_d)then -local caa=db(b_a:getValue(),b_a:getWidth()) -for daa,_ba in pairs(caa)do if(daa<=aaa)then -b_a.parent:writeText(c_a,d_a+daa-1,_ba,b_a.bgColor,b_a.fgColor)end end else -if -(#b_a:getValue()+c_a>b_a.parent:getWidth())then local caa=db(b_a:getValue(),b_a:getWidth()) -for daa,_ba in -pairs(caa)do if(daa<=aaa)then -b_a.parent:writeText(c_a,d_a+daa-1,_ba,b_a.bgColor,b_a.fgColor)end end else -b_a.parent:writeText(c_a,d_a,b_a:getValue(),b_a.bgColor,b_a.fgColor)end end else -local caa=ac(cd,b_a:getValue(),b_a.fgColor,b_a.bgColor or colors.lightGray) -if(_d)then b_a:setSize(#caa[1][1],#caa[1]-1)end;local daa,_ba=b_a.parent:getSize() -local aba,bba=#caa[1][1],#caa[1] -c_a=c_a or math.floor((daa-aba)/2)+1 -d_a=d_a or math.floor((_ba-bba)/2)+1 -for i=1,bba do -b_a.parent:setFG(c_a,d_a+i-1,caa[2][i])b_a.parent:setBG(c_a,d_a+i-1,caa[3][i])b_a.parent:setText(c_a, -d_a+i-1,caa[1][i])end end end end end,init=function(b_a) -b_a.parent:addEvent("other_event",b_a) -if(cc.init(b_a))then -b_a.bgColor=b_a.parent:getTheme("LabelBG")b_a.fgColor=b_a.parent:getTheme("LabelText") -if +aab==0 and 0 or(aab==1 and 1 or ( -b_a.parent.bgColor==colors.black)and(b_a.fgColor==colors.black)then b_a.fgColor=colors.lightGray end end end}return setmetatable(a_a,cc)end end -aa["objects"]["Checkbox"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=bb.getValueFromXML -return -function(db)local _c=ab(db)local ac="Checkbox"_c:setZIndex(5) -_c:setValue(false)_c.width=1;_c.height=1;local bc="\42" -local cc={getType=function(dc)return ac end,setSymbol=function(dc,_d)bc=_d -dc:updateDraw()return dc end,mouseHandler=function(dc,_d,ad,bd) -if(_c.mouseHandler(dc,_d,ad,bd))then -if(_d==1)then -if( -dc:getValue()~=true)and(dc:getValue()~=false)then -dc:setValue(false)else dc:setValue(not dc:getValue())end;dc:updateDraw()return true end end;return false end,touchHandler=function(dc,_d,ad)return -dc:mouseHandler(1,_d,ad)end,setValuesByXMLData=function(dc,_d) -_c.setValuesByXMLData(dc,_d) -if(cb("checked",_d)~=nil)then if(cb("checked",_d))then dc:setValue(true)else -dc:setValue(false)end end;return dc end,draw=function(dc) -if -(_c.draw(dc))then -if(dc.parent~=nil)then local _d,ad=dc:getAnchorPosition() -local bd,cd=dc:getSize()local dd=bb.getTextVerticalAlign(cd,"center")if -(dc.bgColor~=false)then -dc.parent:drawBackgroundBox(_d,ad,bd,cd,dc.bgColor)end -for n=1,cd do -if(n==dd)then -if(dc:getValue()==true)then -dc.parent:writeText(_d, -ad+ (n-1),bb.getTextHorizontalAlign(bc,bd,"center"),dc.bgColor,dc.fgColor)else -dc.parent:writeText(_d,ad+ (n-1),bb.getTextHorizontalAlign(" ",bd,"center"),dc.bgColor,dc.fgColor)end end end end end end,init=function(dc) -dc.parent:addEvent("mouse_click",dc)dc.parent:addEvent("mouse_up",dc) -if(_c.init(dc))then -dc.bgColor=dc.parent:getTheme("CheckboxBG")dc.fgColor=dc.parent:getTheme("CheckboxText")end end}return setmetatable(cc,_c)end end -aa["objects"]["Input"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=da("basaltLogs")local db=bb.getValueFromXML -return -function(_c)local ac=ab(_c)local bc="Input"local cc="text"local dc=0 -ac:setZIndex(5)ac:setValue("")ac.width=10;ac.height=1;local _d=1;local ad=1;local bd=""local cd;local dd -local __a=bd;local a_a=false -local b_a={getType=function(c_a)return bc end,setInputType=function(c_a,d_a)if(d_a=="password")or(d_a=="number")or(d_a== -"text")then cc=d_a end -c_a:updateDraw()return c_a end,setDefaultText=function(c_a,d_a,_aa,aaa)bd=d_a -cd=aaa or cd;dd=_aa or dd;if(c_a:isFocused())then __a=""else __a=bd end -c_a:updateDraw()return c_a end,getInputType=function(c_a) -return cc end,setValue=function(c_a,d_a)ac.setValue(c_a,tostring(d_a)) -if not(a_a)then _d= -tostring(d_a):len()+1 -ad=math.max(1,_d-c_a:getWidth()+1)if(c_a:isFocused())then local _aa,aaa=c_a:getAnchorPosition() -c_a.parent:setCursor(true, -_aa+_d-ad,aaa+math.floor(c_a:getHeight()/2),c_a.fgColor)end end;c_a:updateDraw()return c_a end,getValue=function(c_a) -local d_a=ac.getValue(c_a) -return cc=="number"and tonumber(d_a)or d_a end,setInputLimit=function(c_a,d_a) -dc=tonumber(d_a)or dc;c_a:updateDraw()return c_a end,getInputLimit=function(c_a)return dc end,setValuesByXMLData=function(c_a,d_a) -ac.setValuesByXMLData(c_a,d_a)local _aa,aaa -if(db("defaultBG",d_a)~=nil)then _aa=db("defaultBG",d_a)end -if(db("defaultFG",d_a)~=nil)then aaa=db("defaultFG",d_a)end;if(db("default",d_a)~=nil)then -c_a:setDefaultText(db("default",d_a),aaa~=nil and colors[aaa], -_aa~=nil and colors[_aa])end -if(db("limit",d_a)~= -nil)then c_a:setInputLimit(db("limit",d_a))end;if(db("type",d_a)~=nil)then -c_a:setInputType(db("type",d_a))end;return c_a end,getFocusHandler=function(c_a) -ac.getFocusHandler(c_a) -if(c_a.parent~=nil)then local d_a,_aa=c_a:getAnchorPosition()__a=""if(bd~="")then -c_a:updateDraw()end -c_a.parent:setCursor(true,d_a+_d-ad,_aa+math.max(math.ceil( -c_a:getHeight()/2 -1,1)),c_a.fgColor)end end,loseFocusHandler=function(c_a) -ac.loseFocusHandler(c_a)if(c_a.parent~=nil)then __a=bd;if(bd~="")then c_a:updateDraw()end -c_a.parent:setCursor(false)end end,keyHandler=function(c_a,d_a) -if -(ac.keyHandler(c_a,d_a))then local _aa,aaa=c_a:getSize()a_a=true -if(d_a==keys.backspace)then -local bba=tostring(ac.getValue())if(_d>1)then -c_a:setValue(bba:sub(1,_d-2)..bba:sub(_d,bba:len()))if(_d>1)then _d=_d-1 end -if(ad>1)then if(_dbba)then _d=bba+1 end;if(_d<1)then _d=1 end;if -(_d=_aa+ad)then ad=_d-_aa+1 end;if(ad<1)then ad=1 end end -if(d_a==keys.left)then _d=_d-1;if(_d>=1)then -if(_d=_aa+ad)then ad=_d end end;if(_d<1)then _d=1 end;if(ad<1)then ad=1 end end;local baa,caa=c_a:getAnchorPosition() -local daa=tostring(ac.getValue()) -local _ba=(_d<=daa:len()and _d-1 or daa:len())- (ad-1)local aba=c_a:getX() -if(_ba>aba+_aa-1)then _ba=aba+_aa-1 end;if(c_a.parent~=nil)then -c_a.parent:setCursor(true,baa+_ba,caa+ -math.max(math.ceil(aaa/2 -1,1)),c_a.fgColor)end -c_a:updateDraw()a_a=false;return true end;return false end,charHandler=function(c_a,d_a) -if -(ac.charHandler(c_a,d_a))then a_a=true;local _aa,aaa=c_a:getSize()local baa=ac.getValue() -if( -baa:len()0)then -if( -tonumber(ac.getValue())==nil)then c_a:setValue(cba)_d=_d-1 end end end else -c_a:setValue(baa:sub(1,_d-1)..d_a..baa:sub(_d,baa:len()))_d=_d+1 end;if(_d>=_aa+ad)then ad=ad+1 end end;local caa,daa=c_a:getAnchorPosition() -local _ba=tostring(ac.getValue()) -local aba=(_d<=_ba:len()and _d-1 or _ba:len())- (ad-1)local bba=c_a:getX() -if(aba>bba+_aa-1)then aba=bba+_aa-1 end;if(c_a.parent~=nil)then -c_a.parent:setCursor(true,caa+aba,daa+ -math.max(math.ceil(aaa/2 -1,1)),c_a.fgColor)end;a_a=false -c_a:updateDraw()return true end;return false end,mouseHandler=function(c_a,d_a,_aa,aaa) -if -(ac.mouseHandler(c_a,d_a,_aa,aaa))then local baa,caa=c_a:getAnchorPosition() -local daa,_ba=c_a:getAbsolutePosition(baa,caa)local aba,bba=c_a:getSize()_d=_aa-daa+ad;local cba=ac.getValue()if(_d> -cba:len())then _d=cba:len()+1 end;if(_d=baa+ad)then ad=(_d+1)-baa end -local daa,_ba=c_a:getAnchorPosition()local aba=tostring(ac.getValue()) -local bba=( -_d<=aba:len()and _d-1 or aba:len())- (ad-1)local cba=c_a:getX() -if(bba>cba+baa-1)then bba=cba+baa-1 end;if(c_a.parent~=nil)then -c_a.parent:setCursor(true,daa+bba,_ba+ -math.max(math.ceil(caa/2 -1,1)),c_a.fgColor)end -c_a:updateDraw()a_a=false end end end,draw=function(c_a) -if -(ac.draw(c_a))then -if(c_a.parent~=nil)then local d_a,_aa=c_a:getAnchorPosition() -local aaa,baa=c_a:getSize()local caa=bb.getTextVerticalAlign(baa,"center")if -(c_a.bgColor~=false)then -c_a.parent:drawBackgroundBox(d_a,_aa,aaa,baa,c_a.bgColor)end -for n=1,baa do -if(n==caa)then -local daa=tostring(ac.getValue())local _ba=c_a.bgColor;local aba=c_a.fgColor;local bba;if(daa:len()<=0)then bba=__a -_ba=cd or _ba;aba=dd or aba end;bba=__a -if(daa~="")then bba=daa end;bba=bba:sub(ad,aaa+ad-1)local cba=aaa-bba:len()if(cba<0)then -cba=0 end;if(cc=="password")and(daa~="")then -bba=string.rep("*",bba:len())end -bba=bba..string.rep(c_a.bgSymbol,cba) -c_a.parent:writeText(d_a,_aa+ (n-1),bba,_ba,aba)end end;if(c_a:isFocused())then -c_a.parent:setCursor(true,d_a+_d-ad,_aa+ -math.floor(c_a:getHeight()/2),c_a.fgColor)end end end end,init=function(c_a) -if( -c_a.parent~=nil)then c_a.parent:addEvent("mouse_click",c_a) -c_a.parent:addEvent("key",c_a)c_a.parent:addEvent("char",c_a) -c_a.parent:addEvent("other_event",c_a)c_a.parent:addEvent("mouse_drag",c_a)end -if(ac.init(c_a))then -c_a.bgColor=c_a.parent:getTheme("InputBG")c_a.fgColor=c_a.parent:getTheme("InputText")end end}return setmetatable(b_a,ac)end end -aa["objects"]["Dropdown"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=da("utils").getValueFromXML -return -function(db)local _c=ab(db)local ac="Dropdown"_c.width=12;_c.height=1;_c:setZIndex(6) -local bc={}local cc;local dc;local _d=true;local ad="left"local bd=0;local cd=16;local dd=6;local __a="\16"local a_a="\31"local b_a=false -local c_a={getType=function(d_a)return -ac end,setValuesByXMLData=function(d_a,_aa)_c.setValuesByXMLData(d_a,_aa) -if( -cb("selectionBG",_aa)~=nil)then cc=colors[cb("selectionBG",_aa)]end;if(cb("selectionFG",_aa)~=nil)then -dc=colors[cb("selectionFG",_aa)]end;if(cb("dropdownWidth",_aa)~=nil)then -cd=cb("dropdownWidth",_aa)end;if(cb("dropdownHeight",_aa)~=nil)then -dd=cb("dropdownHeight",_aa)end;if(cb("offset",_aa)~=nil)then -bd=cb("offset",_aa)end -if(_aa["item"]~=nil)then local aaa=_aa["item"]if( -aaa.properties~=nil)then aaa={aaa}end;for baa,caa in pairs(aaa)do -d_a:addItem(cb("text",caa),colors[cb("bg",caa)],colors[cb("fg",caa)])end end end,setOffset=function(d_a,_aa) -bd=_aa;d_a:updateDraw()return d_a end,getOffset=function(d_a)return bd end,addItem=function(d_a,_aa,aaa,baa,...) -table.insert(bc,{text=_aa,bgCol= -aaa or d_a.bgColor,fgCol=baa or d_a.fgColor,args={...}})d_a:updateDraw()return d_a end,getAll=function(d_a)return -bc end,removeItem=function(d_a,_aa)table.remove(bc,_aa)d_a:updateDraw() -return d_a end,getItem=function(d_a,_aa)return bc[_aa]end,getItemIndex=function(d_a) -local _aa=d_a:getValue()for aaa,baa in pairs(bc)do if(baa==_aa)then return aaa end end end,clear=function(d_a) -bc={}d_a:setValue({},false)d_a:updateDraw()return d_a end,getItemCount=function(d_a)return -#bc end,editItem=function(d_a,_aa,aaa,baa,caa,...)table.remove(bc,_aa) -table.insert(bc,_aa,{text=aaa,bgCol=baa or d_a.bgColor,fgCol= -caa or d_a.fgColor,args={...}})d_a:updateDraw()return d_a end,selectItem=function(d_a,_aa)d_a:setValue( -bc[_aa]or{},false)d_a:updateDraw()return d_a end,setSelectedItem=function(d_a,_aa,aaa,baa)cc= -_aa or d_a.bgColor;dc=aaa or d_a.fgColor -_d=baa~=nil and baa;d_a:updateDraw()return d_a end,setDropdownSize=function(d_a,_aa,aaa) -cd,dd=_aa,aaa;d_a:updateDraw()return d_a end,getDropdownSize=function(d_a)return cd,dd end,mouseHandler=function(d_a,_aa,aaa,baa,caa) -if -(b_a)then -local daa,_ba=d_a:getAbsolutePosition(d_a:getAnchorPosition()) -if(_aa==1)then -if(#bc>0)then -for n=1,dd do -if(bc[n+bd]~=nil)then -if(daa<=aaa)and(daa+cd>aaa)and -(_ba+n==baa)then d_a:setValue(bc[n+bd]) -d_a:updateDraw() -local aba=d_a:getEventSystem():sendEvent("mouse_click",d_a,"mouse_click",dir,aaa,baa)if(caa)then d_a:mouseUpHandler(_aa,aaa,baa)end;if(aba== -false)then return aba end;return true end end end end end end -if(_c.mouseHandler(d_a,_aa,aaa,baa))then b_a=(not b_a)d_a:updateDraw() -return true else if(b_a)then d_a:updateDraw()b_a=false end;return false end end,mouseUpHandler=function(d_a,_aa,aaa,baa) -if -(b_a)then -local caa,daa=d_a:getAbsolutePosition(d_a:getAnchorPosition()) -if(_aa==1)then -if(#bc>0)then -for n=1,dd do -if(bc[n+bd]~=nil)then -if(caa<=aaa)and(caa+cd>aaa)and -(daa+n==baa)then b_a=false;d_a:updateDraw() -local _ba=d_a:getEventSystem():sendEvent("mouse_up",d_a,"mouse_up",dir,aaa,baa)if(_ba==false)then return _ba end;return true end end end end end end end,scrollHandler=function(d_a,_aa,aaa,baa) -if -(b_a)and(d_a:isFocused())then bd=bd+_aa;if(bd<0)then bd=0 end;if(_aa==1)then -if(#bc>dd)then if(bd> -#bc-dd)then bd=#bc-dd end else bd=math.min(#bc-1,0)end end -local caa=d_a:getEventSystem():sendEvent("mouse_scroll",d_a,"mouse_scroll",_aa,aaa,baa)if(caa==false)then return caa end;d_a:updateDraw()return true end end,draw=function(d_a) -if -(_c.draw(d_a))then local _aa,aaa=d_a:getAnchorPosition()local baa,caa=d_a:getSize() -if( -d_a.parent~=nil)then if(d_a.bgColor~=false)then -d_a.parent:drawBackgroundBox(_aa,aaa,baa,caa,d_a.bgColor)end;local daa=d_a:getValue() -local _ba=bb.getTextHorizontalAlign(( -daa~=nil and daa.text or""),baa,ad):sub(1, -baa-1).. (b_a and a_a or __a) -d_a.parent:writeText(_aa,aaa,_ba,d_a.bgColor,d_a.fgColor) -if(b_a)then -for n=1,dd do -if(bc[n+bd]~=nil)then -if(bc[n+bd]==daa)then -if(_d)then -d_a.parent:writeText(_aa,aaa+n,bb.getTextHorizontalAlign(bc[ -n+bd].text,cd,ad),cc,dc)else -d_a.parent:writeText(_aa,aaa+n,bb.getTextHorizontalAlign(bc[n+bd].text,cd,ad),bc[ -n+bd].bgCol,bc[n+bd].fgCol)end else -d_a.parent:writeText(_aa,aaa+n,bb.getTextHorizontalAlign(bc[n+bd].text,cd,ad),bc[ -n+bd].bgCol,bc[n+bd].fgCol)end end end end end end end,init=function(d_a) -d_a.parent:addEvent("mouse_click",d_a)d_a.parent:addEvent("mouse_up",d_a) -d_a.parent:addEvent("mouse_scroll",d_a) -if(_c.init(d_a))then -d_a.bgColor=d_a.parent:getTheme("DropdownBG")d_a.fgColor=d_a.parent:getTheme("DropdownText") -cc=d_a.parent:getTheme("SelectionBG")dc=d_a.parent:getTheme("SelectionText")end end}return setmetatable(c_a,_c)end end -aa["objects"]["Thread"]=function(...)local ab=da("utils").getValueFromXML -return -function(bb)local cb -local db="Thread"local _c;local ac;local bc=false;local cc -local dc=function(_d,ad) -if(ad:sub(1,1)=="#")then -local bd=_d:getBaseFrame():getDeepObject(ad:sub(2,ad:len())) -if(bd~=nil)and(bd.internalObjetCall~=nil)then return(function() -bd:internalObjetCall()end)end else return _d:getBaseFrame():getVariable(ad)end;return _d end -cb={name=bb,getType=function(_d)return db end,getZIndex=function(_d)return 1 end,getName=function(_d)return _d.name end,getBaseFrame=function(_d)if -(_d.parent~=nil)then return _d.parent:getBaseFrame()end -return _d end,setValuesByXMLData=function(_d,ad)local bd;if(ab("thread",ad)~=nil)then -bd=dc(_d,ab("thread",ad))end -if(ab("start",ad)~=nil)then if -(ab("start",ad))and(bd~=nil)then _d:start(bd)end end;return _d end,start=function(_d,ad) -if( -ad==nil)then error("Function provided to thread is nil")end;_c=ad;ac=coroutine.create(_c)bc=true;cc=nil -local bd,cd=coroutine.resume(ac)cc=cd;if not(bd)then if(cd~="Terminated")then -error("Thread Error Occurred - "..cd)end end -_d.parent:addEvent("mouse_click",_d)_d.parent:addEvent("mouse_up",_d) -_d.parent:addEvent("mouse_scroll",_d)_d.parent:addEvent("mouse_drag",_d) -_d.parent:addEvent("key",_d)_d.parent:addEvent("key_up",_d) -_d.parent:addEvent("char",_d)_d.parent:addEvent("other_event",_d)return _d end,getStatus=function(_d,ad)if( -ac~=nil)then return coroutine.status(ac)end;return nil end,stop=function(_d,ad) -bc=false;_d.parent:removeEvent("mouse_click",_d) -_d.parent:removeEvent("mouse_up",_d)_d.parent:removeEvent("mouse_scroll",_d) -_d.parent:removeEvent("mouse_drag",_d)_d.parent:removeEvent("key",_d) -_d.parent:removeEvent("key_up",_d)_d.parent:removeEvent("char",_d) -_d.parent:removeEvent("other_event",_d)return _d end,mouseHandler=function(_d,...) -_d:eventHandler("mouse_click",...)end,mouseUpHandler=function(_d,...)_d:eventHandler("mouse_up",...)end,mouseScrollHandler=function(_d,...) -_d:eventHandler("mouse_scroll",...)end,mouseDragHandler=function(_d,...) -_d:eventHandler("mouse_drag",...)end,mouseMoveHandler=function(_d,...) -_d:eventHandler("mouse_move",...)end,keyHandler=function(_d,...)_d:eventHandler("key",...)end,keyUpHandler=function(_d,...) -_d:eventHandler("key_up",...)end,charHandler=function(_d,...)_d:eventHandler("char",...)end,eventHandler=function(_d,ad,...) -if -(bc)then -if(coroutine.status(ac)=="suspended")then if(cc~=nil)then if(ad~=cc)then return end;cc= -nil end -local bd,cd=coroutine.resume(ac,ad,...)cc=cd;if not(bd)then if(cd~="Terminated")then -error("Thread Error Occurred - "..cd)end end else -_d:stop()end end end}cb.__index=cb;return cb end end -aa["objects"]["Pane"]=function(...)local ab=da("Object")local bb=da("basaltLogs") -return -function(cb) -local db=ab(cb)local _c="Pane" -local ac={getType=function(bc)return _c end,setBackground=function(bc,cc,dc,_d)db.setBackground(bc,cc,dc,_d) -return bc end,init=function(bc) -if(db.init(bc))then -bc.bgColor=bc.parent:getTheme("PaneBG")bc.fgColor=bc.parent:getTheme("PaneBG")end end}return setmetatable(ac,db)end end -aa["objects"]["Progressbar"]=function(...)local ab=da("Object") -local bb=da("utils").getValueFromXML -return -function(cb)local db=ab(cb)local _c="Progressbar"local ac=0;db:setZIndex(5) -db:setValue(false)db.width=25;db.height=1;local bc;local cc=""local dc=colors.white;local _d=""local ad=0 -local bd={init=function(cd) -if -(db.init(cd))then cd.bgColor=cd.parent:getTheme("ProgressbarBG") -cd.fgColor=cd.parent:getTheme("ProgressbarText")bc=cd.parent:getTheme("ProgressbarActiveBG")end end,getType=function(cd)return -_c end,setValuesByXMLData=function(cd,dd)db.setValuesByXMLData(cd,dd)if(bb("direction",dd)~= -nil)then ad=bb("direction",dd)end -if( -bb("progressColor",dd)~=nil)then bc=colors[bb("progressColor",dd)]end -if(bb("progressSymbol",dd)~=nil)then cc=bb("progressSymbol",dd)end;if(bb("backgroundSymbol",dd)~=nil)then -_d=bb("backgroundSymbol",dd)end -if -(bb("progressSymbolColor",dd)~=nil)then dc=colors[bb("progressSymbolColor",dd)]end;if(bb("onDone",dd)~=nil)then -cd:generateXMLEventFunction(cd.onProgressDone,bb("onDone",dd))end;return cd end,setDirection=function(cd,dd) -ad=dd;cd:updateDraw()return cd end,setProgressBar=function(cd,dd,__a,a_a)bc=dd or bc -cc=__a or cc;dc=a_a or dc;cd:updateDraw()return cd end,setBackgroundSymbol=function(cd,dd) -_d=dd:sub(1,1)cd:updateDraw()return cd end,setProgress=function(cd,dd)if -(dd>=0)and(dd<=100)and(ac~=dd)then ac=dd;cd:setValue(ac)if(ac==100)then -cd:progressDoneHandler()end end -cd:updateDraw()return cd end,getProgress=function(cd)return -ac end,onProgressDone=function(cd,dd)cd:registerEvent("progress_done",dd) -return cd end,progressDoneHandler=function(cd) -cd:sendEvent("progress_done",cd)end,draw=function(cd) -if(db.draw(cd))then -if(cd.parent~=nil)then -local dd,__a=cd:getAnchorPosition()local a_a,b_a=cd:getSize()if(cd.bgColor~=false)then -cd.parent:drawBackgroundBox(dd,__a,a_a,b_a,cd.bgColor)end;if(_d~="")then -cd.parent:drawTextBox(dd,__a,a_a,b_a,_d)end;if(cd.fgColor~=false)then -cd.parent:drawForegroundBox(dd,__a,a_a,b_a,cd.fgColor)end -if(ad==1)then cd.parent:drawBackgroundBox(dd,__a,a_a, -b_a/100 *ac,bc)cd.parent:drawForegroundBox(dd,__a,a_a, -b_a/100 *ac,dc)cd.parent:drawTextBox(dd,__a,a_a, -b_a/100 *ac,cc)elseif(ad==2)then -cd.parent:drawBackgroundBox(dd, -__a+math.ceil(b_a-b_a/100 *ac),a_a,b_a/100 *ac,bc) -cd.parent:drawForegroundBox(dd,__a+math.ceil(b_a-b_a/100 *ac),a_a, -b_a/100 *ac,dc) -cd.parent:drawTextBox(dd,__a+math.ceil(b_a-b_a/100 *ac),a_a, -b_a/100 *ac,cc)elseif(ad==3)then -cd.parent:drawBackgroundBox(dd+math.ceil(a_a-a_a/100 *ac),__a, -a_a/100 *ac,b_a,bc) -cd.parent:drawForegroundBox(dd+math.ceil(a_a-a_a/100 *ac),__a, -a_a/100 *ac,b_a,dc) -cd.parent:drawTextBox(dd+math.ceil(a_a-a_a/100 *ac),__a, -a_a/100 *ac,b_a,cc)else -cd.parent:drawBackgroundBox(dd,__a,a_a/100 *ac,b_a,bc) -cd.parent:drawForegroundBox(dd,__a,a_a/100 *ac,b_a,dc) -cd.parent:drawTextBox(dd,__a,a_a/100 *ac,b_a,cc)end end end end}return setmetatable(bd,db)end end -aa["objects"]["Radio"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=bb.getValueFromXML -return -function(db)local _c=ab(db)local ac="Radio"_c.width=8;_c:setZIndex(5)local bc={}local cc;local dc -local _d;local ad;local bd;local cd;local dd=true;local __a="\7"local a_a="left" -local b_a={getType=function(c_a)return ac end,setValuesByXMLData=function(c_a,d_a) -_c.setValuesByXMLData(c_a,d_a)if(cb("selectionBG",d_a)~=nil)then -cc=colors[cb("selectionBG",d_a)]end;if(cb("selectionFG",d_a)~=nil)then -dc=colors[cb("selectionFG",d_a)]end;if(cb("boxBG",d_a)~=nil)then -_d=colors[cb("boxBG",d_a)]end;if(cb("inactiveBoxBG",d_a)~=nil)then -bd=colors[cb("inactiveBoxBG",d_a)]end;if(cb("inactiveBoxFG",d_a)~=nil)then -cd=colors[cb("inactiveBoxFG",d_a)]end;if(cb("boxFG",d_a)~=nil)then -ad=colors[cb("boxFG",d_a)]end;if(cb("symbol",d_a)~=nil)then -__a=cb("symbol",d_a)end -if(d_a["item"]~=nil)then local _aa=d_a["item"]if( -_aa.properties~=nil)then _aa={_aa}end;for aaa,baa in pairs(_aa)do -c_a:addItem(cb("text",baa),cb("x",baa),cb("y",baa),colors[cb("bg",baa)],colors[cb("fg",baa)])end end;return c_a end,addItem=function(c_a,d_a,_aa,aaa,baa,caa,...) -table.insert(bc,{x= -_aa or 1,y=aaa or 1,text=d_a,bgCol=baa or c_a.bgColor,fgCol=caa or c_a.fgColor,args={...}})if(#bc==1)then c_a:setValue(bc[1])end -c_a:updateDraw()return c_a end,getAll=function(c_a)return -bc end,removeItem=function(c_a,d_a)table.remove(bc,d_a)c_a:updateDraw() -return c_a end,getItem=function(c_a,d_a)return bc[d_a]end,getItemIndex=function(c_a) -local d_a=c_a:getValue()for _aa,aaa in pairs(bc)do if(aaa==d_a)then return _aa end end end,clear=function(c_a) -bc={}c_a:setValue({},false)c_a:updateDraw()return c_a end,getItemCount=function(c_a)return -#bc end,editItem=function(c_a,d_a,_aa,aaa,baa,caa,daa,...)table.remove(bc,d_a) -table.insert(bc,d_a,{x=aaa or 1,y=baa or 1,text=_aa,bgCol= -caa or c_a.bgColor,fgCol=daa or c_a.fgColor,args={...}})c_a:updateDraw()return c_a end,selectItem=function(c_a,d_a)c_a:setValue( -bc[d_a]or{},false)c_a:updateDraw()return c_a end,setActiveSymbol=function(c_a,d_a) -__a=d_a:sub(1,1)c_a:updateDraw()return c_a end,setSelectedItem=function(c_a,d_a,_aa,aaa,baa,caa) -cc=d_a or cc;dc=_aa or dc;_d=aaa or _d;ad=baa or ad -dd=caa~=nil and caa or true;c_a:updateDraw()return c_a end,mouseHandler=function(c_a,d_a,_aa,aaa) -if( -#bc>0)then -local baa,caa=c_a:getAbsolutePosition(c_a:getAnchorPosition()) -for daa,_ba in pairs(bc)do -if(baa+_ba.x-1 <=_aa)and( -baa+_ba.x-1 +_ba.text:len()+1 >=_aa)and( -caa+_ba.y-1 ==aaa)then -c_a:setValue(_ba) -local aba=c_a:getEventSystem():sendEvent("mouse_click",c_a,"mouse_click",d_a,_aa,aaa)if(aba==false)then return aba end;if(c_a.parent~=nil)then -c_a.parent:setFocusedObject(c_a)end;c_a:updateDraw()return true end end end;return false end,draw=function(c_a) -if( -c_a.parent~=nil)then local d_a,_aa=c_a:getAnchorPosition() -for aaa,baa in pairs(bc)do -if(baa== -c_a:getValue())then if(a_a=="left")then -c_a.parent:writeText(baa.x+d_a-1,baa.y+_aa-1,__a,_d,ad) -c_a.parent:writeText(baa.x+2 +d_a-1,baa.y+_aa-1,baa.text,cc,dc)end else -c_a.parent:drawBackgroundBox( -baa.x+d_a-1,baa.y+_aa-1,1,1,bd or c_a.bgColor) -c_a.parent:writeText(baa.x+2 +d_a-1,baa.y+_aa-1,baa.text,baa.bgCol,baa.fgCol)end end;return true end end,init=function(c_a) -c_a.parent:addEvent("mouse_click",c_a) -if(_c.init(c_a))then -c_a.bgColor=c_a.parent:getTheme("MenubarBG")c_a.fgColor=c_a.parent:getTheme("MenubarFG") -cc=c_a.parent:getTheme("SelectionBG")dc=c_a.parent:getTheme("SelectionText") -_d=c_a.parent:getTheme("MenubarBG")ad=c_a.parent:getTheme("MenubarText")end end}return setmetatable(b_a,_c)end end -aa["objects"]["Program"]=function(...)local ab=da("Object")local bb=da("tHex") -local cb=da("process")local db=da("utils").getValueFromXML;local _c=string.sub -return -function(ac,bc)local cc=ab(ac) -local dc="Program"cc:setZIndex(5)local _d;local ad;local bd={} -local function cd(baa,caa,daa,_ba,aba)local bba,cba=1,1 -local dba,_ca=colors.black,colors.white;local aca=false;local bca=false;local cca={}local dca={}local _da={}local ada={}local bda;local cda={}for i=0,15 do local abb=2 ^i -ada[abb]={bc:getBasaltInstance().getBaseTerm().getPaletteColour(abb)}end;local function dda() -bda=(" "):rep(daa) -for n=0,15 do local abb=2 ^n;local bbb=bb[abb]cda[abb]=bbb:rep(daa)end end -local function __b()dda()local abb=bda -local bbb=cda[colors.white]local cbb=cda[colors.black] -for n=1,_ba do -cca[n]=_c(cca[n]==nil and abb or cca[n]..abb:sub(1, -daa-cca[n]:len()),1,daa) -_da[n]=_c(_da[n]==nil and bbb or _da[n].. -bbb:sub(1,daa-_da[n]:len()),1,daa) -dca[n]=_c(dca[n]==nil and cbb or dca[n].. -cbb:sub(1,daa-dca[n]:len()),1,daa)end;cc.updateDraw(cc)end;__b()local function a_b()if -bba>=1 and cba>=1 and bba<=daa and cba<=_ba then else end end -local function b_b(abb,bbb,cbb) -local dbb=bba;local _cb=dbb+#abb-1 -if cba>=1 and cba<=_ba then -if dbb<=daa and _cb>=1 then -if dbb==1 and _cb== -daa then cca[cba]=abb;_da[cba]=bbb;dca[cba]=cbb else local acb,bcb,ccb -if dbb<1 then local __c= -1 -dbb+1;local a_c=daa-dbb+1;acb=_c(abb,__c,a_c) -bcb=_c(bbb,__c,a_c)ccb=_c(cbb,__c,a_c)elseif _cb>daa then local __c=daa-dbb+1;acb=_c(abb,1,__c) -bcb=_c(bbb,1,__c)ccb=_c(cbb,1,__c)else acb=abb;bcb=bbb;ccb=cbb end;local dcb=cca[cba]local _db=_da[cba]local adb=dca[cba]local bdb,cdb,ddb -if dbb>1 then local __c=dbb-1;bdb= -_c(dcb,1,__c)..acb;cdb=_c(_db,1,__c)..bcb -ddb=_c(adb,1,__c)..ccb else bdb=acb;cdb=bcb;ddb=ccb end -if _cb=1 and _cb<=_ba then -cca[newY]=cca[_cb]dca[newY]=dca[_cb]_da[newY]=_da[_cb]else cca[newY]=bbb -_da[newY]=cbb;dca[newY]=dbb end end end;if(bca)then a_b()end end,isColor=function()return -bc:getBasaltInstance().getBaseTerm().isColor()end,isColour=function()return -bc:getBasaltInstance().getBaseTerm().isColor()end,write=function(abb) -abb=tostring(abb)if(bca)then -b_b(abb,bb[_ca]:rep(abb:len()),bb[dba]:rep(abb:len()))end end,clearLine=function() -if -(bca)then c_b(1,cba,(" "):rep(daa)) -d_b(1,cba,bb[dba]:rep(daa))_ab(1,cba,bb[_ca]:rep(daa))end;if(bca)then a_b()end end,clear=function() -for n=1,_ba -do c_b(1,n,(" "):rep(daa)) -d_b(1,n,bb[dba]:rep(daa))_ab(1,n,bb[_ca]:rep(daa))end;if(bca)then a_b()end end,blit=function(abb,bbb,cbb)if -type(abb)~="string"then -error("bad argument #1 (expected string, got "..type(abb)..")",2)end;if type(bbb)~="string"then -error( -"bad argument #2 (expected string, got "..type(bbb)..")",2)end;if type(cbb)~="string"then -error( -"bad argument #3 (expected string, got "..type(cbb)..")",2)end -if -#bbb~=#abb or#cbb~=#abb then error("Arguments must be the same length",2)end;if(bca)then b_b(abb,bbb,cbb)end end}return _bb end;cc.width=30;cc.height=12;local dd=cd(1,1,cc.width,cc.height)local __a -local a_a=false;local b_a={} -local function c_a(baa)local caa,daa=dd.getCursorPos() -local _ba,aba=baa:getAnchorPosition()local bba,cba=baa:getSize() -if(_ba+caa-1 >=1 and -_ba+caa-1 <=_ba+bba-1 and daa+aba-1 >=1 and -daa+aba-1 <=aba+cba-1)then -baa.parent:setCursor( -baa:isFocused()and dd.getCursorBlink(),_ba+caa-1,daa+aba-1,dd.getTextColor())end end -local function d_a(baa,caa,...)local daa,_ba=__a:resume(caa,...) -if(daa==false)and(_ba~=nil)and -(_ba~="Terminated")then -local aba=baa:sendEvent("program_error",_ba) -if(aba~=false)then error("Basalt Program - ".._ba)end end -if(__a:getStatus()=="dead")then baa:sendEvent("program_done")end end -local function _aa(baa,caa,daa,_ba,aba)if(__a==nil)then return false end -if not(__a:isDead())then if not(a_a)then -local bba,cba=baa:getAbsolutePosition(baa:getAnchorPosition( -nil,nil,true))d_a(baa,caa,daa,_ba-bba+1,aba-cba+1) -c_a(baa)end end end -local function aaa(baa,caa,daa,_ba)if(__a==nil)then return false end -if not(__a:isDead())then if not(a_a)then if(baa.draw)then -d_a(baa,caa,daa,_ba)c_a(baa)end end end end -_d={getType=function(baa)return dc end,show=function(baa)cc.show(baa) -dd.setBackgroundColor(baa.bgColor)dd.setTextColor(baa.fgColor) -dd.basalt_setVisible(true)return baa end,hide=function(baa) -cc.hide(baa)dd.basalt_setVisible(false)return baa end,setPosition=function(baa,caa,daa,_ba) -cc.setPosition(baa,caa,daa,_ba) -dd.basalt_reposition(baa:getAnchorPosition())return baa end,setValuesByXMLData=function(baa,caa) -cc.setValuesByXMLData(baa,caa)if(db("path",caa)~=nil)then ad=db("path",caa)end -if( -db("execute",caa)~=nil)then if(db("execute",caa))then -if(ad~=nil)then baa:execute(ad)end end end end,getBasaltWindow=function()return -dd end,getBasaltProcess=function()return __a end,setSize=function(baa,caa,daa,_ba)cc.setSize(baa,caa,daa,_ba) -dd.basalt_resize(baa:getWidth(),baa:getHeight())return baa end,getStatus=function(baa)if(__a~=nil)then return -__a:getStatus()end;return"inactive"end,setEnviroment=function(baa,caa)bd= -caa or{}return baa end,execute=function(baa,caa,...)ad=caa or ad -__a=cb:new(ad,dd,bd,...)dd.setBackgroundColor(colors.black) -dd.setTextColor(colors.white)dd.clear()dd.setCursorPos(1,1) -dd.setBackgroundColor(baa.bgColor)dd.setTextColor(baa.fgColor) -dd.basalt_setVisible(true)d_a(baa)a_a=false -if(baa.parent~=nil)then -baa.parent:addEvent("mouse_click",baa)baa.parent:addEvent("mouse_up",baa) -baa.parent:addEvent("mouse_drag",baa)baa.parent:addEvent("mouse_scroll",baa) -baa.parent:addEvent("key",baa)baa.parent:addEvent("key_up",baa) -baa.parent:addEvent("char",baa)baa.parent:addEvent("other_event",baa)end;return baa end,stop=function(baa) -if( -__a~=nil)then -if not(__a:isDead())then d_a(baa,"terminate")if(__a:isDead())then -if( -baa.parent~=nil)then baa.parent:setCursor(false)end end end end;baa.parent:removeEvents(baa)return baa end,pause=function(baa,caa)a_a= -caa or(not a_a) -if(__a~=nil)then if not(__a:isDead())then if not(a_a)then -baa:injectEvents(b_a)b_a={}end end end;return baa end,isPaused=function(baa)return -a_a end,injectEvent=function(baa,caa,daa,_ba,aba,bba,cba) -if(__a~=nil)then -if not(__a:isDead())then if(a_a==false)or(cba)then -d_a(baa,caa,daa,_ba,aba,bba)else -table.insert(b_a,{event=caa,args={daa,_ba,aba,bba}})end end end;return baa end,getQueuedEvents=function(baa)return -b_a end,updateQueuedEvents=function(baa,caa)b_a=caa or b_a;return baa end,injectEvents=function(baa,caa)if(__a~=nil)then -if not -(__a:isDead())then for daa,_ba in pairs(caa)do -d_a(baa,_ba.event,table.unpack(_ba.args))end end end;return baa end,mouseHandler=function(baa,caa,daa,_ba) -if -(cc.mouseHandler(baa,caa,daa,_ba))then _aa(baa,"mouse_click",caa,daa,_ba)return true end;return false end,mouseUpHandler=function(baa,caa,daa,_ba) -if -(cc.mouseUpHandler(baa,caa,daa,_ba))then _aa(baa,"mouse_up",caa,daa,_ba)return true end;return false end,scrollHandler=function(baa,caa,daa,_ba) -if -(cc.scrollHandler(baa,caa,daa,_ba))then _aa(baa,"mouse_scroll",caa,daa,_ba)return true end;return false end,dragHandler=function(baa,caa,daa,_ba) -if -(cc.dragHandler(baa,caa,daa,_ba))then _aa(baa,"mouse_drag",caa,daa,_ba)return true end;return false end,keyHandler=function(baa,caa,daa)if -(cc.keyHandler(baa,caa,daa))then aaa(baa,"key",caa,daa)return true end;return -false end,keyUpHandler=function(baa,caa)if -(cc.keyUpHandler(baa,caa))then aaa(baa,"key_up",caa)return true end -return false end,charHandler=function(baa,caa)if -(cc.charHandler(baa,caa))then aaa(baa,"char",caa)return true end -return false end,getFocusHandler=function(baa) -cc.getFocusHandler(baa) -if(__a~=nil)then -if not(__a:isDead())then -if not(a_a)then -if(baa.parent~=nil)then -local caa,daa=dd.getCursorPos()local _ba,aba=baa:getAnchorPosition()local bba,cba=baa:getSize() -if +aab<0.5 and- (2 ^ (20 *aab-10)* +bb((20 *aab-11.125)*bab))/2 or +(2 ^ (-20 *aab+10)*bb((20 *aab-11.125)*bab))/2 +1))end +local function daa(aab)return +aab==0 and 0 or(aab==1 and 1 or ( -_ba+caa-1 >=1 and _ba+caa-1 <=_ba+bba-1 and -daa+aba-1 >=1 and daa+aba-1 <=aba+cba-1)then -baa.parent:setCursor(dd.getCursorBlink(),_ba+caa-1,daa+aba-1,dd.getTextColor())end end end end end end,loseFocusHandler=function(baa) -cc.loseFocusHandler(baa) -if(__a~=nil)then if not(__a:isDead())then if(baa.parent~=nil)then -baa.parent:setCursor(false)end end end end,customEventHandler=function(baa,caa,...) -cc.customEventHandler(baa,caa,...)if(__a==nil)then return end -if(caa=="basalt_resize")then local daa,_ba=dd.getSize() -local aba,bba=baa:getSize() -if(daa~=aba)or(_ba~=bba)then dd.basalt_resize(aba,bba)if not -(__a:isDead())then d_a(baa,"term_resize")end end -dd.basalt_reposition(baa:getAnchorPosition())end end,eventHandler=function(baa,caa,daa,_ba,aba,bba) -cc.eventHandler(baa,caa,daa,_ba,aba,bba)if(__a==nil)then return end -if not(__a:isDead())then -if not(a_a)then if(caa~="terminate")then -d_a(baa,caa,daa,_ba,aba,bba)end -if(baa:isFocused())then -local cba,dba=baa:getAnchorPosition()local _ca,aca=dd.getCursorPos() -if(baa.parent~=nil)then -local bca,cca=baa:getSize() -if -(cba+_ca-1 >=1 and cba+_ca-1 <=cba+bca-1 and -aca+dba-1 >=1 and aca+dba-1 <=dba+cca-1)then -baa.parent:setCursor(dd.getCursorBlink(),cba+_ca-1,aca+dba-1,dd.getTextColor())end end;if(caa=="terminate")then d_a(baa,caa) -baa.parent:setCursor(false)return true end end else -table.insert(b_a,{event=caa,args={daa,_ba,aba,bba}})end end end,draw=function(baa) -if -(cc.draw(baa))then -if(baa.parent~=nil)then local caa,daa=baa:getAnchorPosition() -local _ba,aba=dd.getCursorPos()local bba,cba=baa:getSize()dd.basalt_reposition(caa,daa) -dd.basalt_update() -if -(caa+_ba-1 >=1 and caa+_ba-1 <=caa+bba-1 and -aba+daa-1 >=1 and aba+daa-1 <=daa+cba-1)then -baa.parent:setCursor(baa:isFocused()and dd.getCursorBlink(), -caa+_ba-1,aba+daa-1,dd.getTextColor())end end end end,onError=function(baa,...) -for caa,daa in -pairs(table.pack(...))do if(type(daa)=="function")then -baa:registerEvent("program_error",daa)end end;if(baa.parent~=nil)then -baa.parent:addEvent("other_event",baa)end;return baa end,onDone=function(baa,...) -for caa,daa in -pairs(table.pack(...))do if(type(daa)=="function")then -baa:registerEvent("program_done",daa)end end;if(baa.parent~=nil)then -baa.parent:addEvent("other_event",baa)end;return baa end,init=function(baa) -if -(cc.init(baa))then baa.bgColor=baa.parent:getTheme("ProgramBG")end end}return setmetatable(_d,cc)end end -aa["objects"]["Textfield"]=function(...)local ab=da("Object")local bb=da("tHex") -local cb=da("utils").getValueFromXML;local db=da("basaltLogs") -local _c,ac,bc,cc,dc=string.rep,string.find,string.gmatch,string.sub,string.len -return -function(_d)local ad=ab(_d)local bd="Textfield"local cd,dd,__a,a_a=1,1,1,1;local b_a={""}local c_a={""}local d_a={""} -local _aa={}local aaa={}local baa,caa,daa,_ba;local aba,bba=colors.lightBlue,colors.black;ad.width=30 -ad.height=12;ad:setZIndex(5)local function cba() -if -(baa~=nil)and(caa~=nil)and(daa~=nil)and(_ba~=nil)then return true end;return false end -local function dba()local ada,bda,cda,dda -if -(cba())then if(baa>caa)then ada,bda=caa,baa else ada,bda=baa,caa end;if(daa>_ba)then -cda,dda=_ba,daa else cda,dda=daa,_ba end end;return ada,bda,cda,dda end;local function _ca()end -local function aca(ada)local bda,cda,dda,__b=dba(ada) -for n=__b,dda,-1 do -if(n==dda)or(n==__b)then local a_b=b_a[n] -local b_b=c_a[n]local c_b=d_a[n] -if(n==dda)and(n==__b)then a_b=a_b:sub(1,bda-1).. -a_b:sub(cda+1,a_b:len())b_b=b_b:sub(1,bda-1).. -b_b:sub(cda+1,b_b:len())c_b=c_b:sub(1,bda-1).. -c_b:sub(cda+1,c_b:len())elseif(n==bda)then -a_b=a_b:sub(1,bda)b_b=b_b:sub(1,bda)c_b=c_b:sub(1,bda)elseif(n==dda)then -a_b=a_b:sub(cda,a_b:len())b_b=b_b:sub(cda,b_b:len()) -c_b=c_b:sub(cda,c_b:len())end;b_a[n]=a_b;c_a[n]=b_b;d_a[n]=c_b else table.remove(b_a,n) -table.remove(c_a,n)table.remove(d_a,n)end end;__a,a_a=baa,daa;baa,caa,daa,_ba=nil,nil,nil,nil;return ada end -local function bca(ada,bda)local cda={} -if(ada:len()>0)then -for dda in bc(ada,bda)do local __b,a_b=ac(ada,dda) -if -(__b~=nil)and(a_b~=nil)then table.insert(cda,__b)table.insert(cda,a_b) -local b_b=cc(ada,1,(__b-1))local c_b=cc(ada,a_b+1,ada:len())ada=b_b.. (":"):rep(dda:len()).. -c_b end end end;return cda end -local function cca(ada,bda)bda=bda or a_a -local cda=bb[ada.fgColor]:rep(d_a[bda]:len()) -local dda=bb[ada.bgColor]:rep(c_a[bda]:len()) -for __b,a_b in pairs(aaa)do local b_b=bca(b_a[bda],a_b[1]) -if(#b_b>0)then -for x=1,#b_b/2 do -local c_b=x*2 -1;if(a_b[2]~=nil)then -cda=cda:sub(1,b_b[c_b]-1)..bb[a_b[2]]:rep(b_b[c_b+1]- ( -b_b[c_b]-1)).. -cda:sub(b_b[c_b+1]+1,cda:len())end;if -(a_b[3]~=nil)then -dda=dda:sub(1,b_b[c_b]-1).. +aab<0.5 and 2 ^ (20 *aab-10)/2 or(2 -2 ^ (-20 *aab+10))/2))end;local function _ba(aab)return +aab<0.5 and 2 *aab^2 or 1 - (-2 *aab+2)^2 /2 end;local function aba(aab)return +aab<0.5 and 8 * +aab^4 or 1 - (-2 *aab+2)^4 /2 end;local function bba(aab)return +aab<0.5 and 16 * +aab^5 or 1 - (-2 *aab+2)^5 /2 end;local function cba(aab) +return aab^2 end;local function dba(aab)return aab^4 end +local function _ca(aab)return aab^5 end;local function aca(aab)local bab=1.70158;local cab=bab+1;return +1 +cab* (aab-1)^3 +bab* (aab-1)^2 end;local function bca(aab)return 1 - +(1 -aab)^3 end +local function cca(aab)local bab=(2 *db)/3;return -bb[a_b[3]]:rep(b_b[c_b+1]- (b_b[c_b]-1))..dda:sub(b_b[c_b+1]+1,dda:len())end end end end -for __b,a_b in pairs(_aa)do -for b_b,c_b in pairs(a_b)do local d_b=bca(b_a[bda],c_b) -if(#d_b>0)then for x=1,#d_b/2 do -local _ab=x*2 -1 -cda=cda:sub(1,d_b[_ab]-1).. +aab==0 and 0 or(aab==1 and 1 or( +2 ^ (-10 *aab)*bb((aab*10 -0.75)*bab)+1))end +local function dca(aab)return aab==1 and 1 or 1 -2 ^ (-10 *aab)end;local function _da(aab)return 1 - (1 -aab)* (1 -aab)end;local function ada(aab)return 1 - ( +1 -aab)^4 end;local function bda(aab) +return 1 - (1 -aab)^5 end +local function cda(aab)return 1 -_c(1 -ac(aab,2))end;local function dda(aab)return _c(1 -ac(aab-1,2))end +local function __b(aab)return -bb[__b]:rep(d_b[_ab+1]- (d_b[_ab]-1))..cda:sub(d_b[_ab+1]+1,cda:len())end end end end;d_a[bda]=cda;c_a[bda]=dda;ada:updateDraw()end;local function dca(ada)for n=1,#b_a do cca(ada,n)end end -local _da={getType=function(ada)return bd end,setBackground=function(ada,bda) -ad.setBackground(ada,bda)dca(ada)return ada end,setForeground=function(ada,bda) -ad.setForeground(ada,bda)dca(ada)return ada end,setValuesByXMLData=function(ada,bda) -ad.setValuesByXMLData(ada,bda) -if(bda["lines"]~=nil)then local cda=bda["lines"]["line"]if -(cda.properties~=nil)then cda={cda}end;for dda,__b in pairs(cda)do -ada:addLine(__b:value())end end -if(bda["keywords"]~=nil)then -for cda,dda in pairs(bda["keywords"])do -if(colors[cda]~=nil)then -local __b=dda;if(__b.properties~=nil)then __b={__b}end;local a_b={} -for b_b,c_b in pairs(__b)do -local d_b=c_b["keyword"]if(c_b["keyword"].properties~=nil)then -d_b={c_b["keyword"]}end;for _ab,aab in pairs(d_b)do -table.insert(a_b,aab:value())end end;ada:addKeywords(colors[cda],a_b)end end end -if(bda["rules"]~=nil)then -if(bda["rules"]["rule"]~=nil)then -local cda=bda["rules"]["rule"]if(bda["rules"]["rule"].properties~=nil)then -cda={bda["rules"]["rule"]}end -for dda,__b in pairs(cda)do if(cb("pattern",__b)~=nil)then -ada:addRule(cb("pattern",__b),colors[cb("fg",__b)],colors[cb("bg",__b)])end end end end end,getLines=function(ada)return -b_a end,getLine=function(ada,bda)return b_a[bda]end,editLine=function(ada,bda,cda) -b_a[bda]=cda or b_a[bda]cca(ada,bda)ada:updateDraw()return ada end,clear=function(ada) -b_a={""}c_a={""}d_a={""}baa,caa,daa,_ba=nil,nil,nil,nil;cd,dd,__a,a_a=1,1,1,1 -ada:updateDraw()return ada end,addLine=function(ada,bda,cda) -if -(bda~=nil)then -if(#b_a==1)and(b_a[1]=="")then b_a[1]=bda -c_a[1]=bb[ada.bgColor]:rep(bda:len())d_a[1]=bb[ada.fgColor]:rep(bda:len()) -cca(ada,1)return ada end -if(cda~=nil)then table.insert(b_a,cda,bda) -table.insert(c_a,cda,bb[ada.bgColor]:rep(bda:len())) -table.insert(d_a,cda,bb[ada.fgColor]:rep(bda:len()))else table.insert(b_a,bda) -table.insert(c_a,bb[ada.bgColor]:rep(bda:len())) -table.insert(d_a,bb[ada.fgColor]:rep(bda:len()))end end;cca(ada,cda or#b_a)ada:updateDraw()return ada end,addKeywords=function(ada,bda,cda)if( -_aa[bda]==nil)then _aa[bda]={}end;for dda,__b in pairs(cda)do -table.insert(_aa[bda],__b)end;ada:updateDraw()return ada end,addRule=function(ada,bda,cda,dda) -table.insert(aaa,{bda,cda,dda})ada:updateDraw()return ada end,editRule=function(ada,bda,cda,dda)for __b,a_b in -pairs(aaa)do -if(a_b[1]==bda)then aaa[__b][2]=cda;aaa[__b][3]=dda end end;ada:updateDraw()return ada end,removeRule=function(ada,bda) -for cda,dda in -pairs(aaa)do if(dda[1]==bda)then table.remove(aaa,cda)end end;ada:updateDraw()return ada end,setKeywords=function(ada,bda,cda) -_aa[bda]=cda;ada:updateDraw()return ada end,removeLine=function(ada,bda) -if(#b_a>1)then table.remove(b_a, -bda or#b_a) -table.remove(c_a,bda or#c_a)table.remove(d_a,bda or#d_a)else b_a={""}c_a={""}d_a={""}end;ada:updateDraw()return ada end,getTextCursor=function(ada)return -__a,a_a end,getFocusHandler=function(ada)ad.getFocusHandler(ada) -if(ada.parent~=nil)then -local bda,cda=ada:getAnchorPosition()if(ada.parent~=nil)then -ada.parent:setCursor(true,bda+__a-dd,cda+a_a-cd,ada.fgColor)end end end,loseFocusHandler=function(ada) -ad.loseFocusHandler(ada) -if(ada.parent~=nil)then ada.parent:setCursor(false)end end,keyHandler=function(ada,bda) -if -(ad.keyHandler(ada,event,bda))then local cda,dda=ada:getAnchorPosition()local __b,a_b=ada:getSize() -if(bda== -keys.backspace)then -if(b_a[a_a]=="")then -if(a_a>1)then table.remove(b_a,a_a) -table.remove(d_a,a_a)table.remove(c_a,a_a) -__a=b_a[a_a-1]:len()+1;dd=__a-__b+1;if(dd<1)then dd=1 end;a_a=a_a-1 end elseif(__a<=1)then -if(a_a>1)then __a=b_a[a_a-1]:len()+1 -dd=__a-__b+1;if(dd<1)then dd=1 end;b_a[a_a-1]=b_a[a_a-1]..b_a[a_a]d_a[ -a_a-1]=d_a[a_a-1]..d_a[a_a]c_a[a_a-1]=c_a[a_a-1].. -c_a[a_a]table.remove(b_a,a_a) -table.remove(d_a,a_a)table.remove(c_a,a_a)a_a=a_a-1 end else b_a[a_a]=b_a[a_a]:sub(1,__a-2).. -b_a[a_a]:sub(__a,b_a[a_a]:len()) -d_a[a_a]=d_a[a_a]:sub(1, -__a-2)..d_a[a_a]:sub(__a,d_a[a_a]:len())c_a[a_a]=c_a[a_a]:sub(1,__a-2).. -c_a[a_a]:sub(__a,c_a[a_a]:len())if(__a>1)then -__a=__a-1 end;if(dd>1)then if(__ab_a[a_a]:len())then -if( -b_a[a_a+1]~=nil)then b_a[a_a]=b_a[a_a]..b_a[a_a+1] -table.remove(b_a,a_a+1)table.remove(c_a,a_a+1)table.remove(d_a,a_a+1)end else b_a[a_a]=b_a[a_a]:sub(1,__a-1).. -b_a[a_a]:sub(__a+1,b_a[a_a]:len()) -d_a[a_a]=d_a[a_a]:sub(1, -__a-1)..d_a[a_a]:sub(__a+1,d_a[a_a]:len())c_a[a_a]=c_a[a_a]:sub(1,__a-1).. -c_a[a_a]:sub(__a+1,c_a[a_a]:len())end end;cca(ada)end -if(bda==keys.enter)then -table.insert(b_a,a_a+1,b_a[a_a]:sub(__a,b_a[a_a]:len())) -table.insert(d_a,a_a+1,d_a[a_a]:sub(__a,d_a[a_a]:len())) -table.insert(c_a,a_a+1,c_a[a_a]:sub(__a,c_a[a_a]:len()))b_a[a_a]=b_a[a_a]:sub(1,__a-1) -d_a[a_a]=d_a[a_a]:sub(1,__a-1)c_a[a_a]=c_a[a_a]:sub(1,__a-1)a_a=a_a+1;__a=1;dd=1;if(a_a-cd>= -a_b)then cd=cd+1 end;ada:setValue("")end -if(bda==keys.up)then -if(a_a>1)then a_a=a_a-1;if(__a>b_a[a_a]:len()+1)then __a= -b_a[a_a]:len()+1 end -if(dd>1)then if(__a1)then if(a_ab_a[a_a]:len()+1)then __a=b_a[a_a]:len()+1 end -if(dd>1)then if -(__a=cd+a_b)then cd=cd+1 end end end -if(bda==keys.right)then __a=__a+1 -if(a_a<#b_a)then if -(__a>b_a[a_a]:len()+1)then __a=1;a_a=a_a+1 end elseif(__a>b_a[a_a]:len())then __a= -b_a[a_a]:len()+1 end;if(__a<1)then __a=1 end -if(__a=__b+dd)then dd=__a-__b+1 end;if(dd<1)then dd=1 end end -if(bda==keys.left)then __a=__a-1;if(__a>=1)then -if(__a=__b+dd)then dd=__a end end -if(a_a>1)then if(__a<1)then a_a=a_a-1 -__a=b_a[a_a]:len()+1;dd=__a-__b+1 end end;if(__a<1)then __a=1 end;if(dd<1)then dd=1 end end -if not -( (cda+__a-dd>=cda and cda+__a-dd=dda and dda+a_a-cd -ada:getX()+__b-1)then b_b=ada:getX()+__b-1 end -local c_b=(a_a-cd=__b+dd)then dd=dd+1 end;cca(ada) -ada:setValue("") -if not -( (cda+__a-dd>=cda and cda+__a-dd=dda and dda+a_a-cd -ada:getX()+__b-1)then b_b=ada:getX()+__b-1 end -local c_b=(a_a-cdb_b+cda- (__b+1)+dd)and(b_bb_a[a_a]:len())then __a= -b_a[a_a]:len()+1;caa=__a end;if(__a#b_a- (_ab-1))then cd=#b_a- (_ab-1)end;if -(cd<1)then cd=1 end -if - -(__b+__a-dd>=__b and __b+__a-dd<__b+d_b)and(c_b+a_a-cd>=c_b and c_b+a_a-cd -b_a[a_a]:len())then __a=b_a[a_a]:len()+1;baa=__a end;if(__ab_a[_ba]:len())then caa= -b_a[_ba]:len()+1 end;if(baa==caa)and(daa==_ba)then baa,caa,daa,_ba= -nil,nil,nil,nil end -ada:updateDraw()end;return true end end,eventHandler=function(ada,bda,cda,dda,__b,a_b) -ad.eventHandler(ada,bda,cda,dda,__b,a_b) -if(bda=="paste")then -if(ada:isFocused())then local b_b,c_b=ada:getSize()b_a[a_a]=b_a[a_a]:sub(1, -__a-1).. -cda..b_a[a_a]:sub(__a,b_a[a_a]:len()) -d_a[a_a]=d_a[a_a]:sub(1, -__a-1)..bb[ada.fgColor]:rep(cda:len()).. -d_a[a_a]:sub(__a,d_a[a_a]:len()) -c_a[a_a]=c_a[a_a]:sub(1,__a-1).. - -bb[ada.bgColor]:rep(cda:len())..c_a[a_a]:sub(__a,c_a[a_a]:len())__a=__a+cda:len() -if(__a>=b_b+dd)then dd=(__a+1)-b_b end;local d_b,_ab=ada:getAnchorPosition() -ada.parent:setCursor(true,d_b+__a-dd,_ab+ -a_a-cd,ada.fgColor)cca(ada)ada:updateDraw()end end end,setSelectionColor=function(ada,bda,cda)aba= -bda or aba;bba=cda or bba;return ada end,draw=function(ada) -if -(ad.draw(ada))then -if(ada.parent~=nil)then local bda,cda=ada:getAnchorPosition() -local dda,__b=ada:getSize() -for n=1,__b do local a_b=""local b_b=""local c_b="" -if(b_a[n+cd-1]~=nil)then a_b=b_a[n+cd-1]c_b=d_a[ -n+cd-1]b_b=c_a[n+cd-1]end;a_b=a_b:sub(dd,dda+dd-1) -b_b=b_b:sub(dd,dda+dd-1)c_b=c_b:sub(dd,dda+dd-1)local d_b=dda-a_b:len()if(d_b<0)then -d_b=0 end;a_b=a_b.._c(ada.bgSymbol,d_b)b_b=b_b.. -_c(bb[ada.bgColor],d_b) -c_b=c_b.._c(bb[ada.fgColor],d_b)ada.parent:setText(bda,cda+n-1,a_b)ada.parent:setBG(bda, -cda+n-1,b_b) -ada.parent:setFG(bda,cda+n-1,c_b)end -if(ada:isFocused())then local a_b,b_b=ada:getAnchorPosition()end end end end,init=function(ada) -ada.parent:addEvent("mouse_click",ada)ada.parent:addEvent("mouse_up",ada) -ada.parent:addEvent("mouse_scroll",ada)ada.parent:addEvent("mouse_drag",ada) -ada.parent:addEvent("key",ada)ada.parent:addEvent("char",ada) -ada.parent:addEvent("other_event",ada) -if(ad.init(ada))then -ada.bgColor=ada.parent:getTheme("TextfieldBG")ada.fgColor=ada.parent:getTheme("TextfieldText")end end}return setmetatable(_da,ad)end end -aa["objects"]["Switch"]=function(...)local ab=da("Object") -local bb=da("utils").getValueFromXML -return -function(cb)local db=ab(cb)local _c="Switch"db.width=2;db.height=1 -db.bgColor=colors.lightGray;db.fgColor=colors.gray;db:setValue(false)db:setZIndex(5) -local ac=colors.black;local bc=colors.red;local cc=colors.green -local dc={getType=function(_d)return _c end,setSymbolColor=function(_d,ad)ac=ad -_d:updateDraw()return _d end,setActiveBackground=function(_d,ad)cc=ad;_d:updateDraw()return _d end,setInactiveBackground=function(_d,ad) -bc=ad;_d:updateDraw()return _d end,setValuesByXMLData=function(_d,ad) -db.setValuesByXMLData(_d,ad)if(bb("inactiveBG",ad)~=nil)then -bc=colors[bb("inactiveBG",ad)]end;if(bb("activeBG",ad)~=nil)then -cc=colors[bb("activeBG",ad)]end;if(bb("symbolColor",ad)~=nil)then -ac=colors[bb("symbolColor",ad)]end end,mouseHandler=function(_d,ad,bd,cd) -if -(db.mouseHandler(_d,ad,bd,cd))then -local dd,__a=_d:getAbsolutePosition(_d:getAnchorPosition())_d:setValue(not _d:getValue()) -_d:updateDraw()return true end end,draw=function(_d) -if -(db.draw(_d))then -if(_d.parent~=nil)then local ad,bd=_d:getAnchorPosition() -local cd,dd=_d:getSize() -_d.parent:drawBackgroundBox(ad,bd,cd,dd,_d.bgColor) -if(_d:getValue())then -_d.parent:drawBackgroundBox(ad,bd,1,dd,cc)_d.parent:drawBackgroundBox(ad+1,bd,1,dd,ac)else -_d.parent:drawBackgroundBox(ad,bd,1,dd,ac)_d.parent:drawBackgroundBox(ad+1,bd,1,dd,bc)end end end end,init=function(_d) -_d.parent:addEvent("mouse_click",_d) -if(db.init(_d))then _d.bgColor=_d.parent:getTheme("SwitchBG") -_d.fgColor=_d.parent:getTheme("SwitchText")ac=_d.parent:getTheme("SwitchBGSymbol") -bc=_d.parent:getTheme("SwitchInactive")cc=_d.parent:getTheme("SwitchActive")end end}return setmetatable(dc,db)end end -aa["objects"]["Slider"]=function(...)local ab=da("Object") -local bb=da("basaltLogs")local cb=da("utils").getValueFromXML -return -function(db)local _c=ab(db)local ac="Slider" -_c.width=8;_c.height=1;_c:setValue(1)local bc="horizontal"local cc=" "local dc;local _d="\140" -local ad=_c.width;local bd=1;local cd=1 -local function dd(a_a,b_a,c_a,d_a) -local _aa,aaa=a_a:getAbsolutePosition(a_a:getAnchorPosition())local baa,caa=a_a:getSize() -if(bc=="horizontal")then -for _index=0,baa do -if -(_aa+_index==c_a)and(aaa<=d_a)and(aaa+caa>d_a)then -bd=math.min(_index+1,baa- (cd-1))a_a:setValue(ad/baa* (bd))a_a:updateDraw()end end end -if(bc=="vertical")then -for _index=0,caa do -if -(aaa+_index==d_a)and(_aa<=c_a)and(_aa+baa>c_a)then bd=math.min(_index+1,caa- (cd-1)) -a_a:setValue(ad/caa* (bd))a_a:updateDraw()end end end end -local __a={getType=function(a_a)return ac end,setSymbol=function(a_a,b_a)cc=b_a:sub(1,1)a_a:updateDraw()return a_a end,setValuesByXMLData=function(a_a,b_a) -_c.setValuesByXMLData(a_a,b_a) -if(cb("maxValue",b_a)~=nil)then ad=cb("maxValue",b_a)end;if(cb("backgroundSymbol",b_a)~=nil)then -_d=cb("backgroundSymbol",b_a):sub(1,1)end;if(cb("barType",b_a)~=nil)then -bc=cb("barType",b_a):lower()end;if(cb("symbol",b_a)~=nil)then -cc=cb("symbol",b_a):sub(1,1)end;if(cb("symbolSize",b_a)~=nil)then -a_a:setSymbolSize(cb("symbolSize",b_a))end;if(cb("symbolColor",b_a)~=nil)then -dc=colors[cb("symbolColor",b_a)]end;if(cb("index",b_a)~=nil)then -a_a:setIndex(cb("index",b_a))end end,setIndex=function(a_a,b_a) -bd=b_a;if(bd<1)then bd=1 end;local c_a,d_a=a_a:getSize() -bd=math.min(bd,( -bc=="vertical"and d_a or c_a)- (cd-1)) -a_a:setValue(ad/ (bc=="vertical"and d_a or c_a)*bd)a_a:updateDraw()return a_a end,getIndex=function(a_a)return -bd end,setSymbolSize=function(a_a,b_a)cd=tonumber(b_a)or 1 -if(bc=="vertical")then -a_a:setValue(bd-1 * (ad/ (h- (cd- -1)))- (ad/ (h- (cd-1))))elseif(bc=="horizontal")then -a_a:setValue(bd-1 * (ad/ (w- (cd-1)))- (ad/ -(w- (cd-1))))end;a_a:updateDraw()return a_a end,setMaxValue=function(a_a,b_a) -ad=b_a;return a_a end,setBackgroundSymbol=function(a_a,b_a)_d=string.sub(b_a,1,1) -a_a:updateDraw()return a_a end,setSymbolColor=function(a_a,b_a)dc=b_a;a_a:updateDraw() -return a_a end,setBarType=function(a_a,b_a)bc=b_a:lower()a_a:updateDraw() -return a_a end,mouseHandler=function(a_a,b_a,c_a,d_a)if(_c.mouseHandler(a_a,b_a,c_a,d_a))then -dd(a_a,b_a,c_a,d_a)return true end;return false end,dragHandler=function(a_a,b_a,c_a,d_a)if -(_c.dragHandler(a_a,b_a,c_a,d_a))then dd(a_a,b_a,c_a,d_a)return true end -return false end,scrollHandler=function(a_a,b_a,c_a,d_a) -if -(_c.scrollHandler(a_a,b_a,c_a,d_a))then local _aa,aaa=a_a:getSize()bd=bd+b_a;if(bd<1)then bd=1 end -bd=math.min(bd,( -bc=="vertical"and aaa or _aa)- (cd-1)) -a_a:setValue(ad/ (bc=="vertical"and aaa or _aa)*bd)a_a:updateDraw()return true end;return false end,draw=function(a_a) -if -(_c.draw(a_a))then -if(a_a.parent~=nil)then local b_a,c_a=a_a:getAnchorPosition() -local d_a,_aa=a_a:getSize() -if(bc=="horizontal")then -a_a.parent:writeText(b_a,c_a,_d:rep(bd-1),a_a.bgColor,a_a.fgColor) -a_a.parent:writeText(b_a+bd-1,c_a,cc:rep(cd),dc,dc) -a_a.parent:writeText(b_a+bd+cd-1,c_a,_d:rep(d_a- (bd+cd-1)),a_a.bgColor,a_a.fgColor)end -if(bc=="vertical")then -for n=0,_aa-1 do -if(bd==n+1)then -for curIndexOffset=0,math.min(cd-1,_aa)do a_a.parent:writeText(b_a,c_a+n+ -curIndexOffset,cc,dc,dc)end else if(n+1 bd-1 +cd)then -a_a.parent:writeText(b_a,c_a+n,_d,a_a.bgColor,a_a.fgColor)end end end end end end end,init=function(a_a) -a_a.parent:addEvent("mouse_click",a_a)a_a.parent:addEvent("mouse_drag",a_a) -a_a.parent:addEvent("mouse_scroll",a_a) -if(_c.init(a_a))then -a_a.bgColor=a_a.parent:getTheme("SliderBG")a_a.fgColor=a_a.parent:getTheme("SliderText") -dc=a_a.parent:getTheme("SliderSymbolColor")end end}return setmetatable(__a,_c)end end -aa["objects"]["Scrollbar"]=function(...)local ab=da("Object") -local bb=da("utils").getValueFromXML -return -function(cb)local db=ab(cb)local _c="Scrollbar"db.width=1;db.height=8;db:setValue(1) -db:setZIndex(2)local ac="vertical"local bc=" "local cc;local dc="\127"local _d=db.height;local ad=1;local bd=1 -local function cd(__a,a_a,b_a,c_a) -local d_a,_aa=__a:getAbsolutePosition(__a:getAnchorPosition())local aaa,baa=__a:getSize() -if(ac=="horizontal")then -for _index=0,aaa do -if -(d_a+_index==b_a)and(_aa<=c_a)and(_aa+baa>c_a)then -ad=math.min(_index+1,aaa- (bd-1))__a:setValue(_d/aaa* (ad))__a:updateDraw()end end end -if(ac=="vertical")then -for _index=0,baa do -if -(_aa+_index==c_a)and(d_a<=b_a)and(d_a+aaa>b_a)then ad=math.min(_index+1,baa- (bd-1)) -__a:setValue(_d/baa* (ad))__a:updateDraw()end end end end -local dd={getType=function(__a)return _c end,setSymbol=function(__a,a_a)bc=a_a:sub(1,1)__a:updateDraw()return __a end,setValuesByXMLData=function(__a,a_a) -db.setValuesByXMLData(__a,a_a) -if(bb("maxValue",a_a)~=nil)then _d=bb("maxValue",a_a)end;if(bb("backgroundSymbol",a_a)~=nil)then -dc=bb("backgroundSymbol",a_a):sub(1,1)end;if(bb("symbol",a_a)~=nil)then -bc=bb("symbol",a_a):sub(1,1)end;if(bb("barType",a_a)~=nil)then -ac=bb("barType",a_a):lower()end;if(bb("symbolSize",a_a)~=nil)then -__a:setSymbolSize(bb("symbolSize",a_a))end;if(bb("symbolColor",a_a)~=nil)then -cc=colors[bb("symbolColor",a_a)]end;if(bb("index",a_a)~=nil)then -__a:setIndex(bb("index",a_a))end end,setIndex=function(__a,a_a) -ad=a_a;if(ad<1)then ad=1 end;local b_a,c_a=__a:getSize() -ad=math.min(ad,( -ac=="vertical"and c_a or b_a)- (bd-1)) -__a:setValue(_d/ (ac=="vertical"and c_a or b_a)*ad)__a:updateDraw()return __a end,getIndex=function(__a)return -ad end,setSymbolSize=function(__a,a_a)bd=tonumber(a_a)or 1 -local b_a,c_a=__a:getSize() -if(ac=="vertical")then -__a:setValue(ad-1 * (_d/ (c_a- (bd-1)))- (_d/ (c_a- -(bd-1))))elseif(ac=="horizontal")then -__a:setValue(ad-1 * (_d/ (b_a- (bd-1)))- (_d/ (b_a- ( -bd-1))))end;__a:updateDraw()return __a end,setMaxValue=function(__a,a_a) -_d=a_a;__a:updateDraw()return __a end,setBackgroundSymbol=function(__a,a_a) -dc=string.sub(a_a,1,1)__a:updateDraw()return __a end,setSymbolColor=function(__a,a_a)cc=a_a -__a:updateDraw()return __a end,setBarType=function(__a,a_a)ac=a_a:lower() -__a:updateDraw()return __a end,mouseHandler=function(__a,a_a,b_a,c_a)if(db.mouseHandler(__a,a_a,b_a,c_a))then -cd(__a,a_a,b_a,c_a)return true end;return false end,dragHandler=function(__a,a_a,b_a,c_a)if -(db.dragHandler(__a,a_a,b_a,c_a))then cd(__a,a_a,b_a,c_a)return true end -return false end,scrollHandler=function(__a,a_a,b_a,c_a) -if -(db.scrollHandler(__a,a_a,b_a,c_a))then local d_a,_aa=__a:getSize()ad=ad+a_a;if(ad<1)then ad=1 end -ad=math.min(ad,( -ac=="vertical"and _aa or d_a)- (bd-1)) -__a:setValue(_d/ (ac=="vertical"and _aa or d_a)*ad)__a:updateDraw()end end,draw=function(__a) -if -(db.draw(__a))then -if(__a.parent~=nil)then local a_a,b_a=__a:getAnchorPosition() -local c_a,d_a=__a:getSize() -if(ac=="horizontal")then -__a.parent:writeText(a_a,b_a,dc:rep(ad-1),__a.bgColor,__a.fgColor) -__a.parent:writeText(a_a+ad-1,b_a,bc:rep(bd),cc,cc) -__a.parent:writeText(a_a+ad+bd-1,b_a,dc:rep(c_a- (ad+bd-1)),__a.bgColor,__a.fgColor)end -if(ac=="vertical")then -for n=0,d_a-1 do -if(ad==n+1)then -for curIndexOffset=0,math.min(bd-1,d_a)do __a.parent:writeText(a_a,b_a+n+ -curIndexOffset,bc,cc,cc)end else if(n+1 ad-1 +bd)then -__a.parent:writeText(a_a,b_a+n,dc,__a.bgColor,__a.fgColor)end end end end end end end,init=function(__a) -__a.parent:addEvent("mouse_click",__a)__a.parent:addEvent("mouse_drag",__a) -__a.parent:addEvent("mouse_scroll",__a) -if(db.init(__a))then -__a.bgColor=__a.parent:getTheme("ScrollbarBG")__a.fgColor=__a.parent:getTheme("ScrollbarText") -cc=__a.parent:getTheme("ScrollbarSymbolColor")end end}return setmetatable(dd,db)end end -aa["objects"]["Menubar"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=bb.getValueFromXML;local db=da("tHex") -return -function(_c)local ac=ab(_c)local bc="Menubar"local cc={}ac.width=30;ac.height=1 -ac:setZIndex(5)local dc={}local _d;local ad;local bd=true;local cd="left"local dd=0;local __a=1;local a_a=false -local function b_a()local c_a=0;local d_a=0 -local _aa=cc:getWidth() -for n=1,#dc do if(d_a+dc[n].text:len()+__a*2 >_aa)then -if( -d_a<_aa)then -c_a=c_a+ (dc[n].text:len()+__a*2 - (_aa-d_a))else c_a=c_a+dc[n].text:len()+__a*2 end end;d_a= -d_a+dc[n].text:len()+__a*2 end;return c_a end -cc={getType=function(c_a)return bc end,addItem=function(c_a,d_a,_aa,aaa,...) -table.insert(dc,{text=tostring(d_a),bgCol=_aa or c_a.bgColor,fgCol=aaa or c_a.fgColor,args={...}})if(#dc==1)then c_a:setValue(dc[1])end -c_a:updateDraw()return c_a end,getAll=function(c_a)return -dc end,getItemIndex=function(c_a)local d_a=c_a:getValue()for _aa,aaa in pairs(dc)do -if(aaa==d_a)then return _aa end end end,clear=function(c_a) -dc={}c_a:setValue({},false)c_a:updateDraw()return c_a end,setSpace=function(c_a,d_a)__a= -d_a or __a;c_a:updateDraw()return c_a end,setOffset=function(c_a,d_a)dd= -d_a or 0;if(dd<0)then dd=0 end;local _aa=b_a()if(dd>_aa)then dd=_aa end -c_a:updateDraw()return c_a end,getOffset=function(c_a)return dd end,setScrollable=function(c_a,d_a) -a_a=d_a;if(d_a==nil)then a_a=true end;return c_a end,setValuesByXMLData=function(c_a,d_a) -ac.setValuesByXMLData(c_a,d_a)if(cb("selectionBG",d_a)~=nil)then -_d=colors[cb("selectionBG",d_a)]end;if(cb("selectionFG",d_a)~=nil)then -ad=colors[cb("selectionFG",d_a)]end;if(cb("scrollable",d_a)~=nil)then -if -(cb("scrollable",d_a))then c_a:setScrollable(true)else c_a:setScrollable(false)end end -if( -cb("offset",d_a)~=nil)then c_a:setOffset(cb("offset",d_a))end -if(cb("space",d_a)~=nil)then __a=cb("space",d_a)end -if(d_a["item"]~=nil)then local _aa=d_a["item"] -if(_aa.properties~=nil)then _aa={_aa}end;for aaa,baa in pairs(_aa)do -c_a:addItem(cb("text",baa),colors[cb("bg",baa)],colors[cb("fg",baa)])end end;return c_a end,removeItem=function(c_a,d_a) -table.remove(dc,d_a)c_a:updateDraw()return c_a end,getItem=function(c_a,d_a) -return dc[d_a]end,getItemCount=function(c_a)return#dc end,editItem=function(c_a,d_a,_aa,aaa,baa,...)table.remove(dc,d_a) -table.insert(dc,d_a,{text=_aa,bgCol= -aaa or c_a.bgColor,fgCol=baa or c_a.fgColor,args={...}})c_a:updateDraw()return c_a end,selectItem=function(c_a,d_a)c_a:setValue( -dc[d_a]or{},false)c_a:updateDraw()return c_a end,setSelectedItem=function(c_a,d_a,_aa,aaa)_d= -d_a or c_a.bgColor;ad=_aa or c_a.fgColor;bd=aaa -c_a:updateDraw()return c_a end,mouseHandler=function(c_a,d_a,_aa,aaa) -if -(ac.mouseHandler(c_a,d_a,_aa,aaa))then -local baa,caa=c_a:getAbsolutePosition(c_a:getAnchorPosition())local daa,_ba=c_a:getSize()local aba=0 -for n=1,#dc do -if(dc[n]~=nil)then -if -(baa+aba<=_aa+dd)and(baa+aba+ -dc[n].text:len()+ (__a*2)>_aa+dd)and(caa==aaa)then -c_a:setValue(dc[n]) -c_a:getEventSystem():sendEvent(event,c_a,event,0,_aa,aaa,dc[n])end;aba=aba+dc[n].text:len()+__a*2 end end;c_a:updateDraw()return true end;return false end,scrollHandler=function(c_a,d_a,_aa,aaa) -if -(ac.scrollHandler(c_a,d_a,_aa,aaa))then if(a_a)then dd=dd+d_a;if(dd<0)then dd=0 end;local baa=b_a()if(dd>baa)then dd=baa end -c_a:updateDraw()end;return true end;return false end,draw=function(c_a) -if -(ac.draw(c_a))then -if(c_a.parent~=nil)then local d_a,_aa=c_a:getAnchorPosition() -local aaa,baa=c_a:getSize()if(c_a.bgColor~=false)then -c_a.parent:drawBackgroundBox(d_a,_aa,aaa,baa,c_a.bgColor)end;local caa=""local daa=""local _ba="" -for aba,bba in pairs(dc)do -local cba= -(" "):rep(__a)..bba.text.. (" "):rep(__a)caa=caa..cba -if(bba==c_a:getValue())then daa=daa.. -db[_d or bba.bgCol or c_a.bgColor]:rep(cba:len())_ba=_ba.. -db[ -ad or bba.FgCol or c_a.fgColor]:rep(cba:len())else daa=daa.. -db[bba.bgCol or c_a.bgColor]:rep(cba:len())_ba=_ba.. -db[bba.FgCol or c_a.fgColor]:rep(cba:len())end end -c_a.parent:setText(d_a,_aa,caa:sub(dd+1,aaa+dd)) -c_a.parent:setBG(d_a,_aa,daa:sub(dd+1,aaa+dd)) -c_a.parent:setFG(d_a,_aa,_ba:sub(dd+1,aaa+dd))end end end,init=function(c_a) -c_a.parent:addEvent("mouse_click",c_a)c_a.parent:addEvent("mouse_scroll",c_a) -if -(ac.init(c_a))then c_a.bgColor=c_a.parent:getTheme("MenubarBG") -c_a.fgColor=c_a.parent:getTheme("MenubarText")_d=c_a.parent:getTheme("SelectionBG") -ad=c_a.parent:getTheme("SelectionText")end end}return setmetatable(cc,ac)end end -aa["objects"]["Image"]=function(...)local ab=da("Object") -local bb=da("utils").getValueFromXML;local cb=da("images")local db,_c=table.unpack,string.sub -return -function(ac)local bc=ab(ac) -local cc="Image"bc:setZIndex(2)local dc;local _d;local ad=1;local bd=false;local cd;local dd=false;bc.width=24 -bc.height=8 -local function __a(b_a) -if(dc~=nil)then local c_a={} -for d_a,_aa in pairs(colors)do if(type(_aa)=="number")then -c_a[_aa]={term.nativePaletteColor(_aa)}end end;if(dc.palette~=nil)then -for d_a,_aa in pairs(dc.palette)do c_a[2 ^d_a]=_aa end end;if(dc[b_a]~=nil)and -(dc[b_a].palette~=nil)then -for d_a,_aa in pairs(dc[b_a].palette)do c_a[2 ^d_a]=_aa end end;return c_a end end -local a_a={init=function(b_a)if(bc.init(b_a))then -b_a.bgColor=b_a.parent:getTheme("ImageBG")end end,getType=function(b_a)return -cc end,loadImage=function(b_a,c_a,d_a)if not(fs.exists(c_a))then -error("No valid path: "..c_a)end;dc=cb.loadImageAsBimg(c_a,d_a) -ad=1;_d=dc;if(cd~=nil)then os.cancelTimer(cd)end -b_a:updateDraw()return b_a end,setImage=function(b_a,c_a) -dc=c_a;_d=dc;ad=1;if(cd~=nil)then os.cancelTimer(cd)end -b_a:updateDraw()return b_a end,usePalette=function(b_a,c_a)dd= -c_a~=nil and c_a or true;return b_a end,play=function(b_a,c_a) -if(dc.animated)then -local d_a= -dc[ad].duration or dc.secondsPerFrame or 0.2;b_a.parent:addEvent("other_event",b_a) -cd=os.startTimer(d_a)bd=c_a or false end;return b_a end,selectFrame=function(b_a,c_a)if( -dc[c_a]~=nil)then ad=c_a;if(cd~=nil)then os.cancelTimer(cd)end -b_a:updateDraw()end end,eventHandler=function(b_a,c_a,d_a,...) -bc.eventHandler(b_a,c_a,d_a,...) -if(c_a=="timer")then -if(d_a==cd)then -if(dc[ad+1]~=nil)then ad=ad+1;local _aa= -dc[ad].duration or dc.secondsPerFrame or 0.2 -cd=os.startTimer(_aa)else -if(bd)then ad=1 -local _aa=dc[ad].duration or dc.secondsPerFrame or 0.2;cd=os.startTimer(_aa)end end;b_a:updateDraw()end end end,getMetadata=function(b_a,c_a)return -dc[c_a]end,getImageSize=function(b_a)return dc.width,dc.height end,resizeImage=function(b_a,c_a,d_a) -_d=cb.resizeBIMG(dc,c_a,d_a)b_a:updateDraw()return b_a end,setValuesByXMLData=function(b_a,c_a) -bc.setValuesByXMLData(b_a,c_a) -if(bb("path",c_a)~=nil)then b_a:loadImage(bb("path",c_a))end;return b_a end,draw=function(b_a) -if -(bc.draw(b_a))then -if(_d~=nil)then if(dd)then -b_a:getBaseFrame():setThemeColor(__a(ad))end;local c_a,d_a=b_a:getAnchorPosition() -local _aa,aaa=b_a:getSize() -for baa,caa in ipairs(_d[ad])do local daa,_ba,aba=db(caa)daa=_c(daa,1,_aa) -_ba=_c(_ba,1,_aa)aba=_c(aba,1,_aa) -b_a.parent:blit(c_a,d_a+baa-1,daa,_ba,aba)if(baa==aaa)then break end end end end end}return setmetatable(a_a,bc)end end -aa["objects"]["Graphic"]=function(...)local ab=da("Object")local bb=da("tHex") -local cb=da("utils").getValueFromXML;local db=da("bimg")local _c=da("images") -local ac,bc,cc,dc=string.sub,string.len,math.max,math.min -return -function(_d)local ad=ab(_d)local bd="Graphic"local cd=db()local dd=cd.getFrameObject(1)local __a -local a_a=1;ad:setZIndex(5)local b_a,c_a=0,0 -local d_a={getType=function(_aa)return bd end,setOffset=function(_aa,aaa,baa,caa) -if(caa)then -b_a=b_a+aaa or 0;c_a=c_a+baa or 0 else b_a=aaa or b_a;c_a=baa or c_a end;_aa:updateDraw()return _aa end,getOffset=function(_aa)return -b_a,c_a end,setValuesByXMLData=function(_aa,aaa)ad.setValuesByXMLData(_aa,aaa)return _aa end,selectFrame=function(_aa,aaa)if( -cd.getFrameObject(aaa)==nil)then cd.addFrame(aaa)end -dd=cd.getFrameObject(aaa)__a=dd.getImage(aaa)a_a=aaa;_aa:updateDraw()end,addFrame=function(_aa,aaa) -cd.addFrame(aaa)return _aa end,getFrameMetadata=function(_aa,aaa,baa)return cd.getFrameData(aaa,baa)end,setFrameMetadata=function(_aa,aaa,baa,caa) -cd.setFrameData(aaa,baa,caa)return _aa end,getMetadata=function(_aa,aaa)return cd.getMetadata(aaa)end,setMetadata=function(_aa,aaa,baa)return -cd.setMetadata(aaa,baa)end,getFrame=function(_aa,aaa)return cd.getFrame(aaa)end,getFrameObject=function(_aa,aaa)return -cd.getFrameObject(aaa)end,removeFrame=function(_aa,aaa)cd.removeFrame(aaa)return _aa end,moveFrame=function(_aa,aaa,baa) -cd.moveFrame(aaa,baa)return _aa end,getFrames=function(_aa)return cd.getFrames()end,getFrameCount=function(_aa)return -#cd.getFrames()end,getSelectedFrame=function(_aa)return a_a end,blit=function(_aa,aaa,baa,caa,daa,_ba) -x=daa or x;y=_ba or y;dd.blit(aaa,baa,caa,x,y)__a=dd.getImage() -_aa:updateDraw()return _aa end,setText=function(_aa,aaa,baa,caa) -x=baa or x;y=caa or y;dd.text(aaa,x,y)__a=dd.getImage() -_aa:updateDraw()return _aa end,setBg=function(_aa,aaa,baa,caa)x=baa or x;y= -caa or y;dd.bg(aaa,x,y)__a=dd.getImage() -_aa:updateDraw()return _aa end,setFg=function(_aa,aaa,baa,caa)x=baa or x;y=caa or -y;dd.fg(aaa,x,y)__a=dd.getImage() -_aa:updateDraw()return _aa end,getImageSize=function(_aa) -return cd.getSize()end,setImageSize=function(_aa,aaa,baa)cd.setSize(aaa,baa)__a=dd.getImage() -_aa:updateDraw()return _aa end,resizeImage=function(_aa,aaa,baa) -local caa=_c.resizeBIMG(cd.createBimg(),aaa,baa)cd=db(caa)a_a=1;dd=cd.getFrameObject(1)__a=dd.getImage() -_aa:updateDraw()return _aa end,loadImage=function(_aa,aaa) -if -(fs.exists(aaa))then local baa=_c.loadBIMG(aaa)cd=db(baa)a_a=1 -dd=cd.getFrameObject(1)__a=dd.getImage()_aa:updateDraw()end;return _aa end,clear=function(_aa) -cd=db()__a=nil;_aa:updateDraw()return _aa end,getImage=function(_aa)return -cd.createBimg()end,draw=function(_aa) -if(ad.draw(_aa))then -if(_aa.parent~=nil)then -local aaa,baa=_aa:getAnchorPosition()local caa,daa=_aa:getSize() -if(__a~=nil)then -for _ba,aba in pairs(__a)do if -(_ba<=daa-c_a)and(_ba+c_a>=1)then -_aa.parent:blit(aaa+b_a,baa+_ba-1 +c_a,aba[1],aba[2],aba[3])end end end end end end,init=function(_aa) -if -(ad.init(_aa))then _aa.bgColor=_aa.parent:getTheme("GraphicBG")end end}return setmetatable(d_a,ad)end end -aa["objects"]["Animation"]=function(...)local ab=da("utils").getValueFromXML -local bb=da("basaltEvent") -local cb,db,_c,ac,bc,cc=math.floor,math.sin,math.cos,math.pi,math.sqrt,math.pow -local dc=function(cab,dab,_bb)return cab+ (dab-cab)*_bb end;local _d=function(cab)return cab end -local ad=function(cab)return 1 -cab end;local bd=function(cab)return cab*cab*cab end;local cd=function(cab)return -ad(bd(ad(cab)))end;local dd=function(cab)return -dc(bd(cab),cd(cab),cab)end;local __a=function(cab)return -db((cab*ac)/2)end;local a_a=function(cab)return -ad(_c((cab*ac)/2))end;local b_a=function(cab)return -- (_c(ac*x)-1)/2 end -local c_a=function(cab) -local dab=1.70158;local _bb=dab+1;return _bb*cab^3 -dab*cab^2 end;local d_a=function(cab)return cab^3 end -local _aa=function(cab)local dab=(2 *ac)/3;return - -cab==0 and 0 or(cab==1 and 1 or(-2 ^ (10 *cab-10)* -db((cab*10 -10.75)*dab)))end -local function aaa(cab)return cab==0 and 0 or 2 ^ (10 *cab-10)end -local function baa(cab)return cab==0 and 0 or 2 ^ (10 *cab-10)end -local function caa(cab)local dab=1.70158;local _bb=dab*1.525;return -cab<0.5 and( (2 *cab)^2 * -( (_bb+1)*2 *cab-_bb))/2 or -( -(2 *cab-2)^2 * ( (_bb+1)* (cab*2 -2)+_bb)+2)/2 end;local function daa(cab)return -cab<0.5 and 4 *cab^3 or 1 - (-2 *cab+2)^3 /2 end -local function _ba(cab) -local dab=(2 *ac)/4.5 -return -cab==0 and 0 or(cab==1 and 1 or -( -cab<0.5 and- (2 ^ (20 *cab-10)* -db((20 *cab-11.125)*dab))/2 or -(2 ^ (-20 *cab+10)*db((20 *cab-11.125)*dab))/2 +1))end -local function aba(cab)return -cab==0 and 0 or(cab==1 and 1 or -( -cab<0.5 and 2 ^ (20 *cab-10)/2 or(2 -2 ^ (-20 *cab+10))/2))end;local function bba(cab)return -cab<0.5 and 2 *cab^2 or 1 - (-2 *cab+2)^2 /2 end;local function cba(cab)return -cab<0.5 and 8 * -cab^4 or 1 - (-2 *cab+2)^4 /2 end;local function dba(cab)return -cab<0.5 and 16 * -cab^5 or 1 - (-2 *cab+2)^5 /2 end;local function _ca(cab) -return cab^2 end;local function aca(cab)return cab^4 end -local function bca(cab)return cab^5 end;local function cca(cab)local dab=1.70158;local _bb=dab+1;return -1 +_bb* (cab-1)^3 +dab* (cab-1)^2 end;local function dca(cab)return 1 - -(1 -cab)^3 end -local function _da(cab)local dab=(2 *ac)/3;return - -cab==0 and 0 or(cab==1 and 1 or( -2 ^ (-10 *cab)*db((cab*10 -0.75)*dab)+1))end -local function ada(cab)return cab==1 and 1 or 1 -2 ^ (-10 *cab)end;local function bda(cab)return 1 - (1 -cab)* (1 -cab)end;local function cda(cab)return 1 - ( -1 -cab)^4 end;local function dda(cab) -return 1 - (1 -cab)^5 end -local function __b(cab)return 1 -bc(1 -cc(cab,2))end;local function a_b(cab)return bc(1 -cc(cab-1,2))end -local function b_b(cab)return - -cab<0.5 and(1 -bc( -1 -cc(2 *cab,2)))/2 or(bc(1 -cc(-2 *cab+2,2))+1)/2 end -local function c_b(cab)local dab=7.5625;local _bb=2.75 -if(cab<1 /_bb)then return dab*cab*cab elseif(cab<2 /_bb)then local abb=cab- -1.5 /_bb;return dab*abb*abb+0.75 elseif(cab<2.5 /_bb)then local abb=cab- -2.25 /_bb;return dab*abb*abb+0.9375 else -local abb=cab-2.625 /_bb;return dab*abb*abb+0.984375 end end;local function d_b(cab)return 1 -c_b(1 -cab)end;local function _ab(cab)return +aab<0.5 and(1 -_c( +1 -ac(2 *aab,2)))/2 or(_c(1 -ac(-2 *aab+2,2))+1)/2 end +local function a_b(aab)local bab=7.5625;local cab=2.75 +if(aab<1 /cab)then return bab*aab*aab elseif(aab<2 /cab)then local dab=aab- +1.5 /cab;return bab*dab*dab+0.75 elseif(aab<2.5 /cab)then local dab=aab- +2.25 /cab;return bab*dab*dab+0.9375 else +local dab=aab-2.625 /cab;return bab*dab*dab+0.984375 end end;local function b_b(aab)return 1 -a_b(1 -aab)end;local function c_b(aab)return x<0.5 and(1 - -c_b(1 -2 *cab))/2 or(1 +c_b(2 *cab-1))/2 end -local aab={linear=_d,lerp=dc,flip=ad,easeIn=bd,easeInSine=a_a,easeInBack=c_a,easeInCubic=d_a,easeInElastic=_aa,easeInExpo=baa,easeInQuad=_ca,easeInQuart=aca,easeInQuint=bca,easeInCirc=__b,easeInBounce=d_b,easeOut=cd,easeOutSine=__a,easeOutBack=cca,easeOutCubic=dca,easeOutElastic=_da,easeOutExpo=ada,easeOutQuad=bda,easeOutQuart=cda,easeOutQuint=dda,easeOutCirc=a_b,easeOutBounce=c_b,easeInOut=dd,easeInOutSine=b_a,easeInOutBack=caa,easeInOutCubic=daa,easeInOutElastic=_ba,easeInOutExpo=aba,easeInOutQuad=bba,easeInOutQuart=cba,easeInOutQuint=dba,easeInOutCirc=b_b,easeInOutBounce=_ab}local bab={} +a_b(1 -2 *aab))/2 or(1 +a_b(2 *aab-1))/2 end +local d_b={linear=cc,lerp=bc,flip=dc,easeIn=_d,easeInSine=dd,easeInBack=a_a,easeInCubic=b_a,easeInElastic=c_a,easeInExpo=_aa,easeInQuad=cba,easeInQuart=dba,easeInQuint=_ca,easeInCirc=cda,easeInBounce=b_b,easeOut=ad,easeOutSine=cd,easeOutBack=aca,easeOutCubic=bca,easeOutElastic=cca,easeOutExpo=dca,easeOutQuad=_da,easeOutQuart=ada,easeOutQuint=bda,easeOutCirc=dda,easeOutBounce=a_b,easeInOut=bd,easeInOutSine=__a,easeInOutBack=aaa,easeInOutCubic=baa,easeInOutElastic=caa,easeInOutExpo=daa,easeInOutQuad=_ba,easeInOutQuart=aba,easeInOutQuint=bba,easeInOutCirc=__b,easeInOutBounce=c_b}local _ab=da("xmlParser") return -function(cab)local dab={}local _bb="Animation"local abb;local bbb={}local cbb=0;local dbb=false;local _cb=1;local acb=false -local bcb=bb()local ccb=0;local dcb;local _db=false;local adb=false;local bdb="easeOut"local cdb;local function ddb(c_c)for d_c,_ac in pairs(c_c)do -_ac(dab,bbb[_cb].t,_cb)end end -local function __c(c_c)if(_cb==1)then -c_c:animationStartHandler()end;if(bbb[_cb]~=nil)then ddb(bbb[_cb].f) -cbb=bbb[_cb].t end;_cb=_cb+1 -if(bbb[_cb]==nil)then if(acb)then _cb=1;cbb=0 else -c_c:animationDoneHandler()return end end;if(bbb[_cb].t>0)then -abb=os.startTimer(bbb[_cb].t-cbb)else __c(c_c)end end -local function a_c(c_c,d_c)for n=1,#bbb do -if(bbb[n].t==c_c)then table.insert(bbb[n].f,d_c)return end end -for n=1,#bbb do -if(bbb[n].t>c_c)then if -(bbb[n-1]~=nil)then if(bbb[n-1].t=_ac-0.01)then if(bab[dac][dbc]==_bc)then bab[dac][dbc]= -nil end end end end)end end -dab={name=cab,getType=function(c_c)return _bb end,getBaseFrame=function(c_c)if(c_c.parent~=nil)then -return c_c.parent:getBaseFrame()end;return c_c end,setMode=function(c_c,d_c) -bdb=d_c;return c_c end,addMode=function(c_c,d_c,_ac)aab[d_c]=_ac;return c_c end,generateXMLEventFunction=function(c_c,d_c,_ac) -local aac=function(bac) -if( -bac:sub(1,1)=="#")then -local cac=c_c:getBaseFrame():getDeepObject(bac:sub(2,bac:len())) -if(cac~=nil)and(cac.internalObjetCall~=nil)then d_c(c_c,function() -cac:internalObjetCall()end)end else -d_c(c_c,c_c:getBaseFrame():getVariable(bac))end end;if(type(_ac)=="string")then aac(_ac)elseif(type(_ac)=="table")then -for bac,cac in pairs(_ac)do aac(cac)end end;return c_c end,setValuesByXMLData=function(c_c,d_c)_db= -ab("loop",d_c)==true and true or false -if( -ab("object",d_c)~=nil)then -local _ac=c_c:getBaseFrame():getDeepObject(ab("object",d_c))if(_ac==nil)then -_ac=c_c:getBaseFrame():getVariable(ab("object",d_c))end -if(_ac~=nil)then c_c:setObject(_ac)end end -if(d_c["move"]~=nil)then local _ac=ab("x",d_c["move"]) -local aac=ab("y",d_c["move"])local bac=ab("duration",d_c["move"]) -local cac=ab("time",d_c["move"])c_c:move(_ac,aac,bac,cac)end -if(d_c["size"]~=nil)then local _ac=ab("width",d_c["size"]) -local aac=ab("height",d_c["size"])local bac=ab("duration",d_c["size"]) -local cac=ab("time",d_c["size"])c_c:size(_ac,aac,bac,cac)end -if(d_c["offset"]~=nil)then local _ac=ab("x",d_c["offset"]) -local aac=ab("y",d_c["offset"])local bac=ab("duration",d_c["offset"]) -local cac=ab("time",d_c["offset"])c_c:offset(_ac,aac,bac,cac)end -if(d_c["textColor"]~=nil)then -local _ac=ab("duration",d_c["textColor"])local aac=ab("time",d_c["textColor"])local bac={} -local cac=d_c["textColor"]["color"] -if(cac~=nil)then if(cac.properties~=nil)then cac={cac}end;for dac,_bc in pairs(cac)do -table.insert(bac,colors[_bc:value()])end end;if(_ac~=nil)and(#bac>0)then -c_c:changeTextColor(_ac,aac or 0,table.unpack(bac))end end -if(d_c["background"]~=nil)then -local _ac=ab("duration",d_c["background"])local aac=ab("time",d_c["background"])local bac={} -local cac=d_c["background"]["color"] -if(cac~=nil)then if(cac.properties~=nil)then cac={cac}end;for dac,_bc in pairs(cac)do -table.insert(bac,colors[_bc:value()])end end;if(_ac~=nil)and(#bac>0)then -c_c:changeBackground(_ac,aac or 0,table.unpack(bac))end end -if(d_c["text"]~=nil)then local _ac=ab("duration",d_c["text"]) -local aac=ab("time",d_c["text"])local bac={}local cac=d_c["text"]["text"] -if(cac~=nil)then if(cac.properties~=nil)then -cac={cac}end;for dac,_bc in pairs(cac)do -table.insert(bac,_bc:value())end end;if(_ac~=nil)and(#bac>0)then -c_c:changeText(_ac,aac or 0,table.unpack(bac))end end;if(ab("onDone",d_c)~=nil)then -c_c:generateXMLEventFunction(c_c.onDone,ab("onDone",d_c))end;if(ab("onStart",d_c)~=nil)then -c_c:generateXMLEventFunction(c_c.onDone,ab("onStart",d_c))end -if -(ab("autoDestroy",d_c)~=nil)then if(ab("autoDestroy",d_c))then adb=true end end;bdb=ab("mode",d_c)or bdb -if(ab("play",d_c)~=nil)then if -(ab("play",d_c))then c_c:play(_db)end end;return c_c end,getZIndex=function(c_c)return -1 end,getName=function(c_c)return c_c.name end,setObject=function(c_c,d_c)cdb=d_c;return c_c end,move=function(c_c,d_c,_ac,aac,bac,cac)cdb= -cac or cdb -b_c(d_c,_ac,aac,bac or 0,cdb.getPosition,cdb.setPosition,"position",c_c)return c_c end,offset=function(c_c,d_c,_ac,aac,bac,cac)cdb= -cac or cdb -b_c(d_c,_ac,aac,bac or 0,cdb.getOffset,cdb.setOffset,"offset",c_c)return c_c end,size=function(c_c,d_c,_ac,aac,bac,cac)cdb=cac or -cdb -b_c(d_c,_ac,aac,bac or 0,cdb.getSize,cdb.setSize,"size",c_c)return c_c end,changeText=function(c_c,d_c,_ac,...) -local aac={...}_ac=_ac or 0;cdb=obj or cdb;for n=1,#aac do -a_c(_ac+n* (d_c/#aac),function() -cdb.setText(cdb,aac[n])end)end;return c_c end,changeBackground=function(c_c,d_c,_ac,...) -local aac={...}_ac=_ac or 0;cdb=obj or cdb;for n=1,#aac do -a_c(_ac+n* (d_c/#aac),function() -cdb.setBackground(cdb,aac[n])end)end;return c_c end,changeTextColor=function(c_c,d_c,_ac,...) -local aac={...}_ac=_ac or 0;cdb=obj or cdb;for n=1,#aac do -a_c(_ac+n* (d_c/#aac),function() -cdb.setForeground(cdb,aac[n])end)end;return c_c end,add=function(c_c,d_c,_ac) -dcb=d_c -a_c((_ac or ccb)+ -(bbb[#bbb]~=nil and bbb[#bbb].t or 0),d_c)return c_c end,wait=function(c_c,d_c)ccb=d_c;return c_c end,rep=function(c_c,d_c) -if( -dcb~=nil)then for n=1,d_c or 1 do -a_c((wait or ccb)+ -(bbb[#bbb]~=nil and bbb[#bbb].t or 0),dcb)end end;return c_c end,onDone=function(c_c,d_c) -bcb:registerEvent("animation_done",d_c)return c_c end,onStart=function(c_c,d_c) -bcb:registerEvent("animation_start",d_c)return c_c end,setAutoDestroy=function(c_c,d_c) -adb=d_c~=nil and d_c or true;return c_c end,animationDoneHandler=function(c_c) -bcb:sendEvent("animation_done",c_c)c_c.parent:removeEvent("other_event",c_c)if(adb)then -c_c.parent:removeObject(c_c)c_c=nil end end,animationStartHandler=function(c_c) -bcb:sendEvent("animation_start",c_c)end,clear=function(c_c)bbb={}dcb=nil;ccb=0;_cb=1;cbb=0;acb=false;return c_c end,play=function(c_c,d_c) -c_c:cancel()dbb=true;acb=d_c and true or false;_cb=1;cbb=0 -if(bbb[_cb]~=nil)then -if( -bbb[_cb].t>0)then abb=os.startTimer(bbb[_cb].t)else __c(c_c)end else c_c:animationDoneHandler()end;c_c.parent:addEvent("other_event",c_c)return c_c end,cancel=function(c_c)if( -abb~=nil)then os.cancelTimer(abb)acb=false end -dbb=false;c_c.parent:removeEvent("other_event",c_c)return c_c end,internalObjetCall=function(c_c) -c_c:play(_db)end,eventHandler=function(c_c,d_c,_ac)if(dbb)then -if(d_c=="timer")and(_ac==abb)then if(bbb[_cb]~=nil)then -__c(c_c)else c_c:animationDoneHandler()end end end end}dab.__index=dab;return dab end end -aa["objects"]["List"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=bb.getValueFromXML +{VisualObject=function(aab,bab)local cab={}local dab="linear" +local function _bb(dbb,_cb)for acb,bcb in pairs(cab)do if(bcb.timerId==_cb)then +return bcb end end end +local function abb(dbb,_cb,acb,bcb,ccb,dcb,_db,adb,bdb,cdb)local ddb,__c=bdb(dbb)if(cab[_db]~=nil)then +os.cancelTimer(cab[_db].timerId)end;cab[_db]={} +cab[_db].call=function() +local a_c=cab[_db].progress +local b_c=math.floor(d_b.lerp(ddb,_cb,d_b[dcb](a_c/bcb))+0.5) +local c_c=math.floor(d_b.lerp(__c,acb,d_b[dcb](a_c/bcb))+0.5)cdb(dbb,b_c,c_c)end +cab[_db].finished=function()cdb(dbb,_cb,acb)if(adb~=nil)then adb(dbb)end end;cab[_db].timerId=os.startTimer(0.05 +ccb) +cab[_db].progress=0;cab[_db].duration=bcb;cab[_db].mode=dcb +dbb:listenEvent("other_event")end +local function bbb(dbb,_cb,acb,bcb,ccb,...)local dcb={...}if(cab[bcb]~=nil)then +os.cancelTimer(cab[bcb].timerId)end;cab[bcb]={}local _db=1;cab[bcb].call=function() +local adb=dcb[_db]ccb(dbb,adb)end end +local cbb={animatePosition=function(dbb,_cb,acb,bcb,ccb,dcb,_db)dcb=dcb or dab;bcb=bcb or 1;ccb=ccb or 0 +_cb=math.floor(_cb+0.5)acb=math.floor(acb+0.5) +abb(dbb,_cb,acb,bcb,ccb,dcb,"position",_db,dbb.getPosition,dbb.setPosition)return dbb end,animateSize=function(dbb,_cb,acb,bcb,ccb,dcb,_db)dcb= +dcb or dab;bcb=bcb or 1;ccb=ccb or 0 +abb(dbb,_cb,acb,bcb,ccb,dcb,"size",_db,dbb.getSize,dbb.setSize)return dbb end,animateOffset=function(dbb,_cb,acb,bcb,ccb,dcb,_db)dcb= +dcb or dab;bcb=bcb or 1;ccb=ccb or 0 +abb(dbb,_cb,acb,bcb,ccb,dcb,"offset",_db,dbb.getOffset,dbb.setOffset)return dbb end,animateBackground=function(dbb,_cb,acb,bcb,ccb,dcb)ccb= +ccb or dab;acb=acb or 1;bcb=bcb or 0 +bbb(dbb,_cb,nil,acb,bcb,ccb,"background",dcb,dbb.getBackground,dbb.setBackground)return dbb end,doneHandler=function(dbb,_cb,...) +for acb,bcb in +pairs(cab)do if(bcb.timerId==_cb)then cab[acb]=nil +dbb:sendEvent("animation_done",dbb,"animation_done",acb)end end end,onAnimationDone=function(dbb,...) +for _cb,acb in +pairs(table.pack(...))do if(type(acb)=="function")then +dbb:registerEvent("animation_done",acb)end end;return dbb end,eventHandler=function(dbb,_cb,acb,...) +aab.eventHandler(dbb,_cb,acb,...) +if(_cb=="timer")then local bcb=_bb(dbb,acb) +if(bcb~=nil)then +if(bcb.progress=1)then if(#bc>_aa)then if(bd> -#bc-_aa)then bd=#bc-_aa end;if(bd>=#bc)then bd=#bc-1 end else bd= -bd-1 end end;__a:updateDraw()end;return true end;return false end,mouseHandler=function(__a,a_a,b_a,c_a) -if -(_c.mouseHandler(__a,a_a,b_a,c_a))then -local d_a,_aa=__a:getAbsolutePosition(__a:getAnchorPosition())local aaa,baa=__a:getSize() -if(#bc>0)then for n=1,baa do -if(bc[n+bd]~=nil)then if(d_a<=b_a)and -(d_a+aaa>b_a)and(_aa+n-1 ==c_a)then -__a:setValue(bc[n+bd])__a:updateDraw()end end end end;return true end;return false end,dragHandler=function(__a,a_a,b_a,c_a)return -__a:mouseHandler(a_a,b_a,c_a)end,touchHandler=function(__a,a_a,b_a)return -__a:mouseHandler(1,a_a,b_a)end,draw=function(__a) -if(_c.draw(__a))then -if -(__a.parent~=nil)then local a_a,b_a=__a:getAnchorPosition()local c_a,d_a=__a:getSize()if( -__a.bgColor~=false)then -__a.parent:drawBackgroundBox(a_a,b_a,c_a,d_a,__a.bgColor)end -for n=1,d_a do -if(bc[n+bd]~=nil)then -if(bc[n+bd]== -__a:getValue())then -if(_d)then -__a.parent:writeText(a_a,b_a+n-1,bb.getTextHorizontalAlign(bc[n+bd].text,c_a,ad),cc,dc)else -__a.parent:writeText(a_a,b_a+n-1,bb.getTextHorizontalAlign(bc[n+bd].text,c_a,ad),bc[ -n+bd].bgCol,bc[n+bd].fgCol)end else -__a.parent:writeText(a_a,b_a+n-1,bb.getTextHorizontalAlign(bc[n+bd].text,c_a,ad),bc[ -n+bd].bgCol,bc[n+bd].fgCol)end end end end end end,init=function(__a) -__a.parent:addEvent("mouse_click",__a)__a.parent:addEvent("mouse_drag",__a) -__a.parent:addEvent("mouse_scroll",__a) -if(_c.init(__a))then __a.bgColor=__a.parent:getTheme("ListBG") -__a.fgColor=__a.parent:getTheme("ListText")cc=__a.parent:getTheme("SelectionBG") -dc=__a.parent:getTheme("SelectionText")end end}return setmetatable(dd,_c)end end -aa["objects"]["Button"]=function(...)local ab=da("Object")local bb=da("utils") -local cb=bb.getValueFromXML;local db=da("tHex") +{VisualObject=function(bb)local cb=false +local db=colors.black +local _c={setBackground=function(ac,bc,cc,dc)bb.setBackground(ac,bc)cb=cc or cb;db=dc or db;return ac end,setBackgroundSymbol=function(ac,bc,cc) +cb=bc;db=cc or db;ac:updateDraw()return ac end,getBackgroundSymbol=function(ac) +return cb end,getBackgroundSymbolColor=function(ac)return db end,draw=function(ac)bb.draw(ac) +ac:addDraw("advanced-bg",function() +local bc,cc=ac:getSize() +if(cb~=false)then ac:addTextBox(1,1,bc,cc,cb:sub(1,1))if(cb~=" ")then +ac:addForegroundBox(1,1,bc,cc,db)end end end,2)end}return _c end}end +aa["plugins"]["debug"]=function(...)local ab=da("utils")local bb=ab.wrapText return -function(_c)local ac=ab(_c)local bc="Button"local cc="center"local dc="center" -ac:setZIndex(5)ac:setValue("Button")ac.width=12;ac.height=3 -local _d={init=function(ad) -if(ac.init(ad))then -ad.bgColor=ad.parent:getTheme("ButtonBG")ad.fgColor=ad.parent:getTheme("ButtonText")end end,getType=function(ad)return bc end,setHorizontalAlign=function(ad,bd) -cc=bd;ad:updateDraw()return ad end,setVerticalAlign=function(ad,bd)dc=bd -ad:updateDraw()return ad end,setText=function(ad,bd)ac:setValue(tostring(bd)) -ad:updateDraw()return ad end,setValuesByXMLData=function(ad,bd) -ac.setValuesByXMLData(ad,bd) -if(cb("text",bd)~=nil)then ad:setText(cb("text",bd))end;if(cb("horizontalAlign",bd)~=nil)then -cc=cb("horizontalAlign",bd)end;if(cb("verticalAlign",bd)~=nil)then -dc=cb("verticalAlign",bd)end;return ad end,draw=function(ad) +{basalt=function(cb) +local db=cb.getMainFrame()local _c;local ac;local bc;local cc +local function dc()local _d=16;local ad=6;local bd=99;local cd=99;local dd,__a=db:getSize() +_c=db:addMovableFrame("basaltDebuggingFrame"):setSize( +dd-20,__a-10):setBackground(colors.gray):setForeground(colors.white):setZIndex(100):hide() +_c:addPane():setSize("parent.w",1):setPosition(1,1):setBackground(colors.black):setForeground(colors.white) +_c:setPosition(-dd,__a/2 -_c:getHeight()/2):setBorder(colors.black) +local a_a=_c:addButton():setPosition("parent.w","parent.h"):setSize(1,1):setText("\133"):setForeground(colors.gray):setBackground(colors.black):onClick(function() +end):onDrag(function(b_a,c_a,d_a,_aa,aaa) +local baa,caa=_c:getSize()local daa,_ba=baa,caa;if(baa+_aa-1 >=_d)and(baa+_aa-1 <=bd)then daa=baa+ +_aa-1 end +if(caa+aaa-1 >=ad)and( +caa+aaa-1 <=cd)then _ba=caa+aaa-1 end;_c:setSize(daa,_ba)end) +cc=_c:addButton():setText("Close"):setPosition("parent.w - 6",1):setSize(7,1):setBackground(colors.red):setForeground(colors.white):onClick(function() +_c:animatePosition( +-dd,__a/2 -_c:getHeight()/2,0.5)end) +ac=_c:addList():setSize("parent.w - 2","parent.h - 3"):setPosition(2,3):setBackground(colors.gray):setForeground(colors.white):setSelectionColor(colors.gray,colors.white) +if(bc==nil)then +bc=db:addLabel():setPosition(1,"parent.h"):setBackground(colors.black):setForeground(colors.white):setZIndex(100):onClick(function() +_c:show() +_c:animatePosition(dd/2 -_c:getWidth()/2,__a/2 -_c:getHeight()/2,0.5)end)end end +return +{debug=function(...)local _d={...}if(db==nil)then db=cb.getMainFrame() +if(db~=nil)then dc()else print(...)return end end if -(ac.draw(ad))then -if(ad.parent~=nil)then local bd,cd=ad:getAnchorPosition() -local dd,__a=ad:getSize()local a_a=bb.getTextVerticalAlign(__a,dc) -for n=1,__a do -if(n==a_a)then -local b_a=ad:getValue() -ad.parent:setText(bd+ (dd/2 -b_a:len()/2),cd+ (n-1),bb.getTextHorizontalAlign(b_a,b_a:len(),cc)) -ad.parent:setFG(bd+ (dd/2 -b_a:len()/2),cd+ (n-1),bb.getTextHorizontalAlign(db[ad.fgColor]:rep(b_a:len()),b_a:len(),cc))end end end end end}return setmetatable(_d,ac)end end;aa["libraries"]={} +(db:getName()~="basaltDebuggingFrame")then if(db~=_c)then bc:setParent(db)end end;local ad=""for bd,cd in pairs(_d)do +ad=ad..tostring(cd).. (#_d~=bd and", "or"")end +bc:setText("[Debug] "..ad) +for bd,cd in pairs(bb(ad,ac:getWidth()))do ac:addItem(cd)end +if(ac:getItemCount()>50)then ac:removeItem(1)end +ac:setValue(ac:getItem(ac:getItemCount())) +if(ac.getItemCount()>ac:getHeight())then ac:setOffset(ac:getItemCount()- +ac:getHeight())end;bc:show()end}end}end +aa["plugins"]["themes"]=function(...) +local ab={BaseFrameBG=colors.lightGray,BaseFrameText=colors.black,FrameBG=colors.gray,FrameText=colors.black,ButtonBG=colors.gray,ButtonText=colors.black,CheckboxBG=colors.lightGray,CheckboxText=colors.black,InputBG=colors.black,InputText=colors.lightGray,TextfieldBG=colors.black,TextfieldText=colors.white,ListBG=colors.gray,ListText=colors.black,MenubarBG=colors.gray,MenubarText=colors.black,DropdownBG=colors.gray,DropdownText=colors.black,RadioBG=colors.gray,RadioText=colors.black,SelectionBG=colors.black,SelectionText=colors.lightGray,GraphicBG=colors.black,ImageBG=colors.black,PaneBG=colors.black,ProgramBG=colors.black,ProgressbarBG=colors.gray,ProgressbarText=colors.black,ProgressbarActiveBG=colors.black,ScrollbarBG=colors.lightGray,ScrollbarText=colors.gray,ScrollbarSymbolColor=colors.black,SliderBG=false,SliderText=colors.gray,SliderSymbolColor=colors.black,SwitchBG=colors.lightGray,SwitchText=colors.gray,LabelBG=false,LabelText=colors.black,GraphBG=colors.gray,GraphText=colors.black} +local bb={Container=function(cb,db,_c)local ac={} +local bc={getTheme=function(cc,dc)local _d=cc:getParent()return ac[dc]or(_d~=nil and _d:getTheme(dc)or +ab[dc])end,setTheme=function(cc,dc,_d) +if( +type(dc)=="table")then ac=dc elseif(type(dc)=="string")then ac[dc]=_d end;cc:updateDraw()return cc end}return bc end,basalt=function() +return +{getTheme=function(cb)return +ab[cb]end,setTheme=function(cb,db)if(type(cb)=="table")then ab=cb elseif(type(cb)=="string")then +ab[cb]=db end end}end} +for cb,db in +pairs({"BaseFrame","Frame","ScrollableFrame","MovableFrame","Button","Checkbox","Dropdown","Graph","Graphic","Input","Label","List","Menubar","Pane","Program","Progressbar","Radio","Scrollbar","Slider","Switch","Textfield"})do +bb[db]=function(_c,ac,bc) +local cc={init=function(dc)if(_c.init(dc))then local _d=dc:getParent()or dc +dc:setBackground(_d:getTheme(db.."BG")) +dc:setForeground(_d:getTheme(db.."Text"))end end}return cc end end;return bb end +aa["plugins"]["textures"]=function(...)local ab=da("images")local bb=da("utils") +local cb=da("xmlParser") +return +{VisualObject=function(db)local _c,ac=1,true;local bc,cc,dc;local _d="default" +local ad={addTexture=function(bd,cd,dd)bc=ab.loadImageAsBimg(cd) +cc=bc[1] +if(dd)then if(bc.animated)then bd:listenEvent("other_event")local __a=bc[_c].duration or +bc.secondsPerFrame or 0.2 +dc=os.startTimer(__a)end end;bd:setBackground(false)bd:setForeground(false) +bd:setDrawState("texture-base",true)bd:updateDraw()return bd end,setTextureMode=function(bd,cd)_d= +cd or _d;bd:updateDraw()return bd end,setInfinitePlay=function(bd,cd)ac=cd +return bd end,eventHandler=function(bd,cd,dd,...)db.eventHandler(bd,cd,dd,...) +if(cd=="timer")then +if +(dd==dc)then +if(bc[_c+1]~=nil)then _c=_c+1;cc=bc[_c]local __a= +bc[_c].duration or bc.secondsPerFrame or 0.2 +dc=os.startTimer(__a)bd:updateDraw()else +if(ac)then _c=1;cc=bc[1]local __a= +bc[_c].duration or bc.secondsPerFrame or 0.2 +dc=os.startTimer(__a)bd:updateDraw()end end end end end,draw=function(bd) +db.draw(bd) +bd:addDraw("texture-base",function()local cd=bd:getParent()or bd +local dd,__a=bd:getPosition()local a_a,b_a=bd:getSize()local c_a,d_a=cd:getSize()local _aa=bc.width or +#bc[_c][1][1]local aaa=bc.height or#bc[_c] +local baa,caa=0,0 +if(_d=="center")then +baa=dd+math.floor((a_a-_aa)/2 +0.5)-1 +caa=__a+math.floor((b_a-aaa)/2 +0.5)-1 elseif(_d=="default")then baa,caa=dd,__a elseif(_d=="right")then +baa,caa=dd+a_a-_aa,__a+b_a-aaa end;local daa=dd-baa;local _ba=__a-caa;if baa
dd+a_a then +_aa=(dd+a_a)-baa end +if caa+aaa>__a+b_a then aaa=(__a+b_a)-caa end +for k=1,aaa do if(cc[k+_ba]~=nil)then local aba,bba,cba=table.unpack(cc[k+_ba]) +bd:addBlit(1,k,aba:sub(daa, +daa+_aa),bba:sub(daa,daa+_aa),cba:sub(daa,daa+_aa))end end end,1)bd:setDrawState("texture-base",false)end}return ad end}end;aa["libraries"]={} +aa["libraries"]["process"]=function(...)local ab={}local bb={}local cb=0 +local db=dofile("rom/modules/main/cc/require.lua").make +function bb:new(_c,ac,bc,...)local cc={...} +local dc=setmetatable({path=_c},{__index=self})dc.window=ac;ac.current=term.current;ac.redirect=term.redirect +dc.processId=cb +if(type(_c)=="string")then +dc.coroutine=coroutine.create(function() +local _d=shell.resolveProgram(_c)local ad=setmetatable(bc,{__index=_ENV})ad.shell=shell +ad.basaltProgram=true;ad.arg={[0]=_c,table.unpack(cc)} +if(_d==nil)then error("The path ".._c.. +" does not exist!")end;ad.require,ad.package=db(ad,fs.getDir(_d)) +if(fs.exists(_d))then +local bd=fs.open(_d,"r")local cd=bd.readAll()bd.close()local dd=load(cd,_c,"bt",ad)if(dd~=nil)then return +dd()end end end)elseif(type(_c)=="function")then +dc.coroutine=coroutine.create(function() +_c(table.unpack(cc))end)else return end;ab[cb]=dc;cb=cb+1;return dc end +function bb:resume(_c,...)local ac=term.current()term.redirect(self.window) +if( +self.filter~=nil)then if(_c~=self.filter)then return end;self.filter=nil end;local bc,cc=coroutine.resume(self.coroutine,_c,...)if bc then +self.filter=cc else printError(cc)end;term.redirect(ac) +return bc,cc end +function bb:isDead() +if(self.coroutine~=nil)then +if +(coroutine.status(self.coroutine)=="dead")then table.remove(ab,self.processId)return true end else return true end;return false end +function bb:getStatus()if(self.coroutine~=nil)then +return coroutine.status(self.coroutine)end;return nil end +function bb:start()coroutine.resume(self.coroutine)end;return bb end +aa["libraries"]["basaltDraw"]=function(...)local ab=da("tHex")local bb=da("utils") +local cb=bb.splitString;local db,_c=string.sub,string.rep +return +function(ac)local bc=ac or term.current() +local cc;local dc,_d=bc.getSize()local ad={}local bd={}local cd={}local dd;local __a={} +local function a_a()dd=_c(" ",dc)for n=0,15 do +local caa=2 ^n;local daa=ab[caa]__a[caa]=_c(daa,dc)end end;a_a() +local function b_a()a_a()local caa=dd;local daa=__a[colors.white] +local _ba=__a[colors.black] +for currentY=1,_d do +ad[currentY]=db(ad[currentY]==nil and caa or ad[currentY]..caa:sub(1,dc- +ad[currentY]:len()),1,dc) +cd[currentY]=db(cd[currentY]==nil and daa or cd[currentY]..daa:sub(1,dc- +cd[currentY]:len()),1,dc) +bd[currentY]=db(bd[currentY]==nil and _ba or bd[currentY].._ba:sub(1,dc- +bd[currentY]:len()),1,dc)end end;b_a() +local function c_a(caa,daa,_ba,aba,bba) +if#_ba==#aba and#_ba==#bba then +if daa>=1 and daa<=_d then +if +caa+#_ba>0 and caa<=dc then local cba,dba,_ca;local aca,bca,cca=ad[daa],cd[daa],bd[daa] +local dca,_da=1,#_ba +if caa<1 then dca=1 -caa+1;_da=dc-caa+1 elseif caa+#_ba>dc then _da=dc-caa+1 end;cba=db(aca,1,caa-1)..db(_ba,dca,_da)dba= +db(bca,1,caa-1)..db(aba,dca,_da)_ca=db(cca,1,caa-1).. +db(bba,dca,_da) +if caa+#_ba<=dc then cba=cba.. +db(aca,caa+#_ba,dc) +dba=dba..db(bca,caa+#_ba,dc)_ca=_ca..db(cca,caa+#_ba,dc)end;ad[daa],cd[daa],bd[daa]=cba,dba,_ca end end end end +local function d_a(caa,daa,_ba) +if daa>=1 and daa<=_d then +if caa+#_ba>0 and caa<=dc then local aba;local bba=ad[daa] +local cba,dba=1,#_ba +if caa<1 then cba=1 -caa+1;dba=dc-caa+1 elseif caa+#_ba>dc then dba=dc-caa+1 end;aba=db(bba,1,caa-1)..db(_ba,cba,dba) +if +caa+#_ba<=dc then aba=aba..db(bba,caa+#_ba,dc)end;ad[daa]=aba end end end +local function _aa(caa,daa,_ba) +if daa>=1 and daa<=_d then +if caa+#_ba>0 and caa<=dc then local aba;local bba=bd[daa] +local cba,dba=1,#_ba +if caa<1 then cba=1 -caa+1;dba=dc-caa+1 elseif caa+#_ba>dc then dba=dc-caa+1 end;aba=db(bba,1,caa-1)..db(_ba,cba,dba) +if +caa+#_ba<=dc then aba=aba..db(bba,caa+#_ba,dc)end;bd[daa]=aba end end end +local function aaa(caa,daa,_ba) +if daa>=1 and daa<=_d then +if caa+#_ba>0 and caa<=dc then local aba;local bba=cd[daa] +local cba,dba=1,#_ba +if caa<1 then cba=1 -caa+1;dba=dc-caa+1 elseif caa+#_ba>dc then dba=dc-caa+1 end;aba=db(bba,1,caa-1)..db(_ba,cba,dba) +if +caa+#_ba<=dc then aba=aba..db(bba,caa+#_ba,dc)end;cd[daa]=aba end end end +local baa={setSize=function(caa,daa)dc,_d=caa,daa;b_a()end,setMirror=function(caa)cc=caa end,setBG=function(caa,daa,_ba) +_aa(caa,daa,_ba)end,setText=function(caa,daa,_ba)d_a(caa,daa,_ba)end,setFG=function(caa,daa,_ba) +aaa(caa,daa,_ba)end,blit=function(caa,daa,_ba,aba,bba)c_a(caa,daa,_ba,aba,bba)end,drawBackgroundBox=function(caa,daa,_ba,aba,bba) +local cba=_c(ab[bba],_ba)for n=1,aba do _aa(caa,daa+ (n-1),cba)end end,drawForegroundBox=function(caa,daa,_ba,aba,bba) +local cba=_c(ab[bba],_ba)for n=1,aba do aaa(caa,daa+ (n-1),cba)end end,drawTextBox=function(caa,daa,_ba,aba,bba) +local cba=_c(bba,_ba)for n=1,aba do d_a(caa,daa+ (n-1),cba)end end,update=function() +local caa,daa=bc.getCursorPos()local _ba=false +if(bc.getCursorBlink~=nil)then _ba=bc.getCursorBlink()end;bc.setCursorBlink(false)if(cc~=nil)then +cc.setCursorBlink(false)end +for n=1,_d do bc.setCursorPos(1,n) +bc.blit(ad[n],cd[n],bd[n])if(cc~=nil)then cc.setCursorPos(1,n) +cc.blit(ad[n],cd[n],bd[n])end end;bc.setBackgroundColor(colors.black) +bc.setCursorBlink(_ba)bc.setCursorPos(caa,daa) +if(cc~=nil)then +cc.setBackgroundColor(colors.black)cc.setCursorBlink(_ba)cc.setCursorPos(caa,daa)end end,setTerm=function(caa) +bc=caa end}return baa end end +aa["libraries"]["basaltLogs"]=function(...)local ab=""local bb="basaltLog.txt"local cb="Debug" +fs.delete( +ab~=""and ab.."/"..bb or bb) +local db={__call=function(_c,ac,bc)if(ac==nil)then return end +local cc=ab~=""and ab.."/"..bb or bb +local dc=fs.open(cc,fs.exists(cc)and"a"or"w") +dc.writeLine("[Basalt][".. +os.date("%Y-%m-%d %H:%M:%S").."][".. (bc and bc or cb).. +"]: "..tostring(ac))dc.close()end}return setmetatable({},db)end +aa["libraries"]["basaltEvent"]=function(...) +return +function()local ab={} +local bb={registerEvent=function(cb,db,_c) +if(ab[db]==nil)then ab[db]={}end;table.insert(ab[db],_c)end,removeEvent=function(cb,db,_c)ab[db][_c[db]]= +nil end,hasEvent=function(cb,db)return ab[db]~=nil end,getEventCount=function(cb,db)return +ab[db]~=nil and#ab[db]or 0 end,getEvents=function(cb) +local db={}for _c,ac in pairs(ab)do table.insert(db,_c)end;return db end,clearEvent=function(cb,db)ab[db]= +nil end,clear=function(cb,db)ab={}end,sendEvent=function(cb,db,...)local _c +if(ab[db]~=nil)then for ac,bc in pairs(ab[db])do +local cc=bc(...)if(cc==false)then _c=cc end end end;return _c end}bb.__index=bb;return bb end end +aa["libraries"]["tHex"]=function(...)local ab={} +for i=0,15 do ab[2 ^i]=("%x"):format(i)end;return ab end aa["libraries"]["basaltMon"]=function(...) local ab={[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 bb,cb,db,_c=type,string.len,string.rep,string.sub return @@ -2667,319 +669,129 @@ for dba,_ca in pairs(bc)do local aca=0;local bca=0 for cca,dca in pairs(_ca)do local _da,ada=dca.getSize()if(dca.name==_ba)then return aba+aca,bba+cba end aca=aca+_da;if(ada>bca)then bca=ada end end;cba=cba+bca end;return aba,bba end}end end -aa["libraries"]["layout"]=function(...) -local function ab(cb)local db={}db.___value=nil;db.___name=cb -db.___children={}db.___props={}function db:value()return self.___value end;function db:setValue(_c) -self.___value=_c end;function db:name()return self.___name end;function db:setName(_c) -self.___name=_c end;function db:children()return self.___children end;function db:numChildren()return -#self.___children end -function db:addChild(_c) +aa["libraries"]["images"]=function(...)local ab,bb=string.sub,math.floor;local function cb(ad)return +{[1]={{},{},paintutils.loadImage(ad)}},"bimg"end;local function db(ad)return +paintutils.loadImage(ad),"nfp"end +local function _c(ad,bd) +local cd=fs.open(ad,bd and"rb"or"r")if(cd==nil)then +error("Path - "..ad.." doesn't exist!")end +local dd=textutils.unserialize(cd.readAll())cd.close()if(dd~=nil)then return dd,"bimg"end end;local function ac(ad)end;local function bc(ad)end;local function cc(ad,bd,cd) +if(ab(ad,-4)==".bimg")then return _c(ad,cd)elseif +(ab(ad,-3)==".bbf")then return ac(ad,cd)else return db(ad,cd)end end;local function dc(ad) if -self[_c:name()]~=nil then if -type(self[_c:name()].name)=="function"then local ac={}table.insert(ac,self[_c:name()]) -self[_c:name()]=ac end -table.insert(self[_c:name()],_c)else self[_c:name()]=_c end;table.insert(self.___children,_c)end;function db:properties()return self.___props end;function db:numProperties() -return#self.___props end -function db:addProperty(_c,ac)local bc="@".._c -if self[bc]~=nil then if -type(self[bc])=="string"then local cc={}table.insert(cc,self[bc]) -self[bc]=cc end -table.insert(self[bc],ac)else self[bc]=ac end -table.insert(self.___props,{name=_c,value=self[_c]})end;return db end;local bb={} -function bb:ToXmlString(cb)cb=string.gsub(cb,"&","&") -cb=string.gsub(cb,"<","<")cb=string.gsub(cb,">",">") -cb=string.gsub(cb,"\"",""") -cb=string.gsub(cb,"([^%w%&%;%p%\t% ])",function(db) -return string.format("&#x%X;",string.byte(db))end)return cb end -function bb:FromXmlString(cb) -cb=string.gsub(cb,"&#x([%x]+)%;",function(db) -return string.char(tonumber(db,16))end) -cb=string.gsub(cb,"&#([0-9]+)%;",function(db)return string.char(tonumber(db,10))end)cb=string.gsub(cb,""","\"") -cb=string.gsub(cb,"'","'")cb=string.gsub(cb,">",">") -cb=string.gsub(cb,"<","<")cb=string.gsub(cb,"&","&")return cb end;function bb:ParseArgs(cb,db) -string.gsub(db,"(%w+)=([\"'])(.-)%2",function(_c,ac,bc) -cb:addProperty(_c,self:FromXmlString(bc))end)end -function bb:ParseXmlText(cb) -local db={}local _c=ab()table.insert(db,_c)local ac,bc,cc,dc,_d;local ad,bd=1,1 +(ad:find(".bimg"))then return _c(ad)elseif(ad:find(".bbf"))then return bc(ad)else return cb(ad)end end +local function _d(ad,bd,cd)local dd,__a=ad.width or# +ad[1][1][1],ad.height or#ad[1]local a_a={} +for b_a,c_a in +pairs(ad)do +if(type(b_a)=="number")then local d_a={} +for y=1,cd do local _aa,aaa,baa="","","" +local caa=bb(y/cd*__a+0.5) +if(c_a[caa]~=nil)then +for x=1,bd do local daa=bb(x/bd*dd+0.5)_aa=_aa.. +ab(c_a[caa][1],daa,daa) +aaa=aaa..ab(c_a[caa][2],daa,daa)baa=baa..ab(c_a[caa][3],daa,daa)end;table.insert(d_a,{_aa,aaa,baa})end end;table.insert(a_a,b_a,d_a)else a_a[b_a]=c_a end end;a_a.width=bd;a_a.height=cd;return a_a end +return{loadNFP=db,loadBIMG=_c,loadImage=cc,resizeBIMG=_d,loadImageAsBimg=dc}end +aa["libraries"]["utils"]=function(...)local ab=da("tHex") +local bb,cb,db,_c,ac,bc=string.sub,string.find,string.reverse,string.rep,table.insert,string.len +local function cc(cd,dd)local __a={}if cd==""or dd==""then return __a end;local a_a=1 +local b_a,c_a=cb(cd,dd,a_a)while b_a do ac(__a,bb(cd,a_a,b_a-1))a_a=c_a+1 +b_a,c_a=cb(cd,dd,a_a)end;ac(__a,bb(cd,a_a))return __a end;local function dc(cd)return cd:gsub("{[^}]+}","")end +local function _d(cd,dd)cd=dc(cd)if +(cd=="")or(dd==0)then return{""}end;local __a=cc(cd,"\n")local a_a={} +for b_a,c_a in +pairs(__a)do +if#c_a==0 then table.insert(a_a,"")else +while#c_a>dd do local d_a=dd;for i=dd,1,-1 do if bb(c_a,i,i)==" "then +d_a=i;break end end +if d_a==dd then +local _aa=bb(c_a,1,d_a-1).."-"table.insert(a_a,_aa)c_a=bb(c_a,d_a)else +local _aa=bb(c_a,1,d_a-1)table.insert(a_a,_aa)c_a=bb(c_a,d_a+1)end;if#c_a<=dd then break end end;if#c_a>0 then table.insert(a_a,c_a)end end end;return a_a end +local function ad(cd)local dd={}local __a=1;local a_a=1 +while __a<=#cd do local b_a,c_a;local d_a,_aa;local aaa,baa +for _ba,aba in pairs(colors)do +local bba="{fg:".._ba.."}"local cba="{bg:".._ba.."}"local dba,_ca=cd:find(bba,__a) +local aca,bca=cd:find(cba,__a) +if dba and(not b_a or dba0 then +table.insert(dd,{color=nil,bgColor=nil,text=daa,position=a_a})a_a=a_a+#daa;__a=__a+#daa end +if b_a and(not c_a or b_a1 then if b_a+1 +bba<=dd then aaa({text=" "})b_a=b_a+1 else b_a=1;c_a=c_a+ +1 end end;while bba>0 do local cba=aba:sub(1,dd-b_a+1) +aba=aba:sub(dd-b_a+2)bba=#aba;aaa({text=cba}) +if bba>0 then b_a=1;c_a=c_a+1 else b_a=b_a+#cba end end end end;if b_a>dd then b_a=1;c_a=c_a+1 end end;return a_a end +return +{getTextHorizontalAlign=function(cd,dd,__a,a_a)cd=bb(cd,1,dd)local b_a=dd-bc(cd) +if(__a=="right")then +cd=_c(a_a or" ",b_a)..cd elseif(__a=="center")then +cd=_c(a_a or" ",math.floor(b_a/2))..cd.._c(a_a or" ",math.floor( +b_a/2)) +cd=cd.. (bc(cd)
c_a)then break end +if(aaa.text~=nil)then cd:addText(dd+aaa.x-1,__a+ +aaa.y-1,aaa.text)end;if(aaa.color~=nil)then +cd:addFG(dd+aaa.x-1,__a+aaa.y-1,ab[colors[aaa.color]]:rep( +#aaa.text))end;if(aaa.bgColor~=nil)then +cd:addBG(dd+ +aaa.x-1,__a+aaa.y-1,ab[colors[aaa.bgColor]]:rep(# +aaa.text))end end end,uuid=function() +return +string.gsub(string.format('%x-%x-%x-%x-%x',math.random(0,0xffff),math.random(0,0xffff),math.random(0,0xffff), +math.random(0,0x0fff)+0x4000,math.random(0,0x3fff)+0x8000),' ','0')end}end +aa["libraries"]["xmlParser"]=function(...) +local ab={new=function(db) +return +{tag=db,value=nil,attributes={},children={},addChild=function(_c,ac) +table.insert(_c.children,ac)end,addAttribute=function(_c,ac,bc)_c.attributes[ac]=bc end}end} +local bb=function(db,_c) +local ac,bc=string.gsub(_c,"(%w+)=([\"'])(.-)%2",function(_d,ad,bd) +db:addAttribute(_d,"\""..bd.."\"")end) +local cc,dc=string.gsub(_c,"(%w+)={(.-)}",function(_d,ad)db:addAttribute(_d,ad)end)end +local cb={parseText=function(db)local _c={}local ac=ab.new()table.insert(_c,ac)local bc,cc,dc,_d,ad;local bd,cd=1,1 while true do -ac,bd,bc,cc,dc,_d=string.find(cb,"<(%/?)([%w_:]+)(.-)(%/?)>",ad)if not ac then break end;local dd=string.sub(cb,ad,ac-1) -if not -string.find(dd,"^%s*$")then -local __a=(_c:value()or"")..self:FromXmlString(dd)db[#db]:setValue(__a)end -if _d=="/"then local __a=ab(cc)self:ParseArgs(__a,dc) -_c:addChild(__a)elseif bc==""then local __a=ab(cc)self:ParseArgs(__a,dc) -table.insert(db,__a)_c=__a else local __a=table.remove(db)_c=db[#db] -if#db<1 then error("XmlParser: nothing to close with ".. -cc)end;if __a:name()~=cc then -error("XmlParser: trying to close "..__a.name.." with "..cc)end;_c:addChild(__a)end;ad=bd+1 end;local cd=string.sub(cb,ad)if#db>1 then -error("XmlParser: unclosed "..db[#db]:name())end;return _c end -function bb:loadFile(cb,db)if not db then db=system.ResourceDirectory end -local _c=system.pathForFile(cb,db)local ac,bc=io.open(_c,"r") -if ac and not bc then local cc=ac:read("*a") -io.close(ac)return self:ParseXmlText(cc),nil else print(bc)return nil end end;return bb end -aa["libraries"]["utils"]=function(...) -local ab,bb,cb=string.sub,string.find,string.reverse -local function db(ad,bd)local cd={}if ad==""or bd==""then return cd end;local dd=1 -local __a,a_a=bb(ad,bd,dd)while __a do table.insert(cd,ab(ad,dd,__a-1))dd=a_a+1 -__a,a_a=bb(ad,bd,dd)end -table.insert(cd,ab(ad,dd))return cd end -local _c={[0]={8,4,3,6,5},{4,14,8,7},{6,10,8,7},{9,11,8,0},{1,14,8,0},{13,12,8,0},{2,10,8,0},{15,8,10,11,12,14},{0,7,1,9,2,13},{3,11,8,7},{2,6,7,15},{9,3,7,15},{13,5,7,15},{5,12,8,7},{1,4,7,15},{7,10,11,12,14}}local ac,bc,cc={},{},{}for i=0,15 do bc[2 ^i]=i end -do local ad="0123456789abcdef" -for i=1,16 do ac[ad:sub(i,i)]= -i-1;ac[i-1]=ad:sub(i,i) -cc[ad:sub(i,i)]=2 ^ (i-1)cc[2 ^ (i-1)]=ad:sub(i,i)local bd=_c[i-1]for i=1,#bd do -bd[i]=2 ^bd[i]end end end -local function dc(ad)local bd=_c[bc[ad[#ad][1]]] -for j=1,#bd do local cd=bd[j]for i=1,#ad-1 do if -ad[i][1]==cd then return i end end end;return 1 end -local function _d(ad,bd) -if not bd then local dd={}bd={}for i=1,6 do local __a=ad[i]local a_a=bd[__a] -bd[__a],dd[i]=a_a and(a_a+1)or 1,__a end;ad=dd end;local cd={}for dd,__a in pairs(bd)do cd[#cd+1]={dd,__a}end -if#cd>1 then -while -#cd>2 do -table.sort(cd,function(d_a,_aa)return d_a[2]>_aa[2]end)local __a,a_a=dc(cd),#cd;local b_a,c_a=cd[a_a][1],cd[__a][1] -for i=1,6 do if ad[i]==b_a then -ad[i]=c_a;cd[__a][2]=cd[__a][2]+1 end end;cd[a_a]=nil end;local dd=128 -for i=1,#ad-1 do if ad[i]~=ad[6]then dd=dd+2 ^ (i-1)end end;return string.char(dd), -cc[cd[1][1]==ad[6]and cd[2][1]or cd[1][1]],cc[ad[6]]else -return"\128",cc[ad[1]],cc[ad[1]]end end -return -{getTextHorizontalAlign=function(ad,bd,cd,dd)ad=ab(ad,1,bd)local __a=bd-string.len(ad) -if(cd=="right")then ad=string.rep( -dd or" ",__a)..ad elseif(cd=="center")then -ad=string.rep(dd or" ",math.floor( -__a/2))..ad.. -string.rep(dd or" ",math.floor(__a/2)) -ad=ad.. (string.len(ad) -bd do local b_a=bb(cb(ab(a_a,1,bd))," ")if not b_a then b_a=bd else -b_a=bd-b_a+1 end;local c_a=ab(a_a,1,b_a) -table.insert(dd,c_a)a_a=ab(a_a,b_a+1)end;if#a_a>0 then table.insert(dd,a_a)end end;return dd end,getValueFromXML=function(ad,bd) -local cd;if(type(bd)~="table")then return end;if(bd[ad]~=nil)then -if -(type(bd[ad])=="table")then if(bd[ad].value~=nil)then cd=bd[ad]:value()end end end;if(cd==nil)then -cd=bd["@"..ad]end;if(cd=="true")then cd=true elseif(cd=="false")then cd=false elseif(tonumber(cd)~=nil)then -cd=tonumber(cd)end;return cd end,numberFromString=function(ad)return load( -"return "..ad)()end,uuid=function() -local ad=math.random -local function bd()local cd='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'return -string.gsub(cd,'[xy]',function(dd)local __a= -(dd=='x')and ad(0,0xf)or ad(8,0xb) -return string.format('%x',__a)end)end;return bd()end,array=function(ad,bd)return -load( -"return {".. -("nil,"):rep(ad).. ("[0]=nil,"):rep(bd).."}")()end,shrink=function(ad,bd)local cd,dd,__a,a_a={{},{},{}},0, -#ad+#ad%3,bd or colours.black;for i=1,#ad do if -#ad[i]>dd then dd=#ad[i]end end -for y=0,__a-1,3 do -local b_a,c_a,d_a,_aa={},{},{},1 -for x=0,dd-1,2 do local aaa,baa={},{} -for yy=1,3 do -for xx=1,2 do -aaa[#aaa+1]=(ad[y+yy]and ad[y+yy][x+xx])and -(ad[y+ -yy][x+xx]==0 and a_a or ad[y+yy][x+xx])or a_a;baa[aaa[#aaa]]= -baa[aaa[#aaa]]and(baa[aaa[#aaa]]+1)or 1 end end;b_a[_aa],c_a[_aa],d_a[_aa]=_d(aaa,baa)_aa=_aa+1 end -cd[1][#cd[1]+1],cd[2][#cd[2]+1],cd[3][#cd[3]+1]=table.concat(b_a),table.concat(c_a),table.concat(d_a)end;cd.width,cd.height=#cd[1][1],#cd[1]return cd end}end -aa["libraries"]["basaltDraw"]=function(...)local ab=da("tHex") -local bb,cb=string.sub,string.rep -return -function(db)local _c=db or term.current()local ac;local bc,cc=_c.getSize()local dc={} -local _d={}local ad={}local bd={}local cd={}local dd={}local __a;local a_a={} -local function b_a()__a=cb(" ",bc)for n=0,15 do local daa=2 ^n -local _ba=ab[daa]a_a[daa]=cb(_ba,bc)end end;b_a() -local function c_a()b_a()local daa=__a;local _ba=a_a[colors.white] -local aba=a_a[colors.black] -for currentY=1,cc do -dc[currentY]=bb(dc[currentY]==nil and daa or dc[currentY]..daa:sub(1,bc- -dc[currentY]:len()),1,bc) -ad[currentY]=bb(ad[currentY]==nil and _ba or ad[currentY].._ba:sub(1,bc- -ad[currentY]:len()),1,bc) -_d[currentY]=bb(_d[currentY]==nil and aba or _d[currentY]..aba:sub(1,bc- -_d[currentY]:len()),1,bc)end end;c_a() -local function d_a(daa,_ba,aba) -if(_ba>=1)and(_ba<=cc)then -if -(daa+aba:len()>0)and(daa<=bc)then local bba=dc[_ba]local cba;local dba=daa+#aba-1 -if(daa<1)then local _ca=1 -daa+1 -local aca=bc-daa+1;aba=bb(aba,_ca,aca)elseif(dba>bc)then local _ca=bc-daa+1;aba=bb(aba,1,_ca)end -if(daa>1)then local _ca=daa-1;cba=bb(bba,1,_ca)..aba else cba=aba end;if dba=1)and(_ba<=cc)then -if(daa+aba:len()>0)and(daa<=bc)then -local bba=_d[_ba]local cba;local dba=daa+#aba-1 -if(daa<1)then -aba=bb(aba,1 -daa+1,bc-daa+1)elseif(dba>bc)then aba=bb(aba,1,bc-daa+1)end -if(daa>1)then cba=bb(bba,1,daa-1)..aba else cba=aba end;if dba=1)and(_ba<=cc)then -if(daa+aba:len()>0)and(daa<=bc)then -local bba=ad[_ba]local cba;local dba=daa+#aba-1 -if(daa<1)then local _ca=1 -daa+1;local aca=bc-daa+1 -aba=bb(aba,_ca,aca)elseif(dba>bc)then local _ca=bc-daa+1;aba=bb(aba,1,_ca)end -if(daa>1)then local _ca=daa-1;cba=bb(bba,1,_ca)..aba else cba=aba end;if dba=1)and(_ba<=cc)then -if( -daa+aba:len()>0)and(daa<=bc)then local dba=dc[_ba]local _ca=ad[_ba]local aca=_d[_ba] -local bca,cca,dca;local _da=daa+#aba-1 -if(daa<1)then local ada=1 -daa+1;local bda=bc-daa+1 -aba=bb(aba,ada,bda)bba=bb(bba,ada,bda)cba=bb(cba,ada,bda)elseif(_da>bc)then local ada=bc-daa+1 -aba=bb(aba,1,ada)bba=bb(bba,1,ada)cba=bb(cba,1,ada)end -if(daa>1)then local ada=daa-1;bca=bb(dba,1,ada)..aba -cca=bb(_ca,1,ada)..bba;dca=bb(aca,1,ada)..cba else bca=aba;cca=bba;dca=cba end -if _da",bd)if not bc then break end;local __a=string.sub(db,bd,bc-1)if not +string.find(__a,"^%s*$")then local a_a=(ac.value or"")..__a +_c[#_c].value=a_a end +if ad=="/"then local a_a=ab.new(dc) +bb(a_a,_d)ac:addChild(a_a)elseif cc==""then local a_a=ab.new(dc)bb(a_a,_d) +table.insert(_c,a_a)ac=a_a else local a_a=table.remove(_c)ac=_c[#_c] +if#_c<1 then error("XMLParser: nothing to close with ".. +dc)end;if a_a.tag~=dc then +error("XMLParser: trying to close "..a_a.tag.." with "..dc)end;ac:addChild(a_a)end;bd=cd+1 end;local dd=string.sub(db,bd)if#_c>1 then +error("XMLParser: unclosed ".._c[#_c].tag)end;return ac.children end}return cb end aa["libraries"]["bimg"]=function(...)local ab,bb=string.sub,string.rep local function cb(db,_c)local ac,bc=0,0 local cc,dc,_d={},{},{}local ad,bd=1,1;local cd={} @@ -3010,18 +822,19 @@ bb("0",ad-#dc[bd])..d_a..ab(dc[bd],ad+#d_a,ac)end;if(#dc[bd]>ac)then ac=#dc[bd]e _c.updateSize(ac,bc)end local function c_a(d_a)cd={}cc,dc,_d={},{},{} for _aa,aaa in pairs(db)do if(type(_aa)=="string")then cd[_aa]=aaa else -cc[_aa],dc[_aa],_d[_aa]=aaa[1],aaa[2],aaa[3]end end;_c.updateSize(ac,bc)end;if(db~=nil)then ac=#db[1][1]bc=#db;c_a(db)end +cc[_aa],dc[_aa],_d[_aa]=aaa[1],aaa[2],aaa[3]end end;_c.updateSize(ac,bc)end +if(db~=nil)then if(#db>0)then ac=#db[1][1]bc=#db;c_a(db)end end return -{recalculateSize=dd,setFrame=c_a,getFrame=function()local d_a={} -for _aa,aaa in -pairs(cc)do table.insert(d_a,{aaa,dc[_aa],_d[_aa]})end;for _aa,aaa in pairs(cd)do d_a[_aa]=aaa end;return d_a,ac,bc end,getImage=function() +{recalculateSize=dd,setFrame=c_a,getFrame=function()local d_a={}for _aa,aaa in pairs(cc)do +table.insert(d_a,{aaa,dc[_aa],_d[_aa]})end +for _aa,aaa in pairs(cd)do d_a[_aa]=aaa end;return d_a,ac,bc end,getImage=function() local d_a={}for _aa,aaa in pairs(cc)do table.insert(d_a,{aaa,dc[_aa],_d[_aa]})end;return d_a end,setFrameData=function(d_a,_aa) if( _aa~=nil)then cd[d_a]=_aa else if(type(d_a)=="table")then cd=d_a end end end,setFrameImage=function(d_a) for _aa,aaa in pairs(d_a.t)do cc[_aa]=d_a.t[_aa]dc[_aa]=d_a.fg[_aa]_d[_aa]=d_a.bg[_aa]end end,getFrameImage=function() -return{t=cc,fg=dc,bg=_d}end,getFrameData=function(d_a)return(d_a~=nil and cd[d_a]or cd)end,blit=function(d_a,_aa,aaa,baa,caa) +return{t=cc,fg=dc,bg=_d}end,getFrameData=function(d_a)if(d_a~=nil)then return cd[d_a]else return cd end end,blit=function(d_a,_aa,aaa,baa,caa) __a(d_a,baa,caa)b_a(_aa,baa,caa)a_a(aaa,baa,caa)end,text=__a,fg=b_a,bg=a_a,getSize=function()return ac,bc end,setSize=function(d_a,_aa)local aaa,baa,caa={},{},{} for _y=1,_aa do @@ -3032,9 +845,12 @@ baa[_y]=ab(dc[_y],1,d_a)..bb("0",d_a-ac)else baa[_y]=bb("0",d_a)end;if caa[_y]=bb("f",d_a)end end;cc,dc,_d=aaa,baa,caa;ac,bc=d_a,_aa end}end return function(db)local _c={} -local ac={creator="Bimg Library by NyoriE",date=os.date("!%Y-%m-%dT%TZ")}local bc,cc=0,0;local dc={} +local ac={creator="Bimg Library by NyoriE",date=os.date("!%Y-%m-%dT%TZ")}local bc,cc=0,0;if(db~=nil)then +if(db[1][1][1]~=nil)then bc,cc=ac.width or#db[1][1][1], +ac.height or#db[1]end end;local dc={} local function _d(cd,dd)cd=cd or#_c+1 -table.insert(_c,cd,cb(dd,dc))if(dd==nil)then _c[cd].setSize(bc,cc)end end;local function ad(cd)table.remove(_c,cd or#_c)end +local __a=cb(dd,dc)table.insert(_c,cd,__a)if(dd==nil)then +_c[cd].setSize(bc,cc)end;return __a end;local function ad(cd)table.remove(_c,cd or#_c)end local function bd(cd,dd) local __a=_c[cd] if(__a~=nil)then local a_a=cd+dd;if(a_a>=1)and(a_a<=#_c)then table.remove(_c,cd) @@ -3051,28 +867,2112 @@ bc=cd;cc=dd;for __a,a_a in pairs(_c)do a_a.setSize(cd,dd)end end,getFrame=functi _c[cd]~=nil)then return _c[cd].getFrame()end end,getFrameObjects=function()return _c end,getFrames=function()local cd={}for dd,__a in pairs(_c)do local a_a=__a.getFrame() table.insert(cd,a_a)end;return cd end,getFrameObject=function(cd)return -_c[cd]end,addFrame=function(cd)local dd=cb()if(#_c<=1)then +_c[cd]end,addFrame=function(cd)if(#_c<=1)then if(ac.animated==nil)then ac.animated=true end -if(ac.secondsPerFrame==nil)then ac.secondsPerFrame=0.2 end end;_d(cd)return dd end,removeFrame=function(cd) -ad(cd) -if(#_c<=1)then if(ac.animated==nil)then ac.animated=true end;if -(ac.secondsPerFrame==nil)then ac.secondsPerFrame=0.2 end end end,moveFrame=bd,setFrameData=function(cd,dd,__a) +if(ac.secondsPerFrame==nil)then ac.secondsPerFrame=0.2 end end;return _d(cd)end,removeFrame=ad,moveFrame=bd,setFrameData=function(cd,dd,__a) if( -_c[cd]~=nil)then _c[cd].setFrameData(dd,__a)end end,getFrameData=function(cd,dd)return _c[cd]~=nil and -_c[cd].getFrameData(dd)end,getSize=function()return +_c[cd]~=nil)then _c[cd].setFrameData(dd,__a)end end,getFrameData=function(cd,dd)if(_c[cd]~=nil)then return +_c[cd].getFrameData(dd)end end,getSize=function()return bc,cc end,setAnimation=function(cd)ac.animation=cd end,setMetadata=function(cd,dd)if(dd~=nil)then ac[cd]=dd else if( -type(cd)=="table")then ac=cd end end end,getMetadata=function(cd)return -cd~=nil and ac[cd]or ac end,createBimg=function() +type(cd)=="table")then ac=cd end end end,getMetadata=function(cd)if( +cd~=nil)then return ac[cd]else return ac end end,createBimg=function() local cd={} for dd,__a in pairs(_c)do local a_a=__a.getFrame()table.insert(cd,a_a)end;for dd,__a in pairs(ac)do cd[dd]=__a end;cd.width=bc;cd.height=cc;return cd end} -if(db~=nil)then for cd,dd in pairs(db)do -if(type(cd)=="string")then ac[cd]=dd else _d(cd,dd)end end +if(db~=nil)then +for cd,dd in pairs(db)do if(type(cd)=="string")then ac[cd]=dd end end +if(ac.width==nil)or(ac.height==nil)then +bc=ac.width or#db[1][1][1]cc=ac.height or#db[1]dc.updateSize(bc,cc,true)end +for cd,dd in pairs(db)do if(type(cd)=="number")then _d(cd,dd)end end else _d(1)end;return dc end end +aa["main"]=function(...)local ab=da("basaltEvent")() +local bb=da("loadObjects")local cb;local db=da("plugin")local _c=da("utils")local ac=da("basaltLogs") +local bc=_c.uuid;local cc=_c.wrapText;local dc=_c.tableCount;local _d=300;local ad=0;local bd=0;local cd={} +local dd=term.current()local __a="1.7.0" +local a_a=fs.getDir(table.pack(...)[2]or"")local b_a,c_a,d_a,_aa,aaa={},{},{},{},{}local baa,caa,daa,_ba;local aba={}if not term.isColor or +not term.isColor()then +error('Basalt requires an advanced (golden) computer to run.',0)end;local bba={} +for adb,bdb in +pairs(colors)do if(type(bdb)=="number")then +bba[adb]={dd.getPaletteColor(bdb)}end end +local function cba()_ba=false;dd.clear()dd.setCursorPos(1,1) +for adb,bdb in pairs(colors)do if(type(bdb)== +"number")then +dd.setPaletteColor(bdb,colors.packRGB(table.unpack(bba[adb])))end end end +local function dba(adb) +assert(adb~="function","Schedule needs a function in order to work!") +return function(...)local bdb=coroutine.create(adb) +local cdb,ddb=coroutine.resume(bdb,...) +if(cdb)then table.insert(aaa,bdb)else aba.basaltError(ddb)end end end;aba.log=function(...)ac(...)end +local _ca=function(adb,bdb)_aa[adb]=bdb end;local aca=function(adb)return _aa[adb]end +local bca=function()return cb end;local cca=function(adb)return bca()[adb]end;local dca=function(adb,bdb,cdb)return +cca(bdb)(cdb,adb)end +local _da={getDynamicValueEventSetting=function()return +aba.dynamicValueEvents end,getMainFrame=function()return baa end,setVariable=_ca,getVariable=aca,setMainFrame=function(adb)baa=adb end,getActiveFrame=function()return +caa end,setActiveFrame=function(adb)caa=adb end,getFocusedObject=function()return daa end,setFocusedObject=function(adb)daa=adb end,getMonitorFrame=function(adb)return +d_a[adb]or monGroups[adb][1]end,setMonitorFrame=function(adb,bdb,cdb)if( +baa==bdb)then baa=nil end;if(cdb)then monGroups[adb]={bdb,sides}else +d_a[adb]=bdb end +if(bdb==nil)then monGroups[adb]=nil end end,getTerm=function()return +dd end,schedule=dba,stop=cba,debug=aba.debug,log=aba.log,getObjects=bca,getObject=cca,createObject=dca,getDirectory=function()return a_a end} +local function ada(adb)dd.clear()dd.setBackgroundColor(colors.black) +dd.setTextColor(colors.red)local bdb,cdb=dd.getSize()if(aba.logging)then ac(adb,"Error")end;local ddb=cc( +"Basalt error: "..adb,bdb)local __c=1;for a_c,b_c in pairs(ddb)do +dd.setCursorPos(1,__c)dd.write(b_c)__c=__c+1 end;dd.setCursorPos(1, +__c+1)_ba=false end +local function bda(adb,bdb,cdb,ddb,__c) +if(#aaa>0)then local a_c={} +for n=1,#aaa do +if(aaa[n]~=nil)then if -(ac.width==nil)or(ac.height==nil)then for cd,dd in pairs(_c)do local __a,a_a=dd.getSize()if(__a>bc)then __a=bc end -if(a_a>cc)then a_a=cc end end -dc.updateSize(bc,cc,true)end else _d(1)end;return dc end end -aa["libraries"]["tHex"]=function(...) +(coroutine.status(aaa[n])=="suspended")then +local b_c,c_c=coroutine.resume(aaa[n],adb,bdb,cdb,ddb,__c)if not(b_c)then aba.basaltError(c_c)end else +table.insert(a_c,n)end end end +for n=1,#a_c do table.remove(aaa,a_c[n]- (n-1))end end end +local function cda()if(_ba==false)then return end;if(baa~=nil)then baa:render() +baa:updateTerm()end;for adb,bdb in pairs(d_a)do bdb:render() +bdb:updateTerm()end end;local dda,__b,a_b=nil,nil,nil;local b_b=nil +local function c_b(adb,bdb,cdb,ddb)dda,__b,a_b=bdb,cdb,ddb;if(b_b==nil)then +b_b=os.startTimer(_d/1000)end end +local function d_b()b_b=nil;baa:hoverHandler(__b,a_b,dda)caa=baa end;local _ab,aab,bab=nil,nil,nil;local cab=nil;local function dab()cab=nil;baa:dragHandler(_ab,aab,bab) +caa=baa end;local function _bb(adb,bdb,cdb,ddb)_ab,aab,bab=bdb,cdb,ddb +if(ad<50)then dab()else if(cab==nil)then cab=os.startTimer( +ad/1000)end end end +local abb=nil;local function bbb()abb=nil;cda()end +local function cbb(adb)if(bd<50)then cda()else if(abb==nil)then +abb=os.startTimer(bd/1000)end end end +local function dbb(adb,...)local bdb={...}if +(ab:sendEvent("basaltEventCycle",adb,...)==false)then return end +if(adb=="terminate")then aba.stop()end +if(baa~=nil)then +local cdb={mouse_click=baa.mouseHandler,mouse_up=baa.mouseUpHandler,mouse_scroll=baa.scrollHandler,mouse_drag=_bb,mouse_move=c_b}local ddb=cdb[adb] +if(ddb~=nil)then ddb(baa,...)bda(adb,...)cbb()return end end +if(adb=="monitor_touch")then +for cdb,ddb in pairs(d_a)do if +(ddb:mouseHandler(1,bdb[2],bdb[3],true,bdb[1]))then caa=ddb end end;bda(adb,...)cbb()return end +if(caa~=nil)then +local cdb={char=caa.charHandler,key=caa.keyHandler,key_up=caa.keyUpHandler}local ddb=cdb[adb]if(ddb~=nil)then if(adb=="key")then b_a[bdb[1]]=true elseif(adb=="key_up")then +b_a[bdb[1]]=false end;ddb(caa,...)bda(adb,...) +cbb()return end end +if(adb=="timer")and(bdb[1]==b_b)then d_b()elseif +(adb=="timer")and(bdb[1]==cab)then dab()elseif(adb=="timer")and(bdb[1]==abb)then bbb()else for cdb,ddb in pairs(c_a)do +ddb:eventHandler(adb,...)end +for cdb,ddb in pairs(d_a)do ddb:eventHandler(adb,...)end;bda(adb,...)cbb()end end;local _cb=false;local acb=false +local function bcb() +if not(_cb)then +for adb,bdb in pairs(cd)do +if(fs.exists(bdb))then +if(fs.isDir(bdb))then +local cdb=fs.list(bdb) +for ddb,__c in pairs(cdb)do +if not(fs.isDir(bdb.."/"..__c))then +local a_c=__c:gsub(".lua","") +if +(a_c~="example.lua")and not(a_c:find(".disabled"))then +if(bb[a_c]==nil)then +bb[a_c]=da(bdb.."."..__c:gsub(".lua",""))else error("Duplicate object name: "..a_c)end end end end else local cdb=bdb:gsub(".lua","") +if(bb[cdb]==nil)then bb[cdb]=da(cdb)else error( +"Duplicate object name: "..cdb)end end end end;_cb=true end +if not(acb)then cb=db.loadPlugins(bb,_da)local adb=db.get("basalt") +if +(adb~=nil)then for cdb,ddb in pairs(adb)do +for __c,a_c in pairs(ddb(aba))do aba[__c]=a_c;_da[__c]=a_c end end end;local bdb=db.get("basaltInternal") +if(bdb~=nil)then for cdb,ddb in pairs(bdb)do for __c,a_c in pairs(ddb(aba))do +_da[__c]=a_c end end end;acb=true end end +local function ccb(adb)bcb() +for cdb,ddb in pairs(c_a)do if(ddb:getName()==adb)then return nil end end;local bdb=cb["BaseFrame"](adb,_da)bdb:init() +bdb:load()bdb:draw()table.insert(c_a,bdb) +if(baa==nil)and(bdb:getName()~= +"basaltDebuggingFrame")then bdb:show()end;return bdb end +aba={basaltError=ada,logging=false,dynamicValueEvents=false,drawFrames=cda,log=ac,getVersion=function()return __a end,memory=function()return +math.floor(collectgarbage("count")+0.5).."KB"end,addObject=function(adb)if +(fs.exists(adb))then table.insert(cd,adb)end end,addPlugin=function(adb) +db.addPlugin(adb)end,getAvailablePlugins=function()return db.getAvailablePlugins()end,getAvailableObjects=function() +local adb={}for bdb,cdb in pairs(bb)do table.insert(adb,bdb)end;return adb end,setVariable=_ca,getVariable=aca,getObjects=bca,getObject=cca,createObject=dca,setBaseTerm=function(adb) +dd=adb end,resetPalette=function() +for adb,bdb in pairs(colors)do if(type(bdb)=="number")then end end end,setMouseMoveThrottle=function(adb) +if(_HOST:find("CraftOS%-PC"))then if( +config.get("mouse_move_throttle")~=10)then +config.set("mouse_move_throttle",10)end +if(adb<100)then _d=100 else _d=adb end;return true end;return false end,setRenderingThrottle=function(adb)if( +adb<=0)then bd=0 else abb=nil;bd=adb end end,setMouseDragThrottle=function(adb)if +(adb<=0)then ad=0 else cab=nil;ad=adb end end,autoUpdate=function(adb)_ba=adb;if( +adb==nil)then _ba=true end;local function bdb()cda()while _ba do +dbb(os.pullEventRaw())end end +while _ba do +local cdb,ddb=xpcall(bdb,debug.traceback)if not(cdb)then aba.basaltError(ddb)end end end,update=function(adb,...) +if( +adb~=nil)then local bdb={...} +local cdb,ddb=xpcall(function()dbb(adb,table.unpack(bdb))end,debug.traceback)if not(cdb)then aba.basaltError(ddb)return end end end,stop=cba,stopUpdate=cba,isKeyDown=function(adb)if( +b_a[adb]==nil)then return false end;return b_a[adb]end,getFrame=function(adb)for bdb,cdb in +pairs(c_a)do if(cdb.name==adb)then return cdb end end end,getActiveFrame=function()return +caa end,setActiveFrame=function(adb) +if(adb:getType()=="Container")then caa=adb;return true end;return false end,getMainFrame=function()return baa end,onEvent=function(...) +for adb,bdb in +pairs(table.pack(...))do if(type(bdb)=="function")then +ab:registerEvent("basaltEventCycle",bdb)end end end,schedule=dba,addFrame=ccb,createFrame=ccb,addMonitor=function(adb) +bcb() +for cdb,ddb in pairs(c_a)do if(ddb:getName()==adb)then return nil end end;local bdb=cb["MonitorFrame"](adb,_da)bdb:init() +bdb:load()bdb:draw()table.insert(d_a,bdb)return bdb end,removeFrame=function(adb)c_a[adb]= +nil end,setProjectDir=function(adb)a_a=adb end}local dcb=db.get("basalt")if(dcb~=nil)then +for adb,bdb in pairs(dcb)do for cdb,ddb in pairs(bdb(aba))do +aba[cdb]=ddb;_da[cdb]=ddb end end end +local _db=db.get("basaltInternal")if(_db~=nil)then +for adb,bdb in pairs(_db)do for cdb,ddb in pairs(bdb(aba))do _da[cdb]=ddb end end end;return aba end;aa["objects"]={} +aa["objects"]["Dropdown"]=function(...)local ab=da("utils") +local bb=da("tHex") return -{[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"}end -aa["libraries"]["module"]=function(...)return function(ab)local bb,cb=pcall(da,ab) -return bb and cb or nil end end;return aa["main"]() \ No newline at end of file +function(cb,db)local _c=db.getObject("List")(cb,db)local ac="Dropdown" +_c:setSize(12,1)_c:setZIndex(6)local bc=true;local cc="left"local dc=0;local _d=0;local ad=0;local bd=true +local cd="\16"local dd="\31"local __a=false +local a_a={getType=function(b_a)return ac end,isType=function(b_a,c_a) +return ac==c_a or +_c.isType~=nil and _c.isType(c_a)or false end,load=function(b_a) +b_a:listenEvent("mouse_click",b_a)b_a:listenEvent("mouse_up",b_a) +b_a:listenEvent("mouse_scroll",b_a)b_a:listenEvent("mouse_drag",b_a)end,setOffset=function(b_a,c_a) +dc=c_a;b_a:updateDraw()return b_a end,getOffset=function(b_a)return dc end,addItem=function(b_a,c_a,...) +_c.addItem(b_a,c_a,...)if(bd)then _d=math.max(_d,#c_a)ad=ad+1 end;return b_a end,removeItem=function(b_a,c_a) +_c.removeItem(b_a,c_a)if(bd)then _d=0;ad=0 +for n=1,#list do _d=math.max(_d,#list[n].text)end;ad=#list end end,isOpened=function(b_a)return +__a end,setOpened=function(b_a,c_a)__a=c_a;b_a:updateDraw()return b_a end,setDropdownSize=function(b_a,c_a,d_a) +_d,ad=c_a,d_a;bd=false;b_a:updateDraw()return b_a end,setDropdownWidth=function(b_a,c_a)return +b_a:setDropdownSize(c_a,ad)end,setDropdownHeight=function(b_a,c_a) +return b_a:setDropdownSize(_d,c_a)end,getDropdownSize=function(b_a)return _d,ad end,getDropdownWidth=function(b_a)return _d end,getDropdownHeight=function(b_a)return ad end,mouseHandler=function(b_a,c_a,d_a,_aa,aaa) +if +(__a)then local caa,daa=b_a:getAbsolutePosition() +if(c_a==1)then local _ba=b_a:getAll() +if(# +_ba>0)then +for n=1,ad do +if(_ba[n+dc]~=nil)then +if +(caa<=d_a)and(caa+_d>d_a)and(daa+n==_aa)then b_a:setValue(_ba[n+dc])b_a:updateDraw() +local aba=b_a:sendEvent("mouse_click",b_a,"mouse_click",c_a,d_a,_aa)if(aba==false)then return aba end;if(aaa)then +db.schedule(function()sleep(0.1) +b_a:mouseUpHandler(c_a,d_a,_aa)end)()end;return true end end end end end end;local baa=_c:getBase() +if(baa.mouseHandler(b_a,c_a,d_a,_aa))then __a=not __a +b_a:getParent():setImportant(b_a)b_a:updateDraw()return true else +if(__a)then b_a:updateDraw()__a=false end;return false end end,mouseUpHandler=function(b_a,c_a,d_a,_aa) +if +(__a)then local aaa,baa=b_a:getAbsolutePosition() +if(c_a==1)then local caa=b_a:getAll() +if(# +caa>0)then +for n=1,ad do +if(caa[n+dc]~=nil)then +if +(aaa<=d_a)and(aaa+_d>d_a)and(baa+n==_aa)then __a=false;b_a:updateDraw() +local daa=b_a:sendEvent("mouse_up",b_a,"mouse_up",c_a,d_a,_aa)if(daa==false)then return daa end;return true end end end end end end end,dragHandler=function(b_a,c_a,d_a,_aa)if +(_c.dragHandler(b_a,c_a,d_a,_aa))then __a=true end end,scrollHandler=function(b_a,c_a,d_a,_aa) +if +(__a)then local aaa,baa=b_a:getAbsolutePosition()if +(d_a>=aaa)and(d_a<=aaa+_d)and(_aa>=baa)and(_aa<=baa+ad)then +b_a:setFocus()end end +if(__a)and(b_a:isFocused())then +local aaa,baa=b_a:getAbsolutePosition()if +(d_aaaa+_d)or(_aabaa+ad)then return false end;if(#b_a:getAll()<=ad)then return +false end;local caa=b_a:getAll()dc=dc+c_a +if(dc<0)then dc=0 end +if(c_a==1)then if(#caa>ad)then if(dc>#caa-ad)then dc=#caa-ad end else +dc=math.min(#caa-1,0)end end +local daa=b_a:sendEvent("mouse_scroll",b_a,"mouse_scroll",c_a,d_a,_aa)if(daa==false)then return daa end;b_a:updateDraw()return true end end,draw=function(b_a) +_c.draw(b_a)b_a:setDrawState("list",false) +b_a:addDraw("dropdown",function() +local c_a,d_a=b_a:getPosition()local _aa,aaa=b_a:getSize()local baa=b_a:getValue() +local caa=b_a:getAll()local daa,_ba=b_a:getBackground(),b_a:getForeground() +local aba=ab.getTextHorizontalAlign(( +baa~=nil and baa.text or""),_aa,cc):sub(1, +_aa-1).. (__a and dd or cd) +b_a:addBlit(1,1,aba,bb[_ba]:rep(#aba),bb[daa]:rep(#aba)) +if(__a)then b_a:addTextBox(1,2,_d,ad," ") +b_a:addBackgroundBox(1,2,_d,ad,daa)b_a:addForegroundBox(1,2,_d,ad,_ba) +for n=1,ad do +if(caa[n+dc]~=nil)then local bba=ab.getTextHorizontalAlign(caa[ +n+dc].text,_d,cc) +if( +caa[n+dc]==baa)then +if(bc)then local cba,dba=b_a:getSelectionColor() +b_a:addBlit(1,n+1,bba,bb[dba]:rep( +#bba),bb[cba]:rep(#bba))else +b_a:addBlit(1,n+1,bba,bb[caa[n+dc].fgCol]:rep(#bba),bb[caa[n+dc].bgCol]:rep( +#bba))end else +b_a:addBlit(1,n+1,bba,bb[caa[n+dc].fgCol]:rep(#bba),bb[caa[n+dc].bgCol]:rep( +#bba))end end end end end)end}a_a.__index=a_a;return setmetatable(a_a,_c)end end +aa["objects"]["Menubar"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("List")(cb,db)local ac="Menubar"local bc={}_c:setSize(30,1)_c:setZIndex(5)local cc=0 +local dc,_d=1,1;local ad=true +local function bd()local cd=0;local dd=_c:getWidth()local __a=_c:getAll()for n=1,#__a do cd=cd+ +__a[n].text:len()+dc*2 end;return +math.max(cd-dd,0)end +bc={init=function(cd)local dd=cd:getParent()cd:listenEvent("mouse_click") +cd:listenEvent("mouse_drag")cd:listenEvent("mouse_scroll")return _c.init(cd)end,getType=function(cd)return +ac end,getBase=function(cd)return _c end,setSpace=function(cd,dd)dc=dd or dc;cd:updateDraw() +return cd end,getSpace=function(cd)return dc end,setScrollable=function(cd,dd)ad=dd +if(dd==nil)then ad=true end;return cd end,getScrollable=function(cd)return ad end,mouseHandler=function(cd,dd,__a,a_a) +if +(_c:getBase().mouseHandler(cd,dd,__a,a_a))then local b_a,c_a=cd:getAbsolutePosition()local d_a,_aa=cd:getSize()local aaa=0 +local baa=cd:getAll() +for n=1,#baa do +if(baa[n]~=nil)then +if +(b_a+aaa<=__a+cc)and( +b_a+aaa+baa[n].text:len()+ (dc*2)>__a+cc)and(c_a==a_a)then +cd:setValue(baa[n])cd:sendEvent(event,cd,event,0,__a,a_a,baa[n])end;aaa=aaa+baa[n].text:len()+dc*2 end end;cd:updateDraw()return true end end,scrollHandler=function(cd,dd,__a,a_a) +if +(_c:getBase().scrollHandler(cd,dd,__a,a_a))then if(ad)then cc=cc+dd;if(cc<0)then cc=0 end;local b_a=bd()if(cc>b_a)then cc=b_a end +cd:updateDraw()end;return true end;return false end,draw=function(cd) +_c.draw(cd) +cd:addDraw("list",function()local dd=cd:getParent()local __a,a_a=cd:getSize()local b_a=""local c_a="" +local d_a=""local _aa,aaa=cd:getSelectionColor() +for baa,caa in pairs(cd:getAll())do +local daa= +(" "):rep(dc)..caa.text.. (" "):rep(dc)b_a=b_a..daa +if(caa==cd:getValue())then c_a=c_a.. +bb[_aa or caa.bgCol or +cd:getBackground()]:rep(daa:len())d_a=d_a.. +bb[aaa or +caa.FgCol or cd:getForeground()]:rep(daa:len())else c_a=c_a.. +bb[caa.bgCol or +cd:getBackground()]:rep(daa:len())d_a=d_a.. +bb[caa.FgCol or +cd:getForeground()]:rep(daa:len())end end +cd:addBlit(1,1,b_a:sub(cc+1,__a+cc),d_a:sub(cc+1,__a+cc),c_a:sub(cc+1,__a+cc))end)end}bc.__index=bc;return setmetatable(bc,_c)end end +aa["objects"]["Slider"]=function(...)local ab=da("tHex") +return +function(bb,cb) +local db=cb.getObject("ChangeableObject")(bb,cb)local _c="Slider"db:setSize(12,1)db:setValue(1) +db:setBackground(false,"\140",colors.black)local ac="horizontal"local bc=" "local cc=colors.black;local dc=colors.gray;local _d=12;local ad=1 +local bd=1 +local function cd(__a,a_a,b_a,c_a)local d_a,_aa=__a:getPosition()local aaa,baa=__a:getSize()local caa= +ac=="vertical"and baa or aaa +for i=0,caa do +if + +( +(ac=="vertical"and _aa+i==c_a)or(ac=="horizontal"and d_a+i==b_a))and(d_a<=b_a)and(d_a+aaa>b_a)and(_aa<=c_a)and +(_aa+baa>c_a)then ad=math.min(i+1,caa- (# +bc+bd-2)) +__a:setValue(_d/caa*ad)__a:updateDraw()end end end +local dd={getType=function(__a)return _c end,load=function(__a)__a:listenEvent("mouse_click") +__a:listenEvent("mouse_drag")__a:listenEvent("mouse_scroll")end,setSymbol=function(__a,a_a) +bc=a_a:sub(1,1)__a:updateDraw()return __a end,getSymbol=function(__a)return bc end,setIndex=function(__a,a_a) +ad=a_a;if(ad<1)then ad=1 end;local b_a,c_a=__a:getSize() +ad=math.min(ad,( +ac=="vertical"and c_a or b_a)- (bd-1)) +__a:setValue(_d/ (ac=="vertical"and c_a or b_a)*ad)__a:updateDraw()return __a end,getIndex=function(__a)return +ad end,setMaxValue=function(__a,a_a)_d=a_a;return __a end,getMaxValue=function(__a)return _d end,setSymbolColor=function(__a,a_a) +symbolColor=a_a;__a:updateDraw()return __a end,getSymbolColor=function(__a) +return symbolColor end,setBarType=function(__a,a_a)ac=a_a:lower()__a:updateDraw()return __a end,getBarType=function(__a)return +ac end,mouseHandler=function(__a,a_a,b_a,c_a)if(db.mouseHandler(__a,a_a,b_a,c_a))then cd(__a,a_a,b_a,c_a)return +true end;return false end,dragHandler=function(__a,a_a,b_a,c_a)if +(db.dragHandler(__a,a_a,b_a,c_a))then cd(__a,a_a,b_a,c_a)return true end +return false end,scrollHandler=function(__a,a_a,b_a,c_a) +if +(db.scrollHandler(__a,a_a,b_a,c_a))then local d_a,_aa=__a:getSize()ad=ad+a_a;if(ad<1)then ad=1 end +ad=math.min(ad,( +ac=="vertical"and _aa or d_a)- (bd-1)) +__a:setValue(_d/ (ac=="vertical"and _aa or d_a)*ad)__a:updateDraw()return true end;return false end,draw=function(__a) +db.draw(__a) +__a:addDraw("slider",function()local a_a,b_a=__a:getSize() +local c_a,d_a=__a:getBackground(),__a:getForeground() +if(ac=="horizontal")then __a:addText(ad,oby,bc:rep(bd)) +if(dc~=false)then __a:addBG(ad,1,ab[dc]:rep( +#bc*bd))end;if(cc~=false)then +__a:addFG(ad,1,ab[cc]:rep(#bc*bd))end end +if(ac=="vertical")then +for n=0,b_a-1 do +if(ad==n+1)then for curIndexOffset=0,math.min(bd-1,b_a)do +__a:addBlit(1,1 +n+curIndexOffset,bc,ab[symbolColor],ab[symbolColor])end else if(n+1 +ad-1 +bd)then +__a:addBlit(1,1 +n,bgSymbol,ab[d_a],ab[c_a])end end end end end)end}dd.__index=dd;return setmetatable(dd,db)end end +aa["objects"]["Flexbox"]=function(...) +local function ab(bb,cb)local db=0;local _c=0;local ac=6 +local bc={getFlexGrow=function(cc)return db end,setFlexGrow=function(cc,dc)db=dc;return cc end,getFlexShrink=function(cc)return +_c end,setFlexShrink=function(cc,dc)_c=dc;return cc end,getFlexBasis=function(cc)return ac end,setFlexBasis=function(cc,dc)ac=dc;return cc end}for cc,dc in pairs(bc)do bb[cc]=dc end;return bb end +return +function(bb,cb) +local db=cb.getObject("ScrollableFrame")(bb,cb)local _c="Flexbox"local ac="row"local bc=1;local cc="flex-start"local dc="nowrap"local _d={}local ad={} +local bd=false +local cd=ab({getHeight=function(d_a)return 0 end,getWidth=function(d_a)return 0 end,getPosition=function(d_a)return 0,0 end,getSize=function(d_a)return 0,0 end,isType=function(d_a)return +false end,getType=function(d_a)return"lineBreakFakeObject"end,setPosition=function(d_a)end,setSize=function(d_a)end}) +local function dd(d_a) +if(dc=="nowrap")then ad={}local _aa=1;local aaa=1;local baa=1 +for caa,daa in pairs(_d)do if(ad[_aa]==nil)then +ad[_aa]={offset=1}end +local _ba=ac=="row"and daa:getHeight()or daa:getWidth()if _ba>aaa then aaa=_ba end +if(daa==cd)then baa=baa+aaa+bc;aaa=1;_aa=_aa+1 +ad[_aa]={offset=baa,daa}else table.insert(ad[_aa],daa)end end elseif(dc=="wrap")then ad={}local _aa=1;local aaa=1;local baa=ac=="row"and d_a:getWidth()or +d_a:getHeight()local caa=0;local daa=1 +for _ba,aba in pairs(_d)do if( +ad[daa]==nil)then ad[daa]={offset=1}end;local bba= +ac=="row"and aba:getHeight()or aba:getWidth()if bba>_aa then +_aa=bba end +if aba==cd then aaa=aaa+_aa+bc;_aa=1;daa=daa+1 +ad[daa]={offset=aaa,aba}else +local cba=ac=="row"and aba:getWidth()or aba:getHeight() +if(cba+caa>baa)then aaa=aaa+_aa+bc;_aa=ac=="row"and aba:getHeight()or +aba:getWidth()daa=daa+1;caa=0 +ad[daa]={offset=aaa,aba}else caa=caa+cba;table.insert(ad[daa],aba)end end end end end +local function __a(d_a,_aa)local aaa,baa=d_a:getSize()local caa=0;local daa=0;local _ba=0 +for cba,dba in ipairs(_aa)do caa=caa+ +dba:getFlexGrow()daa=daa+dba:getFlexShrink()_ba=_ba+ +dba:getFlexBasis()end;local aba=aaa-_ba- (bc* (#_aa-1))local bba=1 +for cba,dba in ipairs(_aa)do +if(dba~=cd)then +local _ca;local aca=dba:getFlexGrow()local bca=dba:getFlexShrink()if caa>0 then _ca= +dba:getFlexBasis()+aca/caa*aba else +_ca=dba:getFlexBasis()end +if aba<0 and daa>0 then _ca= +dba:getFlexBasis()+bca/daa*aba end;dba:setPosition(bba,_aa.offset or 1) +dba:setSize(_ca,dba:getHeight())cb.log(_aa.offset)bba=bba+_ca+bc end end +if cc=="flex-end"then local cba=bba-bc;local dba=aaa-cba+1 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca+dba,cca)end elseif cc=="center"then local cba=bba-bc;local dba=(aaa-cba)/2 +1 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca+dba,cca)end elseif cc=="space-between"then local cba=bba-bc +local dba=(aaa-cba)/ (#_aa-1)+1 +for _ca,aca in ipairs(_aa)do if _ca>1 then local bca,cca=aca:getPosition() +aca:setPosition(bca+dba* (_ca-1),cca)end end elseif cc=="space-around"then local cba=bba-bc;local dba=(aaa-cba)/#_aa +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca+dba*_ca-dba/2,cca)end elseif cc=="space-evenly"then local cba=#_aa+1;local dba=0;for cca,dca in ipairs(_aa)do +dba=dba+dca:getWidth()end;local _ca=aaa-dba +local aca=math.floor(_ca/cba)local bca=_ca-aca*cba;bba=aca+ (bca>0 and 1 or 0)bca=bca> +0 and bca-1 or 0 +for cca,dca in ipairs(_aa)do +dca:setPosition(bba,1) +bba=bba+dca:getWidth()+aca+ (bca>0 and 1 or 0)bca=bca>0 and bca-1 or 0 end end end +local function a_a(d_a,_aa)local aaa,baa=d_a:getSize()local caa=0;local daa=0;local _ba=0 +for cba,dba in ipairs(_aa)do caa=caa+ +dba:getFlexGrow()daa=daa+dba:getFlexShrink()_ba=_ba+ +dba:getFlexBasis()end;local aba=baa-_ba- (bc* (#_aa-1))local bba=1 +for cba,dba in ipairs(_aa)do +if(dba~=cd)then +local _ca;local aca=dba:getFlexGrow()local bca=dba:getFlexShrink()if caa>0 then _ca= +dba:getFlexBasis()+aca/caa*aba else +_ca=dba:getFlexBasis()end +if aba<0 and daa>0 then _ca= +dba:getFlexBasis()+bca/daa*aba end;dba:setPosition(_aa.offset,bba) +dba:setSize(dba:getWidth(),_ca)bba=bba+_ca+bc end end +if cc=="flex-end"then local cba=bba-bc;local dba=baa-cba+1 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca,cca+dba)end elseif cc=="center"then local cba=bba-bc;local dba=(baa-cba)/2 +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca,cca+dba)end elseif cc=="space-between"then local cba=bba-bc +local dba=(baa-cba)/ (#_aa-1)+1 +for _ca,aca in ipairs(_aa)do if _ca>1 then local bca,cca=aca:getPosition() +aca:setPosition(bca,cca+dba* (_ca-1))end end elseif cc=="space-around"then local cba=bba-bc;local dba=(baa-cba)/#_aa +for _ca,aca in ipairs(_aa)do +local bca,cca=aca:getPosition()aca:setPosition(bca,cca+dba*_ca-dba/2)end elseif cc=="space-evenly"then local cba=#_aa+1;local dba=0;for cca,dca in ipairs(_aa)do +dba=dba+dca:getHeight()end;local _ca=baa-dba +local aca=math.floor(_ca/cba)local bca=_ca-aca*cba;bba=aca+ (bca>0 and 1 or 0)bca=bca> +0 and bca-1 or 0 +for cca,dca in ipairs(_aa)do +local _da,ada=dca:getPosition()dca:setPosition(_da,bba)bba= +bba+dca:getHeight()+aca+ (bca>0 and 1 or 0)bca=bca>0 and +bca-1 or 0 end end end +local function b_a(d_a)dd(d_a) +if ac=="row"then for _aa,aaa in pairs(ad)do __a(d_a,aaa)end else for _aa,aaa in pairs(ad)do +a_a(d_a,aaa)end end;bd=false end +local c_a={getType=function()return _c end,isType=function(d_a,_aa)return +_c==_aa or db.isType~=nil and db.isType(_aa)or false end,setJustifyContent=function(d_a,_aa) +cc=_aa;bd=true;return d_a end,getJustifyContent=function(d_a)return cc end,setDirection=function(d_a,_aa)ac=_aa;bd=true;return d_a end,getDirection=function(d_a)return +ac end,setSpacing=function(d_a,_aa)bc=_aa;bd=true;return d_a end,getSpacing=function(d_a)return bc end,setFlexWrap=function(d_a,_aa) +dc=_aa;bd=true;return d_a end,updateLayout=function(d_a)bd=true end,addBreak=function(d_a) +table.insert(_d,cd)bd=true;return d_a end,draw=function(d_a)db.draw(d_a) +d_a:addDraw("flexboxDraw",function()if bd then +b_a(d_a)end end,1)end} +for d_a,_aa in pairs(cb.getObjects())do +c_a["add"..d_a]=function(aaa,baa) +local caa=ab(db["add"..d_a](aaa,baa),cb)table.insert(_d,caa)bd=true;return caa end end;c_a.__index=c_a;return setmetatable(c_a,db)end end +aa["objects"]["MovableFrame"]=function(...) +local ab,bb,cb,db=math.max,math.min,string.sub,string.rep +return +function(_c,ac)local bc=ac.getObject("Frame")(_c,ac)local cc="MovableFrame" +local dc;local _d,ad,bd=0,0,false;local cd={{x1=1,x2="width",y1=1,y2=1}} +local dd={getType=function()return cc end,setDraggingMap=function(__a,a_a) +cd=a_a;return __a end,getDraggingMap=function(__a)return cd end,isType=function(__a,a_a) +return cc==a_a or(bc.isType~=nil and +bc.isType(a_a))or false end,getBase=function(__a)return bc end,load=function(__a) +bc.load(__a)__a:listenEvent("mouse_click") +__a:listenEvent("mouse_up")__a:listenEvent("mouse_drag")end,removeChildren=function(__a) +bc.removeChildren(__a)__a:listenEvent("mouse_click") +__a:listenEvent("mouse_up")__a:listenEvent("mouse_drag")end,dragHandler=function(__a,a_a,b_a,c_a) +if +(bc.dragHandler(__a,a_a,b_a,c_a))then +if(bd)then local d_a,_aa=dc:getOffset() +d_a=d_a<0 and math.abs(d_a)or-d_a;_aa=_aa<0 and math.abs(_aa)or-_aa;local aaa=1 +local baa=1;aaa,baa=dc:getAbsolutePosition() +__a:setPosition(b_a+_d- (aaa-1)+d_a, +c_a+ad- (baa-1)+_aa)__a:updateDraw()end;return true end end,mouseHandler=function(__a,a_a,b_a,c_a,...) +if +(bc.mouseHandler(__a,a_a,b_a,c_a,...))then dc:setImportant(__a)local d_a,_aa=__a:getAbsolutePosition() +local aaa,baa=__a:getSize() +for caa,daa in pairs(cd)do local _ba,aba=daa.x1 =="width"and aaa or daa.x1,daa.x2 =="width"and +aaa or daa.x2;local bba,cba= +daa.y1 =="height"and baa or daa.y1, +daa.y2 =="height"and baa or daa.y2 +if +(b_a>= +d_a+_ba-1)and(b_a<=d_a+aba-1)and(c_a>=_aa+bba-1)and(c_a<=_aa+cba-1)then bd=true +_d=d_a-b_a;ad=_aa-c_a;return true end end;return true end end,mouseUpHandler=function(__a,...) +bd=false;return bc.mouseUpHandler(__a,...)end,setParent=function(__a,a_a,...) +bc.setParent(__a,a_a,...)dc=a_a;return __a end}dd.__index=dd;return setmetatable(dd,bc)end end +aa["objects"]["ScrollableFrame"]=function(...) +local ab,bb,cb,db=math.max,math.min,string.sub,string.rep +return +function(_c,ac)local bc=ac.getObject("Frame")(_c,ac) +local cc="ScrollableFrame"local dc;local _d=0;local ad=0;local bd=true +local function cd(b_a)local c_a=0;local d_a=b_a:getChildren() +for _aa,aaa in pairs(d_a)do +if( +aaa.element.getWidth~=nil)and(aaa.element.getX~=nil)then +local baa,caa=aaa.element:getWidth(),aaa.element:getX()local daa=b_a:getWidth() +if +(aaa.element:getType()=="Dropdown")then if(aaa.element:isOpened())then +local _ba=aaa.element:getDropdownSize() +if(_ba+caa-daa>=c_a)then c_a=ab(_ba+caa-daa,0)end end end +if(h+caa-daa>=c_a)then c_a=ab(baa+caa-daa,0)end end end;return c_a end +local function dd(b_a)local c_a=0;local d_a=b_a:getChildren() +for _aa,aaa in pairs(d_a)do +if +(aaa.element.getHeight~=nil)and(aaa.element.getY~=nil)then +local baa,caa=aaa.element:getHeight(),aaa.element:getY()local daa=b_a:getHeight() +if +(aaa.element:getType()=="Dropdown")then if(aaa.element:isOpened())then +local _ba,aba=aaa.element:getDropdownSize() +if(aba+caa-daa>=c_a)then c_a=ab(aba+caa-daa,0)end end end +if(baa+caa-daa>=c_a)then c_a=ab(baa+caa-daa,0)end end end;return c_a end +local function __a(b_a,c_a)local d_a,_aa=b_a:getOffset()local aaa +if(_d==1)then +aaa=bd and cd(b_a)or ad +b_a:setOffset(bb(aaa,ab(0,d_a+c_a)),_aa)elseif(_d==0)then aaa=bd and dd(b_a)or ad +b_a:setOffset(d_a,bb(aaa,ab(0,_aa+c_a)))end;b_a:updateDraw()end +local a_a={getType=function()return cc end,isType=function(b_a,c_a)return +cc==c_a or bc.isType~=nil and bc.isType(c_a)or false end,setDirection=function(b_a,c_a)_d= +c_a=="horizontal"and 1 or c_a=="vertical"and 0 or +_d;return b_a end,setScrollAmount=function(b_a,c_a) +ad=c_a;bd=false;return b_a end,getBase=function(b_a)return bc end,load=function(b_a)bc.load(b_a) +b_a:listenEvent("mouse_scroll")end,removeChildren=function(b_a)bc.removeChildren(b_a) +b_a:listenEvent("mouse_scroll")end,setParent=function(b_a,c_a,...)bc.setParent(b_a,c_a,...) +dc=c_a;return b_a end,scrollHandler=function(b_a,c_a,d_a,_aa) +if +(bc:getBase().scrollHandler(b_a,c_a,d_a,_aa))then b_a:sortChildren() +for aaa,baa in +ipairs(b_a:getEvents("mouse_scroll"))do +if(baa.element.scrollHandler~=nil)then local caa,daa=0,0;if(b_a.getOffset~=nil)then +caa,daa=b_a:getOffset()end +if(baa.element.getIgnoreOffset())then caa,daa=0,0 end;if(baa.element.scrollHandler(baa.element,c_a,d_a+caa,_aa+daa))then +return true end end end;__a(b_a,c_a,d_a,_aa)b_a:clearFocusedChild()return true end end,draw=function(b_a) +bc.draw(b_a) +b_a:addDraw("scrollableFrame",function()if(bd)then __a(b_a,0)end end,0)end}a_a.__index=a_a;return setmetatable(a_a,bc)end end +aa["objects"]["Switch"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("ChangeableObject")(ab,bb)local db="Switch"cb:setSize(4,1)cb:setValue(false) +cb:setZIndex(5)local _c=colors.black;local ac=colors.red;local bc=colors.green +local cc={getType=function(dc)return db end,setSymbol=function(dc,_d) +_c=_d;return dc end,getSymbol=function(dc)return _c end,setActiveBackground=function(dc,_d)bc=_d;return dc end,getActiveBackground=function(dc)return bc end,setInactiveBackground=function(dc,_d) +ac=_d;return dc end,getInactiveBackground=function(dc)return ac end,load=function(dc) +dc:listenEvent("mouse_click")end,mouseHandler=function(dc,...) +if(cb.mouseHandler(dc,...))then +dc:setValue(not dc:getValue())dc:updateDraw()return true end end,draw=function(dc)cb.draw(dc) +dc:addDraw("switch",function() +local _d=dc:getParent()local ad,bd=dc:getBackground(),dc:getForeground() +local cd,dd=dc:getSize() +if(dc:getValue())then dc:addBackgroundBox(1,1,cd,dd,bc) +dc:addBackgroundBox(cd,1,1,dd,_c)else dc:addBackgroundBox(1,1,cd,dd,ac) +dc:addBackgroundBox(1,1,1,dd,_c)end end)end}cc.__index=cc;return setmetatable(cc,cb)end end +aa["objects"]["Scrollbar"]=function(...)local ab=da("tHex") +return +function(bb,cb) +local db=cb.getObject("VisualObject")(bb,cb)local _c="Scrollbar"db:setZIndex(2)db:setSize(1,8) +db:setBackground(colors.lightGray,"\127",colors.gray)local ac="vertical"local bc=" "local cc=colors.black;local dc=colors.black;local _d=3;local ad=1 +local bd=1;local cd=true +local function dd()local b_a,c_a=db:getSize()if(cd)then +bd=math.max((ac=="vertical"and c_a or +b_a- (#bc))- (_d-1),1)end end;dd() +local function __a(b_a,c_a,d_a,_aa)local aaa,baa=b_a:getAbsolutePosition() +local caa,daa=b_a:getSize()dd()local _ba=ac=="vertical"and daa or caa +for i=0,_ba do +if + +( ( +ac=="vertical"and baa+i==_aa)or(ac=="horizontal"and aaa+i==d_a))and(aaa<=d_a)and(aaa+caa>d_a)and(baa<=_aa)and +(baa+daa>_aa)then ad=math.min(i+1, +_ba- (#bc+bd-2)) +b_a:scrollbarMoveHandler()b_a:updateDraw()end end end +local a_a={getType=function(b_a)return _c end,load=function(b_a)db.load(b_a)local c_a=b_a:getParent() +b_a:listenEvent("mouse_click")b_a:listenEvent("mouse_up") +b_a:listenEvent("mouse_scroll")b_a:listenEvent("mouse_drag")end,setSymbol=function(b_a,c_a,d_a,_aa) +bc=c_a:sub(1,1)cc=d_a or cc;dc=_aa or dc;dd()b_a:updateDraw()return b_a end,setSymbolBG=function(b_a,c_a)return b_a:setSymbol(bc,c_a, +nil)end,setSymbolFG=function(b_a,c_a)return +b_a:setSymbol(bc,nil,c_a)end,getSymbol=function(b_a)return bc end,getSymbolBG=function(b_a)return cc end,getSymbolFG=function(b_a)return +dc end,setIndex=function(b_a,c_a)ad=c_a;if(ad<1)then ad=1 end;local d_a,_aa=b_a:getSize()dd() +b_a:updateDraw()return b_a end,setScrollAmount=function(b_a,c_a)_d=c_a;dd() +b_a:updateDraw()return b_a end,getScrollAmount=function(b_a)return _d end,getIndex=function(b_a) +local c_a,d_a=b_a:getSize()return +_d> (ac=="vertical"and d_a or c_a)and +math.floor(_d/ ( +ac=="vertical"and d_a or c_a)*ad)or ad end,setSymbolSize=function(b_a,c_a)bd= +tonumber(c_a)or 1;cd=c_a~=false and false or true +dd()b_a:updateDraw()return b_a end,getSymbolSize=function(b_a)return +bd end,setBarType=function(b_a,c_a)ac=c_a:lower()dd()b_a:updateDraw()return b_a end,getBarType=function(b_a)return +ac end,mouseHandler=function(b_a,c_a,d_a,_aa,...)if(db.mouseHandler(b_a,c_a,d_a,_aa,...))then +__a(b_a,c_a,d_a,_aa)return true end;return false end,dragHandler=function(b_a,c_a,d_a,_aa)if +(db.dragHandler(b_a,c_a,d_a,_aa))then __a(b_a,c_a,d_a,_aa)return true end;return +false end,setSize=function(b_a,...) +db.setSize(b_a,...)dd()return b_a end,scrollHandler=function(b_a,c_a,d_a,_aa) +if(db.scrollHandler(b_a,c_a,d_a,_aa))then +local aaa,baa=b_a:getSize()dd()ad=ad+c_a;if(ad<1)then ad=1 end +ad=math.min(ad, +(ac=="vertical"and baa or aaa)- (ac=="vertical"and bd-1 or#bc+bd-2))b_a:scrollbarMoveHandler()b_a:updateDraw()end end,onChange=function(b_a,...) +for c_a,d_a in +pairs(table.pack(...))do if(type(d_a)=="function")then +b_a:registerEvent("scrollbar_moved",d_a)end end;return b_a end,scrollbarMoveHandler=function(b_a) +b_a:sendEvent("scrollbar_moved",b_a:getIndex())end,customEventHandler=function(b_a,c_a,...) +db.customEventHandler(b_a,c_a,...)if(c_a=="basalt_FrameResize")then dd()end end,draw=function(b_a) +db.draw(b_a) +b_a:addDraw("scrollbar",function()local c_a=b_a:getParent()local d_a,_aa=b_a:getSize() +local aaa,baa=b_a:getBackground(),b_a:getForeground() +if(ac=="horizontal")then for n=0,_aa-1 do +b_a:addBlit(ad,1 +n,bc:rep(bd),ab[dc]:rep(#bc*bd),ab[cc]:rep( +#bc*bd))end elseif(ac=="vertical")then +for n=0,_aa-1 do +if(ad==n+1)then +for curIndexOffset=0,math.min( +bd-1,_aa)do +b_a:addBlit(1,ad+curIndexOffset,bc:rep(math.max(#bc,d_a)),ab[dc]:rep(math.max( +#bc,d_a)),ab[cc]:rep(math.max(#bc,d_a)))end end end end end)end}a_a.__index=a_a;return setmetatable(a_a,db)end end +aa["objects"]["Radio"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("List")(cb,db)local ac="Radio"_c:setSize(1,1)_c:setZIndex(5)local bc={} +local cc=colors.black;local dc=colors.green;local _d=colors.black;local ad=colors.red;local bd=true;local cd="\7" +local dd="left" +local __a={getType=function(a_a)return ac end,addItem=function(a_a,b_a,c_a,d_a,_aa,aaa,...)_c.addItem(a_a,b_a,_aa,aaa,...)table.insert(bc,{x=c_a or 1,y= +d_a or#bc*2}) +return a_a end,removeItem=function(a_a,b_a) +_c.removeItem(a_a,b_a)table.remove(bc,b_a)return a_a end,clear=function(a_a) +_c.clear(a_a)bc={}return a_a end,editItem=function(a_a,b_a,c_a,d_a,_aa,aaa,baa,...) +_c.editItem(a_a,b_a,c_a,aaa,baa,...)table.remove(bc,b_a) +table.insert(bc,b_a,{x=d_a or 1,y=_aa or 1})return a_a end,setBoxSelectionColor=function(a_a,b_a,c_a) +cc=b_a;dc=c_a;return a_a end,setBoxSelectionBG=function(a_a,b_a) +return a_a:setBoxSelectionColor(b_a,dc)end,setBoxSelectionFG=function(a_a,b_a) +return a_a:setBoxSelectionColor(cc,b_a)end,getBoxSelectionColor=function(a_a)return cc,dc end,getBoxSelectionBG=function(a_a)return cc end,getBoxSelectionFG=function(a_a) +return dc end,setBoxDefaultColor=function(a_a,b_a,c_a)_d=b_a;ad=c_a;return a_a end,setBoxDefaultBG=function(a_a,b_a)return +a_a:setBoxDefaultColor(b_a,ad)end,setBoxDefaultFG=function(a_a,b_a)return +a_a:setBoxDefaultColor(_d,b_a)end,getBoxDefaultColor=function(a_a)return _d,ad end,getBoxDefaultBG=function(a_a)return _d end,getBoxDefaultFG=function(a_a)return +ad end,mouseHandler=function(a_a,b_a,c_a,d_a,...) +if(#bc>0)then local _aa,aaa=a_a:getAbsolutePosition() +local baa=a_a:getAll() +for caa,daa in pairs(baa)do +if + +(_aa+bc[caa].x-1 <=c_a)and(_aa+bc[caa].x-1 + +daa.text:len()+1 >=c_a)and(aaa+bc[caa].y-1 ==d_a)then a_a:setValue(daa) +local _ba=a_a:sendEvent("mouse_click",a_a,"mouse_click",b_a,c_a,d_a,...)a_a:updateDraw()if(_ba==false)then return _ba end;return true end end end end,draw=function(a_a) +a_a:addDraw("radio",function() +local b_a,c_a=a_a:getSelectionColor()local d_a=a_a:getAll() +for _aa,aaa in pairs(d_a)do +if(aaa==a_a:getValue())then +a_a:addBlit(bc[_aa].x,bc[_aa].y,cd,bb[dc],bb[cc]) +a_a:addBlit(bc[_aa].x+2,bc[_aa].y,aaa.text,bb[c_a]:rep(#aaa.text),bb[b_a]:rep( +#aaa.text))else +a_a:addBackgroundBox(bc[_aa].x,bc[_aa].y,1,1,_d or colors.black) +a_a:addBlit(bc[_aa].x+2,bc[_aa].y,aaa.text,bb[aaa.fgCol]:rep(#aaa.text),bb[aaa.bgCol]:rep( +#aaa.text))end end;return true end)end}__a.__index=__a;return setmetatable(__a,_c)end end +aa["objects"]["MonitorFrame"]=function(...)local ab=da("basaltMon") +local bb,cb,db,_c=math.max,math.min,string.sub,string.rep +return +function(ac,bc)local cc=bc.getObject("BaseFrame")(ac,bc) +local dc="MonitorFrame"cc:setTerm(nil)local _d=false;local ad +local bd={getType=function()return dc end,isType=function(cd,dd) +return dc==dd or cc.isType~=nil and +cc.isType(dd)or false end,getBase=function(cd)return cc end,setMonitor=function(cd,dd) +if +(type(dd)=="string")then local __a=peripheral.wrap(dd) +if(__a~=nil)then cd:setTerm(__a)end elseif(type(dd)=="table")then cd:setTerm(dd)end;return cd end,setMonitorGroup=function(cd,dd) +ad=ab(dd)cd:setTerm(ad)_d=true;return cd end,render=function(cd)if(cd:getTerm()~= +nil)then cc.render(cd)end end,show=function(cd) +cc:getBase().show(cd)bc.setActiveFrame(cd) +for dd,__a in pairs(colors)do if(type(__a)=="number")then +termObject.setPaletteColor(__a,colors.packRGB(term.nativePaletteColor((__a))))end end +for dd,__a in pairs(colorTheme)do +if(type(__a)=="number")then +termObject.setPaletteColor( +type(dd)=="number"and dd or colors[dd],__a)else local a_a,b_a,c_a=table.unpack(__a) +termObject.setPaletteColor( +type(dd)=="number"and dd or colors[dd],a_a,b_a,c_a)end end;return cd end} +bd.mouseHandler=function(cd,dd,__a,a_a,b_a,c_a,...) +if(_d)then __a,a_a=ad.calculateClick(c_a,__a,a_a)end;cc.mouseHandler(cd,dd,__a,a_a,b_a,c_a,...)end;bd.__index=bd;return setmetatable(bd,cc)end end +aa["objects"]["VisualObject"]=function(...)local ab=da("utils")local bb=da("tHex") +local cb,db,_c=string.sub,string.find,table.insert +return +function(ac,bc)local cc=bc.getObject("Object")(ac,bc) +local dc="VisualObject"local _d,ad,bd,cd,dd=true,false,false,false,false;local __a=1;local a_a,b_a,c_a,d_a=1,1,1,1 +local _aa,aaa,baa,caa=0,0,0,0;local daa,_ba,aba=colors.black,colors.white,false;local bba;local cba={}local dba={}local _ca={} +local aca={} +local function bca(dca,_da)local ada={}if dca==""then return ada end;_da=_da or" "local bda=1 +local cda,dda=db(dca,_da,bda) +while cda do +_c(ada,{x=bda,value=cb(dca,bda,cda-1)})bda=dda+1;cda,dda=db(dca,_da,bda)end;_c(ada,{x=bda,value=cb(dca,bda)})return ada end +local cca={getType=function(dca)return dc end,getBase=function(dca)return cc end,isType=function(dca,_da) +return dc==_da or +cc.isType~=nil and cc.isType(_da)or false end,getBasalt=function(dca)return bc end,show=function(dca)_d=true +dca:updateDraw()return dca end,hide=function(dca)_d=false;dca:updateDraw()return dca end,isVisible=function(dca)return +_d end,setVisible=function(dca,_da)_d=_da or not _d;dca:updateDraw()return dca end,setTransparency=function(dca,_da)aba= +_da~=nil and _da or true;dca:updateDraw() +return dca end,setParent=function(dca,_da,ada) +cc.setParent(dca,_da,ada)bba=_da;return dca end,setFocus=function(dca)if(bba~=nil)then +bba:setFocusedChild(dca)end;return dca end,setZIndex=function(dca,_da)__a=_da +if +(bba~=nil)then bba:updateZIndex(dca,__a)dca:updateDraw()end;return dca end,getZIndex=function(dca)return __a end,updateDraw=function(dca)if( +bba~=nil)then bba:updateDraw()end;return dca end,setPosition=function(dca,_da,ada,bda) +local cda,dda=a_a,b_a +if(type(_da)=="number")then a_a=bda and a_a+_da or _da end +if(type(ada)=="number")then b_a=bda and b_a+ada or ada end;if(bba~=nil)then +bba:customEventHandler("basalt_FrameReposition",dca)end;if(dca:getType()=="Container")then +bba:customEventHandler("basalt_FrameReposition",dca)end;dca:updateDraw() +dca:repositionHandler(cda,dda)return dca end,getX=function(dca)return +a_a end,setX=function(dca,_da)return dca:setPosition(_da,b_a)end,getY=function(dca)return +b_a end,setY=function(dca,_da)return dca:setPosition(a_a,_da)end,getPosition=function(dca)return +a_a,b_a end,setSize=function(dca,_da,ada,bda)local cda,dda=c_a,d_a;if(type(_da)=="number")then c_a= +bda and c_a+_da or _da end;if +(type(ada)=="number")then d_a=bda and d_a+ada or ada end +if +(bba~=nil)then bba:customEventHandler("basalt_FrameResize",dca)if( +dca:getType()=="Container")then +bba:customEventHandler("basalt_FrameResize",dca)end end;dca:resizeHandler(cda,dda)dca:updateDraw()return dca end,getHeight=function(dca)return +d_a end,setHeight=function(dca,_da)return dca:setSize(c_a,_da)end,getWidth=function(dca)return +c_a end,setWidth=function(dca,_da)return dca:setSize(_da,d_a)end,getSize=function(dca)return +c_a,d_a end,setBackground=function(dca,_da)daa=_da;dca:updateDraw()return dca end,getBackground=function(dca)return +daa end,setForeground=function(dca,_da)_ba=_da or false;dca:updateDraw()return dca end,getForeground=function(dca)return +_ba end,getAbsolutePosition=function(dca,_da,ada)if(_da==nil)or(ada==nil)then +_da,ada=dca:getPosition()end +if(bba~=nil)then +local bda,cda=bba:getAbsolutePosition()_da=bda+_da-1;ada=cda+ada-1 end;return _da,ada end,ignoreOffset=function(dca,_da) +ad=_da;if(_da==nil)then ad=true end;return dca end,getIgnoreOffset=function(dca)return ad end,isCoordsInObject=function(dca,_da,ada) +if +(_d)and(dca:isEnabled())then +if(_da==nil)or(ada==nil)then return false end;local bda,cda=dca:getAbsolutePosition()local dda,__b=dca:getSize()if + +(bda<=_da)and(bda+dda>_da)and(cda<=ada)and(cda+__b>ada)then return true end end;return false end,onGetFocus=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("get_focus",ada)end end;return dca end,onLoseFocus=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("lose_focus",ada)end end;return dca end,isFocused=function(dca) +if( +bba~=nil)then return bba:getFocusedObject()==dca end;return true end,resizeHandler=function(dca,...) +if(dca:isEnabled())then +local _da=dca:sendEvent("basalt_resize",...)if(_da==false)then return false end end;return true end,repositionHandler=function(dca,...)if +(dca:isEnabled())then local _da=dca:sendEvent("basalt_reposition",...)if(_da==false)then +return false end end;return +true end,onResize=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("basalt_resize",ada)end end;return dca end,onReposition=function(dca,...) +for _da,ada in +pairs(table.pack(...))do if(type(ada)=="function")then +dca:registerEvent("basalt_reposition",ada)end end;return dca end,mouseHandler=function(dca,_da,ada,bda,cda) +if +(dca:isCoordsInObject(ada,bda))then local dda,__b=dca:getAbsolutePosition() +local a_b=dca:sendEvent("mouse_click",_da,ada- (dda-1), +bda- (__b-1),ada,bda,cda)if(a_b==false)then return false end;if(bba~=nil)then +bba:setFocusedChild(dca)end;cd=true;dd=true;_aa,aaa=ada,bda;return true end end,mouseUpHandler=function(dca,_da,ada,bda) +dd=false +if(cd)then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_release",_da,ada- (cda-1), +bda- (dda-1),ada,bda)cd=false end +if(dca:isCoordsInObject(ada,bda))then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_up",_da, +ada- (cda-1),bda- (dda-1),ada,bda)if(__b==false)then return false end;return true end end,dragHandler=function(dca,_da,ada,bda) +if +(dd)then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_drag",_da,ada- (cda-1),bda- ( +dda-1),_aa-ada,aaa-bda,ada,bda)_aa,aaa=ada,bda;if(__b~=nil)then return __b end;if(bba~=nil)then +bba:setFocusedChild(dca)end;return true end +if(dca:isCoordsInObject(ada,bda))then local cda,dda=dca:getAbsolutePosition() +_aa,aaa=ada,bda;baa,caa=cda-ada,dda-bda end end,scrollHandler=function(dca,_da,ada,bda) +if +(dca:isCoordsInObject(ada,bda))then local cda,dda=dca:getAbsolutePosition() +local __b=dca:sendEvent("mouse_scroll",_da,ada- (cda-1), +bda- (dda-1))if(__b==false)then return false end;if(bba~=nil)then +bba:setFocusedChild(dca)end;return true end end,hoverHandler=function(dca,_da,ada,bda) +if +(dca:isCoordsInObject(_da,ada))then local cda=dca:sendEvent("mouse_hover",_da,ada,bda)if(cda==false)then return +false end;bd=true;return true end +if(bd)then local cda=dca:sendEvent("mouse_leave",_da,ada,bda)if +(cda==false)then return false end;bd=false end end,keyHandler=function(dca,_da,ada)if +(dca:isEnabled())and(_d)then +if(dca:isFocused())then +local bda=dca:sendEvent("key",_da,ada)if(bda==false)then return false end;return true end end end,keyUpHandler=function(dca,_da)if +(dca:isEnabled())and(_d)then +if(dca:isFocused())then +local ada=dca:sendEvent("key_up",_da)if(ada==false)then return false end;return true end end end,charHandler=function(dca,_da)if +(dca:isEnabled())and(_d)then +if(dca:isFocused())then local ada=dca:sendEvent("char",_da)if(ada== +false)then return false end;return true end end end,getFocusHandler=function(dca) +local _da=dca:sendEvent("get_focus")if(_da~=nil)then return _da end;return true end,loseFocusHandler=function(dca) +dd=false;local _da=dca:sendEvent("lose_focus") +if(_da~=nil)then return _da end;return true end,addDraw=function(dca,_da,ada,bda,cda,dda) +local __b= +(cda==nil or cda==1)and dba or cda==2 and cba or cda==3 and _ca;bda=bda or#__b+1 +if(_da~=nil)then for b_b,c_b in pairs(__b)do if(c_b.name==_da)then +table.remove(__b,b_b)break end end +local a_b={name=_da,f=ada,pos=bda,active= +dda~=nil and dda or true}table.insert(__b,bda,a_b)end;dca:updateDraw()return dca end,addPreDraw=function(dca,_da,ada,bda,cda) +dca:addDraw(_da,ada,bda,2)return dca end,addPostDraw=function(dca,_da,ada,bda,cda) +dca:addDraw(_da,ada,bda,3)return dca end,setDrawState=function(dca,_da,ada,bda) +local cda= +(bda==nil or bda==1)and dba or bda==2 and cba or bda==3 and _ca +for dda,__b in pairs(cda)do if(__b.name==_da)then __b.active=ada;break end end;dca:updateDraw()return dca end,getDrawId=function(dca,_da,ada)local bda= + +ada==1 and dba or ada==2 and cba or ada==3 and _ca or dba;for cda,dda in pairs(bda)do if( +dda.name==_da)then return cda end end end,addText=function(dca,_da,ada,bda)local cda= +dca:getParent()or dca;local dda,__b=dca:getPosition()if(bba~=nil)then +local b_b,c_b=bba:getOffset()dda=ad and dda or dda-b_b +__b=ad and __b or __b-c_b end +if not(aba)then cda:setText(_da+dda-1, +ada+__b-1,bda)return end;local a_b=bca(bda,"\0") +for b_b,c_b in pairs(a_b)do if +(c_b.value~="")and(c_b.value~="\0")then +cda:setText(_da+c_b.x+dda-2,ada+__b-1,c_b.value)end end end,addBG=function(dca,_da,ada,bda,cda)local dda= +bba or dca;local __b,a_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()__b=ad and __b or __b-c_b +a_b=ad and a_b or a_b-d_b end +if not(aba)then dda:setBG(_da+__b-1, +ada+a_b-1,bda)return end;local b_b=bca(bda) +for c_b,d_b in pairs(b_b)do +if(d_b.value~="")and(d_b.value~=" ")then +if(cda~= +true)then +dda:setText(_da+d_b.x+__b-2,ada+a_b-1,(" "):rep(#d_b.value)) +dda:setBG(_da+d_b.x+__b-2,ada+a_b-1,d_b.value)else +table.insert(aca,{x=_da+d_b.x-1,y=ada,bg=d_b.value})dda:setBG(_da+__b-1,ada+a_b-1,fg)end end end end,addFG=function(dca,_da,ada,bda)local cda= +bba or dca;local dda,__b=dca:getPosition()if(bba~=nil)then +local b_b,c_b=bba:getOffset()dda=ad and dda or dda-b_b +__b=ad and __b or __b-c_b end +if not(aba)then cda:setFG(_da+dda-1, +ada+__b-1,bda)return end;local a_b=bca(bda) +for b_b,c_b in pairs(a_b)do if(c_b.value~="")and(c_b.value~=" ")then +cda:setFG( +_da+c_b.x+dda-2,ada+__b-1,c_b.value)end end end,addBlit=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local aab,bab=bba:getOffset()a_b=ad and a_b or a_b-aab +b_b=ad and b_b or b_b-bab end +if not(aba)then __b:blit(_da+a_b-1, +ada+b_b-1,bda,cda,dda)return end;local c_b=bca(bda,"\0")local d_b=bca(cda)local _ab=bca(dda) +for aab,bab in pairs(c_b)do if +(bab.value~="")or(bab.value~="\0")then +__b:setText(_da+bab.x+a_b-2,ada+b_b-1,bab.value)end end;for aab,bab in pairs(_ab)do +if(bab.value~="")or(bab.value~=" ")then __b:setBG( +_da+bab.x+a_b-2,ada+b_b-1,bab.value)end end;for aab,bab in pairs(d_b)do +if( +bab.value~="")or(bab.value~=" ")then __b:setFG(_da+bab.x+a_b-2,ada+ +b_b-1,bab.value)end end end,addTextBox=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()a_b=ad and a_b or a_b-c_b +b_b=ad and b_b or b_b-d_b end;__b:drawTextBox(_da+a_b-1, +ada+b_b-1,bda,cda,dda)end,addForegroundBox=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()a_b=ad and a_b or a_b-c_b +b_b=ad and b_b or b_b-d_b end;__b:drawForegroundBox(_da+a_b-1, +ada+b_b-1,bda,cda,dda)end,addBackgroundBox=function(dca,_da,ada,bda,cda,dda)local __b= +bba or dca;local a_b,b_b=dca:getPosition()if(bba~=nil)then +local c_b,d_b=bba:getOffset()a_b=ad and a_b or a_b-c_b +b_b=ad and b_b or b_b-d_b end;__b:drawBackgroundBox(_da+a_b-1, +ada+b_b-1,bda,cda,dda)end,render=function(dca)if +(_d)then dca:redraw()end end,redraw=function(dca)for _da,ada in pairs(cba)do if(ada.active)then +ada.f(dca)end end;for _da,ada in pairs(dba)do if(ada.active)then +ada.f(dca)end end;for _da,ada in pairs(_ca)do if(ada.active)then +ada.f(dca)end end;return true end,draw=function(dca) +dca:addDraw("base",function() +local _da,ada=dca:getSize()if(daa~=false)then dca:addTextBox(1,1,_da,ada," ") +dca:addBackgroundBox(1,1,_da,ada,daa)end;if(_ba~=false)then +dca:addForegroundBox(1,1,_da,ada,_ba)end end,1)end}cca.__index=cca;return setmetatable(cca,cc)end end +aa["objects"]["Treeview"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="Treeview"local bc={}local cc=colors.black;local dc=colors.lightGray;local _d=true +local ad="left"local bd,cd=0,0;local dd=true;_c:setSize(16,8)_c:setZIndex(5) +local function __a(c_a,d_a) +c_a=c_a or""d_a=d_a or false;local _aa=false;local aaa=nil;local baa={}local caa={}local daa +caa={getChildren=function()return baa end,setParent=function(_ba)if( +aaa~=nil)then +aaa.removeChild(aaa.findChildrenByText(caa.getText()))end;aaa=_ba;_c:updateDraw()return caa end,getParent=function()return +aaa end,addChild=function(_ba,aba)local bba=__a(_ba,aba)bba.setParent(caa) +table.insert(baa,bba)_c:updateDraw()return bba end,setExpanded=function(_ba)if +(d_a)then _aa=_ba end;_c:updateDraw()return caa end,isExpanded=function()return +_aa end,onSelect=function(...)for _ba,aba in pairs(table.pack(...))do if(type(aba)=="function")then +daa=aba end end;return caa end,callOnSelect=function()if( +daa~=nil)then daa(caa)end end,setExpandable=function(_ba)_ba=_ba +_c:updateDraw()return caa end,isExpandable=function()return d_a end,removeChild=function(_ba) +if(type(_ba)=="table")then for aba,bba in +pairs(_ba)do if(bba==_ba)then _ba=aba;break end end end;table.remove(baa,_ba)_c:updateDraw()return caa end,findChildrenByText=function(_ba) +local aba={} +for bba,cba in ipairs(baa)do if string.find(cba.getText(),_ba)then +table.insert(aba,cba)end end;return aba end,getText=function()return +c_a end,setText=function(_ba)c_a=_ba;_c:updateDraw()return caa end}return caa end;local a_a=__a("Root",true)a_a.setExpanded(true) +local b_a={init=function(c_a) +local d_a=c_a:getParent()c_a:listenEvent("mouse_click") +c_a:listenEvent("mouse_scroll")return _c.init(c_a)end,getBase=function(c_a)return +_c end,getType=function(c_a)return ac end,isType=function(c_a,d_a) +return ac==d_a or +_c.isType~=nil and _c.isType(d_a)or false end,setOffset=function(c_a,d_a,_aa)bd=d_a;cd=_aa;return c_a end,setXOffset=function(c_a,d_a)return +c_a:setOffset(d_a,cd)end,setYOffset=function(c_a,d_a)return c_a:setOffset(bd,d_a)end,getOffset=function(c_a)return +bd,cd end,getXOffset=function(c_a)return bd end,getYOffset=function(c_a)return cd end,setScrollable=function(c_a,d_a)dd=d_a;return c_a end,getScrollable=function(c_a,d_a)return +dd end,setSelectionColor=function(c_a,d_a,_aa,aaa)cc=d_a or c_a:getBackground()dc=_aa or +c_a:getForeground()_d=aaa~=nil and aaa or true +c_a:updateDraw()return c_a end,setSelectionBG=function(c_a,d_a)return c_a:setSelectionColor(d_a, +nil,_d)end,setSelectionFG=function(c_a,d_a)return c_a:setSelectionColor( +nil,d_a,_d)end,getSelectionColor=function(c_a) +return cc,dc end,getSelectionBG=function(c_a)return cc end,getSelectionFG=function(c_a)return dc end,isSelectionColorActive=function(c_a)return _d end,getRoot=function(c_a) +return a_a end,setRoot=function(c_a,d_a)a_a=d_a;d_a.setParent(nil)return c_a end,onSelect=function(c_a,...) +for d_a,_aa in +pairs(table.pack(...))do if(type(_aa)=="function")then +c_a:registerEvent("treeview_select",_aa)end end;return c_a end,selectionHandler=function(c_a,d_a) +d_a.callOnSelect(d_a)c_a:sendEvent("treeview_select",d_a)return c_a end,mouseHandler=function(c_a,d_a,_aa,aaa) +if +_c.mouseHandler(c_a,d_a,_aa,aaa)then local baa=1 -cd;local caa,daa=c_a:getAbsolutePosition() +local _ba,aba=c_a:getSize() +local function bba(cba,dba) +if aaa==daa+baa-1 then +if _aa>=caa and _aa=1 then local daa=0 +local function _ba(aba,bba) +daa=daa+1;if aba.isExpanded()then +for cba,dba in ipairs(aba.getChildren())do _ba(dba,bba+1)end end end;for aba,bba in ipairs(a_a.getChildren())do _ba(bba,1)end +if +daa>caa then if cd>daa-caa then cd=daa-caa end else cd=cd-1 end end;c_a:updateDraw()end;return true end;return false end,draw=function(c_a) +_c.draw(c_a) +c_a:addDraw("treeview",function()local d_a=1 -cd;local _aa=c_a:getValue() +local function aaa(baa,caa) +local daa,_ba=c_a:getSize() +if d_a>=1 and d_a<=_ba then +local aba=(baa==_aa)and cc or c_a:getBackground() +local bba=(baa==_aa)and dc or c_a:getForeground()local cba=baa.getText() +c_a:addBlit(1 +caa+bd,d_a,cba,bb[bba]:rep(#cba),bb[aba]:rep( +#cba))end;d_a=d_a+1;if baa.isExpanded()then for aba,bba in ipairs(baa.getChildren())do +aaa(bba,caa+1)end end end;for baa,caa in ipairs(a_a.getChildren())do aaa(caa,1)end end)end}b_a.__index=b_a;return setmetatable(b_a,_c)end end +aa["objects"]["Thread"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("Object")(ab,bb)local db="Thread"local _c;local ac;local bc=false;local cc +local dc={getType=function(_d)return db end,start=function(_d,ad)if(ad==nil)then +error("Function provided to thread is nil")end;_c=ad;ac=coroutine.create(_c) +bc=true;cc=nil;local bd,cd=coroutine.resume(ac)cc=cd;if not(bd)then +if(cd~="Terminated")then error( +"Thread Error Occurred - "..cd)end end +_d:listenEvent("mouse_click")_d:listenEvent("mouse_up") +_d:listenEvent("mouse_scroll")_d:listenEvent("mouse_drag")_d:listenEvent("key") +_d:listenEvent("key_up")_d:listenEvent("char") +_d:listenEvent("other_event")return _d end,getStatus=function(_d,ad)if( +ac~=nil)then return coroutine.status(ac)end;return nil end,stop=function(_d,ad) +bc=false;_d:listenEvent("mouse_click",false) +_d:listenEvent("mouse_up",false)_d:listenEvent("mouse_scroll",false) +_d:listenEvent("mouse_drag",false)_d:listenEvent("key",false) +_d:listenEvent("key_up",false)_d:listenEvent("char",false) +_d:listenEvent("other_event",false)return _d end,mouseHandler=function(_d,...) +_d:eventHandler("mouse_click",...)end,mouseUpHandler=function(_d,...)_d:eventHandler("mouse_up",...)end,mouseScrollHandler=function(_d,...) +_d:eventHandler("mouse_scroll",...)end,mouseDragHandler=function(_d,...) +_d:eventHandler("mouse_drag",...)end,mouseMoveHandler=function(_d,...) +_d:eventHandler("mouse_move",...)end,keyHandler=function(_d,...)_d:eventHandler("key",...)end,keyUpHandler=function(_d,...) +_d:eventHandler("key_up",...)end,charHandler=function(_d,...)_d:eventHandler("char",...)end,eventHandler=function(_d,ad,...) +cb.eventHandler(_d,ad,...) +if(bc)then +if(coroutine.status(ac)=="suspended")then if(cc~=nil)then +if(ad~=cc)then return end;cc=nil end +local bd,cd=coroutine.resume(ac,ad,...)cc=cd;if not(bd)then if(cd~="Terminated")then +error("Thread Error Occurred - "..cd)end end else +_d:stop()end end end}dc.__index=dc;return setmetatable(dc,cb)end end +aa["objects"]["Object"]=function(...)local ab=da("basaltEvent") +local bb=da("utils")local cb=bb.uuid;local db,_c=table.unpack,string.sub +return +function(ac,bc)ac=ac or cb() +assert(bc~=nil, +"Unable to find basalt instance! ID: "..ac)local cc="Object"local dc,_d=true,false;local ad=ab()local bd={}local cd={}local dd +local __a={init=function(a_a) +if(_d)then return false end;_d=true;return true end,load=function(a_a)end,getType=function(a_a)return cc end,isType=function(a_a,b_a)return cc== +b_a end,getProperty=function(a_a,b_a) +local c_a=a_a["get"..b_a:gsub("^%l",string.upper)]if(c_a~=nil)then return c_a(a_a)end end,setProperty=function(a_a,b_a,...) +local c_a=a_a[ +"set"..b_a:gsub("^%l",string.upper)]if(c_a~=nil)then return c_a(a_a,...)end end,getName=function(a_a)return +ac end,getParent=function(a_a)return dd end,setParent=function(a_a,b_a,c_a)if(c_a)then dd=b_a;return a_a end +if(b_a.getType~= +nil and b_a:isType("Container"))then a_a:remove() +b_a:addChild(a_a)if(a_a.show)then a_a:show()end;dd=b_a end;return a_a end,updateEvents=function(a_a)for b_a,c_a in +pairs(cd)do dd:removeEvent(b_a,a_a) +if(c_a)then dd:addEvent(b_a,a_a)end end;return a_a end,listenEvent=function(a_a,b_a,c_a)if( +dd~=nil)then +if(c_a)or(c_a==nil)then cd[b_a]=true;dd:addEvent(b_a,a_a)elseif +(c_a==false)then cd[b_a]=false;dd:removeEvent(b_a,a_a)end end +return a_a end,getZIndex=function(a_a)return +1 end,enable=function(a_a)dc=true;return a_a end,disable=function(a_a)dc=false;return a_a end,isEnabled=function(a_a)return +dc end,remove=function(a_a)if(dd~=nil)then dd:removeChild(a_a)end +a_a:updateDraw()return a_a end,getBaseFrame=function(a_a)if(dd~=nil)then +return dd:getBaseFrame()end;return a_a end,onEvent=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("other_event",c_a)end end;return a_a end,getEventSystem=function(a_a)return +ad end,getRegisteredEvents=function(a_a)return bd end,registerEvent=function(a_a,b_a,c_a) +if(dd~=nil)then dd:addEvent(b_a,a_a)end;ad:registerEvent(b_a,c_a) +if(bd[b_a]==nil)then bd[b_a]={}end;table.insert(bd[b_a],c_a)end,removeEvent=function(a_a,b_a,c_a)if( +ad:getEventCount(b_a)<1)then +if(dd~=nil)then dd:removeEvent(b_a,a_a)end end;ad:removeEvent(b_a,c_a)if( +bd[b_a]~=nil)then table.remove(bd[b_a],c_a)if(#bd[b_a]==0)then +bd[b_a]=nil end end end,eventHandler=function(a_a,b_a,...) +local c_a=a_a:sendEvent("other_event",b_a,...)if(c_a~=nil)then return c_a end end,customEventHandler=function(a_a,b_a,...) +local c_a=a_a:sendEvent("custom_event",b_a,...)if(c_a~=nil)then return c_a end;return true end,sendEvent=function(a_a,b_a,...)if( +b_a=="other_event")or(b_a=="custom_event")then return +ad:sendEvent(b_a,a_a,...)end;return +ad:sendEvent(b_a,a_a,b_a,...)end,onClick=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_click",c_a)end end;return a_a end,onClickUp=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("mouse_up",c_a)end end;return a_a end,onRelease=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_release",c_a)end end;return a_a end,onScroll=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_scroll",c_a)end end;return a_a end,onHover=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_hover",c_a)end end;return a_a end,onLeave=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_leave",c_a)end end;return a_a end,onDrag=function(a_a,...) +for b_a,c_a in +pairs(table.pack(...))do if(type(c_a)=="function")then +a_a:registerEvent("mouse_drag",c_a)end end;return a_a end,onKey=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("key",c_a)end end;return a_a end,onChar=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("char",c_a)end end;return a_a end,onKeyUp=function(a_a,...)for b_a,c_a in +pairs(table.pack(...))do +if(type(c_a)=="function")then a_a:registerEvent("key_up",c_a)end end;return a_a end}__a.__index=__a;return __a end end +aa["objects"]["Image"]=function(...)local ab=da("images")local bb=da("bimg") +local cb,db,_c,ac=table.unpack,string.sub,math.max,math.min +return +function(bc,cc)local dc=cc.getObject("VisualObject")(bc,cc) +local _d="Image"local ad=bb()local bd=ad.getFrameObject(1)local cd;local dd;local __a=1;local a_a=false;local b_a +local c_a=false;local d_a=true;local _aa,aaa=0,0;dc:setSize(24,8)dc:setZIndex(2) +local function baa(_ba)local aba={} +for dba,_ca in +pairs(colors)do if(type(_ca)=="number")then +aba[dba]={term.nativePaletteColor(_ca)}end end;local bba=ad.getMetadata("palette")if(bba~=nil)then for dba,_ca in pairs(bba)do +aba[dba]=tonumber(_ca)end end +local cba=ad.getFrameData("palette")cc.log(cba)if(cba~=nil)then +for dba,_ca in pairs(cba)do aba[dba]=tonumber(_ca)end end;return aba end;local function caa() +if(d_a)then if(ad~=nil)then dc:setSize(ad.getSize())end end end +local daa={getType=function(_ba)return _d end,isType=function(_ba,aba)return +_d==aba or +dc.isType~=nil and dc.isType(aba)or false end,setOffset=function(_ba,aba,bba,cba) +if(cba)then _aa=_aa+ +aba or 0;aaa=aaa+bba or 0 else _aa=aba or _aa;aaa=bba or aaa end;_ba:updateDraw()return _ba end,setXOffset=function(_ba,aba)return _ba:setOffset(_ba,aba, +nil)end,setYOffset=function(_ba,aba)return +_ba:setOffset(_ba,nil,aba)end,setSize=function(_ba,aba,bba)dc:setSize(aba,bba) +d_a=false;return _ba end,getOffset=function(_ba)return _aa,aaa end,getXOffset=function(_ba)return _aa end,getYOffset=function(_ba)return +aaa end,selectFrame=function(_ba,aba)if(ad.getFrameObject(aba)==nil)then +ad.addFrame(aba)end;bd=ad.getFrameObject(aba) +dd=bd.getImage(aba)__a=aba;_ba:updateDraw()end,addFrame=function(_ba,aba) +ad.addFrame(aba)return _ba end,getFrame=function(_ba,aba)return ad.getFrame(aba)end,getFrameObject=function(_ba,aba)return +ad.getFrameObject(aba)end,removeFrame=function(_ba,aba)ad.removeFrame(aba)return _ba end,moveFrame=function(_ba,aba,bba) +ad.moveFrame(aba,bba)return _ba end,getFrames=function(_ba)return ad.getFrames()end,getFrameCount=function(_ba)return +#ad.getFrames()end,getActiveFrame=function(_ba)return __a end,loadImage=function(_ba,aba)if +(fs.exists(aba))then local bba=ab.loadBIMG(aba)ad=bb(bba)__a=1 +bd=ad.getFrameObject(1)cd=ad.createBimg()dd=bd.getImage()caa() +_ba:updateDraw()end;return +_ba end,setPath=function(_ba,aba)return +_ba:loadImage(aba)end,setImage=function(_ba,aba)if(type(aba)=="table")then ad=bb(aba)__a=1 +bd=ad.getFrameObject(1)cd=ad.createBimg()dd=bd.getImage()caa() +_ba:updateDraw()end;return _ba end,clear=function(_ba) +ad=bb()bd=ad.getFrameObject(1)dd=nil;_ba:updateDraw()return _ba end,getImage=function(_ba)return +ad.createBimg()end,getImageFrame=function(_ba,aba)return bd.getImage(aba)end,usePalette=function(_ba,aba)c_a= +aba~=nil and aba or true;return _ba end,getUsePalette=function(_ba)return +c_a end,setUsePalette=function(_ba,aba)return _ba:usePalette(aba)end,play=function(_ba,aba) +if +(ad.getMetadata("animated"))then +local bba= +ad.getMetadata("duration")or ad.getMetadata("secondsPerFrame")or 0.2;_ba:listenEvent("other_event") +b_a=os.startTimer(bba)a_a=aba or false end;return _ba end,setPlay=function(_ba,aba)return +_ba:play(aba)end,stop=function(_ba)os.cancelTimer(b_a)b_a=nil;a_a=false +return _ba end,eventHandler=function(_ba,aba,bba,...) +dc.eventHandler(_ba,aba,bba,...) +if(aba=="timer")then +if(bba==b_a)then +if(ad.getFrame(__a+1)~=nil)then __a=__a+1 +_ba:selectFrame(__a) +local cba= +ad.getFrameData(__a,"duration")or ad.getMetadata("secondsPerFrame")or 0.2;b_a=os.startTimer(cba)else +if(a_a)then __a=1;_ba:selectFrame(__a) +local cba= +ad.getFrameData(__a,"duration")or ad.getMetadata("secondsPerFrame")or 0.2;b_a=os.startTimer(cba)end end;_ba:updateDraw()end end end,setMetadata=function(_ba,aba,bba) +ad.setMetadata(aba,bba)return _ba end,getMetadata=function(_ba,aba)return ad.getMetadata(aba)end,getFrameMetadata=function(_ba,aba,bba)return +ad.getFrameData(aba,bba)end,setFrameMetadata=function(_ba,aba,bba,cba) +ad.setFrameData(aba,bba,cba)return _ba end,blit=function(_ba,aba,bba,cba,dba,_ca)x=dba or x;y=_ca or y +bd.blit(aba,bba,cba,x,y)dd=bd.getImage()_ba:updateDraw()return _ba end,setText=function(_ba,aba,bba,cba)x= +bba or x;y=cba or y;bd.text(aba,x,y)dd=bd.getImage() +_ba:updateDraw()return _ba end,setBg=function(_ba,aba,bba,cba)x=bba or x;y= +cba or y;bd.bg(aba,x,y)dd=bd.getImage() +_ba:updateDraw()return _ba end,setFg=function(_ba,aba,bba,cba)x=bba or x +y=cba or y;bd.fg(aba,x,y)dd=bd.getImage()_ba:updateDraw()return _ba end,getImageSize=function(_ba)return +ad.getSize()end,setImageSize=function(_ba,aba,bba)ad.setSize(aba,bba) +dd=bd.getImage()_ba:updateDraw()return _ba end,resizeImage=function(_ba,aba,bba) +local cba=ab.resizeBIMG(cd,aba,bba)ad=bb(cba)__a=1;bd=ad.getFrameObject(1)dd=bd.getImage() +_ba:updateDraw()return _ba end,draw=function(_ba) +dc.draw(_ba) +_ba:addDraw("image",function()local aba,bba=_ba:getSize()local cba,dba=_ba:getPosition() +local _ca,aca=_ba:getParent():getSize()local bca,cca=_ba:getParent():getOffset() +if +(cba-bca>_ca)or(dba-cca>aca)or(cba-bca+aba<1)or(dba- +cca+bba<1)then return end +if(c_a)then _ba:getParent():setPalette(baa(__a))end +if(dd~=nil)then +for dca,_da in pairs(dd)do +if(dca+aaa<=bba)and(dca+aaa>=1)then +local ada,bda,cda=_da[1],_da[2],_da[3]local dda=_c(1 -_aa,1)local __b=ac(aba-_aa,#ada) +ada=db(ada,dda,__b)bda=db(bda,dda,__b)cda=db(cda,dda,__b) +_ba:addBlit(_c(1 +_aa,1),dca+aaa,ada,bda,cda)end end end end)end}daa.__index=daa;return setmetatable(daa,dc)end end +aa["objects"]["Button"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("VisualObject")(cb,db)local ac="Button"local bc="center"local cc="center"local dc="Button"_c:setSize(12,3) +_c:setZIndex(5) +local _d={getType=function(ad)return ac end,isType=function(ad,bd)return +ac==bd or _c.isType~=nil and _c.isType(bd)or false end,getBase=function(ad)return +_c end,getHorizontalAlign=function(ad)return bc end,setHorizontalAlign=function(ad,bd)bc=bd;ad:updateDraw()return ad end,getVerticalAlign=function(ad)return +cc end,setVerticalAlign=function(ad,bd)cc=bd;ad:updateDraw()return ad end,getText=function(ad) +return dc end,setText=function(ad,bd)dc=bd;ad:updateDraw()return ad end,draw=function(ad) +_c.draw(ad) +ad:addDraw("button",function()local bd,cd=ad:getSize() +local dd=ab.getTextVerticalAlign(cd,cc)local __a +if(bc=="center")then +__a=math.floor((bd-dc:len())/2)elseif(bc=="right")then __a=bd-dc:len()end;ad:addText(__a+1,dd,dc) +ad:addFG(__a+1,dd,bb[ad:getForeground()or colors.white]:rep(dc:len()))end)end}_d.__index=_d;return setmetatable(_d,_c)end end +aa["objects"]["Input"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="Input"local bc="text"local cc=0;_c:setZIndex(5)_c:setValue("") +_c:setSize(12,1)local dc=1;local _d=1;local ad=""local bd=colors.black;local cd=colors.lightGray;local dd=ad +local __a=false +local a_a={load=function(b_a)b_a:listenEvent("mouse_click") +b_a:listenEvent("key")b_a:listenEvent("char") +b_a:listenEvent("other_event")b_a:listenEvent("mouse_drag")end,getType=function(b_a)return +ac end,isType=function(b_a,c_a)return +ac==c_a or _c.isType~=nil and _c.isType(c_a)or false end,setDefaultFG=function(b_a,c_a)return b_a:setDefaultText(b_a,ad,c_a, +nil)end,setDefaultBG=function(b_a,c_a)return b_a:setDefaultText(b_a,ad, +nil,c_a)end,setDefaultText=function(b_a,c_a,d_a,_aa) +ad=c_a;cd=d_a or cd;bd=_aa or bd;if(b_a:isFocused())then dd=""else dd=ad end +b_a:updateDraw()return b_a end,getDefaultText=function(b_a)return ad,cd, +bd end,setOffset=function(b_a,c_a)_d=c_a;b_a:updateDraw()return b_a end,getOffset=function(b_a)return +_d end,setTextOffset=function(b_a,c_a)dc=c_a;b_a:updateDraw()return b_a end,getTextOffset=function(b_a)return +dc end,setInputType=function(b_a,c_a)bc=c_a;b_a:updateDraw()return b_a end,getInputType=function(b_a)return +bc end,setValue=function(b_a,c_a)_c.setValue(b_a,tostring(c_a)) +if not(__a)then dc= +tostring(c_a):len()+1 +_d=math.max(1,dc-b_a:getWidth()+1) +if(b_a:isFocused())then local d_a=b_a:getParent() +local _aa,aaa=b_a:getPosition() +d_a:setCursor(true,_aa+dc-_d,aaa+math.floor(b_a:getHeight()/2),b_a:getForeground())end end;b_a:updateDraw()return b_a end,getValue=function(b_a) +local c_a=_c.getValue(b_a) +return bc=="number"and tonumber(c_a)or c_a end,setInputLimit=function(b_a,c_a) +cc=tonumber(c_a)or cc;b_a:updateDraw()return b_a end,getInputLimit=function(b_a)return cc end,getFocusHandler=function(b_a) +_c.getFocusHandler(b_a)local c_a=b_a:getParent() +if(c_a~=nil)then local d_a,_aa=b_a:getPosition()dd=""if(ad~= +"")then b_a:updateDraw()end +c_a:setCursor(true,d_a+dc-_d,_aa+math.max(math.ceil( +b_a:getHeight()/2 -1,1)),b_a:getForeground())end end,loseFocusHandler=function(b_a) +_c.loseFocusHandler(b_a)local c_a=b_a:getParent()dd=ad +if(ad~="")then b_a:updateDraw()end;c_a:setCursor(false)end,keyHandler=function(b_a,c_a) +if +(_c.keyHandler(b_a,c_a))then local d_a,_aa=b_a:getSize()local aaa=b_a:getParent()__a=true +if +(c_a==keys.backspace)then local _ba=tostring(_c.getValue()) +if(dc>1)then b_a:setValue(_ba:sub(1,dc-2).. +_ba:sub(dc,_ba:len()))dc=math.max( +dc-1,1)if(dc<_d)then _d=math.max(_d-1,1)end end end +if(c_a==keys.enter)then aaa:clearFocusedChild(b_a)end +if(c_a==keys.right)then +local _ba=tostring(_c.getValue()):len()dc=dc+1;if(dc>_ba)then dc=_ba+1 end;dc=math.max(dc,1)if(dc<_d)or +(dc>=d_a+_d)then _d=dc-d_a+1 end;_d=math.max(_d,1)end;if(c_a==keys.left)then dc=dc-1;if(dc>=1)then +if(dc<_d)or(dc>=d_a+_d)then _d=dc end end;dc=math.max(dc,1) +_d=math.max(_d,1)end +local baa,caa=b_a:getPosition()local daa=tostring(_c.getValue())b_a:updateDraw() +__a=false;return true end end,charHandler=function(b_a,c_a) +if +(_c.charHandler(b_a,c_a))then __a=true;local d_a,_aa=b_a:getSize()local aaa=_c.getValue() +if( +aaa:len()0)then +if( +tonumber(_c.getValue())==nil)then b_a:setValue(_ba)dc=dc-1 end end end else +b_a:setValue(aaa:sub(1,dc-1)..c_a..aaa:sub(dc,aaa:len()))dc=dc+1 end;if(dc>=d_a+_d)then _d=_d+1 end end;local baa,caa=b_a:getPosition() +local daa=tostring(_c.getValue())__a=false;b_a:updateDraw()return true end end,mouseHandler=function(b_a,c_a,d_a,_aa) +if +(_c.mouseHandler(b_a,c_a,d_a,_aa))then local aaa=b_a:getParent()local baa,caa=b_a:getPosition() +local daa,_ba=b_a:getAbsolutePosition(baa,caa)local aba,bba=b_a:getSize()dc=d_a-daa+_d;local cba=_c.getValue()if(dc> +cba:len())then dc=cba:len()+1 end;if(dc<_d)then _d=dc-1 +if(_d<1)then _d=1 end end +aaa:setCursor(true,baa+dc-_d,caa+ +math.max(math.ceil(bba/2 -1,1)),b_a:getForeground())return true end end,dragHandler=function(b_a,c_a,d_a,_aa,aaa,baa) +if +(b_a:isFocused())then if(b_a:isCoordsInObject(d_a,_aa))then +if(_c.dragHandler(b_a,c_a,d_a,_aa,aaa,baa))then return true end end +local caa=b_a:getParent()caa:clearFocusedChild()end end,draw=function(b_a) +_c.draw(b_a) +b_a:addDraw("input",function()local c_a=b_a:getParent()local d_a,_aa=b_a:getPosition() +local aaa,baa=b_a:getSize()local caa=ab.getTextVerticalAlign(baa,textVerticalAlign) +local daa=tostring(_c.getValue())local _ba=b_a:getBackground()local aba=b_a:getForeground()local bba;if( +daa:len()<=0)then bba=dd;_ba=bd or _ba;aba=cd or aba end +bba=dd;if(daa~="")then bba=daa end;bba=bba:sub(_d,aaa+_d-1)local cba=aaa- +bba:len()if(cba<0)then cba=0 end +if +(bc=="password")and(daa~="")then bba=string.rep("*",bba:len())end;bba=bba..string.rep(" ",cba) +b_a:addBlit(1,caa,bba,bb[aba]:rep(bba:len()),bb[_ba]:rep(bba:len()))if(b_a:isFocused())then +c_a:setCursor(true,d_a+dc-_d,_aa+ +math.floor(b_a:getHeight()/2),b_a:getForeground())end end)end}a_a.__index=a_a;return setmetatable(a_a,_c)end end +aa["objects"]["Textfield"]=function(...)local ab=da("tHex") +local bb,cb,db,_c,ac=string.rep,string.find,string.gmatch,string.sub,string.len +return +function(bc,cc) +local dc=cc.getObject("ChangeableObject")(bc,cc)local _d="Textfield"local ad,bd,cd,dd=1,1,1,1;local __a={""}local a_a={""}local b_a={""}local c_a={}local d_a={} +local _aa,aaa,baa,caa;local daa,_ba=colors.lightBlue,colors.black;dc:setSize(30,12) +dc:setZIndex(5) +local function aba()if +(_aa~=nil)and(aaa~=nil)and(baa~=nil)and(caa~=nil)then return true end;return false end +local function bba()local cca,dca,_da,ada=_aa,aaa,baa,caa +if aba()then +if _aaaaa and baa>=caa then +cca=aaa;dca=_aa;if baa>caa then _da=caa;ada=baa else _da=baa;ada=caa end elseif baa>caa then +cca=aaa;dca=_aa;_da=caa;ada=baa end;return cca,dca,_da,ada end end +local function cba(cca)local dca,_da,ada,bda=bba(cca)local cda=__a[ada]local dda=__a[bda] +__a[ada]= +cda:sub(1,dca-1)..dda:sub(_da+1,dda:len())a_a[ada]=a_a[ada]:sub(1,dca-1).. +a_a[bda]:sub(_da+1,a_a[bda]:len()) +b_a[ada]=b_a[ada]:sub(1, +dca-1)..b_a[bda]:sub(_da+1,b_a[bda]:len()) +for i=bda,ada+1,-1 do if i~=ada then table.remove(__a,i)table.remove(a_a,i) +table.remove(b_a,i)end end;cd,dd=dca,ada;_aa,aaa,baa,caa=nil,nil,nil,nil;return cca end +local function dba(cca,dca)local _da={} +if(cca:len()>0)then +for ada in db(cca,dca)do local bda,cda=cb(cca,ada) +if +(bda~=nil)and(cda~=nil)then table.insert(_da,bda)table.insert(_da,cda) +local dda=_c(cca,1,(bda-1))local __b=_c(cca,cda+1,cca:len())cca=dda.. (":"):rep(ada:len()).. +__b end end end;return _da end +local function _ca(cca,dca)dca=dca or dd +local _da=ab[cca:getForeground()]:rep(b_a[dca]:len()) +local ada=ab[cca:getBackground()]:rep(a_a[dca]:len()) +for bda,cda in pairs(d_a)do local dda=dba(__a[dca],cda[1]) +if(#dda>0)then +for x=1,#dda/2 do +local __b=x*2 -1;if(cda[2]~=nil)then +_da=_da:sub(1,dda[__b]-1)..ab[cda[2]]:rep(dda[__b+1]- ( +dda[__b]-1)).. +_da:sub(dda[__b+1]+1,_da:len())end;if +(cda[3]~=nil)then +ada=ada:sub(1,dda[__b]-1).. + +ab[cda[3]]:rep(dda[__b+1]- (dda[__b]-1))..ada:sub(dda[__b+1]+1,ada:len())end end end end +for bda,cda in pairs(c_a)do +for dda,__b in pairs(cda)do local a_b=dba(__a[dca],__b) +if(#a_b>0)then for x=1,#a_b/2 do +local b_b=x*2 -1 +_da=_da:sub(1,a_b[b_b]-1).. + +ab[bda]:rep(a_b[b_b+1]- (a_b[b_b]-1)).._da:sub(a_b[b_b+1]+1,_da:len())end end end end;b_a[dca]=_da;a_a[dca]=ada;cca:updateDraw()end;local function aca(cca)for n=1,#__a do _ca(cca,n)end end +local bca={getType=function(cca)return _d end,setBackground=function(cca,dca) +dc.setBackground(cca,dca)aca(cca)return cca end,setForeground=function(cca,dca) +dc.setForeground(cca,dca)aca(cca)return cca end,setSelection=function(cca,dca,_da)_ba=dca or _ba +daa=_da or daa;return cca end,setSelectionFG=function(cca,dca) +return cca:setSelection(dca,nil)end,setSelectionBG=function(cca,dca)return cca:setSelection(nil,dca)end,getSelection=function(cca)return +_ba,daa end,getSelectionFG=function(cca)return _ba end,getSelectionBG=function(cca)return daa end,getLines=function(cca)return __a end,getLine=function(cca,dca)return +__a[dca]end,editLine=function(cca,dca,_da)__a[dca]=_da or __a[dca] +_ca(cca,dca)cca:updateDraw()return cca end,clear=function(cca) +__a={""}a_a={""}b_a={""}_aa,aaa,baa,caa=nil,nil,nil,nil;ad,bd,cd,dd=1,1,1,1 +cca:updateDraw()return cca end,addLine=function(cca,dca,_da) +if(dca~=nil)then +local ada=cca:getBackground()local bda=cca:getForeground() +if(#__a==1)and(__a[1]=="")then +__a[1]=dca;a_a[1]=ab[ada]:rep(dca:len()) +b_a[1]=ab[bda]:rep(dca:len())_ca(cca,1)return cca end +if(_da~=nil)then table.insert(__a,_da,dca) +table.insert(a_a,_da,ab[ada]:rep(dca:len())) +table.insert(b_a,_da,ab[bda]:rep(dca:len()))else table.insert(__a,dca) +table.insert(a_a,ab[ada]:rep(dca:len())) +table.insert(b_a,ab[bda]:rep(dca:len()))end end;_ca(cca,_da or#__a)cca:updateDraw()return cca end,addKeywords=function(cca,dca,_da)if( +c_a[dca]==nil)then c_a[dca]={}end;for ada,bda in pairs(_da)do +table.insert(c_a[dca],bda)end;cca:updateDraw()return cca end,addRule=function(cca,dca,_da,ada) +table.insert(d_a,{dca,_da,ada})cca:updateDraw()return cca end,editRule=function(cca,dca,_da,ada)for bda,cda in +pairs(d_a)do +if(cda[1]==dca)then d_a[bda][2]=_da;d_a[bda][3]=ada end end;cca:updateDraw()return cca end,removeRule=function(cca,dca) +for _da,ada in +pairs(d_a)do if(ada[1]==dca)then table.remove(d_a,_da)end end;cca:updateDraw()return cca end,setKeywords=function(cca,dca,_da) +c_a[dca]=_da;cca:updateDraw()return cca end,removeLine=function(cca,dca) +if(#__a>1)then table.remove(__a, +dca or#__a) +table.remove(a_a,dca or#a_a)table.remove(b_a,dca or#b_a)else __a={""}a_a={""}b_a={""}end;cca:updateDraw()return cca end,getTextCursor=function(cca)return +cd,dd end,getOffset=function(cca)return bd,ad end,setOffset=function(cca,dca,_da)bd=dca or bd;ad=_da or ad +cca:updateDraw()return cca end,getXOffset=function(cca,dca)return bd end,setXOffset=function(cca,dca)return +cca:setOffset(dca,nil)end,getYOffset=function(cca,dca)return ad end,setYOffset=function(cca,dca)return +cca:setOffset(nil,dca)end,getFocusHandler=function(cca)dc.getFocusHandler(cca) +local dca,_da=cca:getPosition() +cca:getParent():setCursor(true,dca+cd-bd,_da+dd-ad,cca:getForeground())end,loseFocusHandler=function(cca) +dc.loseFocusHandler(cca)cca:getParent():setCursor(false)end,keyHandler=function(cca,dca) +if +(dc.keyHandler(cca,event,dca))then local _da=cca:getParent()local ada,bda=cca:getPosition() +local cda,dda=cca:getSize() +if(dca==keys.backspace)then +if(aba())then cba(cca)else +if(__a[dd]=="")then +if(dd>1)then +table.remove(__a,dd)table.remove(b_a,dd)table.remove(a_a,dd)cd= +__a[dd-1]:len()+1;bd=cd-cda+1;if(bd<1)then bd=1 end;dd=dd-1 end elseif(cd<=1)then +if(dd>1)then cd=__a[dd-1]:len()+1;bd=cd-cda+1;if(bd<1)then +bd=1 end;__a[dd-1]=__a[dd-1]..__a[dd]b_a[dd-1]= +b_a[dd-1]..b_a[dd] +a_a[dd-1]=a_a[dd-1]..a_a[dd]table.remove(__a,dd)table.remove(b_a,dd) +table.remove(a_a,dd)dd=dd-1 end else __a[dd]=__a[dd]:sub(1,cd-2).. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]= +b_a[dd]:sub(1,cd-2)..b_a[dd]:sub(cd,b_a[dd]:len())a_a[dd]=a_a[dd]:sub(1,cd-2).. +a_a[dd]:sub(cd,a_a[dd]:len()) +if(cd>1)then cd=cd-1 end;if(bd>1)then if(cd +__a[dd]:len())then if(__a[dd+1]~=nil)then __a[dd]=__a[dd]..__a[dd+1]table.remove(__a, +dd+1)table.remove(a_a,dd+1) +table.remove(b_a,dd+1)end else +__a[dd]=__a[dd]:sub(1, +cd-1)..__a[dd]:sub(cd+1,__a[dd]:len())b_a[dd]=b_a[dd]:sub(1,cd-1).. +b_a[dd]:sub(cd+1,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1, +cd-1)..a_a[dd]:sub(cd+1,a_a[dd]:len())end end;_ca(cca)elseif(dca==keys.enter)then if(aba())then cba(cca)end +table.insert(__a,dd+1,__a[dd]:sub(cd,__a[dd]:len())) +table.insert(b_a,dd+1,b_a[dd]:sub(cd,b_a[dd]:len())) +table.insert(a_a,dd+1,a_a[dd]:sub(cd,a_a[dd]:len()))__a[dd]=__a[dd]:sub(1,cd-1) +b_a[dd]=b_a[dd]:sub(1,cd-1)a_a[dd]=a_a[dd]:sub(1,cd-1)dd=dd+1;cd=1;bd=1;if(dd-ad>=dda)then +ad=ad+1 end;cca:setValue("")elseif(dca==keys.up)then +_aa,baa,aaa,caa=nil,nil,nil,nil +if(dd>1)then dd=dd-1;if(cd>__a[dd]:len()+1)then +cd=__a[dd]:len()+1 end;if(bd>1)then +if(cd1)then if(dd +__a[dd]:len()+1)then cd=__a[dd]:len()+1 end +if(bd>1)then if(cd=ad+dda)then ad=ad+1 end end elseif(dca==keys.right)then _aa,baa,aaa,caa=nil,nil,nil,nil;cd=cd+1 +if(dd<#__a)then if(cd> +__a[dd]:len()+1)then cd=1;dd=dd+1 end elseif +(cd>__a[dd]:len())then cd=__a[dd]:len()+1 end;if(cd<1)then cd=1 end +if(cd=cda+bd)then bd=cd-cda+1 end;if(bd<1)then bd=1 end elseif(dca==keys.left)then _aa,baa,aaa,caa=nil,nil,nil,nil;cd=cd-1 +if(cd>=1)then if( +cd=cda+bd)then bd=cd end end;if(dd>1)then +if(cd<1)then dd=dd-1;cd=__a[dd]:len()+1;bd=cd-cda+1 end end;if(cd<1)then cd=1 end;if(bd<1)then bd=1 end elseif(dca== +keys.tab)then +if(cd%3 ==0)then +__a[dd]=__a[dd]:sub(1,cd-1).." ".. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]=b_a[dd]:sub(1,cd-1)..ab[cca:getForeground()].. +b_a[dd]:sub(cd,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1,cd-1)..ab[cca:getBackground()].. +a_a[dd]:sub(cd,a_a[dd]:len())cd=cd+1 end +while cd%3 ~=0 do +__a[dd]=__a[dd]:sub(1,cd-1).." ".. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]=b_a[dd]:sub(1,cd-1)..ab[cca:getForeground()].. +b_a[dd]:sub(cd,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1,cd-1)..ab[cca:getBackground()].. +a_a[dd]:sub(cd,a_a[dd]:len())cd=cd+1 end end +if not +( (ada+cd-bd>=ada and ada+cd-bd=bda and bda+dd-adcca:getX()+ +cda-1)then __b=cca:getX()+cda-1 end;local a_b=(dd-ad=cda+bd)then bd=bd+1 end;_ca(cca) +cca:setValue("") +if not +( (ada+cd-bd>=ada and ada+cd-bd=bda and bda+dd-adcca:getX()+ +cda-1)then __b=cca:getX()+cda-1 end;local a_b=(dd-ad_da-cda+bd then cd=_da-cda+bd;dd=ada-dda+ +ad;if cd>__a[dd]:len()then +cd=__a[dd]:len()+1 end;aaa=cd;caa=dd +if cd#__a- (c_b-1))then +ad=#__a- (c_b-1)end;if(ad<1)then ad=1 end +if(cda+cd-bd>=cda and cda+cd-bd< +cda+b_b)and +(a_b+dd-ad>=a_b and a_b+dd-ad__a[dd]:len())then +cd=__a[dd]:len()+1;_aa=cd end +if(cd__a[caa]:len())then aaa=__a[caa]:len()+1 end +if(_aa==aaa)and(baa==caa)then _aa,aaa,baa,caa=nil,nil,nil,nil end;cca:updateDraw()end;return true end end,eventHandler=function(cca,dca,_da,ada,bda,cda) +if +(dc.eventHandler(cca,dca,_da,ada,bda,cda))then +if(dca=="paste")then +if(cca:isFocused())then local dda=cca:getParent() +local __b,a_b=cca:getForeground(),cca:getBackground()local b_b,c_b=cca:getSize() +__a[dd]=__a[dd]:sub(1,cd-1).._da.. +__a[dd]:sub(cd,__a[dd]:len()) +b_a[dd]=b_a[dd]:sub(1,cd-1)..ab[__b]:rep(_da:len()).. +b_a[dd]:sub(cd,b_a[dd]:len()) +a_a[dd]=a_a[dd]:sub(1,cd-1)..ab[a_b]:rep(_da:len()).. +a_a[dd]:sub(cd,a_a[dd]:len())cd=cd+_da:len()if(cd>=b_b+bd)then bd=(cd+1)-b_b end +local d_b,_ab=cca:getPosition() +dda:setCursor(true,d_b+cd-bd,_ab+dd-ad,__b)_ca(cca)cca:updateDraw()end end end end,draw=function(cca) +dc.draw(cca) +cca:addDraw("textfield",function()local dca=cca:getParent()local _da,ada=cca:getPosition() +local bda,cda=cca:getSize()local dda=ab[cca:getBackground()] +local __b=ab[cca:getForeground()] +for n=1,cda do local a_b=""local b_b=""local c_b=""if __a[n+ad-1]then a_b=__a[n+ad-1] +c_b=b_a[n+ad-1]b_b=a_a[n+ad-1]end +a_b=_c(a_b,bd,bda+bd-1)b_b=bb(dda,bda)c_b=bb(__b,bda)cca:addText(1,n,a_b) +cca:addBG(1,n,b_b)cca:addFG(1,n,c_b)cca:addBlit(1,n,a_b,c_b,b_b)end +if _aa and aaa and baa and caa then local a_b,b_b,c_b,d_b=bba(cca) +for n=c_b,d_b do +local _ab=#__a[n]local aab=0 +if n==c_b and n==d_b then aab=a_b-1 +_ab=_ab- (a_b-1)- (_ab-b_b)elseif n==d_b then _ab=_ab- (_ab-b_b)elseif n==c_b then _ab=_ab- (a_b-1)aab=a_b-1 end;cca:addBG(1 +aab,n,bb(ab[daa],_ab)) +cca:addFG(1 +aab,n,bb(ab[_ba],_ab))end end end)end,load=function(cca) +cca:listenEvent("mouse_click")cca:listenEvent("mouse_up") +cca:listenEvent("mouse_scroll")cca:listenEvent("mouse_drag") +cca:listenEvent("key")cca:listenEvent("char") +cca:listenEvent("other_event")end}bca.__index=bca;return setmetatable(bca,dc)end end +aa["objects"]["Progressbar"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("ChangeableObject")(ab,bb)local db="Progressbar"local _c=0;cb:setZIndex(5)cb:setValue(false) +cb:setSize(25,3)local ac=colors.black;local bc=""local cc=colors.white;local dc=""local _d=0 +local ad={getType=function(bd)return db end,setDirection=function(bd,cd) +_d=cd;bd:updateDraw()return bd end,getDirection=function(bd)return _d end,setProgressBar=function(bd,cd,dd,__a) +ac=cd or ac;bc=dd or bc;cc=__a or cc;bd:updateDraw()return bd end,getProgressBar=function(bd)return +ac,bc,cc end,setActiveBarColor=function(bd,cd)return bd:setProgressBar(cd,nil,nil)end,getActiveBarColor=function(bd)return +ac end,setActiveBarSymbol=function(bd,cd)return bd:setProgressBar(nil,cd,nil)end,getActiveBarSymbol=function(bd)return +bc end,setActiveBarSymbolColor=function(bd,cd)return bd:setProgressBar(nil,nil,cd)end,getActiveBarSymbolColor=function(bd)return +cc end,setBackgroundSymbol=function(bd,cd)dc=cd:sub(1,1)bd:updateDraw()return bd end,getBackgroundSymbol=function(bd)return +dc end,setProgress=function(bd,cd) +if(cd>=0)and(cd<=100)and(_c~=cd)then _c=cd +bd:setValue(_c)if(_c==100)then bd:progressDoneHandler()end end;bd:updateDraw()return bd end,getProgress=function(bd)return +_c end,onProgressDone=function(bd,cd)bd:registerEvent("progress_done",cd) +return bd end,progressDoneHandler=function(bd) +bd:sendEvent("progress_done")end,draw=function(bd)cb.draw(bd) +bd:addDraw("progressbar",function() +local cd,dd=bd:getPosition()local __a,a_a=bd:getSize() +local b_a,c_a=bd:getBackground(),bd:getForeground() +if(b_a~=false)then bd:addBackgroundBox(1,1,__a,a_a,b_a)end;if(dc~="")then bd:addTextBox(1,1,__a,a_a,dc)end +if +(c_a~=false)then bd:addForegroundBox(1,1,__a,a_a,c_a)end +if(_d==1)then bd:addBackgroundBox(1,1,__a,a_a/100 *_c,ac)bd:addForegroundBox(1,1,__a, +a_a/100 *_c,cc) +bd:addTextBox(1,1,__a,a_a/100 *_c,bc)elseif(_d==3)then +bd:addBackgroundBox(1,1 +math.ceil(a_a-a_a/100 *_c),__a, +a_a/100 *_c,ac) +bd:addForegroundBox(1,1 +math.ceil(a_a-a_a/100 *_c),__a, +a_a/100 *_c,cc) +bd:addTextBox(1,1 +math.ceil(a_a-a_a/100 *_c),__a,a_a/100 *_c,bc)elseif(_d==2)then +bd:addBackgroundBox(1 +math.ceil(__a-__a/100 *_c),1,__a/ +100 *_c,a_a,ac) +bd:addForegroundBox(1 +math.ceil(__a-__a/100 *_c),1,__a/100 *_c,a_a,cc) +bd:addTextBox(1 +math.ceil(__a-__a/100 *_c),1,__a/100 *_c,a_a,bc)else +bd:addBackgroundBox(1,1,math.ceil(__a/100 *_c),a_a,ac) +bd:addForegroundBox(1,1,math.ceil(__a/100 *_c),a_a,cc) +bd:addTextBox(1,1,math.ceil(__a/100 *_c),a_a,bc)end end)end}ad.__index=ad;return setmetatable(ad,cb)end end +aa["objects"]["Timer"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("Object")(ab,bb)local db="Timer"local _c=0;local ac=0;local bc=0;local cc;local dc=false +local _d={getType=function(ad)return db end,setTime=function(ad,bd,cd)_c=bd or 0 +ac=cd or 1;return ad end,getTime=function(ad)return _c end,start=function(ad)if(dc)then +os.cancelTimer(cc)end;bc=ac;cc=os.startTimer(_c)dc=true +ad:listenEvent("other_event")return ad end,isActive=function(ad)return dc end,cancel=function(ad)if( +cc~=nil)then os.cancelTimer(cc)end;dc=false +ad:removeEvent("other_event")return ad end,setStart=function(ad,bd)if(bd==true)then +return ad:start()else return ad:cancel()end end,onCall=function(ad,bd) +ad:registerEvent("timed_event",bd)return ad end,eventHandler=function(ad,bd,...)cb.eventHandler(ad,bd,...) +if +bd=="timer"and tObj==cc and dc then +ad:sendEvent("timed_event")if(bc>=1)then bc=bc-1;if(bc>=1)then cc=os.startTimer(_c)end elseif(bc==-1)then +cc=os.startTimer(_c)end end end}_d.__index=_d;return setmetatable(_d,cb)end end +aa["objects"]["Program"]=function(...)local ab=da("tHex")local bb=da("process") +local cb=string.sub +return +function(db,_c)local ac=_c.getObject("VisualObject")(db,_c) +local bc="Program"local cc;local dc;local _d={} +local function ad(_aa,aaa,baa,caa)local daa,_ba=1,1;local aba,bba=colors.black,colors.white;local cba=false +local dba=false;local _ca={}local aca={}local bca={}local cca={}local dca;local _da={}for i=0,15 do local cab=2 ^i +cca[cab]={_c.getTerm().getPaletteColour(cab)}end;local function ada()dca=(" "):rep(baa) +for n=0,15 do +local cab=2 ^n;local dab=ab[cab]_da[cab]=dab:rep(baa)end end +local function bda()ada()local cab=dca +local dab=_da[colors.white]local _bb=_da[colors.black] +for n=1,caa do +_ca[n]=cb(_ca[n]==nil and cab or _ca[n]..cab:sub(1, +baa-_ca[n]:len()),1,baa) +bca[n]=cb(bca[n]==nil and dab or bca[n].. +dab:sub(1,baa-bca[n]:len()),1,baa) +aca[n]=cb(aca[n]==nil and _bb or aca[n].. +_bb:sub(1,baa-aca[n]:len()),1,baa)end;ac.updateDraw(ac)end;bda()local function cda()if +daa>=1 and _ba>=1 and daa<=baa and _ba<=caa then else end end +local function dda(cab,dab,_bb)if + +_ba<1 or _ba>caa or daa<1 or daa+#cab-1 >baa then return end +_ca[_ba]=cb(_ca[_ba],1,daa-1)..cab..cb(_ca[_ba], +daa+#cab,baa)bca[_ba]=cb(bca[_ba],1,daa-1).. +dab..cb(bca[_ba],daa+#cab,baa) +aca[_ba]= +cb(aca[_ba],1,daa-1).._bb..cb(aca[_ba],daa+#cab,baa)daa=daa+#cab;if dba then cda()end;cc:updateDraw()end +local function __b(cab,dab,_bb) +if(_bb~=nil)then local abb=_ca[dab]if(abb~=nil)then +_ca[dab]=cb(abb:sub(1,cab-1).._bb..abb:sub(cab+ +(_bb:len()),baa),1,baa)end end;cc:updateDraw()end +local function a_b(cab,dab,_bb) +if(_bb~=nil)then local abb=aca[dab]if(abb~=nil)then +aca[dab]=cb(abb:sub(1,cab-1).._bb..abb:sub(cab+ +(_bb:len()),baa),1,baa)end end;cc:updateDraw()end +local function b_b(cab,dab,_bb) +if(_bb~=nil)then local abb=bca[dab]if(abb~=nil)then +bca[dab]=cb(abb:sub(1,cab-1).._bb..abb:sub(cab+ +(_bb:len()),baa),1,baa)end end;cc:updateDraw()end +local c_b=function(cab) +if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)elseif ab[cab]==nil then +error("Invalid color (got "..cab..")",2)end;bba=cab end +local d_b=function(cab) +if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)elseif ab[cab]==nil then +error("Invalid color (got "..cab..")",2)end;aba=cab end +local _ab=function(cab,dab,_bb,abb)if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)end +if ab[cab]==nil then error("Invalid color (got ".. +cab..")",2)end;local bbb +if +type(dab)=="number"and _bb==nil and abb==nil then bbb={colours.rgb8(dab)}cca[cab]=bbb else if +type(dab)~="number"then +error("bad argument #2 (expected number, got "..type(dab)..")",2)end;if type(_bb)~="number"then +error( +"bad argument #3 (expected number, got "..type(_bb)..")",2)end;if type(abb)~="number"then +error( +"bad argument #4 (expected number, got "..type(abb)..")",2)end;bbb=cca[cab]bbb[1]=dab +bbb[2]=_bb;bbb[3]=abb end end +local aab=function(cab)if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)end +if ab[cab]==nil then error("Invalid color (got ".. +cab..")",2)end;local dab=cca[cab]return dab[1],dab[2],dab[3]end +local bab={setCursorPos=function(cab,dab)if type(cab)~="number"then +error("bad argument #1 (expected number, got "..type(cab)..")",2)end;if type(dab)~="number"then +error( +"bad argument #2 (expected number, got "..type(dab)..")",2)end;daa=math.floor(cab) +_ba=math.floor(dab)if(dba)then cda()end end,getCursorPos=function()return +daa,_ba end,setCursorBlink=function(cab)if type(cab)~="boolean"then +error("bad argument #1 (expected boolean, got ".. +type(cab)..")",2)end;cba=cab end,getCursorBlink=function()return +cba end,getPaletteColor=aab,getPaletteColour=aab,setBackgroundColor=d_b,setBackgroundColour=d_b,setTextColor=c_b,setTextColour=c_b,setPaletteColor=_ab,setPaletteColour=_ab,getBackgroundColor=function()return aba end,getBackgroundColour=function()return aba end,getSize=function() +return baa,caa end,getTextColor=function()return bba end,getTextColour=function()return bba end,basalt_resize=function(cab,dab)baa,caa=cab,dab;bda()end,basalt_reposition=function(cab,dab) +_aa,aaa=cab,dab end,basalt_setVisible=function(cab)dba=cab end,drawBackgroundBox=function(cab,dab,_bb,abb,bbb)for n=1,abb do +a_b(cab,dab+ (n-1),ab[bbb]:rep(_bb))end end,drawForegroundBox=function(cab,dab,_bb,abb,bbb) +for n=1,abb do b_b(cab, +dab+ (n-1),ab[bbb]:rep(_bb))end end,drawTextBox=function(cab,dab,_bb,abb,bbb)for n=1,abb do +__b(cab,dab+ (n-1),bbb:rep(_bb))end end,basalt_update=function()for n=1,caa do +cc:addBlit(1,n,_ca[n],bca[n],aca[n])end end,scroll=function(cab) +assert(type(cab)== +"number","bad argument #1 (expected number, got "..type(cab)..")") +if cab~=0 then +for newY=1,caa do local dab=newY+cab;if dab<1 or dab>caa then _ca[newY]=dca +bca[newY]=_da[bba]aca[newY]=_da[aba]else _ca[newY]=_ca[dab]aca[newY]=aca[dab] +bca[newY]=bca[dab]end end end;if(dba)then cda()end end,isColor=function()return +_c.getTerm().isColor()end,isColour=function() +return _c.getTerm().isColor()end,write=function(cab)cab=tostring(cab)if(dba)then +dda(cab,ab[bba]:rep(cab:len()),ab[aba]:rep(cab:len()))end end,clearLine=function() +if +(dba)then __b(1,_ba,(" "):rep(baa)) +a_b(1,_ba,ab[aba]:rep(baa))b_b(1,_ba,ab[bba]:rep(baa))end;if(dba)then cda()end end,clear=function() +for n=1,caa +do __b(1,n,(" "):rep(baa)) +a_b(1,n,ab[aba]:rep(baa))b_b(1,n,ab[bba]:rep(baa))end;if(dba)then cda()end end,blit=function(cab,dab,_bb)if +type(cab)~="string"then +error("bad argument #1 (expected string, got "..type(cab)..")",2)end;if type(dab)~="string"then +error( +"bad argument #2 (expected string, got "..type(dab)..")",2)end;if type(_bb)~="string"then +error( +"bad argument #3 (expected string, got "..type(_bb)..")",2)end +if +#dab~=#cab or#_bb~=#cab then error("Arguments must be the same length",2)end;if(dba)then dda(cab,dab,_bb)end end}return bab end;ac:setZIndex(5)ac:setSize(30,12)local bd=ad(1,1,30,12)local cd +local dd=false;local __a={} +local function a_a(_aa)local aaa=_aa:getParent()local baa,caa=bd.getCursorPos() +local daa,_ba=_aa:getPosition()local aba,bba=_aa:getSize() +if(daa+baa-1 >=1 and +daa+baa-1 <=daa+aba-1 and caa+_ba-1 >=1 and +caa+_ba-1 <=_ba+bba-1)then +aaa:setCursor( +_aa:isFocused()and bd.getCursorBlink(),daa+baa-1,caa+_ba-1,bd.getTextColor())end end +local function b_a(_aa,aaa,...)local baa,caa=cd:resume(aaa,...) +if(baa==false)and(caa~=nil)and +(caa~="Terminated")then +local daa=_aa:sendEvent("program_error",caa) +if(daa~=false)then error("Basalt Program - "..caa)end end +if(cd:getStatus()=="dead")then _aa:sendEvent("program_done")end end +local function c_a(_aa,aaa,baa,caa,daa)if(cd==nil)then return false end +if not(cd:isDead())then if not(dd)then +local _ba,aba=_aa:getAbsolutePosition()b_a(_aa,aaa,baa,caa-_ba+1,daa-aba+1) +a_a(_aa)end end end +local function d_a(_aa,aaa,baa,caa)if(cd==nil)then return false end +if not(cd:isDead())then if not(dd)then if(_aa.draw)then +b_a(_aa,aaa,baa,caa)a_a(_aa)end end end end +cc={getType=function(_aa)return bc end,show=function(_aa)ac.show(_aa) +bd.setBackgroundColor(_aa:getBackground())bd.setTextColor(_aa:getForeground()) +bd.basalt_setVisible(true)return _aa end,hide=function(_aa) +ac.hide(_aa)bd.basalt_setVisible(false)return _aa end,setPosition=function(_aa,aaa,baa,caa) +ac.setPosition(_aa,aaa,baa,caa)bd.basalt_reposition(_aa:getPosition())return _aa end,getBasaltWindow=function()return +bd end,getBasaltProcess=function()return cd end,setSize=function(_aa,aaa,baa,caa)ac.setSize(_aa,aaa,baa,caa) +bd.basalt_resize(_aa:getWidth(),_aa:getHeight())return _aa end,getStatus=function(_aa)if(cd~=nil)then return +cd:getStatus()end;return"inactive"end,setEnviroment=function(_aa,aaa)_d= +aaa or{}return _aa end,execute=function(_aa,aaa,...)dc=aaa or dc +cd=bb:new(dc,bd,_d,...)bd.setBackgroundColor(colors.black) +bd.setTextColor(colors.white)bd.clear()bd.setCursorPos(1,1) +bd.setBackgroundColor(_aa:getBackground()) +bd.setTextColor(_aa:getForeground()or colors.white)bd.basalt_setVisible(true)b_a(_aa)dd=false +_aa:listenEvent("mouse_click",_aa)_aa:listenEvent("mouse_up",_aa) +_aa:listenEvent("mouse_drag",_aa)_aa:listenEvent("mouse_scroll",_aa) +_aa:listenEvent("key",_aa)_aa:listenEvent("key_up",_aa) +_aa:listenEvent("char",_aa)_aa:listenEvent("other_event",_aa)return _aa end,setExecute=function(_aa,aaa,...)return +_aa:execute(aaa,...)end,stop=function(_aa)local aaa=_aa:getParent() +if(cd~=nil)then if not +(cd:isDead())then b_a(_aa,"terminate")if(cd:isDead())then +aaa:setCursor(false)end end end;aaa:removeEvents(_aa)return _aa end,pause=function(_aa,aaa)dd= +aaa or(not dd)if(cd~=nil)then +if not(cd:isDead())then if not(dd)then +_aa:injectEvents(table.unpack(__a))__a={}end end end;return _aa end,isPaused=function(_aa)return +dd end,injectEvent=function(_aa,aaa,baa,...) +if(cd~=nil)then if not(cd:isDead())then +if(dd==false)or(baa)then +b_a(_aa,aaa,...)else table.insert(__a,{event=aaa,args={...}})end end end;return _aa end,getQueuedEvents=function(_aa)return +__a end,updateQueuedEvents=function(_aa,aaa)__a=aaa or __a;return _aa end,injectEvents=function(_aa,...)if(cd~=nil)then +if not +(cd:isDead())then for aaa,baa in pairs({...})do +b_a(_aa,baa.event,table.unpack(baa.args))end end end;return _aa end,mouseHandler=function(_aa,aaa,baa,caa) +if +(ac.mouseHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_click",aaa,baa,caa)return true end;return false end,mouseUpHandler=function(_aa,aaa,baa,caa) +if +(ac.mouseUpHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_up",aaa,baa,caa)return true end;return false end,scrollHandler=function(_aa,aaa,baa,caa) +if +(ac.scrollHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_scroll",aaa,baa,caa)return true end;return false end,dragHandler=function(_aa,aaa,baa,caa) +if +(ac.dragHandler(_aa,aaa,baa,caa))then c_a(_aa,"mouse_drag",aaa,baa,caa)return true end;return false end,keyHandler=function(_aa,aaa,baa)if +(ac.keyHandler(_aa,aaa,baa))then d_a(_aa,"key",aaa,baa)return true end;return +false end,keyUpHandler=function(_aa,aaa)if +(ac.keyUpHandler(_aa,aaa))then d_a(_aa,"key_up",aaa)return true end +return false end,charHandler=function(_aa,aaa)if +(ac.charHandler(_aa,aaa))then d_a(_aa,"char",aaa)return true end +return false end,getFocusHandler=function(_aa) +ac.getFocusHandler(_aa) +if(cd~=nil)then +if not(cd:isDead())then +if not(dd)then local aaa=_aa:getParent() +if(aaa~=nil)then +local baa,caa=bd.getCursorPos()local daa,_ba=_aa:getPosition()local aba,bba=_aa:getSize() +if +( + +daa+baa-1 >=1 and daa+baa-1 <=daa+aba-1 and caa+_ba-1 >=1 and caa+_ba-1 <=_ba+bba-1)then +aaa:setCursor(bd.getCursorBlink(),daa+baa-1,caa+_ba-1,bd.getTextColor())end end end end end end,loseFocusHandler=function(_aa) +ac.loseFocusHandler(_aa) +if(cd~=nil)then if not(cd:isDead())then local aaa=_aa:getParent()if(aaa~=nil)then +aaa:setCursor(false)end end end end,eventHandler=function(_aa,aaa,...) +ac.eventHandler(_aa,aaa,...)if cd==nil then return end +if not cd:isDead()then +if not dd then b_a(_aa,aaa,...) +if +_aa:isFocused()then local baa=_aa:getParent()local caa,daa=_aa:getPosition() +local _ba,aba=bd.getCursorPos()local bba,cba=_aa:getSize() +if caa+_ba-1 >=1 and +caa+_ba-1 <=caa+bba-1 and aba+daa-1 >=1 and +aba+daa-1 <=daa+cba-1 then +baa:setCursor(bd.getCursorBlink(), +caa+_ba-1,aba+daa-1,bd.getTextColor())end end else table.insert(__a,{event=aaa,args={...}})end end end,resizeHandler=function(_aa,...) +ac.resizeHandler(_aa,...) +if(cd~=nil)then +if not(cd:isDead())then +if not(dd)then +bd.basalt_resize(_aa:getSize())b_a(_aa,"term_resize",_aa:getSize())else +bd.basalt_resize(_aa:getSize()) +table.insert(__a,{event="term_resize",args={_aa:getSize()}})end end end end,repositionHandler=function(_aa,...) +ac.repositionHandler(_aa,...) +if(cd~=nil)then if not(cd:isDead())then +bd.basalt_reposition(_aa:getPosition())end end end,draw=function(_aa) +ac.draw(_aa) +_aa:addDraw("program",function()local aaa=_aa:getParent()local baa,caa=_aa:getPosition() +local daa,_ba=bd.getCursorPos()local aba,bba=_aa:getSize()bd.basalt_update()end)end,onError=function(_aa,...) +for baa,caa in +pairs(table.pack(...))do if(type(caa)=="function")then +_aa:registerEvent("program_error",caa)end end;local aaa=_aa:getParent()_aa:listenEvent("other_event") +return _aa end,onDone=function(_aa,...) +for baa,caa in +pairs(table.pack(...))do if(type(caa)=="function")then +_aa:registerEvent("program_done",caa)end end;local aaa=_aa:getParent()_aa:listenEvent("other_event") +return _aa end}cc.__index=cc;return setmetatable(cc,ac)end end +aa["objects"]["Checkbox"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="Checkbox"_c:setZIndex(5)_c:setValue(false) +_c:setSize(1,1)local bc,cc,dc,_d="\42"," ","","right" +local ad={load=function(bd)bd:listenEvent("mouse_click",bd) +bd:listenEvent("mouse_up",bd)end,getType=function(bd)return ac end,isType=function(bd,cd)return +ac==cd or +_c.isType~=nil and _c.isType(cd)or false end,setSymbol=function(bd,cd,dd) +bc=cd or bc;cc=dd or cc;bd:updateDraw()return bd end,setActiveSymbol=function(bd,cd)return bd:setSymbol(cd, +nil)end,setInactiveSymbol=function(bd,cd) +return bd:setSymbol(nil,cd)end,getSymbol=function(bd)return bc,cc end,getActiveSymbol=function(bd)return bc end,getInactiveSymbol=function(bd)return cc end,setText=function(bd,cd) +dc=cd;return bd end,getText=function(bd)return dc end,setTextPosition=function(bd,cd)_d=cd or _d;return bd end,getTextPosition=function(bd)return +_d end,setChecked=_c.setValue,getChecked=_c.getValue,mouseHandler=function(bd,cd,dd,__a) +if(_c.mouseHandler(bd,cd,dd,__a))then +if(cd==1)then +if( +bd:getValue()~=true)and(bd:getValue()~=false)then +bd:setValue(false)else bd:setValue(not bd:getValue())end;bd:updateDraw()return true end end;return false end,draw=function(bd) +_c.draw(bd) +bd:addDraw("checkbox",function()local cd,dd=bd:getPosition()local __a,a_a=bd:getSize() +local b_a=ab.getTextVerticalAlign(a_a,"center")local c_a,d_a=bd:getBackground(),bd:getForeground() +if +(bd:getValue())then +bd:addBlit(1,b_a,ab.getTextHorizontalAlign(bc,__a,"center"),bb[d_a],bb[c_a])else +bd:addBlit(1,b_a,ab.getTextHorizontalAlign(cc,__a,"center"),bb[d_a],bb[c_a])end;if(dc~="")then local _aa=_d=="left"and-dc:len()or 3 +bd:addText(_aa,b_a,dc)end end)end}ad.__index=ad;return setmetatable(ad,_c)end end +aa["objects"]["List"]=function(...)local ab=da("utils")local bb=da("tHex") +return +function(cb,db) +local _c=db.getObject("ChangeableObject")(cb,db)local ac="List"local bc={}local cc=colors.black;local dc=colors.lightGray;local _d=true +local ad="left"local bd=0;local cd=true;_c:setSize(16,8)_c:setZIndex(5) +local dd={init=function(__a) +local a_a=__a:getParent()__a:listenEvent("mouse_click") +__a:listenEvent("mouse_drag")__a:listenEvent("mouse_scroll")return _c.init(__a)end,getBase=function(__a)return +_c end,setTextAlign=function(__a,a_a)ad=a_a;return __a end,getTextAlign=function(__a)return ad end,getBase=function(__a)return _c end,getType=function(__a)return +ac end,isType=function(__a,a_a)return +ac==a_a or _c.isType~=nil and _c.isType(a_a)or false end,addItem=function(__a,a_a,b_a,c_a,...) +table.insert(bc,{text=a_a,bgCol= +b_a or __a:getBackground(),fgCol=c_a or __a:getForeground(),args={...}})if(#bc<=1)then __a:setValue(bc[1],false)end +__a:updateDraw()return __a end,setOptions=function(__a,...) +bc={} +for a_a,b_a in pairs(...)do +if(type(b_a)=="string")then +table.insert(bc,{text=b_a,bgCol=__a:getBackground(),fgCol=__a:getForeground(),args={}})else +table.insert(bc,{text=b_a[1],bgCol=b_a[2]or __a:getBackground(),fgCol=b_a[3]or +__a:getForeground(),args=b_a[4]or{}})end end;__a:setValue(bc[1],false)__a:updateDraw()return __a end,setOffset=function(__a,a_a) +bd=a_a;__a:updateDraw()return __a end,getOffset=function(__a)return bd end,removeItem=function(__a,a_a) +if( +type(a_a)=="number")then table.remove(bc,a_a)elseif(type(a_a)=="table")then +for b_a,c_a in +pairs(bc)do if(c_a==a_a)then table.remove(bc,b_a)break end end end;__a:updateDraw()return __a end,getItem=function(__a,a_a)return +bc[a_a]end,getAll=function(__a)return bc end,getOptions=function(__a)return bc end,getItemIndex=function(__a) +local a_a=__a:getValue()for b_a,c_a in pairs(bc)do if(c_a==a_a)then return b_a end end end,clear=function(__a) +bc={}__a:setValue({},false)__a:updateDraw()return __a end,getItemCount=function(__a)return +#bc end,editItem=function(__a,a_a,b_a,c_a,d_a,...)table.remove(bc,a_a) +table.insert(bc,a_a,{text=b_a,bgCol=c_a or +__a:getBackground(),fgCol=d_a or __a:getForeground(),args={...}})__a:updateDraw()return __a end,selectItem=function(__a,a_a)__a:setValue( +bc[a_a]or{},false)__a:updateDraw()return __a end,setSelectionColor=function(__a,a_a,b_a,c_a)cc= +a_a or __a:getBackground() +dc=b_a or __a:getForeground()_d=c_a~=nil and c_a or true;__a:updateDraw() +return __a end,setSelectionBG=function(__a,a_a)return __a:setSelectionColor(a_a, +nil,_d)end,setSelectionFG=function(__a,a_a)return __a:setSelectionColor( +nil,a_a,_d)end,getSelectionColor=function(__a) +return cc,dc end,getSelectionBG=function(__a)return cc end,getSelectionFG=function(__a)return dc end,isSelectionColorActive=function(__a)return _d end,setScrollable=function(__a,a_a) +cd=a_a;if(a_a==nil)then cd=true end;__a:updateDraw()return __a end,getScrollable=function(__a)return +cd end,scrollHandler=function(__a,a_a,b_a,c_a) +if(_c.scrollHandler(__a,a_a,b_a,c_a))then +if(cd)then +local d_a,_aa=__a:getSize()bd=bd+a_a;if(bd<0)then bd=0 end;if(a_a>=1)then +if(#bc>_aa)then +if(bd>#bc-_aa)then bd=#bc-_aa end;if(bd>=#bc)then bd=#bc-1 end else bd=bd-1 end end +__a:updateDraw()end;return true end;return false end,mouseHandler=function(__a,a_a,b_a,c_a) +if +(_c.mouseHandler(__a,a_a,b_a,c_a))then local d_a,_aa=__a:getAbsolutePosition()local aaa,baa=__a:getSize() +if +(#bc>0)then +for n=1,baa do +if(bc[n+bd]~=nil)then if +(d_a<=b_a)and(d_a+aaa>b_a)and(_aa+n-1 ==c_a)then __a:setValue(bc[n+bd])__a:selectHandler() +__a:updateDraw()end end end end;return true end;return false end,dragHandler=function(__a,a_a,b_a,c_a)return +__a:mouseHandler(a_a,b_a,c_a)end,touchHandler=function(__a,a_a,b_a)return +__a:mouseHandler(1,a_a,b_a)end,onSelect=function(__a,...) +for a_a,b_a in +pairs(table.pack(...))do if(type(b_a)=="function")then +__a:registerEvent("select_item",b_a)end end;return __a end,selectHandler=function(__a) +__a:sendEvent("select_item",__a:getValue())end,draw=function(__a)_c.draw(__a) +__a:addDraw("list",function() +local a_a,b_a=__a:getSize() +for n=1,b_a do +if bc[n+bd]then local c_a=bc[n+bd].text +local d_a,_aa=bc[n+bd].fgCol,bc[n+bd].bgCol +if bc[n+bd]==__a:getValue()and _d then d_a,_aa=dc,cc end;__a:addText(1,n,c_a:sub(1,a_a)) +__a:addBG(1,n,bb[_aa]:rep(a_a))__a:addFG(1,n,bb[d_a]:rep(a_a))end end end)end}dd.__index=dd;return setmetatable(dd,_c)end end +aa["objects"]["Graph"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("ChangeableObject")(ab,bb)local db="Graph"cb:setZIndex(5)cb:setSize(30,10)local _c={} +local ac=colors.gray;local bc="\7"local cc=colors.black;local dc=100;local _d=0;local ad="line"local bd=10 +local cd={getType=function(dd)return db end,setGraphColor=function(dd,__a)ac= +__a or ac;dd:updateDraw()return dd end,setGraphSymbol=function(dd,__a,a_a) +bc=__a or bc;cc=a_a or cc;dd:updateDraw()return dd end,setGraphSymbolColor=function(dd,__a)return dd:setGraphSymbolColor( +nil,__a)end,getGraphSymbol=function(dd) +return bc,cc end,getGraphSymbolColor=function(dd)return cc end,addDataPoint=function(dd,__a)if __a>=_d and __a<=dc then +table.insert(_c,__a)dd:updateDraw()end;if(#_c>100)then +table.remove(_c,1)end;return dd end,setMaxValue=function(dd,__a) +dc=__a;dd:updateDraw()return dd end,getMaxValue=function(dd)return dc end,setMinValue=function(dd,__a) +_d=__a;dd:updateDraw()return dd end,getMinValue=function(dd)return _d end,setGraphType=function(dd,__a)if __a== +"scatter"or __a=="line"or __a=="bar"then ad=__a +dd:updateDraw()end;return dd end,getGraphType=function(dd)return +ad end,setMaxEntries=function(dd,__a)bd=__a;dd:updateDraw()return dd end,getMaxEntries=function(dd)return +bd end,clear=function(dd)_c={}dd:updateDraw()return dd end,draw=function(dd) +cb.draw(dd) +dd:addDraw("graph",function()local __a,a_a=dd:getPosition()local b_a,c_a=dd:getSize() +local d_a,_aa=dd:getBackground(),dd:getForeground()local aaa=dc-_d;local baa,caa;local daa=#_c-bd+1;if daa<1 then daa=1 end +for i=daa,#_c do local _ba=_c[i] +local aba=math.floor(( ( +b_a-1)/ (bd-1))* (i-daa)+1.5) +local bba=math.floor((c_a-1)- ( (c_a-1)/aaa)* (_ba-_d)+1.5) +if ad=="scatter"then dd:addBackgroundBox(aba,bba,1,1,ac) +dd:addForegroundBox(aba,bba,1,1,cc)dd:addTextBox(aba,bba,1,1,bc)elseif ad=="line"then +if baa and caa then +local cba=math.abs(aba-baa)local dba=math.abs(bba-caa)local _ca=baa-dba then +bca=bca-dba;baa=baa+_ca end +if ccadba.evId else return +cba.zIndex>dba.zIndex end end;local function a_a(cba)cba:sortChildren()return bc end +local function b_a(cba,dba)if +(type(dba)=="table")then dba=dba:getName()end +for _ca,aca in ipairs(bc)do if +aca.element:getName()==dba then return aca.element end end end +local function c_a(cba,dba)local _ca=b_a(dba)if(_ca~=nil)then return _ca end;for aca,bca in ipairs(bc)do +if +(bca:getType()=="Container")then local cca=bca:getDeepChild(dba)if(cca~=nil)then return cca end end end end +local function d_a(cba,dba)if(b_a(dba:getName())~=nil)then return end;bd=bd+1 +local _ca=dba:getZIndex() +table.insert(bc,{element=dba,zIndex=_ca,objId=bd})ad=false;dba:setParent(cba,true)for aca,bca in +pairs(dba:getRegisteredEvents())do cba:addEvent(aca,dba)end;if(dba.init~= +nil)then dba:init()end +if(dba.load~=nil)then dba:load()end;if(dba.draw~=nil)then dba:draw()end;return dba end +local function _aa(cba,dba) +if(type(dba)=="string")then dba=b_a(dba:getName())end;if(dba==nil)then return end +for _ca,aca in ipairs(bc)do if aca.element==dba then +table.remove(bc,_ca)return true end end;cba:removeEvents(dba)ad=false end;local function aaa(cba)local dba=cba:getParent()bc={}cc={}ad=false;bd=0;cd=0;_d=nil +dba:removeEvents(cba)end +local function baa(cba,dba,_ca)bd=bd+1;cd=cd+1;for aca,bca in +pairs(bc)do +if(bca.element==dba)then bca.zIndex=_ca;bca.objId=bd;break end end;for aca,bca in pairs(cc)do +for cca,dca in pairs(bca)do if +(dca.element==dba)then dca.zIndex=_ca;dca.evId=cd end end end;ad=false +cba:updateDraw()end +local function caa(cba,dba)local _ca=cba:getParent() +for aca,bca in pairs(cc)do for cca,dca in pairs(bca)do if(dca.element==dba)then +table.remove(cc[aca],cca)end end +if( +bb(cc[aca])<=0)then if(_ca~=nil)then _ca:removeEvent(aca,cba)end end end;ad=false end +local function daa(cba,dba,_ca)if(type(_ca)=="table")then _ca=_ca:getName()end +if(cc[dba]~= +nil)then for aca,bca in pairs(cc[dba])do +if(bca.element:getName()==_ca)then return bca end end end end +local function _ba(cba,dba,_ca) +if(daa(cba,dba,_ca:getName())~=nil)then return end;local aca=_ca:getZIndex()cd=cd+1 +if(cc[dba]==nil)then cc[dba]={}end +table.insert(cc[dba],{element=_ca,zIndex=aca,evId=cd})ad=false;cba:listenEvent(dba)return _ca end +local function aba(cba,dba,_ca) +if(cc[dba]~=nil)then for aca,bca in pairs(cc[dba])do if(bca.element==_ca)then +table.remove(cc[dba],aca)end end;if( +bb(cc[dba])<=0)then cba:listenEvent(dba,false)end end;ad=false end +local function bba(cba,dba)return dba~=nil and cc[dba]or cc end +dc={getType=function()return ac end,getBase=function(cba)return _c end,isType=function(cba,dba) +return ac==dba or +_c.isType~=nil and _c.isType(dba)or false end,setSize=function(cba,...)_c.setSize(cba,...) +cba:customEventHandler("basalt_FrameResize")return cba end,setPosition=function(cba,...) +_c.setPosition(cba,...)cba:customEventHandler("basalt_FrameReposition") +return cba end,searchChildren=function(cba,dba)local _ca={} +for aca,bca in pairs(bc)do if +(string.find(bca.element:getName(),dba))then table.insert(_ca,bca)end end;return _ca end,getChildrenByType=function(cba,dba) +local _ca={}for aca,bca in pairs(bc)do +if(bca.element:isType(dba))then table.insert(_ca,bca)end end;return _ca end,setImportant=function(cba,dba)bd= +bd+1;cd=cd+1 +for _ca,aca in pairs(cc)do for bca,cca in pairs(aca)do +if(cca.element==dba)then cca.evId=cd +table.remove(cc[_ca],bca)table.insert(cc[_ca],cca)break end end end +for _ca,aca in ipairs(bc)do if aca.element==dba then aca.objId=bd;table.remove(bc,_ca) +table.insert(bc,aca)break end end;if(cba.updateDraw~=nil)then cba:updateDraw()end +ad=false end,sortChildren=function(cba)if +(ad)then return end;table.sort(bc,dd)for dba,_ca in pairs(cc)do +table.sort(cc[dba],__a)end;ad=true end,clearFocusedChild=function(cba)if( +_d~=nil)then +if(b_a(cba,_d)~=nil)then _d:loseFocusHandler()end end;_d=nil;return cba end,setFocusedChild=function(cba,dba) +if( +_d~=dba)then if(_d~=nil)then +if(b_a(cba,_d)~=nil)then _d:loseFocusHandler()end end;if(dba~=nil)then if(b_a(cba,dba)~=nil)then +dba:getFocusHandler()end end;_d=dba;return true end;return false end,getFocused=function(cba)return +_d end,getChild=b_a,getChildren=a_a,getDeepChildren=c_a,addChild=d_a,removeChild=_aa,removeChildren=aaa,getEvents=bba,getEvent=daa,addEvent=_ba,removeEvent=aba,removeEvents=caa,updateZIndex=baa,listenEvent=function(cba,dba,_ca)_c.listenEvent(cba,dba,_ca)if( +cc[dba]==nil)then cc[dba]={}end;return cba end,customEventHandler=function(cba,...) +_c.customEventHandler(cba,...) +for dba,_ca in pairs(bc)do if(_ca.element.customEventHandler~=nil)then +_ca.element:customEventHandler(...)end end end,loseFocusHandler=function(cba) +_c.loseFocusHandler(cba)if(_d~=nil)then _d:loseFocusHandler()_d=nil end end,getBasalt=function(cba)return +db end,setPalette=function(cba,dba,...)local _ca=cba:getParent() +_ca:setPalette(dba,...)return cba end,eventHandler=function(cba,...) +if(_c.eventHandler~=nil)then +_c.eventHandler(cba,...) +if(cc["other_event"]~=nil)then cba:sortChildren() +for dba,_ca in +ipairs(cc["other_event"])do if(_ca.element.eventHandler~=nil)then +_ca.element.eventHandler(_ca.element,...)end end end end end} +for cba,dba in +pairs({mouse_click={"mouseHandler",true},mouse_up={"mouseUpHandler",false},mouse_drag={"dragHandler",false},mouse_scroll={"scrollHandler",true},mouse_hover={"hoverHandler",false}})do +dc[dba[1]]=function(_ca,aca,bca,cca,...) +if(_c[dba[1]]~=nil)then +if(_c[dba[1]](_ca,aca,bca,cca,...))then +if +(cc[cba]~=nil)then _ca:sortChildren() +for dca,_da in ipairs(cc[cba])do +if +(_da.element[dba[1]]~=nil)then local ada,bda=0,0 +if(_ca.getOffset~=nil)then ada,bda=_ca:getOffset()end +if(_da.element.getIgnoreOffset~=nil)then if(_da.element.getIgnoreOffset())then +ada,bda=0,0 end end;if(_da.element[dba[1]](_da.element,aca,bca+ada,cca+bda,...))then return +true end end end;if(dba[2])then _ca:clearFocusedChild()end end;return true end end end end +for cba,dba in +pairs({key="keyHandler",key_up="keyUpHandler",char="charHandler"})do +dc[dba]=function(_ca,...) +if(_c[dba]~=nil)then +if(_c[dba](_ca,...))then +if(cc[cba]~=nil)then +_ca:sortChildren()for aca,bca in ipairs(cc[cba])do +if(bca.element[dba]~=nil)then if +(bca.element[dba](bca.element,...))then return true end end end end end end end end;for cba,dba in pairs(db.getObjects())do +dc["add"..cba]=function(_ca,aca)return +_ca:addChild(db:createObject(cba,aca))end end +dc.__index=dc;return setmetatable(dc,_c)end end +aa["objects"]["Frame"]=function(...)local ab=da("utils") +local bb,cb,db,_c,ac=math.max,math.min,string.sub,string.rep,string.len +return +function(bc,cc)local dc=cc.getObject("Container")(bc,cc)local _d="Frame" +local ad;local bd=true;local cd,dd=0,0;dc:setSize(30,10)dc:setZIndex(10) +local __a={getType=function()return _d end,isType=function(a_a,b_a)return + +_d==b_a or dc.isType~=nil and dc.isType(b_a)or false end,getBase=function(a_a) +return dc end,getOffset=function(a_a)return cd,dd end,setOffset=function(a_a,b_a,c_a)cd=b_a or cd;dd=c_a or dd +a_a:updateDraw()return a_a end,getXOffset=function(a_a)return cd end,setXOffset=function(a_a,b_a)return +a_a:setOffset(b_a,nil)end,getYOffset=function(a_a)return dd end,setYOffset=function(a_a,b_a)return +a_a:setOffset(nil,b_a)end,setParent=function(a_a,b_a,...) +dc.setParent(a_a,b_a,...)ad=b_a;return a_a end,render=function(a_a) +if(dc.render~=nil)then +if +(a_a:isVisible())then dc.render(a_a)local b_a=a_a:getChildren()for c_a,d_a in ipairs(b_a)do +if( +d_a.element.render~=nil)then d_a.element:render()end end end end end,updateDraw=function(a_a)if( +ad~=nil)then ad:updateDraw()end;return a_a end,blit=function(a_a,b_a,c_a,d_a,_aa,aaa) +local baa,caa=a_a:getPosition()local daa,_ba=ad:getOffset()baa=baa-daa;caa=caa-_ba +local aba,bba=a_a:getSize() +if c_a>=1 and c_a<=bba then +local cba=db(d_a,bb(1 -b_a+1,1),bb(aba-b_a+1,1)) +local dba=db(_aa,bb(1 -b_a+1,1),bb(aba-b_a+1,1)) +local _ca=db(aaa,bb(1 -b_a+1,1),bb(aba-b_a+1,1)) +ad:blit(bb(b_a+ (baa-1),baa),caa+c_a-1,cba,dba,_ca)end end,setCursor=function(a_a,b_a,c_a,d_a,_aa) +local aaa,baa=a_a:getPosition()local caa,daa=a_a:getOffset() +ad:setCursor(b_a or false,(c_a or 0)+aaa-1 -caa,( +d_a or 0)+baa-1 -daa,_aa or colors.white)return a_a end} +for a_a,b_a in +pairs({"drawBackgroundBox","drawForegroundBox","drawTextBox"})do +__a[b_a]=function(c_a,d_a,_aa,aaa,baa,caa)local daa,_ba=c_a:getPosition()local aba,bba=ad:getOffset() +daa=daa-aba;_ba=_ba-bba +baa=(_aa<1 and( +baa+_aa>c_a:getHeight()and c_a:getHeight()or baa+_aa-1)or( +baa+ +_aa>c_a:getHeight()and c_a:getHeight()-_aa+1 or baa)) +aaa=(d_a<1 and(aaa+d_a>c_a:getWidth()and c_a:getWidth()or aaa+ +d_a-1)or( + +aaa+d_a>c_a:getWidth()and c_a:getWidth()-d_a+1 or aaa)) +ad[b_a](ad,bb(d_a+ (daa-1),daa),bb(_aa+ (_ba-1),_ba),aaa,baa,caa)end end +for a_a,b_a in pairs({"setBG","setFG","setText"})do +__a[b_a]=function(c_a,d_a,_aa,aaa) +local baa,caa=c_a:getPosition()local daa,_ba=ad:getOffset()baa=baa-daa;caa=caa-_ba +local aba,bba=c_a:getSize()if(_aa>=1)and(_aa<=bba)then +ad[b_a](ad,bb(d_a+ (baa-1),baa),caa+_aa-1,db(aaa,bb( +1 -d_a+1,1),bb(aba-d_a+1,1)))end end end;__a.__index=__a;return setmetatable(__a,dc)end end +aa["objects"]["ChangeableObject"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("VisualObject")(ab,bb)local db="ChangeableObject"local _c +local ac={setValue=function(bc,cc,dc)if(_c~=cc)then _c=cc;bc:updateDraw()if(dc~=false)then +bc:valueChangedHandler()end end;return bc end,getValue=function(bc)return +_c end,onChange=function(bc,...) +for cc,dc in pairs(table.pack(...))do if(type(dc)=="function")then +bc:registerEvent("value_changed",dc)end end;return bc end,valueChangedHandler=function(bc) +bc:sendEvent("value_changed",_c)end}ac.__index=ac;return setmetatable(ac,cb)end end +aa["objects"]["BaseFrame"]=function(...)local ab=da("basaltDraw") +local bb=da("utils")local cb,db,_c,ac=math.max,math.min,string.sub,string.rep +return +function(bc,cc) +local dc=cc.getObject("Container")(bc,cc)local _d="BaseFrame"local ad,bd=0,0;local cd={}local dd=true;local __a=cc.getTerm() +local a_a=ab(__a)local b_a,c_a,d_a,_aa=1,1,false,colors.white +local aaa={getType=function()return _d end,isType=function(baa,caa) +return _d==caa or dc.isType~=nil and +dc.isType(caa)or false end,getBase=function(baa)return dc end,getOffset=function(baa)return ad,bd end,setOffset=function(baa,caa,daa)ad= +caa or ad;bd=daa or bd;baa:updateDraw()return baa end,getXOffset=function(baa)return +ad end,setXOffset=function(baa,caa)return baa:setOffset(caa,nil)end,getYOffset=function(baa)return +bd end,setYOffset=function(baa,caa)return baa:setOffset(nil,caa)end,setPalette=function(baa,caa,...) +if( +baa==cc.getActiveFrame())then +if(type(caa)=="string")then cd[caa]=... +__a.setPaletteColor( +type(caa)=="number"and caa or colors[caa],...)elseif(type(caa)=="table")then +for daa,_ba in pairs(caa)do cd[daa]=_ba +if(type(_ba)=="number")then +__a.setPaletteColor( +type(daa)=="number"and daa or colors[daa],_ba)else local aba,bba,cba=table.unpack(_ba) +__a.setPaletteColor( +type(daa)=="number"and daa or colors[daa],aba,bba,cba)end end end end;return baa end,setSize=function(baa,...) +dc.setSize(baa,...)a_a=ab(__a)return baa end,getSize=function()return __a.getSize()end,getWidth=function(baa)return +({__a.getSize()})[1]end,getHeight=function(baa) +return({__a.getSize()})[2]end,show=function(baa)dc.show(baa)cc.setActiveFrame(baa) +for caa,daa in +pairs(colors)do if(type(daa)=="number")then +__a.setPaletteColor(daa,colors.packRGB(term.nativePaletteColor((daa))))end end +for caa,daa in pairs(cd)do +if(type(daa)=="number")then +__a.setPaletteColor( +type(caa)=="number"and caa or colors[caa],daa)else local _ba,aba,bba=table.unpack(daa) +__a.setPaletteColor( +type(caa)=="number"and caa or colors[caa],_ba,aba,bba)end end;cc.setMainFrame(baa)return baa end,render=function(baa) +if( +dc.render~=nil)then +if(baa:isVisible())then +if(dd)then dc.render(baa) +local caa=baa:getChildren()for daa,_ba in ipairs(caa)do if(_ba.element.render~=nil)then +_ba.element:render()end end +dd=false end end end end,updateDraw=function(baa) +dd=true;return baa end,eventHandler=function(baa,caa,...)dc.eventHandler(baa,caa,...)if +(caa=="term_resize")then baa:setSize(__a.getSize())end end,updateTerm=function(baa)if( +a_a~=nil)then a_a.update()end end,setTerm=function(baa,caa)__a=caa;if(caa== +nil)then a_a=nil else a_a=ab(__a)end;return baa end,getTerm=function()return +__a end,blit=function(baa,caa,daa,_ba,aba,bba)local cba,dba=baa:getPosition() +local _ca,aca=baa:getSize() +if daa>=1 and daa<=aca then +local bca=_c(_ba,cb(1 -caa+1,1),cb(_ca-caa+1,1)) +local cca=_c(aba,cb(1 -caa+1,1),cb(_ca-caa+1,1)) +local dca=_c(bba,cb(1 -caa+1,1),cb(_ca-caa+1,1)) +a_a.blit(cb(caa+ (cba-1),cba),dba+daa-1,bca,cca,dca)end end,setCursor=function(baa,caa,daa,_ba,aba) +local bba,cba=baa:getAbsolutePosition()local dba,_ca=baa:getOffset()d_a=caa or false;if(daa~=nil)then +b_a=bba+daa-1 -dba end +if(_ba~=nil)then c_a=cba+_ba-1 -_ca end;_aa=aba or _aa +if(d_a)then __a.setTextColor(_aa) +__a.setCursorPos(b_a,c_a)__a.setCursorBlink(d_a)else __a.setCursorBlink(false)end;return baa end} +for baa,caa in +pairs({mouse_click={"mouseHandler",true},mouse_up={"mouseUpHandler",false},mouse_drag={"dragHandler",false},mouse_scroll={"scrollHandler",true},mouse_hover={"hoverHandler",false}})do +aaa[caa[1]]=function(daa,_ba,aba,bba,...)if(dc[caa[1]](daa,_ba,aba,bba,...))then +cc.setActiveFrame(daa)end end end +for baa,caa in +pairs({"drawBackgroundBox","drawForegroundBox","drawTextBox"})do +aaa[caa]=function(daa,_ba,aba,bba,cba,dba)local _ca,aca=daa:getPosition()local bca,cca=daa:getSize() +cba=(aba<1 and(cba+ +aba>daa:getHeight()and daa:getHeight()or cba+aba- +1)or(cba+aba> +daa:getHeight()and daa:getHeight()-aba+1 or +cba)) +bba=(_ba<1 and(bba+_ba>daa:getWidth()and daa:getWidth()or bba+ +_ba-1)or( + +bba+_ba>daa:getWidth()and daa:getWidth()-_ba+1 or bba)) +a_a[caa](cb(_ba+ (_ca-1),_ca),cb(aba+ (aca-1),aca),bba,cba,dba)end end +for baa,caa in pairs({"setBG","setFG","setText"})do +aaa[caa]=function(daa,_ba,aba,bba) +local cba,dba=daa:getPosition()local _ca,aca=daa:getSize()if(aba>=1)and(aba<=aca)then +a_a[caa](cb(_ba+ (cba-1),cba), +dba+aba-1,_c(bba,cb(1 -_ba+1,1),cb(_ca-_ba+1,1)))end end end;aaa.__index=aaa;return setmetatable(aaa,dc)end end +aa["objects"]["Pane"]=function(...) +return +function(ab,bb) +local cb=bb.getObject("VisualObject")(ab,bb)local db="Pane"cb:setSize(25,10) +local _c={getType=function(ac)return db end}_c.__index=_c;return setmetatable(_c,cb)end end +aa["objects"]["Label"]=function(...)local ab=da("utils")local bb=ab.wrapText +local cb=ab.writeWrappedText;local db=da("tHex") +return +function(_c,ac) +local bc=ac.getObject("VisualObject")(_c,ac)local cc="Label"bc:setZIndex(3)bc:setSize(5,1) +bc:setBackground(false)local dc=true;local _d,ad="Label","left" +local bd={getType=function(cd)return cc end,getBase=function(cd)return bc end,setText=function(cd,dd) +_d=tostring(dd) +if(dc)then local __a=bb(_d,#_d)local a_a,b_a=1,1;for c_a,d_a in pairs(__a)do b_a=b_a+1 +a_a=math.max(a_a,d_a:len())end;cd:setSize(a_a,b_a)dc=true end;cd:updateDraw()return cd end,getAutoSize=function(cd)return +dc end,setAutoSize=function(cd,dd)dc=dd;return cd end,getText=function(cd)return _d end,setSize=function(cd,dd,__a) +bc.setSize(cd,dd,__a)dc=false;return cd end,getTextAlign=function(cd)return ad end,setTextAlign=function(cd,dd)ad=dd or ad;return +cd end,draw=function(cd)bc.draw(cd) +cd:addDraw("label",function()local dd,__a=cd:getSize() +local a_a= + + +ad=="center"and math.floor(dd/2 -_d:len()/2 +0.5)or ad=="right"and dd- (_d:len()-1)or 1;cb(cd,a_a,1,_d,dd+1,__a)end)end,init=function(cd) +bc.init(cd)local dd=cd:getParent() +cd:setForeground(dd:getForeground())end}bd.__index=bd;return setmetatable(bd,bc)end end;return aa["main"]() \ No newline at end of file