diff --git a/basaltInstaller.lua b/basaltInstaller.lua new file mode 100644 index 0000000..41c91b1 --- /dev/null +++ b/basaltInstaller.lua @@ -0,0 +1,58 @@ + +local args = table.pack(...) + + +local function downloadProject(dir) + local function split(inputstr, sep) + if sep == nil then + sep = "%s" + end + local t={} + for str in string.gmatch(inputstr, "([^"..sep.."]+)") do + table.insert(t, str) + end + return t + end + shell.run("wget https://raw.githubusercontent.com/Pyroxenium/Basalt/master/projectFiles.txt .projectFiles.txt") + local projectFiles = {} + local pFile = fs.open(".projectFiles.txt", "r") + + for line in pFile.readLine do + local t = split(line, "/") + if(#t>1)then + if(projectFiles[t[1]]==nil)then projectFiles[t[1]] = {} end + table.insert(projectFiles[t[1]], t[2]) + else + if(projectFiles["default"]==nil)then projectFiles["default"] = {} end + table.insert(projectFiles["default"], line) + end + end + pFile.close() + shell.run("rm .projectFiles.txt") + fs.makeDir(dir) + fs.makeDir(dir.."/objects") + fs.makeDir(dir.."/libraries") + for k,v in pairs(projectFiles["objects"])do + shell.run("wget https://raw.githubusercontent.com/Pyroxenium/Basalt/master/Basalt/objects/"..v.." "..dir.."/objects/"..v) + end + for k,v in pairs(projectFiles["libraries"])do + shell.run("wget https://raw.githubusercontent.com/Pyroxenium/Basalt/master/Basalt/libraries/"..v.." "..dir.."/libraries/"..v) + end + for k,v in pairs(projectFiles["default"])do + shell.run("wget https://raw.githubusercontent.com/Pyroxenium/Basalt/master/Basalt/"..v.." "..dir.."/"..v) + end +end + +if(#args>0)then + if(string.lower(args[1])=="bpm")or(string.lower(args[1])=="basaltpackagemanager")then + shell.run("wget https://raw.githubusercontent.com/Pyroxenium/Basalt/master/basaltPackageManager.lua basaltPackageManager.lua") + end + if(string.lower(args[1])=="single")then + downloadProject("Basalt") + shell.run("wget https://raw.githubusercontent.com/Pyroxenium/Basalt/master/basaltPackager.lua basaltPackager.lua") + shell.run("basaltPackager.lua "..tostring(args[2] and false or true)) + fs.delete("Basalt") + end +else + downloadProject("Basalt") +end \ No newline at end of file diff --git a/basaltPackageManager.lua b/basaltPackageManager.lua new file mode 100644 index 0000000..2cb4e62 --- /dev/null +++ b/basaltPackageManager.lua @@ -0,0 +1,1181 @@ +local project = {} +local packaged = true +local baseRequire = require +local require = function(path) + for _,v in pairs(project)do + for name,b in pairs(v)do + if(name==path)then + return b() + end + end + end + return baseRequire(path); +end +local getProject = function(subDir) + if(subDir~=nil)then + return project[subDir] + end + return project +end +project['objects'] = {}project['libraries'] = {}project['default'] = {}project['objects']['Animation'] = function(...) +return +function(a)local b={}local c="Animation"local d;local _a={}local aa=1;local ba=0;local ca +local function da()if(_a[aa]~=nil)then +_a[aa].f(b,aa)end;aa=aa+1;if(_a[aa]~=nil)then if(_a[aa].t>0)then +d=os.startTimer(_a[aa].t)else da()end end end +b={name=a,getType=function(_b)return c end,getZIndex=function(_b)return 1 end,getName=function(_b)return _b.name end,add=function(_b,ab,bb)ca=ab;table.insert(_a,{f=ab,t= +bb or ba})return _b end,wait=function(_b,ab) +ba=ab;return _b end,rep=function(_b,ab) +for x=1,ab do table.insert(_a,{f=ca,t=ba})end;return _b end,clear=function(_b)_a={}ca=nil;ba=0;aa=1;return _b end,play=function(_b) +aa=1;if(_a[aa]~=nil)then +if(_a[aa].t>0)then d=os.startTimer(_a[aa].t)else da()end end;return _b end,cancel=function(_b) +os.cancelTimer(d)return _b end,eventHandler=function(_b,ab,bb)if(ab=="timer")and(bb==d)then +if(_a[aa]~=nil)then da()end end end}b.__index=b;return b end +end; +project['objects']['Button'] = function(...)local d=require("Object")local _a=require("theme") +local aa=require("utils") +return +function(ba)local ca=d(ba)local da="Button"ca:setValue("Button") +ca:setZIndex(5)ca.width=8;ca.bgColor=_a.ButtonBG;ca.fgColor=_a.ButtonFG;local _b="center" +local ab="center" +local bb={getType=function(cb)return da end,setHorizontalAlign=function(cb,db)_b=db end,setVerticalAlign=function(cb,db)ab=db end,setText=function(cb,db)ca:setValue(db) +return cb end,draw=function(cb) +if(ca.draw(cb))then +if(cb.parent~=nil)then +local db,_c=cb:getAnchorPosition()local ac=aa.getTextVerticalAlign(cb.height,ab)if +(cb.bgColor~=false)then +cb.parent:drawBackgroundBox(db,_c,cb.width,cb.height,cb.bgColor) +cb.parent:drawTextBox(db,_c,cb.width,cb.height," ")end;if( +cb.fgColor~=false)then +cb.parent:drawForegroundBox(db,_c,cb.width,cb.height,cb.fgColor)end +for n=1,cb.height do if(n==ac)then +cb.parent:setText(db,_c+ +(n-1),aa.getTextHorizontalAlign(cb:getValue(),cb.width,_b))end end end;cb:setVisualChanged(false)end end}return setmetatable(bb,ca)end +end; +project['objects']['Checkbox'] = function(...)local d=require("Object")local _a=require("theme") +local aa=require("utils") +return +function(ba)local ca=d(ba)local da="Checkbox"ca:setZIndex(5)ca:setValue(false) +ca.width=1;ca.height=1;ca.bgColor=_a.CheckboxBG;ca.fgColor=_a.CheckboxFG +local _b={symbol="\42",getType=function(ab)return da end,mouseHandler=function(ab,bb,cb,db,_c) +if +(ca.mouseHandler(ab,bb,cb,db,_c))then +if +( (bb=="mouse_click")and(cb==1))or(bb=="monitor_touch")then +if(ab:getValue()~=true)and(ab:getValue()~=false)then +ab:setValue(false)else ab:setValue(not ab:getValue())end end;return true end;return false end,draw=function(ab) +if +(ca.draw(ab))then +if(ab.parent~=nil)then local bb,cb=ab:getAnchorPosition() +local db=aa.getTextVerticalAlign(ab.height,"center")if(ab.bgColor~=false)then +ab.parent:drawBackgroundBox(bb,cb,ab.width,ab.height,ab.bgColor)end +for n=1,ab.height do +if(n==db)then +if +(ab:getValue()==true)then +ab.parent:writeText(bb,cb+ (n-1),aa.getTextHorizontalAlign(ab.symbol,ab.width,"center"),ab.bgColor,ab.fgColor)else +ab.parent:writeText(bb,cb+ (n-1),aa.getTextHorizontalAlign(" ",ab.width,"center"),ab.bgColor,ab.fgColor)end end end end;ab:setVisualChanged(false)end end}return setmetatable(_b,ca)end +end; +project['objects']['Dropdown'] = function(...)local d=require("Object")local _a=require("theme") +local aa=require("utils") +return +function(ba)local ca=d(ba)local da="Dropdown"ca.width=12;ca.height=1;ca.bgColor=_a.dropdownBG +ca.fgColor=_a.dropdownFG;ca:setZIndex(6)local _b={}local ab=_a.selectionBG;local bb=_a.selectionFG +local cb=true;local db="left"local _c=0;local ac=16;local bc=6;local cc="\16"local dc="\31"local _d=false +local ad={getType=function(bd)return da end,setIndexOffset=function(bd,cd) +_c=cd;return bd end,getIndexOffset=function(bd)return _c end,addItem=function(bd,cd,dd,__a,...) +table.insert(_b,{text=cd,bgCol=dd or bd.bgColor,fgCol=__a or bd.fgColor,args={...}})return bd end,getAll=function(bd)return _b end,removeItem=function(bd,cd) +table.remove(_b,cd)return bd end,getItem=function(bd,cd)return _b[cd]end,getItemIndex=function(bd) +local cd=bd:getValue()for dd,__a in pairs(_b)do if(__a==cd)then return dd end end end,clear=function(bd) +_b={}bd:setValue({})return bd end,getItemCount=function(bd)return#_b end,editItem=function(bd,cd,dd,__a,a_a,...) +table.remove(_b,cd) +table.insert(_b,cd,{text=dd,bgCol=__a or bd.bgColor,fgCol=a_a or bd.fgColor,args={...}})return bd end,selectItem=function(bd,cd)bd:setValue( +_b[cd]or{})return bd end,setSelectedItem=function(bd,cd,dd,__a) +ab=cd or bd.bgColor;bb=dd or bd.fgColor;cb=__a;return bd end,setDropdownSize=function(bd,cd,dd) +ac,bc=cd,dd;return bd end,mouseHandler=function(bd,cd,dd,__a,a_a) +if(_d)then +local b_a,c_a=bd:getAbsolutePosition(bd:getAnchorPosition()) +if +( (cd=="mouse_click")and(dd==1))or(cd=="monitor_touch")then if(#_b>0)then +for n=1,bc do if(_b[n+_c]~=nil)then +if +(b_a<=__a)and(b_a+ac>__a)and(c_a+n==a_a)then bd:setValue(_b[n+_c])return true end end end end end +if(cd=="mouse_scroll")then _c=_c+dd;if(_c<0)then _c=0 end +if(dd==1)then if(#_b>bc)then if(_c>#_b-bc)then _c=#_b- +bc end else _c=_b-1 end end;return true end;bd:setVisualChanged()end +if(ca.mouseHandler(bd,cd,dd,__a,a_a))then _d=true else _d=false end end,draw=function(bd) +if +(ca.draw(bd))then local cd,dd=bd:getAnchorPosition() +if(bd.parent~=nil)then if(bd.bgColor~=false)then +bd.parent:drawBackgroundBox(cd,dd,bd.width,bd.height,bd.bgColor)end;local __a=bd:getValue() +local a_a=aa.getTextHorizontalAlign(( +__a~=nil and __a.text or""),bd.width,db):sub(1, +bd.width-1).. (_d and dc or cc) +bd.parent:writeText(cd,dd,a_a,bd.bgColor,bd.fgColor) +if(_d)then +for n=1,bc do +if(_b[n+_c]~=nil)then +if(_b[n+_c]==__a)then +if(cb)then +bd.parent:writeText(cd,dd+n,aa.getTextHorizontalAlign(_b[n+ +_c].text,ac,db),ab,bb)else +bd.parent:writeText(cd,dd+n,aa.getTextHorizontalAlign(_b[n+_c].text,ac,db),_b[n+ +_c].bgCol,_b[n+_c].fgCol)end else +bd.parent:writeText(cd,dd+n,aa.getTextHorizontalAlign(_b[n+_c].text,ac,db),_b[n+ +_c].bgCol,_b[n+_c].fgCol)end end end end end;bd:setVisualChanged(false)end end}return setmetatable(ad,ca)end +end; +project['objects']['Label'] = function(...)local aa=require("Object")local ba=require("theme") +local ca=require("utils")local da=require("tHex")local _b=require("bigfont") +return +function(ab)local bb=aa(ab) +local cb="Label"bb:setZIndex(3)local db=true;bb:setValue("")local _c="left"local ac="top" +local bc=0;local cc,dc=false,false +local _d={getType=function(ad)return cb end,setText=function(ad,bd)bd=tostring(bd) +bb:setValue(bd)if(db)then ad.width=bd:len()end +if not(cc)then ad.fgColor= +ad.parent:getForeground()or colors.white end;if not(dc)then +ad.bgColor=ad.parent:getBackground()or colors.black end;return ad end,setBackground=function(ad,bd) +bb.setBackground(ad,bd)dc=true;return ad end,setForeground=function(ad,bd) +bb.setForeground(ad,bd)cc=true;return ad end,setTextAlign=function(ad,bd,cd)_c=bd or _c;ac=cd or ac +ad:setVisualChanged()return ad end,setFontSize=function(ad,bd)if(bd>0)and(bd<=4)then +bc=bd-1 or 0 end;return ad end,getFontSize=function(ad)return bc+1 end,setSize=function(ad,bd,cd) +bb.setSize(ad,bd,cd)db=false;ad:setVisualChanged()return ad end,draw=function(ad) +if +(bb.draw(ad))then +if(ad.parent~=nil)then local bd,cd=ad:getAnchorPosition() +local dd=ca.getTextVerticalAlign(ad.height,ac)if(ad.bgColor~=false)then +ad.parent:drawBackgroundBox(bd,cd,ad.width,ad.height,ad.bgColor) +ad.parent:drawTextBox(bd,cd,ad.width,ad.height," ")end;if( +ad.fgColor~=false)then +ad.parent:drawForegroundBox(bd,cd,ad.width,ad.height,ad.fgColor)end +if(bc==0)then +for n=1,ad.height do if(n==dd)then +ad.parent:setText(bd, +cd+ (n-1),ca.getTextHorizontalAlign(ad:getValue(),ad.width,_c))end end else +local __a=_b(bc,ad:getValue(),ad.fgColor,ad.bgColor or colors.black) +if(db)then ad.height=#__a[1]-1;ad.width=#__a[1][1]end +for n=1,ad.height do +if(n==dd)then local a_a,b_a=ad.parent:getSize() +local c_a,d_a=#__a[1][1],#__a[1] +bd=bd or math.floor((a_a-c_a)/2)+1 +cd=cd or math.floor((b_a-d_a)/2)+1 +for i=1,d_a do +ad.parent:setFG(bd,cd+i+n-2,ca.getTextHorizontalAlign(__a[2][i],ad.width,_c)) +ad.parent:setBG(bd,cd+i+n-2,ca.getTextHorizontalAlign(__a[3][i],ad.width,_c,da[ad.bgColor or colors.black])) +ad.parent:setText(bd,cd+i+n-2,ca.getTextHorizontalAlign(__a[1][i],ad.width,_c))end end end end end;ad:setVisualChanged(false)end end}return setmetatable(_d,bb)end +end; +project['objects']['List'] = function(...)local d=require("Object")local _a=require("theme") +local aa=require("utils") +return +function(ba)local ca=d(ba)local da="List"ca.width=16;ca.height=6;ca.bgColor=_a.listBG +ca.fgColor=_a.listFG;ca:setZIndex(5)local _b={}local ab=_a.selectionBG;local bb=_a.selectionFG +local cb=true;local db="left"local _c=0;local ac=true +local bc={getType=function(cc)return da end,addItem=function(cc,dc,_d,ad,...) +table.insert(_b,{text=dc,bgCol=_d or cc.bgColor,fgCol=ad or cc.fgColor,args={...}})if(#_b==1)then cc:setValue(_b[1])end;return cc end,setIndexOffset=function(cc,dc) +_c=dc;return cc end,getIndexOffset=function(cc)return _c end,removeItem=function(cc,dc)table.remove(_b,dc) +return cc end,getItem=function(cc,dc)return _b[dc]end,getAll=function(cc)return _b end,getItemIndex=function(cc) +local dc=cc:getValue()for _d,ad in pairs(_b)do if(ad==dc)then return _d end end end,clear=function(cc) +_b={}cc:setValue({})return cc end,getItemCount=function(cc)return#_b end,editItem=function(cc,dc,_d,ad,bd,...) +table.remove(_b,dc) +table.insert(_b,dc,{text=_d,bgCol=ad or cc.bgColor,fgCol=bd or cc.fgColor,args={...}})return cc end,selectItem=function(cc,dc)cc:setValue( +_b[dc]or{})return cc end,setSelectedItem=function(cc,dc,_d,ad) +ab=dc or cc.bgColor;bb=_d or cc.fgColor;cb=ad;return cc end,setScrollable=function(cc,dc) +ac=dc;return cc end,mouseHandler=function(cc,dc,_d,ad,bd) +local cd,dd=cc:getAbsolutePosition(cc:getAnchorPosition()) +if +(cd<=ad)and(cd+cc.width>ad)and(dd<=bd)and( +dd+cc.height>bd)and(cc:isVisible())then +if +( ( (dc=="mouse_click")or(dc=="mouse_drag"))and(_d==1))or(dc=="monitor_touch")then +if(#_b>0)then +for n=1,cc.height do +if( +_b[n+_c]~=nil)then +if +(cd<=ad)and(cd+cc.width>ad)and(dd+n-1 ==bd)then cc:setValue(_b[n+_c]) +cc:getEventSystem():sendEvent("mouse_click",cc,"mouse_click",0,ad,bd,_b[ +n+_c])end end end end end +if(dc=="mouse_scroll")and(ac)then _c=_c+_d;if(_c<0)then _c=0 end;if(_d>=1)then +if +(#_b>cc.height)then if(_c>#_b-cc.height)then _c=#_b-cc.height end;if +(_c>=#_b)then _c=#_b-1 end else _c=_c-1 end end end;cc:setVisualChanged()return true end end,draw=function(cc) +if +(ca.draw(cc))then +if(cc.parent~=nil)then local dc,_d=cc:getAnchorPosition()if(cc.bgColor~=false)then +cc.parent:drawBackgroundBox(dc,_d,cc.width,cc.height,cc.bgColor)end +for n=1,cc.height do +if(_b[n+_c]~=nil)then +if( +_b[n+_c]==cc:getValue())then +if(cb)then +cc.parent:writeText(dc,_d+n-1,aa.getTextHorizontalAlign(_b[n+_c].text,cc.width,db),ab,bb)else +cc.parent:writeText(dc,_d+n-1,aa.getTextHorizontalAlign(_b[n+_c].text,cc.width,db),_b[ +n+_c].bgCol,_b[n+_c].fgCol)end else +cc.parent:writeText(dc,_d+n-1,aa.getTextHorizontalAlign(_b[n+_c].text,cc.width,db),_b[ +n+_c].bgCol,_b[n+_c].fgCol)end end end end;cc:setVisualChanged(false)end end}return setmetatable(bc,ca)end +end; +project['objects']['List'] = function(...)local d=require("Object")local _a=require("theme") +local aa=require("utils") +return +function(ba)local ca=d(ba)local da="List"ca.width=16;ca.height=6;ca.bgColor=_a.listBG +ca.fgColor=_a.listFG;ca:setZIndex(5)local _b={}local ab=_a.selectionBG;local bb=_a.selectionFG +local cb=true;local db="left"local _c=0;local ac=true +local bc={getType=function(cc)return da end,addItem=function(cc,dc,_d,ad,...) +table.insert(_b,{text=dc,bgCol=_d or cc.bgColor,fgCol=ad or cc.fgColor,args={...}})if(#_b==1)then cc:setValue(_b[1])end;return cc end,setIndexOffset=function(cc,dc) +_c=dc;return cc end,getIndexOffset=function(cc)return _c end,removeItem=function(cc,dc)table.remove(_b,dc) +return cc end,getItem=function(cc,dc)return _b[dc]end,getAll=function(cc)return _b end,getItemIndex=function(cc) +local dc=cc:getValue()for _d,ad in pairs(_b)do if(ad==dc)then return _d end end end,clear=function(cc) +_b={}cc:setValue({})return cc end,getItemCount=function(cc)return#_b end,editItem=function(cc,dc,_d,ad,bd,...) +table.remove(_b,dc) +table.insert(_b,dc,{text=_d,bgCol=ad or cc.bgColor,fgCol=bd or cc.fgColor,args={...}})return cc end,selectItem=function(cc,dc)cc:setValue( +_b[dc]or{})return cc end,setSelectedItem=function(cc,dc,_d,ad) +ab=dc or cc.bgColor;bb=_d or cc.fgColor;cb=ad;return cc end,setScrollable=function(cc,dc) +ac=dc;return cc end,mouseHandler=function(cc,dc,_d,ad,bd) +local cd,dd=cc:getAbsolutePosition(cc:getAnchorPosition()) +if +(cd<=ad)and(cd+cc.width>ad)and(dd<=bd)and( +dd+cc.height>bd)and(cc:isVisible())then +if +( ( (dc=="mouse_click")or(dc=="mouse_drag"))and(_d==1))or(dc=="monitor_touch")then +if(#_b>0)then +for n=1,cc.height do +if( +_b[n+_c]~=nil)then +if +(cd<=ad)and(cd+cc.width>ad)and(dd+n-1 ==bd)then cc:setValue(_b[n+_c]) +cc:getEventSystem():sendEvent("mouse_click",cc,"mouse_click",0,ad,bd,_b[ +n+_c])end end end end end +if(dc=="mouse_scroll")and(ac)then _c=_c+_d;if(_c<0)then _c=0 end;if(_d>=1)then +if +(#_b>cc.height)then if(_c>#_b-cc.height)then _c=#_b-cc.height end;if +(_c>=#_b)then _c=#_b-1 end else _c=_c-1 end end end;cc:setVisualChanged()return true end end,draw=function(cc) +if +(ca.draw(cc))then +if(cc.parent~=nil)then local dc,_d=cc:getAnchorPosition()if(cc.bgColor~=false)then +cc.parent:drawBackgroundBox(dc,_d,cc.width,cc.height,cc.bgColor)end +for n=1,cc.height do +if(_b[n+_c]~=nil)then +if( +_b[n+_c]==cc:getValue())then +if(cb)then +cc.parent:writeText(dc,_d+n-1,aa.getTextHorizontalAlign(_b[n+_c].text,cc.width,db),ab,bb)else +cc.parent:writeText(dc,_d+n-1,aa.getTextHorizontalAlign(_b[n+_c].text,cc.width,db),_b[ +n+_c].bgCol,_b[n+_c].fgCol)end else +cc.parent:writeText(dc,_d+n-1,aa.getTextHorizontalAlign(_b[n+_c].text,cc.width,db),_b[ +n+_c].bgCol,_b[n+_c].fgCol)end end end end;cc:setVisualChanged(false)end end}return setmetatable(bc,ca)end +end; +project['objects']['Menubar'] = function(...)local _a=require("Object")local aa=require("theme") +local ba=require("utils")local ca=require("tHex") +return +function(da)local _b=_a(da)local ab="Menubar"local bb={}_b.width=30 +_b.height=1;_b.bgColor=colors.gray;_b.fgColor=colors.lightGray +_b:setZIndex(5)local cb={}local db=aa.selectionBG;local _c=aa.selectionFG;local ac=true;local bc="left"local cc=0 +local dc=1;local _d=false +local function ad()local bd=0;local cd=0 +for n=1,#cb do +if(cd+cb[n].text:len()+dc*2 > +bb.width)then +if(cddd)then cc=dd end;return bd end,getPositionOffset=function(bd)return +cc end,setScrollable=function(bd,cd)_d=cd;if(cd==nil)then _d=true end;return bd end,removeItem=function(bd,cd) +table.remove(cb,cd)return bd end,getItem=function(bd,cd)return cb[cd]end,getItemCount=function(bd)return#cb end,editItem=function(bd,cd,dd,__a,a_a,...) +table.remove(cb,cd) +table.insert(cb,cd,{text=dd,bgCol=__a or bd.bgColor,fgCol=a_a or bd.fgColor,args={...}})return bd end,selectItem=function(bd,cd)bd:setValue( +cb[cd]or{})return bd end,setSelectedItem=function(bd,cd,dd,__a) +db=cd or bd.bgColor;_c=dd or bd.fgColor;ac=__a;return bd end,mouseHandler=function(bd,cd,dd,__a,a_a) +if +(_b.mouseHandler(bd,cd,dd,__a,a_a))then +local b_a,c_a=bd:getAbsolutePosition(bd:getAnchorPosition()) +if + +(b_a<=__a)and(b_a+bd.width>__a)and(c_a<=a_a)and(c_a+bd.height>a_a)and(bd:isVisible())then +if(bd.parent~=nil)then bd.parent:setFocusedObject(bd)end +if(cd=="mouse_click")or(cd=="monitor_touch")then local d_a=0 +for n=1,#cb do +if +(cb[n]~=nil)then +if +(b_a+d_a<=__a+cc)and( +b_a+d_a+cb[n].text:len()+ (dc*2)>__a+cc)and(c_a==a_a)then bd:setValue(cb[n]) +bd:getEventSystem():sendEvent(cd,bd,cd,0,__a,a_a,cb[n])end;d_a=d_a+cb[n].text:len()+dc*2 end end end;if(cd=="mouse_scroll")and(_d)then cc=cc+dd;if(cc<0)then cc=0 end;local d_a=ad()if +(cc>d_a)then cc=d_a end end +bd:setVisualChanged(true)return true end end;return false end,draw=function(bd) +if +(_b.draw(bd))then +if(bd.parent~=nil)then local cd,dd=bd:getAnchorPosition()if(bd.bgColor~=false)then +bd.parent:drawBackgroundBox(cd,dd,bd.width,bd.height,bd.bgColor)end;local __a=""local a_a=""local b_a="" +for c_a,d_a in +pairs(cb)do +local _aa=(" "):rep(dc)..d_a.text.. (" "):rep(dc)__a=__a.._aa +if(d_a==bd:getValue())then a_a=a_a.. +ca[db or d_a.bgCol or bd.bgColor]:rep(_aa:len())b_a=b_a.. +ca[_c or d_a.FgCol or +bd.fgColor]:rep(_aa:len())else a_a=a_a.. +ca[d_a.bgCol or bd.bgColor]:rep(_aa:len())b_a=b_a.. +ca[d_a.FgCol or bd.fgColor]:rep(_aa:len())end end +bd.parent:setText(cd,dd,__a:sub(cc+1,bd.width+cc)) +bd.parent:setBG(cd,dd,a_a:sub(cc+1,bd.width+cc)) +bd.parent:setFG(cd,dd,b_a:sub(cc+1,bd.width+cc))end;bd:setVisualChanged(false)end end}return setmetatable(bb,_b)end +end; +project['objects']['Radio'] = function(...)local d=require("Object")local _a=require("theme") +local aa=require("utils") +return +function(ba)local ca=d(ba)local da="Radio"ca.width=8;ca.bgColor=_a.listBG +ca.fgColor=_a.listFG;ca:setZIndex(5)local _b={}local ab=_a.selectionBG;local bb=_a.selectionFG +local cb=ca.bgColor;local db=ca.fgColor;local _c=true;local ac="\7"local bc="left" +local cc={getType=function(dc)return da end,addItem=function(dc,_d,ad,bd,cd,dd,...) +table.insert(_b,{x=ad or 1,y= +bd or 1,text=_d,bgCol=cd or dc.bgColor,fgCol=dd or dc.fgColor,args={...}})if(#_b==1)then dc:setValue(_b[1])end;return dc end,getAll=function(dc)return +_b end,removeItem=function(dc,_d)table.remove(_b,_d)return dc end,getItem=function(dc,_d)return +_b[_d]end,getItemIndex=function(dc)local _d=dc:getValue()for ad,bd in pairs(_b)do +if(bd==_d)then return ad end end end,clear=function(dc) +_b={}dc:setValue({})return dc end,getItemCount=function(dc)return#_b end,editItem=function(dc,_d,ad,bd,cd,dd,__a,...) +table.remove(_b,_d) +table.insert(_b,_d,{x=bd or 1,y=cd or 1,text=ad,bgCol=dd or dc.bgColor,fgCol=__a or dc.fgColor,args={...}})return dc end,selectItem=function(dc,_d)dc:setValue( +_b[_d]or{})return dc end,setSelectedItem=function(dc,_d,ad,bd,cd,dd)ab=_d or ab;bb= +ad or bb;cb=bd or cb;db=cd or db;_c=dd;return dc end,mouseHandler=function(dc,_d,ad,bd,cd) +local dd,__a=dc:getAbsolutePosition(dc:getAnchorPosition()) +if +( (_d=="mouse_click")and(ad==1))or(_d=="monitor_touch")then +if(#_b>0)then +for a_a,b_a in pairs(_b)do +if(dd+b_a.x-1 <=bd)and( +dd+b_a.x-1 +b_a.text:len()+2 >=bd)and( +__a+b_a.y-1 ==cd)then dc:setValue(b_a) +if( +dc.parent~=nil)then dc.parent:setFocusedObject(dc)end;dc:setVisualChanged()return true end end end end;return false end,draw=function(dc) +if +(ca.draw(dc))then +if(dc.parent~=nil)then local _d,ad=dc:getAnchorPosition() +for bd,cd in pairs(_b)do +if(cd== +dc:getValue())then if(bc=="left")then +dc.parent:writeText(cd.x+_d-1,cd.y+ad-1,ac,cb,db) +dc.parent:writeText(cd.x+2 +_d-1,cd.y+ad-1,cd.text,ab,bb)end else +dc.parent:drawBackgroundBox( +cd.x+_d-1,cd.y+ad-1,1,1,dc.bgColor) +dc.parent:writeText(cd.x+2 +_d-1,cd.y+ad-1,cd.text,cd.bgCol,cd.fgCol)end end end;dc:setVisualChanged(false)end end}return setmetatable(cc,ca)end +end; +project['objects']['Scrollbar'] = function(...)local c=require("Object")local d=require("theme") +return +function(_a)local aa=c(_a) +local ba="Scrollbar"aa.width=1;aa.height=8;aa.bgColor=colors.lightGray +aa.fgColor=colors.gray;aa:setValue(1)aa:setZIndex(2)local ca="vertical"local da=" " +local _b=colors.black;local ab="\127"local bb=aa.height;local cb=1;local db=1 +local _c={getType=function(ac)return ba end,setSymbol=function(ac,bc)da=bc:sub(1,1) +ac:setVisualChanged()return ac end,setSymbolSize=function(ac,bc)db=tonumber(bc)or 1 +if +(ca=="vertical")then +ac:setValue(cb-1 * (bb/ (ac.height- (db-1)))- (bb/ ( +ac.height- (db-1))))elseif(ca=="horizontal")then +ac:setValue( +cb-1 * (bb/ (ac.width- (db-1)))- (bb/ (ac.width- (db-1))))end;ac:setVisualChanged()return ac end,setMaxValue=function(ac,bc) +bb=bc;return ac end,setBackgroundSymbol=function(ac,bc)ab=string.sub(bc,1,1) +ac:setVisualChanged()return ac end,setSymbolColor=function(ac,bc)_b=bc +ac:setVisualChanged()return ac end,setBarType=function(ac,bc)ca=bc:lower()return ac end,mouseHandler=function(ac,bc,cc,dc,_d) +if +(aa.mouseHandler(ac,bc,cc,dc,_d))then +local ad,bd=ac:getAbsolutePosition(ac:getAnchorPosition()) +if +( ( (bc=="mouse_click")or(bc=="mouse_drag"))and(cc==1))or(bc=="monitor_touch")then +if(ca=="horizontal")then +for _index=0,ac.width +do if +(ad+_index==dc)and(bd<=_d)and(bd+ac.height>_d)then cb=math.min(_index+1,ac.width- (db-1))ac:setValue( +bb/ac.width* (cb)) +ac:setVisualChanged()end end end +if(ca=="vertical")then +for _index=0,ac.height do if(bd+_index==_d)and(ad<=dc)and +(ad+ac.width>dc)then +cb=math.min(_index+1,ac.height- (db-1))ac:setValue(bb/ac.height* (cb)) +ac:setVisualChanged()end end end end +if(bc=="mouse_scroll")then cb=cb+cc;if(cb<1)then cb=1 end +cb=math.min(cb,( +ca=="vertical"and ac.height or ac.width)- (db-1)) +ac:setValue( +bb/ (ca=="vertical"and ac.height or ac.width)*cb)end;return true end end,draw=function(ac) +if +(aa.draw(ac))then +if(ac.parent~=nil)then local bc,cc=ac:getAnchorPosition() +if(ca=="horizontal")then +ac.parent:writeText(bc,cc,ab:rep( +cb-1),ac.bgColor,ac.fgColor) +ac.parent:writeText(bc+cb-1,cc,da:rep(db),_b,_b) +ac.parent:writeText(bc+cb+db-1,cc,ab:rep(ac.width- (cb+db-1)),ac.bgColor,ac.fgColor)end +if(ca=="vertical")then +for n=0,ac.height-1 do +if(cb==n+1)then for curIndexOffset=0,math.min(db-1,ac.height)do +ac.parent:writeText(bc, +cc+n+curIndexOffset,da,_b,_b)end else if(n+1 cb-1 +db)then +ac.parent:writeText(bc,cc+n,ab,ac.bgColor,ac.fgColor)end end end end end;ac:setVisualChanged(false)end end}return setmetatable(_c,aa)end +end; +project['objects']['Thread'] = function(...) +return +function(a)local b;local c="Thread"local d;local _a;local aa=false +b={name=a,getType=function(ba)return c end,getZIndex=function(ba)return 1 end,getName=function(ba) +return ba.name end,start=function(ba,ca)if(ca==nil)then +error("Function provided to thread is nil")end;d=ca;_a=coroutine.create(d) +aa=true;local da,_b=coroutine.resume(_a)if not(da)then +if(_b~="Terminated")then error( +"Thread Error Occurred - ".._b)end end;return ba end,getStatus=function(ba,ca)if( +_a~=nil)then return coroutine.status(_a)end;return nil end,stop=function(ba,ca) +aa=false;return ba end,eventHandler=function(ba,ca,da,_b,ab) +if(aa)then +if(coroutine.status(_a)~="dead")then +local bb,cb=coroutine.resume(_a,ca,da,_b,ab)if not(bb)then if(cb~="Terminated")then +error("Thread Error Occurred - "..cb)end end else +aa=false end end end}b.__index=b;return b end +end; +project['libraries']['basaltDraw'] = function(...)local d=require("tHex")local _a,aa=string.sub,string.rep +return +function(ba) +local ca=ba or term.current()local da,_b=ca.getSize()local ab={}local bb={}local cb={}local db={}local _c={}local ac={}local bc;local cc={}local function dc() +bc=aa(" ",da) +for n=0,15 do local __a=2 ^n;local a_a=d[__a]cc[__a]=aa(a_a,da)end end;dc() +local function _d()local __a=bc +local a_a=cc[colors.white]local b_a=cc[colors.black] +for currentY=1,_b do +ab[currentY]=_a( +ab[currentY]==nil and __a or +ab[currentY]..__a:sub(1,da-ab[currentY]:len()),1,da) +cb[currentY]=_a(cb[currentY]==nil and a_a or cb[currentY]..a_a:sub(1,da- +cb[currentY]:len()),1,da) +bb[currentY]=_a(bb[currentY]==nil and b_a or bb[currentY]..b_a:sub(1,da- +bb[currentY]:len()),1,da)end end;_d() +local function ad(__a,a_a,b_a) +if(a_a>=1)and(a_a<=_b)then +if +(__a+b_a:len()>0)and(__a<=da)then local c_a=ab[a_a]local d_a;local _aa=__a+#b_a-1 +if(__a<1)then local aaa=1 -__a+1 +local baa=da-__a+1;b_a=_a(b_a,aaa,baa)elseif(_aa>da)then local aaa=da-__a+1;b_a=_a(b_a,1,aaa)end +if(__a>1)then local aaa=__a-1;d_a=_a(c_a,1,aaa)..b_a else d_a=b_a end;if _aa=1)and(a_a<=_b)then +if(__a+b_a:len()>0)and(__a<=da)then +local c_a=bb[a_a]local d_a;local _aa=__a+#b_a-1 +if(__a<1)then +b_a=_a(b_a,1 -__a+1,da-__a+1)elseif(_aa>da)then b_a=_a(b_a,1,da-__a+1)end +if(__a>1)then d_a=_a(c_a,1,__a-1)..b_a else d_a=b_a end;if _aa=1)and(a_a<=_b)then +if(__a+b_a:len()>0)and(__a<=da)then +local c_a=cb[a_a]local d_a;local _aa=__a+#b_a-1 +if(__a<1)then local aaa=1 -__a+1;local baa=da-__a+1 +b_a=_a(b_a,aaa,baa)elseif(_aa>da)then local aaa=da-__a+1;b_a=_a(b_a,1,aaa)end +if(__a>1)then local aaa=__a-1;d_a=_a(c_a,1,aaa)..b_a else d_a=b_a end;if _aa1 then +while#_c>2 do +table.sort(_c,function(ad,bd)return +ad[2]>bd[2]end)local bc,cc=ba(_c),#_c;local dc,_d=_c[cc][1],_c[bc][1] +for i=1,6 do if cb[i]==dc then cb[i]=_d;_c[bc][2]= +_c[bc][2]+1 end end;_c[cc]=nil end;local ac=128 +for i=1,#cb-1 do if cb[i]~=cb[6]then ac=ac+2 ^ (i-1)end end;return string.char(ac), +aa[_c[1][1]==cb[6]and _c[2][1]or _c[1][1] ],aa[cb[6] ]else +return"\128",aa[cb[1] ],aa[cb[1] ]end end;local da,_b,ab,bb={{},{},{}},0,#a+#a%3,b or colors.black;for i=1,#a do if +#a[i]>_b then _b=#a[i]end end +for y=0,ab-1,3 do local cb,db,_c,ac={},{},{},1 +for x=0,_b-1,2 do +local bc,cc={},{} +for yy=1,3 do +for xx=1,2 do +bc[#bc+1]= +(a[y+yy]and a[y+yy][x+xx])and( +a[y+yy][x+xx]==0 and bb or a[y+yy][x+xx])or bb +cc[bc[#bc] ]=cc[bc[#bc] ]and(cc[bc[#bc] ]+1)or 1 end end;cb[ac],db[ac],_c[ac]=ca(bc,cc)ac=ac+1 end +da[1][#da[1]+1],da[2][#da[2]+1],da[3][#da[3]+1]=table.concat(cb),table.concat(db),table.concat(_c)end;da.width,da.height=#da[1][1],#da[1]return da end} +end; +project['default']['Frame'] = function(...)local ca=require("Object")local da=require("loadObjects") +local _b=require("basaltDraw")local ab=require("theme")local bb=require("utils")local cb=bb.rpairs +local db=string.sub +return +function(_c,ac,bc,cc)local dc=ca(_c)local _d="Frame"local ad={}local bd={}local cd={} +local dd=bc or term.current()local __a=""local a_a=false;local b_a=false;local c_a=0;local d_a=0;dc:setZIndex(10) +local _aa=_b(dd)local aaa=false;local baa=1;local caa=1;local daa=colors.white;local _ba,aba=0,0 +if(ac~=nil)then dc.parent=ac +dc.width,dc.height=ac:getSize()dc.bgColor=ab.FrameBG;dc.fgColor=ab.FrameFG else +dc.width,dc.height=dd.getSize()dc.bgColor=ab.basaltBG;dc.fgColor=ab.basaltFG end +local function bba(_ca)for aca,bca in pairs(ad)do +for cca,dca in pairs(bca)do if(dca.name==_ca)then return bca end end end end +local function cba(_ca)local aca=_ca:getZIndex() +if(bba(_ca.name)~=nil)then return nil end +if(ad[aca]==nil)then for x=1,#bd+1 do +if(bd[x]~=nil)then if(aca==bd[x])then break end;if(aca>bd[x])then +table.insert(bd,x,aca)break end else table.insert(bd,aca)end end;if( +#bd<=0)then table.insert(bd,aca)end;ad[aca]={}end;_ca.parent=cd;table.insert(ad[aca],_ca)return _ca end +local function dba(_ca) +for aca,bca in pairs(ad)do for cca,dca in pairs(bca)do +if(dca==_ca)then table.remove(ad[aca],cca)return true end end end;return false end +cd={barActive=false,barBackground=colors.gray,barTextcolor=colors.black,barText="New Frame",barTextAlign="left",isMoveable=false,getType=function(_ca)return _d end,setFocusedObject=function(_ca,aca) +if +(cc.getFocusedObject()~=nil)then +cc.getFocusedObject():loseFocusHandler()cc.setFocusedObject(nil)end;if(aca~=nil)then cc.setFocusedObject(aca) +aca:getFocusHandler()end;return _ca end,setSize=function(_ca,aca,bca) +dc.setSize(_ca,aca,bca) +for cca,dca in pairs(bd)do if(ad[dca]~=nil)then +for _da,ada in pairs(ad[dca])do if(ada.eventHandler~=nil)then +ada:sendEvent("basalt_resize",ada,_ca)end end end end;return _ca end,getBasaltInstance=function(_ca)return +cc end,setOffset=function(_ca,aca,bca) +_ba=aca~=nil and +math.floor(aca<0 and math.abs(aca)or-aca)or _ba +aba=bca~=nil and +math.floor(bca<0 and math.abs(bca)or-bca)or aba;return _ca end,getFrameOffset=function(_ca)return +_ba,aba end,removeFocusedObject=function(_ca)if(cc.getFocusedObject()~=nil)then +cc.getFocusedObject():loseFocusHandler()end;cc.setFocusedObject(nil)return +_ca end,getFocusedObject=function(_ca)return +cc.getFocusedObject()end,setCursor=function(_ca,aca,bca,cca,dca) +if(_ca.parent~=nil)then +local _da,ada=_ca:getAnchorPosition() +_ca.parent:setCursor(aca or false,(bca or 0)+_da-1,(cca or 0)+ada-1, +dca or daa)else +local _da,ada=_ca:getAbsolutePosition(_ca:getAnchorPosition())aaa=aca or false;if(bca~=nil)then baa=_da+bca-1 end;if(cca~=nil)then caa=ada+ +cca-1 end;daa=dca or daa +_ca:setVisualChanged()end;return _ca end,setMoveable=function(_ca,aca)_ca.isMoveable= +aca or not _ca.isMoveable +_ca:setVisualChanged()return _ca end,show=function(_ca)dc.show(_ca) +if( +_ca.parent==nil)then cc.setActiveFrame(_ca)if(a_a)then +cc.setMonitorFrame(__a,_ca)else cc.setMainFrame(_ca)end end;return _ca end,hide=function(_ca) +dc.hide(_ca) +if(_ca.parent==nil)then if(activeFrame==_ca)then activeFrame=nil end;if(a_a)then +if( +cc.getMonitorFrame(__a)==_ca)then cc.setActiveFrame(nil)end else +if(cc.getMainFrame()==_ca)then cc.setMainFrame(nil)end end end;return _ca end,showBar=function(_ca,aca)_ca.barActive= +aca or not _ca.barActive +_ca:setVisualChanged()return _ca end,setBar=function(_ca,aca,bca,cca) +_ca.barText=aca or""_ca.barBackground=bca or _ca.barBackground +_ca.barTextcolor=cca or _ca.barTextcolor;_ca:setVisualChanged()return _ca end,setBarTextAlign=function(_ca,aca)_ca.barTextAlign= +aca or"left"_ca:setVisualChanged()return _ca end,setMonitor=function(_ca,aca) +if( +aca~=nil)and(aca~=false)then +if +(peripheral.getType(aca)=="monitor")then dd=peripheral.wrap(aca)b_a=true end;a_a=true else dd=parentTerminal;a_a=false;if(cc.getMonitorFrame(__a)==_ca)then cc.setMonitorFrame(__a, +nil)end end;_aa=_aa(dd)__a=aca or nil;return _ca end,getVisualChanged=function(_ca) +local aca=dc.getVisualChanged(_ca) +for bca,cca in pairs(bd)do if(ad[cca]~=nil)then +for dca,_da in pairs(ad[cca])do if(_da.getVisualChanged~=nil and +_da:getVisualChanged())then aca=true end end end end;return aca end,loseFocusHandler=function(_ca) +dc.loseFocusHandler(_ca)end,getFocusHandler=function(_ca)dc.getFocusHandler(_ca) +if(_ca.parent~=nil)then +_ca.parent:removeObject(_ca)_ca.parent:addObject(_ca)end end,keyHandler=function(_ca,aca,bca) +local cca=cc.getFocusedObject() +if(cca~=nil)then if(cca~=_ca)then if(cca.keyHandler~=nil)then +if(cca:keyHandler(aca,bca))then return true end end else +dc.keyHandler(_ca,aca,bca)end end;return false end,backgroundKeyHandler=function(_ca,aca,bca) +dc.backgroundKeyHandler(_ca,aca,bca) +for cca,dca in pairs(bd)do if(ad[dca]~=nil)then +for _da,ada in pairs(ad[dca])do if(ada.backgroundKeyHandler~=nil)then +ada:backgroundKeyHandler(aca,bca)end end end end end,eventHandler=function(_ca,aca,bca,cca,dca,_da) +dc.eventHandler(_ca,aca,bca,cca,dca,_da) +for ada,bda in pairs(bd)do if(ad[bda]~=nil)then +for cda,dda in pairs(ad[bda])do if(dda.eventHandler~=nil)then +dda:eventHandler(aca,bca,cca,dca,_da)end end end end +if(a_a)then if(aca=="peripheral")and(bca==__a)then +if +(peripheral.getType(__a)=="monitor")then b_a=true;dd=peripheral.wrap(__a)_aa=_aa(dd)end end +if(aca== +"peripheral_detach")and(bca==__a)then b_a=false end end +if(aca=="terminate")then dd.clear()dd.setCursorPos(1,1)cc.stop()end end,mouseHandler=function(_ca,aca,bca,cca,dca) +local _da,ada=_ca:getOffset()_da=_da<0 and math.abs(_da)or-_da;ada=ada<0 and +math.abs(ada)or-ada +if(_ca.drag)then +if(aca=="mouse_drag")then +local __b=1;local a_b=1;if(_ca.parent~=nil)then +__b,a_b=_ca.parent:getAbsolutePosition(_ca.parent:getAnchorPosition())end +_ca:setPosition( +cca+c_a- (__b-1)+_da,dca+d_a- (a_b-1)+ada)end;if(aca=="mouse_up")then _ca.drag=false end;return true end +local bda,cda=_ca:getAbsolutePosition(_ca:getAnchorPosition())local dda=false;if(cda-1 ==dca)and(_ca:getBorder("top"))then dca=dca+1 +dda=true end +if(dc.mouseHandler(_ca,aca,bca,cca,dca))then +local __b,a_b=_ca:getAbsolutePosition(_ca:getAnchorPosition())__b=__b+_ba;a_b=a_b+aba +for b_b,c_b in pairs(bd)do +if(ad[c_b]~=nil)then for d_b,_ab in cb(ad[c_b])do +if +(_ab.mouseHandler~=nil)then if(_ab:mouseHandler(aca,bca,cca,dca))then return true end end end end end +if(_ca.isMoveable)then +local b_b,c_b=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +if +(cca>=b_b)and(cca<=b_b+_ca.width-1)and(dca==c_b)and(aca=="mouse_click")then _ca.drag=true +c_a=b_b-cca;d_a=dda and 1 or 0 end end +if(cc.getFocusedObject()~=nil)then +cc.getFocusedObject():loseFocusHandler()cc.setFocusedObject(nil)end;return true end;return false end,setText=function(_ca,aca,bca,cca) +local dca,_da=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +if(bca>=1)and(bca<=_ca.height)then +if(_ca.parent~=nil)then +local ada,bda=_ca.parent:getAnchorPosition() +_ca.parent:setText(math.max(aca+ (dca-1),dca)- (ada-1), +_da+bca-1 - (bda-1),db(cca,math.max(1 -aca+1,1),math.max(_ca.width-aca+1,1)))else +_aa.setText(math.max(aca+ (dca-1),dca),_da+bca-1,db(cca,math.max(1 -aca+1,1),math.max( +_ca.width-aca+1,1)))end end end,setBG=function(_ca,aca,bca,cca) +local dca,_da=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +if(bca>=1)and(bca<=_ca.height)then +if(_ca.parent~=nil)then +local ada,bda=_ca.parent:getAnchorPosition() +_ca.parent:setBG(math.max(aca+ (dca-1),dca)- (ada-1), +_da+bca-1 - (bda-1),db(cca,math.max(1 -aca+1,1),math.max(_ca.width-aca+1,1)))else +_aa.setBG(math.max(aca+ (dca-1),dca),_da+bca-1,db(cca,math.max(1 -aca+1,1),math.max( +_ca.width-aca+1,1)))end end end,setFG=function(_ca,aca,bca,cca) +local dca,_da=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +if(bca>=1)and(bca<=_ca.height)then +if(_ca.parent~=nil)then +local ada,bda=_ca.parent:getAnchorPosition() +_ca.parent:setFG(math.max(aca+ (dca-1),dca)- (ada-1), +_da+bca-1 - (bda-1),db(cca,math.max(1 -aca+1,1),math.max(_ca.width-aca+1,1)))else +_aa.setFG(math.max(aca+ (dca-1),dca),_da+bca-1,db(cca,math.max(1 -aca+1,1),math.max( +_ca.width-aca+1,1)))end end end,writeText=function(_ca,aca,bca,cca,dca,_da) +local ada,bda=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +if(bca>=1)and(bca<=_ca.height)then +if(_ca.parent~=nil)then +local cda,dda=_ca.parent:getAnchorPosition() +_ca.parent:writeText(math.max(aca+ (ada-1),ada)- (cda-1),bda+ +bca-1 - (dda-1),db(cca,math.max(1 -aca+1,1),_ca.width-aca+1),dca,_da)else +_aa.writeText(math.max(aca+ (ada-1),ada),bda+bca-1,db(cca,math.max(1 -aca+1,1),math.max( +_ca.width-aca+1,1)),dca,_da)end end end,drawBackgroundBox=function(_ca,aca,bca,cca,dca,_da) +local ada,bda=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +dca=(bca<1 and +(dca+bca>_ca.height and _ca.height or dca+bca-1)or( +dca+bca>_ca.height and _ca.height-bca+1 or dca)) +cca=(aca<1 and +(cca+aca>_ca.width and _ca.width or cca+aca-1)or( +cca+aca>_ca.width and _ca.width-aca+1 or cca)) +if(_ca.parent~=nil)then local cda,dda=_ca.parent:getAnchorPosition() +_ca.parent:drawBackgroundBox(math.max( +aca+ (ada-1),ada)- (cda-1), +math.max(bca+ (bda-1),bda)- (dda-1),cca,dca,_da)else +_aa.drawBackgroundBox(math.max(aca+ (ada-1),ada),math.max(bca+ (bda-1),bda),cca,dca,_da)end end,drawTextBox=function(_ca,aca,bca,cca,dca,_da) +local ada,bda=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +dca=(bca<1 and +(dca+bca>_ca.height and _ca.height or dca+bca-1)or( +dca+bca>_ca.height and _ca.height-bca+1 or dca)) +cca=(aca<1 and +(cca+aca>_ca.width and _ca.width or cca+aca-1)or( +cca+aca>_ca.width and _ca.width-aca+1 or cca)) +if(_ca.parent~=nil)then local cda,dda=_ca.parent:getAnchorPosition() +_ca.parent:drawTextBox(math.max( +aca+ (ada-1),ada)- (cda-1), +math.max(bca+ (bda-1),bda)- (dda-1),cca,dca,_da:sub(1,1))else +_aa.drawTextBox(math.max(aca+ (ada-1),ada),math.max(bca+ (bda-1),bda),cca,dca,_da:sub(1,1))end end,drawForegroundBox=function(_ca,aca,bca,cca,dca,_da) +local ada,bda=_ca:getAbsolutePosition(_ca:getAnchorPosition()) +dca=(bca<1 and +(dca+bca>_ca.height and _ca.height or dca+bca-1)or( +dca+bca>_ca.height and _ca.height-bca+1 or dca)) +cca=(aca<1 and +(cca+aca>_ca.width and _ca.width or cca+aca-1)or( +cca+aca>_ca.width and _ca.width-aca+1 or cca)) +if(_ca.parent~=nil)then local cda,dda=_ca.parent:getAnchorPosition() +_ca.parent:drawForegroundBox(math.max( +aca+ (ada-1),ada)- (cda-1), +math.max(bca+ (bda-1),bda)- (dda-1),cca,dca,_da)else +_aa.drawForegroundBox(math.max(aca+ (ada-1),ada),math.max(bca+ (bda-1),bda),cca,dca,_da)end end,draw=function(_ca)if +(a_a)and not(b_a)then return false end +if(_ca:getVisualChanged())then +if +(dc.draw(_ca))then +local aca,bca=_ca:getAbsolutePosition(_ca:getAnchorPosition())local cca,dca=_ca:getAnchorPosition() +if(_ca.parent~=nil)then +if +(_ca.bgColor~=false)then +_ca.parent:drawBackgroundBox(cca,dca,_ca.width,_ca.height,_ca.bgColor) +_ca.parent:drawTextBox(cca,dca,_ca.width,_ca.height," ")end;if(_ca.bgColor~=false)then +_ca.parent:drawForegroundBox(cca,dca,_ca.width,_ca.height,_ca.fgColor)end else +if(_ca.bgColor~=false)then +_aa.drawBackgroundBox(aca,bca,_ca.width,_ca.height,_ca.bgColor)_aa.drawTextBox(aca,bca,_ca.width,_ca.height," ")end;if(_ca.fgColor~=false)then +_aa.drawForegroundBox(aca,bca,_ca.width,_ca.height,_ca.fgColor)end end;dd.setCursorBlink(false) +if(_ca.barActive)then +if(_ca.parent~=nil)then +_ca.parent:writeText(cca,dca,bb.getTextHorizontalAlign(_ca.barText,_ca.width,_ca.barTextAlign),_ca.barBackground,_ca.barTextcolor)else +_aa.writeText(aca,bca,bb.getTextHorizontalAlign(_ca.barText,_ca.width,_ca.barTextAlign),_ca.barBackground,_ca.barTextcolor)end +if(_ca:getBorder("left"))then +if(_ca.parent~=nil)then +_ca.parent:drawBackgroundBox(cca-1,dca,1,1,_ca.barBackground)if(_ca.bgColor~=false)then +_ca.parent:drawBackgroundBox(cca-1,dca+1,1,_ca.height-1,_ca.bgColor)end end end +if(_ca:getBorder("top"))then if(_ca.parent~=nil)then +_ca.parent:drawBackgroundBox(cca-1,dca-1,_ca.width+1,1,_ca.barBackground)end end end;for _da,ada in cb(bd)do +if(ad[ada]~=nil)then for bda,cda in pairs(ad[ada])do +if(cda.draw~=nil)then cda:draw()end end end end;if(aaa)then +dd.setTextColor(daa)dd.setCursorPos(baa,caa) +if(_ca.parent~=nil)then +dd.setCursorBlink(_ca:isFocused())else dd.setCursorBlink(aaa)end end +_ca:setVisualChanged(false)end end end,drawUpdate=function(_ca)if +(a_a)and not(b_a)then return false end;_aa.update()end,addObject=function(_ca,aca)return +cba(aca)end,removeObject=function(_ca,aca)return dba(aca)end,getObject=function(_ca,aca)return bba(aca)end,addFrame=function(_ca,aca)local bca=cc.newFrame(aca,_ca, +nil,cc)return cba(bca)end}for _ca,aca in pairs(da)do +cd["add".._ca]=function(bca,cca)return cba(aca(cca,bca))end end;setmetatable(cd,dc) +return cd end +end; +project['default']['loadObjects'] = function(...)local b={}if(packaged)then +for c,d in pairs(getProject("objects"))do b[c]=d()end;return b end;for c,d in +pairs(fs.list(fs.combine("Basalt","objects")))do +if(d~="example.lua")then local _a=d:gsub(".lua","")b[_a]=require(_a)end end;return b +end; +project['default']['Object'] = function(...)local b=require("basaltEvent") +return +function(c)local d="Object"local _a;local aa=1;local ba="topLeft" +local ca=false;local da=false;local _b=false;local ab=false;local bb=false;local cb=false;local db=false +local _c=colors.black;local ac=colors.black;local bc=true;local cc=b() +local dc={x=1,y=1,width=1,height=1,bgColor=colors.black,fgColor=colors.white,name=c or"Object",parent=nil,show=function(_d)da=true +bc=true;return _d end,hide=function(_d)da=false;bc=true;return _d end,isVisible=function(_d)return da end,setFocus=function(_d) +if( +_d.parent~=nil)then _d.parent:setFocusedObject(_d)end;return _d end,setZIndex=function(_d,ad)aa=ad +if(_d.parent~=nil)then +_d.parent:removeObject(_d)_d.parent:addObject(_d)end;return _d end,getZIndex=function(_d)return aa end,getType=function(_d)return +d end,getName=function(_d)return _d.name end,remove=function(_d)if(_d.parent~=nil)then +_d.parent:removeObject(_d)end;return _d end,setParent=function(_d,ad) +if( +ad.getType~=nil and ad:getType()=="Frame")then _d:remove() +ad:addObject(_d)if(_d.draw)then _d:show()end end;return _d end,setValue=function(_d,ad) +if( +_a~=ad)then _a=ad;bc=true;_d:valueChangedHandler()end;return _d end,getValue=function(_d)return _a end,getVisualChanged=function(_d)return bc end,setVisualChanged=function(_d,ad)bc= +ad or true;if(ad==nil)then bc=true end;return _d end,getEventSystem=function(_d)return +cc end,getParent=function(_d)return _d.parent end,setPosition=function(_d,ad,bd,cd)if(cd)then _d.x,_d.y=math.floor(_d.x+ad),math.floor( +_d.y+bd)else +_d.x,_d.y=math.floor(ad),math.floor(bd)end;bc=true;return _d end,getPosition=function(_d)return +_d.x,_d.y end,getVisibility=function(_d)return da end,setVisibility=function(_d,ad)da=ad or not da;bc=true +return _d end,setSize=function(_d,ad,bd)_d.width,_d.height=ad,bd +cc:sendEvent("basalt_resize",_d)bc=true;return _d end,getHeight=function(_d)return _d.height end,getWidth=function(_d)return +_d.width end,getSize=function(_d)return _d.width,_d.height end,setBackground=function(_d,ad) +_d.bgColor=ad;bc=true;return _d end,getBackground=function(_d)return _d.bgColor end,setForeground=function(_d,ad) +_d.fgColor=ad;bc=true;return _d end,getForeground=function(_d)return _d.fgColor end,showShadow=function(_d,ad)_b=ad or +(not _b)return _d end,setShadow=function(_d,ad)_c=ad;return _d end,isShadowActive=function(_d) +return _b end,showBorder=function(_d,...) +for ad,bd in pairs(table.pack(...))do if(bd=="left")then ab=true end;if( +bd=="top")then bb=true end;if(bd=="right")then cb=true end;if(bd=="bottom")then +db=true end end;return _d end,setBorder=function(_d,ad) +_c=ad;return _d end,getBorder=function(_d,ad)if(ad=="left")then return ab end +if(ad=="top")then return bb end;if(ad=="right")then return cb end;if(ad=="bottom")then return db end end,draw=function(_d) +if +(da)then +if(_d.parent~=nil)then local ad,bd=_d:getAnchorPosition() +if(_b)then +_d.parent:drawBackgroundBox( +ad+1,bd+_d.height,_d.width,1,_c) +_d.parent:drawBackgroundBox(ad+_d.width,bd+1,1,_d.height,_c) +_d.parent:drawForegroundBox(ad+1,bd+_d.height,_d.width,1,_c) +_d.parent:drawForegroundBox(ad+_d.width,bd+1,1,_d.height,_c)end +if(ab)then +_d.parent:drawTextBox(ad-1,bd,1,_d.height,"\149") +_d.parent:drawForegroundBox(ad-1,bd,1,_d.height,ac)if(_d.bgColor~=false)then +_d.parent:drawBackgroundBox(ad-1,bd,1,_d.height,_d.bgColor)end end +if(ab)and(bb)then +_d.parent:drawTextBox(ad-1,bd-1,1,1,"\151")_d.parent:drawForegroundBox(ad-1,bd-1,1,1,ac)if( +_d.bgColor~=false)then +_d.parent:drawBackgroundBox(ad-1,bd-1,1,1,_d.bgColor)end end +if(bb)then +_d.parent:drawTextBox(ad,bd-1,_d.width,1,"\131") +_d.parent:drawForegroundBox(ad,bd-1,_d.width,1,ac)if(_d.bgColor~=false)then +_d.parent:drawBackgroundBox(ad,bd-1,_d.width,1,_d.bgColor)end end;if(bb)and(cb)then +_d.parent:drawTextBox(ad+_d.width,bd-1,1,1,"\149") +_d.parent:drawForegroundBox(ad+_d.width,bd-1,1,1,ac)end;if(cb)then +_d.parent:drawTextBox( +ad+_d.width,bd,1,_d.height,"\149") +_d.parent:drawForegroundBox(ad+_d.width,bd,1,_d.height,ac)end;if(cb)and(db)then +_d.parent:drawTextBox( +ad+_d.width,bd+_d.height,1,1,"\129") +_d.parent:drawForegroundBox(ad+_d.width,bd+_d.height,1,1,ac)end;if(db)then +_d.parent:drawTextBox(ad, +bd+_d.height,_d.width,1,"\131") +_d.parent:drawForegroundBox(ad,bd+_d.height,_d.width,1,ac)end +if(db)and(ab)then _d.parent:drawTextBox( +ad-1,bd+_d.height,1,1,"\131")_d.parent:drawForegroundBox( +ad-1,bd+_d.height,1,1,ac)end end;return true end;return false end,getAbsolutePosition=function(_d,ad,bd) +if( +ad==nil)or(bd==nil)then ad,bd=_d:getAnchorPosition()end +if(_d.parent~=nil)then +local cd,dd=_d.parent:getAbsolutePosition(_d.parent:getAnchorPosition())ad=cd+ad-1;bd=dd+bd-1 end;return ad,bd end,getAnchorPosition=function(_d,ad,bd,cd)if( +ad==nil)then ad=_d.x end;if(bd==nil)then bd=_d.y end +if(ba=="top")then +ad=math.floor( +_d.parent.width/2)+ad-1 elseif(ba=="topRight")then ad=_d.parent.width+ad-1 elseif(ba=="right")then ad= +_d.parent.width+ad-1;bd= +math.floor(_d.parent.height/2)+bd-1 elseif(ba=="bottomRight")then ad= +_d.parent.width+ad-1 +bd=_d.parent.height+bd-1 elseif(ba=="bottom")then +ad=math.floor(_d.parent.width/2)+ad-1;bd=_d.parent.height+bd-1 elseif(ba=="bottomLeft")then bd= +_d.parent.height+bd-1 elseif(ba=="left")then bd= +math.floor(_d.parent.height/2)+bd-1 elseif(ba=="center")then +ad=math.floor( +_d.parent.width/2)+ad-1 +bd=math.floor(_d.parent.height/2)+bd-1 end;local dd,__a=_d:getOffset() +if not(ca or cd)then return ad+dd,bd+__a end;return ad,bd end,getOffset=function(_d) +if( +_d.parent~=nil)then return _d.parent:getFrameOffset()end;return 0,0 end,ignoreOffset=function(_d,ad)ca=ad +if(ad==nil)then ca=true end;return _d end,getBaseFrame=function(_d)if(_d.parent~=nil)then return +_d.parent:getBaseFrame()end;return _d end,setAnchor=function(_d,ad) +ba=ad;bc=true;return _d end,getAnchor=function(_d)return ba end,onChange=function(_d,...) +for ad,bd in +pairs(table.pack(...))do if(type(bd)=="function")then +_d:registerEvent("value_changed",bd)end end;return _d end,onClick=function(_d,...) +for ad,bd in +pairs(table.pack(...))do if(type(bd)=="function")then _d:registerEvent("mouse_click",bd) +_d:registerEvent("monitor_touch",bd)end end;return _d end,onClickUp=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then _d:registerEvent("mouse_up",bd)end end;return _d end,onScroll=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then _d:registerEvent("mouse_scroll",bd)end end;return _d end,onDrag=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then _d:registerEvent("mouse_drag",bd)end end;return _d end,onEvent=function(_d,...) +for ad,bd in +pairs(table.pack(...))do if(type(bd)=="function")then +_d:registerEvent("custom_event_handler",bd)end end;return _d end,onKey=function(_d,...) +for ad,bd in +pairs(table.pack(...))do if(type(bd)=="function")then _d:registerEvent("key",bd) +_d:registerEvent("char",bd)end end;return _d end,onResize=function(_d,...) +for ad,bd in +pairs(table.pack(...))do if(type(bd)=="function")then +_d:registerEvent("basalt_resize",bd)end end;return _d end,onKeyUp=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then _d:registerEvent("key_up",bd)end end;return _d end,onBackgroundKey=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then +_d:registerEvent("background_key",bd)_d:registerEvent("background_char",bd)end end;return +_d end,onBackgroundKeyUp=function(_d,...) +for ad,bd in +pairs(table.pack(...))do if(type(bd)=="function")then +_d:registerEvent("background_key_up",bd)end end;return _d end,isFocused=function(_d)if( +_d.parent~=nil)then +return _d.parent:getFocusedObject()==_d end;return false end,onGetFocus=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then _d:registerEvent("get_focus",bd)end end;return _d end,onLoseFocus=function(_d,...)for ad,bd in +pairs(table.pack(...))do +if(type(bd)=="function")then _d:registerEvent("lose_focus",bd)end end;return _d end,registerEvent=function(_d,ad,bd)return +cc:registerEvent(ad,bd)end,removeEvent=function(_d,ad,bd)return cc:removeEvent(ad,bd)end,sendEvent=function(_d,ad,...)return +cc:sendEvent(ad,_d,...)end,mouseHandler=function(_d,ad,bd,cd,dd) +local __a,a_a=_d:getAbsolutePosition(_d:getAnchorPosition())local b_a=false +if(a_a-1 ==dd)and(_d:getBorder("top"))then dd=dd+1;b_a=true end +if +(__a<=cd)and(__a+_d.width>cd)and(a_a<=dd)and(a_a+ +_d.height>dd)and(da)then +if(_d.parent~=nil)then _d.parent:setFocusedObject(_d)end;local c_a=cc:sendEvent(ad,_d,ad,bd,cd,dd) +if(c_a~=nil)then return c_a end;return true end;return false end,keyHandler=function(_d,ad,bd) +if +(_d:isFocused())then local cd=cc:sendEvent(ad,_d,ad,bd)if(cd~=nil)then return cd end;return true end;return false end,backgroundKeyHandler=function(_d,ad,bd)local cd=cc:sendEvent( +"background_"..ad,_d,ad,bd) +if(cd~=nil)then return cd end;return true end,valueChangedHandler=function(_d) +cc:sendEvent("value_changed",_d)end,eventHandler=function(_d,ad,bd,cd,dd,__a) +cc:sendEvent("custom_event_handler",_d,ad,bd,cd,dd,__a)end,getFocusHandler=function(_d) +local ad=cc:sendEvent("get_focus",_d)if(ad~=nil)then return ad end;return true end,loseFocusHandler=function(_d) +local ad=cc:sendEvent("lose_focus",_d)if(ad~=nil)then return ad end;return true end}dc.__index=dc;return dc end +end; +project['default']['theme'] = function(...) +return +{basaltBG=colors.lightGray,basaltFG=colors.black,FrameBG=colors.gray,FrameFG=colors.black,ButtonBG=colors.gray,ButtonFG=colors.black,CheckboxBG=colors.gray,CheckboxFG=colors.black,InputBG=colors.gray,InputFG=colors.black,textfieldBG=colors.gray,textfieldFG=colors.black,listBG=colors.gray,listFG=colors.black,dropdownBG=colors.gray,dropdownFG=colors.black,radioBG=colors.gray,radioFG=colors.black,selectionBG=colors.black,selectionFG=colors.lightGray} +end; +local dc=require("basaltEvent")() +local _d=require("Frame")local ad=term.current()local bd=1.1;local cd=true +local dd=fs.getDir(table.pack(...)[2]or"")local __a,a_a,b_a={},{},{}local c_a,d_a,_aa,aaa;local function baa()aaa=false end +local caa={getMainFrame=function()return c_a end,setMainFrame=function(bba) +c_a=bba end,getActiveFrame=function()return d_a end,setActiveFrame=function(bba)d_a=bba end,getFocusedObject=function()return _aa end,setFocusedObject=function(bba)_aa=bba end,getMonitorFrame=function(bba)return +b_a[bba]end,setMonitorFrame=function(bba,cba)b_a[bba]=cba end,getBaseTerm=function()return ad end,stop=baa,newFrame=_d,getDirectory=function() +return dd end} +local function daa()c_a:draw()c_a:drawUpdate()for bba,cba in pairs(b_a)do cba:draw() +cba:drawUpdate()end end +local function _ba(bba,cba,dba,_ca,aca)if +(dc:sendEvent("basaltEventCycle",bba,cba,dba,_ca,aca)==false)then return end +if(c_a~=nil)then +if(bba=="mouse_click")then +c_a:mouseHandler(bba,cba,dba,_ca,aca)d_a=c_a elseif(bba=="mouse_drag")then +c_a:mouseHandler(bba,cba,dba,_ca,aca)d_a=c_a elseif(bba=="mouse_up")then +c_a:mouseHandler(bba,cba,dba,_ca,aca)d_a=c_a elseif(bba=="mouse_scroll")then +c_a:mouseHandler(bba,cba,dba,_ca,aca)d_a=c_a elseif(bba=="monitor_touch")then if(b_a[cba]~=nil)then +b_a[cba]:mouseHandler(bba,cba,dba,_ca,aca)d_a=b_a[cba]end end end;if(bba=="key")or(bba=="char")then d_a:keyHandler(bba,cba) +d_a:backgroundKeyHandler(bba,cba)end +if(bba=="key")then __a[cba]=true end;if(bba=="key_up")then __a[cba]=false end;for bca,cca in pairs(a_a)do +cca:eventHandler(bba,cba,dba,_ca,aca)end;daa()end;local aba={} +aba={setBaseTerm=function(bba)ad=bba end,autoUpdate=function(bba)aaa=bba;if(bba==nil)then aaa=true end;daa()while aaa do +local cba,dba,_ca,aca,bca=os.pullEventRaw()_ba(cba,dba,_ca,aca,bca)end end,update=function(bba,cba,dba,_ca,aca)if( +bba~=nil)then _ba(bba,cba,dba,_ca,aca)end end,stop=baa,isKeyDown=function(bba)if( +__a[bba]==nil)then return false end;return __a[bba]end,getFrame=function(bba)for cba,dba in +pairs(a_a)do if(dba.name==bba)then return dba end end end,getActiveFrame=function()return +d_a end,setActiveFrame=function(bba) +if(bba:getType()=="Frame")then d_a=bba;return true end;return false end,onEvent=function(...) +for bba,cba in +pairs(table.pack(...))do if(type(cba)=="function")then +dc:registerEvent("basaltEventCycle",cba)end end end,createFrame=function(bba)for dba,_ca in +pairs(a_a)do if(_ca.name==bba)then return nil end end;local cba=_d(bba, +nil,nil,caa)table.insert(a_a,cba)return cba end,removeFrame=function(bba)a_a[bba]= +nil end,setProjectDir=function(bba)dd=bba end} + +local basalt = aba + + +-- Basalt installer beginns here: +local function split(inputstr, sep) + if sep == nil then + sep = "%s" + end + local t={} + for str in string.gmatch(inputstr, "([^"..sep.."]+)") do + table.insert(t, str) + end + return t + end + +local projectFiles = {} +local pFile = fs.open("projectFiles.txt", "r") + +for line in pFile.readLine do + local t = split(line, "/") + if(#t>1)then + if(projectFiles[t[1]]==nil)then projectFiles[t[1]] = {} end + table.insert(projectFiles[t[1]], t[2]) + else + if(projectFiles[t[1]]==nil)then projectFiles["default"] = {} end + table.insert(projectFiles["default"], line) + end +end +local w, h = term.getSize() +local main = basalt.createFrame("InstallerFrame"):show() +local anim = main:addAnimation("movingFrameAnimation") +local libFrame = main:addFrame("LibraryFrame"):setBackground(colors.lightGray):setForeground(colors.black):show() +local objFrame = main:addFrame("ObjectFrame"):setBackground(colors.lightGray):setForeground(colors.black):setPosition(w+1,1):show() +local configFrame = main:addFrame("ConfigFrame"):setBackground(colors.lightGray):setForeground(colors.black):setPosition(w+w+1,1):show() + + +libFrame:addLabel("setupMessage"):setText("Setup the Project's libraries:"):setPosition(2, 2):show() +libFrame:addLabel("included"):setText("Included"):setPosition(2, 4):show() +local libInc = libFrame:addList("includedLibList"):setPosition(2,5):setSize(14,10):show() +for _,v in pairs(projectFiles["libraries"])do + libInc:addItem(v) +end + +local libExc = libFrame:addList("exludedLibList"):setPosition(20,5):setSize(14,10):show() +libFrame:addLabel("excluded"):setText("Excluded"):setPosition(26, 4):show() +libFrame:addButton("excludeItem"):setPosition(13,4):setSize(3,1):setText(">"):onClick(function() + local item = libInc:getItem(libInc:getItemIndex()) + if(item~=nil)then + libInc:removeItem(libInc:getItemIndex()) + libExc:addItem(item.text) + end +end):show() +libFrame:addButton("includeItem"):setSize(3,1):setText("<"):setPosition(20,4):onClick(function() + local item = libExc:getItem(libExc:getItemIndex()) + if(item~=nil)then + libExc:removeItem(libExc:getItemIndex()) + libInc:addItem(item.text) + end +end):show() +libFrame:addButton("nextBtn"):setAnchor("bottomRight"):setPosition(-11,-2):setSize(10,3):setText("Next"):onClick(function() + anim:clear() + anim:add(function() + main:setOffset(w/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset(w/2,0) + end) + :wait(0.1) + :add(function() + main:setOffset(w/2+w/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset(w,0) + end):play() +end):show() + + + +objFrame:addLabel("setupMessage"):setText("Setup the Project's objects:"):setPosition(2, 2):show() +objFrame:addLabel("included"):setText("Included"):setPosition(2, 4):show() +local objInc = objFrame:addList("includedObjList"):setPosition(2,5):setSize(14,10):show() +for _,v in pairs(projectFiles["objects"])do + objInc:addItem(v) +end + +local objExc = objFrame:addList("exludedObjList"):setPosition(20,5):setSize(14,10):show() +objFrame:addLabel("excluded"):setText("Excluded"):setPosition(26, 4):show() +objFrame:addButton("excludeItem"):setPosition(13,4):setSize(3,1):setText(">"):onClick(function() + local item = objInc:getItem(objInc:getItemIndex()) + if(item~=nil)then + objInc:removeItem(objInc:getItemIndex()) + objExc:addItem(item.text) + end +end):show() +objFrame:addButton("includeItem"):setSize(3,1):setText("<"):setPosition(20,4):onClick(function() + local item = objExc:getItem(objExc:getItemIndex()) + if(item~=nil)then + objExc:removeItem(objExc:getItemIndex()) + objInc:addItem(item.text) + end +end):show() +objFrame:addButton("nextBtn"):setAnchor("bottomRight"):setPosition(-11,-2):setSize(10,3):setText("Next"):onClick(function() + anim:clear() + anim:add(function() + main:setOffset((w*2)/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset((w*2)/2,0) + end) + :wait(0.1) + :add(function() + main:setOffset((w*2)/2+(w*2)/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset((w*2),0) + end):play() +end):show() +objFrame:addButton("backBtn"):setAnchor("bottomLeft"):setPosition(2,-2):setSize(10,3):setText("Back"):onClick(function() + anim:clear() + anim:add(function() + main:setOffset(w/2+w/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset(w/2,0) + end) + :wait(0.1) + :add(function() + main:setOffset(w/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset(0,0) + end):play() +end):show() + +configFrame:addButton("backBtn"):setAnchor("bottomLeft"):setPosition(2,-2):setSize(10,3):setText("Back"):onClick(function() + anim:clear() + anim:add(function() + main:setOffset((w*2)/2+(w*2)/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset((w*2)/2,0) + end) + :wait(0.1) + :add(function() + main:setOffset((w*2)/4,0) + end) + :wait(0.1) + :add(function() + main:setOffset(w,0) + end):play() +end):show() + +configFrame:addLabel("configInfo"):setPosition(2,2):setText("Setup the configuration:"):show() +configFrame:addRadio("singleOrMultiFile"):setPosition(2,4):addItem("Single file project",1,1,colors.lightGray,colors.black):addItem("Multiple files project",1,3,colors.lightGray,colors.black):setSelectedItem(colors.lightGray,colors.black):show() +configFrame:addCheckbox("minify"):setPosition(2,8):show() +configFrame:addLabel("minifyInfo"):setPosition(4,8):setText("Minify the project"):show() +configFrame:addLabel("betaInfo"):setPosition(2,11):setText("The Basalt Package Manager is still in alpha!"):setForeground(colors.red):show() +configFrame:addLabel("discord"):setPosition(2,12):setText("Checkout discord.com/invite/yNNnmBVBpE if you get"):setForeground(colors.red):show() +configFrame:addLabel("discord2"):setPosition(2,13):setText("into errors."):setForeground(colors.red):show() +configFrame:addButton("installBtn"):setAnchor("bottomRight"):setPosition(-11,-2):setSize(11,3):setText("Install"):onClick(function() + +end):show() + +basalt.autoUpdate() \ No newline at end of file diff --git a/basaltPackager.lua b/basaltPackager.lua new file mode 100644 index 0000000..a56b0c4 --- /dev/null +++ b/basaltPackager.lua @@ -0,0 +1,495 @@ +-- The minify part is fully made by stravant and can be found here: https://github.com/stravant/LuaMinify/blob/master/RobloxPlugin/Minify.lua +-- Thanks to him for his awesome work! + +-- +-- Minify.lua +-- +-- A compilation of all of the neccesary code to Minify a source file, all into one single +-- script for usage on Roblox. Needed to deal with Roblox' lack of `require`. +-- + +--The minify part is also minified, if you're looking for the packaging part, check out the bottom! +function lookupify(cd)for dd,__a in pairs(cd)do cd[__a]=true end;return cd end +function CountTable(cd)local dd=0;for __a in pairs(cd)do dd=dd+1 end;return dd end +function PrintTable(cd,dd)if cd.Print then return cd.Print()end;dd=dd or 0 +local __a=(CountTable(cd)>1)local a_a=string.rep(' ',dd+1) +local b_a="{".. (__a and'\n'or'') +for c_a,d_a in pairs(cd)do +if type(d_a)~='function'then +b_a=b_a.. (__a and a_a or'') +if type(c_a)=='number'then elseif type(c_a)=='string'and +c_a:match("^[A-Za-z_][A-Za-z0-9_]*$")then b_a=b_a..c_a.." = "elseif +type(c_a)=='string'then b_a=b_a.."[\""..c_a.."\"] = "else b_a=b_a.."[".. +tostring(c_a).."] = "end +if type(d_a)=='string'then b_a=b_a.."\""..d_a.."\""elseif type(d_a)== +'number'then b_a=b_a..d_a elseif type(d_a)=='table'then b_a=b_a.. +PrintTable(d_a,dd+ (__a and 1 or 0))else +b_a=b_a..tostring(d_a)end;if next(cd,c_a)then b_a=b_a..","end;if __a then b_a=b_a..'\n'end end end;b_a=b_a.. +(__a and string.rep(' ',dd)or'').."}"return b_a end;local bb=lookupify{' ','\n','\t','\r'} +local cb={['\r']='\\r',['\n']='\\n',['\t']='\\t',['"']='\\"',["'"]="\\'"} +local db=lookupify{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'} +local _c=lookupify{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'} +local ac=lookupify{'0','1','2','3','4','5','6','7','8','9'} +local bc=lookupify{'0','1','2','3','4','5','6','7','8','9','A','a','B','b','C','c','D','d','E','e','F','f'} +local cc=lookupify{'+','-','*','/','^','%',',','{','}','[',']','(',')',';','#'} +local dc=lookupify{'and','break','do','else','elseif','end','false','for','function','goto','if','in','local','nil','not','or','repeat','return','then','true','until','while'} +function LexLua(cd)local dd={} +local __a,a_a=pcall(function()local _aa=1;local aaa=1;local baa=1 +local function caa()local cba=cd:sub(_aa,_aa)if cba=='\n'then baa=1 +aaa=aaa+1 else baa=baa+1 end;_aa=_aa+1;return cba end +local function daa(cba)cba=cba or 0;return cd:sub(_aa+cba,_aa+cba)end;local function _ba(cba)local dba=daa() +for i=1,#cba do if dba==cba:sub(i,i)then return caa()end end end;local function aba(cba) +return error(">> :"..aaa..":".. +baa..": "..cba,0)end +local function bba()local cba=_aa +if daa()=='['then local dba=0;while +daa(dba+1)=='='do dba=dba+1 end +if daa(dba+1)=='['then for _=0,dba+1 do caa()end +local _ca=_aa +while true do if daa()==''then +aba("Expected `]"..string.rep('=',dba).."]` near .",3)end;local cca=true;if daa()==']'then for i=1,dba do if daa(i)~='='then +cca=false end end +if daa(dba+1)~=']'then cca=false end else cca=false end;if cca then break else +caa()end end;local aca=cd:sub(_ca,_aa-1)for i=0,dba+1 do caa()end +local bca=cd:sub(cba,_aa-1)return aca,bca else return nil end else return nil end end +while true do local cba='' +while true do local dca=daa() +if bb[dca]then cba=cba..caa()elseif +dca=='-'and daa(1)=='-'then caa()caa()cba=cba..'--'local _da,ada=bba() +if ada then cba=cba..ada else while daa()~='\n'and +daa()~=''do cba=cba..caa()end end else break end end;local dba=aaa;local _ca=baa +local aca=":"..aaa..":"..baa..":> "local bca=daa()local cca=nil +if bca==''then cca={Type='Eof'}elseif +_c[bca]or db[bca]or bca=='_'then local dca=_aa;repeat caa()bca=daa()until not +(_c[bca]or db[bca]or ac[bca]or bca=='_') +local _da=cd:sub(dca,_aa-1) +if dc[_da]then cca={Type='Keyword',Data=_da}else cca={Type='Ident',Data=_da}end elseif ac[bca]or(daa()=='.'and ac[daa(1)])then local dca=_aa +if bca=='0'and +daa(1)=='x'then caa()caa()while bc[daa()]do caa()end;if _ba('Pp')then +_ba('+-')while ac[daa()]do caa()end end else +while ac[daa()]do caa()end;if _ba('.')then while ac[daa()]do caa()end end;if _ba('Ee')then +_ba('+-')while ac[daa()]do caa()end end end;cca={Type='Number',Data=cd:sub(dca,_aa-1)}elseif bca=='\''or bca== +'\"'then local dca=_aa;local _da=caa()local ada=_aa;while true do local dda=caa() +if dda=='\\'then caa()elseif +dda==_da then break elseif dda==''then aba("Unfinished string near ")end end;local bda=cd:sub(ada, +_aa-2)local cda=cd:sub(dca,_aa-1) +cca={Type='String',Data=cda,Constant=bda}elseif bca=='['then local dca,_da=bba() +if _da then cca={Type='String',Data=_da,Constant=dca}else +caa()cca={Type='Symbol',Data='['}end elseif _ba('>=<')then if _ba('=')then cca={Type='Symbol',Data=bca..'='}else +cca={Type='Symbol',Data=bca}end elseif _ba('~')then +if _ba('=')then +cca={Type='Symbol',Data='~='}else aba("Unexpected symbol `~` in source.",2)end elseif _ba('.')then +if _ba('.')then if _ba('.')then cca={Type='Symbol',Data='...'}else +cca={Type='Symbol',Data='..'}end else cca={Type='Symbol',Data='.'}end elseif _ba(':')then if _ba(':')then cca={Type='Symbol',Data='::'}else +cca={Type='Symbol',Data=':'}end elseif cc[bca]then caa() +cca={Type='Symbol',Data=bca}else local dca,_da=bba()if dca then cca={Type='String',Data=_da,Constant=dca}else +aba("Unexpected Symbol `".. +bca.."` in source.",2)end end;cca.LeadingWhite=cba;cca.Line=dba;cca.Char=_ca +cca.Print=function() +return"<".. (cca.Type..string.rep(' ',7 -# +cca.Type)).. +" ".. (cca.Data or'').." >"end;dd[#dd+1]=cca;if cca.Type=='Eof'then break end end end)if not __a then return false,a_a end;local b_a={}local c_a={}local d_a=1 +function b_a:Peek(_aa)_aa=_aa or 0;return dd[math.min( +#dd,d_a+_aa)]end +function b_a:Get()local _aa=dd[d_a]d_a=math.min(d_a+1,#dd)return _aa end;function b_a:Is(_aa)return b_a:Peek().Type==_aa end;function b_a:Save()c_a[ +#c_a+1]=d_a end +function b_a:Commit()c_a[#c_a]=nil end;function b_a:Restore()d_a=c_a[#c_a]c_a[#c_a]=nil end +function b_a:ConsumeSymbol(_aa) +local aaa=self:Peek() +if aaa.Type=='Symbol'then if _aa then +if aaa.Data==_aa then self:Get()return true else return nil end else self:Get()return aaa end else return +nil end end +function b_a:ConsumeKeyword(_aa)local aaa=self:Peek()if +aaa.Type=='Keyword'and aaa.Data==_aa then self:Get()return true else return nil end end;function b_a:IsKeyword(_aa)local aaa=b_a:Peek()return +aaa.Type=='Keyword'and aaa.Data==_aa end +function b_a:IsSymbol(_aa) +local aaa=b_a:Peek()return aaa.Type=='Symbol'and aaa.Data==_aa end +function b_a:IsEof()return b_a:Peek().Type=='Eof'end;return true,b_a end +function ParseLua(cd)local dd,__a=LexLua(cd)if not dd then return false,__a end +local function a_a(ada)local bda=">> :".. + +__a:Peek().Line..":"..__a:Peek().Char..": "..ada.."\n"local cda=0 +for dda in +cd:gmatch("[^\n]*\n?")do if dda:sub(-1,-1)=='\n'then dda=dda:sub(1,-2)end;cda= +cda+1 +if cda==__a:Peek().Line then bda=bda..">> `".. +dda:gsub('\t',' ').."`\n"for i=1,__a:Peek().Char +do local __b=dda:sub(i,i) +if __b=='\t'then bda=bda..' 'else bda=bda..' 'end end +bda=bda.." ^---"break end end;return bda end;local b_a=0;local c_a={}local d_a={'_','a','b','c','d'} +local function _aa(ada)local bda={}bda.Parent=ada +bda.LocalList={}bda.LocalMap={} +function bda:RenameVars() +for cda,dda in pairs(bda.LocalList)do local __b;b_a=0 +repeat b_a=b_a+1;local a_b=b_a +__b=''while a_b>0 do local b_b=a_b%#d_a;a_b=(a_b-b_b)/#d_a +__b=__b..d_a[b_b+1]end until +not c_a[__b]and +not ada:GetLocal(__b)and not bda.LocalMap[__b]dda.Name=__b;bda.LocalMap[__b]=dda end end +function bda:GetLocal(cda)local dda=bda.LocalMap[cda]if dda then return dda end;if bda.Parent then +local __b=bda.Parent:GetLocal(cda)if __b then return __b end end;return nil end +function bda:CreateLocal(cda)local dda={}dda.Scope=bda;dda.Name=cda;dda.CanRename=true;bda.LocalList[# +bda.LocalList+1]=dda +bda.LocalMap[cda]=dda;return dda end;bda.Print=function()return""end;return bda end;local aaa;local baa +local function caa(ada)local bda=_aa(ada)if not __a:ConsumeSymbol('(')then return false, +a_a("`(` expected.")end;local cda={}local dda=false +while not +__a:ConsumeSymbol(')')do +if __a:Is('Ident')then +local c_b=bda:CreateLocal(__a:Get().Data)cda[#cda+1]=c_b;if not __a:ConsumeSymbol(',')then +if +__a:ConsumeSymbol(')')then break else return false,a_a("`)` expected.")end end elseif +__a:ConsumeSymbol('...')then dda=true +if not __a:ConsumeSymbol(')')then return false, +a_a("`...` must be the last argument of a function.")end;break else return false,a_a("Argument name or `...` expected")end end;local __b,a_b=baa(bda)if not __b then return false,a_b end;if not +__a:ConsumeKeyword('end')then +return false,a_a("`end` expected after function body")end;local b_b={} +b_b.AstType='Function'b_b.Scope=bda;b_b.Arguments=cda;b_b.Body=a_b;b_b.VarArg=dda;return true,b_b end +local function daa(ada) +if __a:ConsumeSymbol('(')then local bda,cda=aaa(ada) +if not bda then return false,cda end +if not __a:ConsumeSymbol(')')then return false,a_a("`)` Expected.")end;cda.ParenCount=(cda.ParenCount or 0)+1;return true,cda elseif +__a:Is('Ident')then local bda=__a:Get()local cda=ada:GetLocal(bda.Data)if not cda then +c_a[bda.Data]=true end;local dda={}dda.AstType='VarExpr'dda.Name=bda.Data +dda.Local=cda;return true,dda else return false,a_a("primary expression expected")end end +local function _ba(ada,bda)local cda,dda=daa(ada)if not cda then return false,dda end +while true do +if __a:IsSymbol('.')or +__a:IsSymbol(':')then local __b=__a:Get().Data;if not __a:Is('Ident')then return false, +a_a(" expected.")end;local a_b=__a:Get() +local b_b={}b_b.AstType='MemberExpr'b_b.Base=dda;b_b.Indexer=__b;b_b.Ident=a_b;dda=b_b elseif not +bda and __a:ConsumeSymbol('[')then local __b,a_b=aaa(ada)if not __b then +return false,a_b end;if not __a:ConsumeSymbol(']')then +return false,a_a("`]` expected.")end;local b_b={}b_b.AstType='IndexExpr' +b_b.Base=dda;b_b.Index=a_b;dda=b_b elseif not bda and __a:ConsumeSymbol('(')then local __b={} +while not +__a:ConsumeSymbol(')')do local b_b,c_b=aaa(ada)if not b_b then return false,c_b end +__b[#__b+1]=c_b +if not __a:ConsumeSymbol(',')then if __a:ConsumeSymbol(')')then break else return false, +a_a("`)` Expected.")end end end;local a_b={}a_b.AstType='CallExpr'a_b.Base=dda;a_b.Arguments=__b;dda=a_b elseif not bda and +__a:Is('String')then local __b={}__b.AstType='StringCallExpr'__b.Base=dda +__b.Arguments={__a:Get()}dda=__b elseif not bda and __a:IsSymbol('{')then local __b,a_b=aaa(ada)if not __b then +return false,a_b end;local b_b={}b_b.AstType='TableCallExpr'b_b.Base=dda +b_b.Arguments={a_b}dda=b_b else break end end;return true,dda end +local function aba(ada) +if __a:Is('Number')then local bda={}bda.AstType='NumberExpr'bda.Value=__a:Get()return +true,bda elseif __a:Is('String')then local bda={}bda.AstType='StringExpr' +bda.Value=__a:Get()return true,bda elseif __a:ConsumeKeyword('nil')then local bda={}bda.AstType='NilExpr' +return true,bda elseif __a:IsKeyword('false')or __a:IsKeyword('true')then local bda={} +bda.AstType='BooleanExpr'bda.Value=(__a:Get().Data=='true')return true,bda elseif +__a:ConsumeSymbol('...')then local bda={}bda.AstType='DotsExpr'return true,bda elseif __a:ConsumeSymbol('{')then local bda={} +bda.AstType='ConstructorExpr'bda.EntryList={} +while true do +if __a:IsSymbol('[')then __a:Get()local cda,dda=aaa(ada) +if not cda then return +false,a_a("Key Expression Expected")end +if not __a:ConsumeSymbol(']')then return false,a_a("`]` Expected")end +if not __a:ConsumeSymbol('=')then return false,a_a("`=` Expected")end;local __b,a_b=aaa(ada)if not __b then +return false,a_a("Value Expression Expected")end +bda.EntryList[#bda.EntryList+1]={Type='Key',Key=dda,Value=a_b}elseif __a:Is('Ident')then local cda=__a:Peek(1) +if +cda.Type=='Symbol'and cda.Data=='='then local dda=__a:Get()if not __a:ConsumeSymbol('=')then +return false,a_a("`=` Expected")end;local __b,a_b=aaa(ada)if not __b then return false, +a_a("Value Expression Expected")end +bda.EntryList[ +#bda.EntryList+1]={Type='KeyString',Key=dda.Data,Value=a_b}else local dda,__b=aaa(ada) +if not dda then return false,a_a("Value Exected")end +bda.EntryList[#bda.EntryList+1]={Type='Value',Value=__b}end elseif __a:ConsumeSymbol('}')then break else local cda,dda=aaa(ada) +bda.EntryList[#bda.EntryList+1]={Type='Value',Value=dda}if not cda then return false,a_a("Value Expected")end end +if __a:ConsumeSymbol(';')or __a:ConsumeSymbol(',')then elseif +__a:ConsumeSymbol('}')then break else return false,a_a("`}` or table entry Expected")end end;return true,bda elseif __a:ConsumeKeyword('function')then local bda,cda=caa(ada)if not bda then +return false,cda end;cda.IsLocal=true;return true,cda else return _ba(ada)end end;local bba=lookupify{'-','not','#'}local cba=8 +local dba={['+']={6,6},['-']={6,6},['%']={7,7},['/']={7,7},['*']={7,7},['^']={10,9},['..']={5,4},['==']={3,3},['<']={3,3},['<=']={3,3},['~=']={3,3},['>']={3,3},['>=']={3,3},['and']={2,2},['or']={1,1}} +local function _ca(ada,bda)local cda,dda +if bba[__a:Peek().Data]then local __b=__a:Get().Data +cda,dda=_ca(ada,cba)if not cda then return false,dda end;local a_b={}a_b.AstType='UnopExpr' +a_b.Rhs=dda;a_b.Op=__b;dda=a_b else cda,dda=aba(ada)if not cda then return false,dda end end +while true do local __b=dba[__a:Peek().Data] +if __b and __b[1]>bda then +local a_b=__a:Get().Data;local b_b,c_b=_ca(ada,__b[2])if not b_b then return false,c_b end;local d_b={} +d_b.AstType='BinopExpr'd_b.Lhs=dda;d_b.Op=a_b;d_b.Rhs=c_b;dda=d_b else break end end;return true,dda end;aaa=function(ada)return _ca(ada,0)end +local function aca(ada)local bda=nil +if +__a:ConsumeKeyword('if')then local cda={}cda.AstType='IfStatement'cda.Clauses={} +repeat local dda,__b=aaa(ada)if not dda then +return false,__b end;if not __a:ConsumeKeyword('then')then return false, +a_a("`then` expected.")end +local a_b,b_b=baa(ada)if not a_b then return false,b_b end +cda.Clauses[#cda.Clauses+1]={Condition=__b,Body=b_b}until not __a:ConsumeKeyword('elseif') +if __a:ConsumeKeyword('else')then local dda,__b=baa(ada) +if not dda then return false,__b end;cda.Clauses[#cda.Clauses+1]={Body=__b}end;if not __a:ConsumeKeyword('end')then +return false,a_a("`end` expected.")end;bda=cda elseif __a:ConsumeKeyword('while')then +local cda={}cda.AstType='WhileStatement'local dda,__b=aaa(ada) +if not dda then return false,__b end;if not __a:ConsumeKeyword('do')then +return false,a_a("`do` expected.")end;local a_b,b_b=baa(ada) +if not a_b then return false,b_b end;if not __a:ConsumeKeyword('end')then +return false,a_a("`end` expected.")end;cda.Condition=__b;cda.Body=b_b;bda=cda elseif +__a:ConsumeKeyword('do')then local cda,dda=baa(ada)if not cda then return false,dda end +if not +__a:ConsumeKeyword('end')then return false,a_a("`end` expected.")end;local __b={}__b.AstType='DoStatement'__b.Body=dda;bda=__b elseif +__a:ConsumeKeyword('for')then +if not __a:Is('Ident')then return false,a_a(" expected.")end;local cda=__a:Get() +if __a:ConsumeSymbol('=')then local dda=_aa(ada) +local __b=dda:CreateLocal(cda.Data)local a_b,b_b=aaa(ada)if not a_b then return false,b_b end +if not +__a:ConsumeSymbol(',')then return false,a_a("`,` Expected")end;local c_b,d_b=aaa(ada)if not c_b then return false,d_b end;local _ab,aab +if +__a:ConsumeSymbol(',')then _ab,aab=aaa(ada)if not _ab then return false,aab end end;if not __a:ConsumeKeyword('do')then +return false,a_a("`do` expected")end;local bab,cab=baa(dda) +if not bab then return false,cab end;if not __a:ConsumeKeyword('end')then +return false,a_a("`end` expected")end;local dab={} +dab.AstType='NumericForStatement'dab.Scope=dda;dab.Variable=__b;dab.Start=b_b;dab.End=d_b;dab.Step=aab +dab.Body=cab;bda=dab else local dda=_aa(ada) +local __b={dda:CreateLocal(cda.Data)} +while __a:ConsumeSymbol(',')do if not __a:Is('Ident')then return false, +a_a("for variable expected.")end +__b[#__b+1]=dda:CreateLocal(__a:Get().Data)end;if not __a:ConsumeKeyword('in')then +return false,a_a("`in` expected.")end;local a_b={}local b_b,c_b=aaa(ada)if not b_b then +return false,c_b end;a_b[#a_b+1]=c_b +while __a:ConsumeSymbol(',')do +local bab,cab=aaa(ada)if not bab then return false,cab end;a_b[#a_b+1]=cab end;if not __a:ConsumeKeyword('do')then +return false,a_a("`do` expected.")end;local d_b,_ab=baa(dda) +if not d_b then return false,_ab end;if not __a:ConsumeKeyword('end')then +return false,a_a("`end` expected.")end;local aab={} +aab.AstType='GenericForStatement'aab.Scope=dda;aab.VariableList=__b;aab.Generators=a_b;aab.Body=_ab;bda=aab end elseif __a:ConsumeKeyword('repeat')then local cda,dda=baa(ada) +if not cda then return false,dda end;if not __a:ConsumeKeyword('until')then +return false,a_a("`until` expected.")end;local __b,a_b=aaa(ada) +if not __b then return false,a_b end;local b_b={}b_b.AstType='RepeatStatement'b_b.Condition=a_b;b_b.Body=dda;bda=b_b elseif +__a:ConsumeKeyword('function')then if not __a:Is('Ident')then +return false,a_a("Function name expected")end;local cda,dda=_ba(ada,true)if not cda then +return false,dda end;local __b,a_b=caa(ada)if not __b then return false,a_b end +a_b.IsLocal=false;a_b.Name=dda;bda=a_b elseif __a:ConsumeKeyword('local')then +if __a:Is('Ident')then +local cda={__a:Get().Data}while __a:ConsumeSymbol(',')do if not __a:Is('Ident')then return false, +a_a("local var name expected")end +cda[#cda+1]=__a:Get().Data end;local dda={}if +__a:ConsumeSymbol('=')then +repeat local a_b,b_b=aaa(ada)if not a_b then return false,b_b end +dda[#dda+1]=b_b until not __a:ConsumeSymbol(',')end;for a_b,b_b in +pairs(cda)do cda[a_b]=ada:CreateLocal(b_b)end +local __b={}__b.AstType='LocalStatement'__b.LocalList=cda;__b.InitList=dda;bda=__b elseif +__a:ConsumeKeyword('function')then if not __a:Is('Ident')then +return false,a_a("Function name expected")end;local cda=__a:Get().Data +local dda=ada:CreateLocal(cda)local __b,a_b=caa(ada)if not __b then return false,a_b end;a_b.Name=dda +a_b.IsLocal=true;bda=a_b else +return false,a_a("local var or function def expected")end elseif __a:ConsumeSymbol('::')then if not __a:Is('Ident')then return false, +a_a('Label name expected')end +local cda=__a:Get().Data +if not __a:ConsumeSymbol('::')then return false,a_a("`::` expected")end;local dda={}dda.AstType='LabelStatement'dda.Label=cda;bda=dda elseif +__a:ConsumeKeyword('return')then local cda={} +if not __a:IsKeyword('end')then local __b,a_b=aaa(ada) +if __b then cda[1]=a_b;while +__a:ConsumeSymbol(',')do local b_b,c_b=aaa(ada)if not b_b then return false,c_b end +cda[#cda+1]=c_b end end end;local dda={}dda.AstType='ReturnStatement'dda.Arguments=cda;bda=dda elseif +__a:ConsumeKeyword('break')then local cda={}cda.AstType='BreakStatement'bda=cda elseif __a:IsKeyword('goto')then +if not +__a:Is('Ident')then return false,a_a("Label expected")end;local cda=__a:Get().Data;local dda={}dda.AstType='GotoStatement' +dda.Label=cda;bda=dda else local cda,dda=_ba(ada)if not cda then return false,dda end +if +__a:IsSymbol(',')or __a:IsSymbol('=')then +if(dda.ParenCount or 0)>0 then return false, +a_a("Can not assign to parenthesized expression, is not an lvalue")end;local __b={dda} +while __a:ConsumeSymbol(',')do local _ab,aab=_ba(ada) +if not _ab then return false,aab end;__b[#__b+1]=aab end +if not __a:ConsumeSymbol('=')then return false,a_a("`=` Expected.")end;local a_b={}local b_b,c_b=aaa(ada)if not b_b then return false,c_b end;a_b[1]=c_b;while +__a:ConsumeSymbol(',')do local _ab,aab=aaa(ada)if not _ab then return false,aab end +a_b[#a_b+1]=aab end;local d_b={} +d_b.AstType='AssignmentStatement'd_b.Lhs=__b;d_b.Rhs=a_b;bda=d_b elseif +dda.AstType=='CallExpr'or +dda.AstType=='TableCallExpr'or dda.AstType=='StringCallExpr'then local __b={}__b.AstType='CallStatement'__b.Expression=dda;bda=__b else return false, +a_a("Assignment Statement Expected")end end;bda.HasSemicolon=__a:ConsumeSymbol(';')return true,bda end +local bca=lookupify{'end','else','elseif','until'} +baa=function(ada)local bda={}bda.Scope=_aa(ada)bda.AstType='Statlist'local cda={} +while not +bca[__a:Peek().Data]and not __a:IsEof()do +local dda,__b=aca(bda.Scope)if not dda then return false,__b end;cda[#cda+1]=__b end;bda.Body=cda;return true,bda end;local function cca()local ada=_aa()return baa(ada)end;local dca,_da=cca() +return dca,_da end +local _d=lookupify{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'} +local ad=lookupify{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'} +local bd=lookupify{'0','1','2','3','4','5','6','7','8','9'} +function Format_Mini(cd)local dd,__a;local a_a=0 +local function b_a(d_a,_aa,aaa) +if a_a>150 then a_a=0;return d_a.."\n".._aa end;aaa=aaa or' 'local baa,caa=d_a:sub(-1,-1),_aa:sub(1,1) +if +ad[baa]or _d[baa]or baa=='_'then +if not +(ad[caa]or _d[caa]or caa=='_'or bd[caa])then return d_a.._aa elseif caa=='('then +print("==============>>>",baa,caa)return d_a..aaa.._aa else return d_a..aaa.._aa end elseif bd[baa]then +if caa=='('then return d_a.._aa else return d_a..aaa.._aa end elseif baa==''then return d_a.._aa else +if caa=='('then return d_a..aaa.._aa else return d_a.._aa end end end +__a=function(d_a)local _aa=string.rep('(',d_a.ParenCount or 0) +if +d_a.AstType=='VarExpr'then if d_a.Local then _aa=_aa..d_a.Local.Name else +_aa=_aa..d_a.Name end elseif d_a.AstType=='NumberExpr'then _aa=_aa.. +d_a.Value.Data elseif d_a.AstType=='StringExpr'then +_aa=_aa..d_a.Value.Data elseif d_a.AstType=='BooleanExpr'then _aa=_aa..tostring(d_a.Value)elseif +d_a.AstType=='NilExpr'then _aa=b_a(_aa,"nil")elseif d_a.AstType=='BinopExpr'then +_aa=b_a(_aa,__a(d_a.Lhs))_aa=b_a(_aa,d_a.Op)_aa=b_a(_aa,__a(d_a.Rhs))elseif d_a.AstType== +'UnopExpr'then _aa=b_a(_aa,d_a.Op) +_aa=b_a(_aa,__a(d_a.Rhs))elseif d_a.AstType=='DotsExpr'then _aa=_aa.."..."elseif d_a.AstType=='CallExpr'then _aa=_aa.. +__a(d_a.Base)_aa=_aa.."("for i=1,#d_a.Arguments do _aa=_aa.. +__a(d_a.Arguments[i]) +if i~=#d_a.Arguments then _aa=_aa..","end end;_aa=_aa..")"elseif d_a.AstType== +'TableCallExpr'then _aa=_aa..__a(d_a.Base)_aa=_aa.. +__a(d_a.Arguments[1])elseif d_a.AstType=='StringCallExpr'then +_aa=_aa..__a(d_a.Base)_aa=_aa..d_a.Arguments[1].Data elseif +d_a.AstType=='IndexExpr'then +_aa=_aa..__a(d_a.Base).."["..__a(d_a.Index).."]"elseif d_a.AstType=='MemberExpr'then _aa=_aa..__a(d_a.Base).. +d_a.Indexer..d_a.Ident.Data elseif +d_a.AstType=='Function'then d_a.Scope:RenameVars() +_aa=_aa.."function(" +if#d_a.Arguments>0 then for i=1,#d_a.Arguments do +_aa=_aa..d_a.Arguments[i].Name +if i~=#d_a.Arguments then _aa=_aa..","elseif d_a.VarArg then _aa=_aa..",..."end end elseif +d_a.VarArg then _aa=_aa.."..."end;_aa=_aa..")"_aa=b_a(_aa,dd(d_a.Body)) +_aa=b_a(_aa,"end")elseif d_a.AstType=='ConstructorExpr'then _aa=_aa.."{" +for i=1,#d_a.EntryList do +local aaa=d_a.EntryList[i] +if aaa.Type=='Key'then _aa=_aa.."[".. +__a(aaa.Key).."]="..__a(aaa.Value)elseif aaa.Type== +'Value'then _aa=_aa..__a(aaa.Value)elseif aaa.Type=='KeyString'then +_aa=_aa.. +aaa.Key.."="..__a(aaa.Value)end;if i~=#d_a.EntryList then _aa=_aa..","end end;_aa=_aa.."}"end +_aa=_aa..string.rep(')',d_a.ParenCount or 0)a_a=a_a+#_aa;return _aa end +local c_a=function(d_a)local _aa='' +if d_a.AstType=='AssignmentStatement'then +for i=1,#d_a.Lhs do +_aa=_aa..__a(d_a.Lhs[i])if i~=#d_a.Lhs then _aa=_aa..","end end;if#d_a.Rhs>0 then _aa=_aa.."=" +for i=1,#d_a.Rhs do +_aa=_aa..__a(d_a.Rhs[i])if i~=#d_a.Rhs then _aa=_aa..","end end end elseif +d_a.AstType=='CallStatement'then _aa=__a(d_a.Expression)elseif d_a.AstType=='LocalStatement'then +_aa=_aa.."local " +for i=1,#d_a.LocalList do _aa=_aa..d_a.LocalList[i].Name;if i~=# +d_a.LocalList then _aa=_aa..","end end +if#d_a.InitList>0 then _aa=_aa.."="for i=1,#d_a.InitList do _aa=_aa.. +__a(d_a.InitList[i]) +if i~=#d_a.InitList then _aa=_aa..","end end end elseif d_a.AstType=='IfStatement'then +_aa=b_a("if",__a(d_a.Clauses[1].Condition))_aa=b_a(_aa,"then") +_aa=b_a(_aa,dd(d_a.Clauses[1].Body)) +for i=2,#d_a.Clauses do local aaa=d_a.Clauses[i] +if aaa.Condition then +_aa=b_a(_aa,"elseif")_aa=b_a(_aa,__a(aaa.Condition)) +_aa=b_a(_aa,"then")else _aa=b_a(_aa,"else")end;_aa=b_a(_aa,dd(aaa.Body))end;_aa=b_a(_aa,"end")elseif d_a.AstType=='WhileStatement'then +_aa=b_a("while",__a(d_a.Condition))_aa=b_a(_aa,"do")_aa=b_a(_aa,dd(d_a.Body)) +_aa=b_a(_aa,"end")elseif d_a.AstType=='DoStatement'then _aa=b_a(_aa,"do") +_aa=b_a(_aa,dd(d_a.Body))_aa=b_a(_aa,"end")elseif d_a.AstType=='ReturnStatement'then _aa="return" +for i=1,#d_a.Arguments +do _aa=b_a(_aa,__a(d_a.Arguments[i]))if i~= +#d_a.Arguments then _aa=_aa..","end end elseif d_a.AstType=='BreakStatement'then _aa="break"elseif d_a.AstType=='RepeatStatement'then +_aa="repeat"_aa=b_a(_aa,dd(d_a.Body))_aa=b_a(_aa,"until") +_aa=b_a(_aa,__a(d_a.Condition))elseif d_a.AstType=='Function'then d_a.Scope:RenameVars()if d_a.IsLocal then +_aa="local"end;_aa=b_a(_aa,"function ")if d_a.IsLocal then +_aa=_aa..d_a.Name.Name else _aa=_aa..__a(d_a.Name)end;_aa= +_aa.."(" +if#d_a.Arguments>0 then +for i=1,#d_a.Arguments do _aa=_aa.. +d_a.Arguments[i].Name;if i~=#d_a.Arguments then _aa=_aa..","elseif d_a.VarArg then +print("Apply vararg")_aa=_aa..",..."end end elseif d_a.VarArg then _aa=_aa.."..."end;_aa=_aa..")"_aa=b_a(_aa,dd(d_a.Body)) +_aa=b_a(_aa,"end")elseif d_a.AstType=='GenericForStatement'then d_a.Scope:RenameVars() +_aa="for " +for i=1,#d_a.VariableList do +_aa=_aa..d_a.VariableList[i].Name;if i~=#d_a.VariableList then _aa=_aa..","end end;_aa=_aa.." in" +for i=1,#d_a.Generators do +_aa=b_a(_aa,__a(d_a.Generators[i]))if i~=#d_a.Generators then _aa=b_a(_aa,',')end end;_aa=b_a(_aa,"do")_aa=b_a(_aa,dd(d_a.Body)) +_aa=b_a(_aa,"end")elseif d_a.AstType=='NumericForStatement'then _aa="for "_aa=_aa.. +d_a.Variable.Name.."="_aa=_aa.. +__a(d_a.Start)..","..__a(d_a.End)if d_a.Step then +_aa=_aa..","..__a(d_a.Step)end;_aa=b_a(_aa,"do") +_aa=b_a(_aa,dd(d_a.Body))_aa=b_a(_aa,"end")end;a_a=a_a+#_aa;return _aa end +dd=function(d_a)local _aa=''d_a.Scope:RenameVars()for aaa,baa in pairs(d_a.Body)do +_aa=b_a(_aa,c_a(baa),';')end;return _aa end;cd.Scope:RenameVars()return dd(cd)end +local minify = function(cd)local dd,__a=ParseLua(cd)if not dd then return false,__a end +return true,Format_Mini(__a)end + +-- Packaging part: +local projectPath = "Basalt" +local outputFileName = "basalt.lua" + +local projectFiles = { + "objects", + "libraries", + "Frame.lua", + "loadObjects.lua", + "Object.lua", + "theme.lua", +} +local subDirs = { + "objects", "libraries" +} +local mainFile = "main.lua" +local minifyProject = true + +local outputFile = io.open(outputFileName, "w") + +if(outputFile==nil)then + error("Can't open file "..outputFileName) +end + +outputFile:write([[ +local project = {} +local packaged = true +local baseRequire = require +local require = function(path) + for _,v in pairs(project)do + for name,b in pairs(v)do + if(name==path)then + return b() + end + end + end + return baseRequire(path); +end +local getProject = function(subDir) + if(subDir~=nil)then + return project[subDir] + end + return project +end +]]) + +for k,v in pairs(subDirs)do + outputFile:write("project['"..v.."'] = {}") +end +outputFile:write("project['default'] = {}") + +local function writeNewPackage(subdir, name, path) + if not(fs.isDir(path))then + outputFile:write("project['"..subdir.."']['"..name.."'] = ".."function(...)") + local fileData = io.open(path, "r"):read("*all") + if(minifyProject)then + local success, data = minify(fileData) + if(success)then + outputFile:write(data:gsub("]]", "] ]"):gsub("]]", "] ]").."\n") + else + print("Error: Can't minify "..path) + end + else + outputFile:write(fileData:gsub("]]", "] ]"):gsub("]]", "] ]").."\n") + end + outputFile:write("end; \n") + end +end + +for _,v in pairs(projectFiles)do + if(fs.isDir(fs.combine(projectPath, v)))then + for _,b in pairs(fs.list(fs.combine(projectPath, v)))do + writeNewPackage(v, b:gsub(".lua", ""), fs.combine(fs.combine(projectPath, v), b)) + end + else + writeNewPackage("default", v:gsub(".lua", ""), fs.combine(projectPath, v)) + end +end + +local main = io.open(fs.combine(projectPath, mainFile), "r"):read("*all") +if(minifyProject)then + local success,data = minify(main) + if(success)then + outputFile:write(data) + else + print("Error: Can't minify "..fs.combine(projectPath, mainFile)) + end +else + outputFile:write(main) +end + +outputFile:close()