Merge branch 'main' of https://github.com/Pyroxenium/Basalt2
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
local minified = true
|
||||
local project = {}
|
||||
local baseRequire = require
|
||||
require = function(path) return project[path] or baseRequire(path) end
|
||||
project["render.lua"] = function(...) local d={}d.__index=d;local _a=require("libraries/colorHex")
|
||||
local aa=require("log")
|
||||
function d.new(ba)local ca=setmetatable({},d)ca.terminal=ba
|
||||
@@ -103,6 +105,172 @@ project["init.lua"] = function(...) local da={...}local _b=da[1]or"basalt"local
|
||||
local bb="path;/path/?.lua;/path/?/init.lua;"local cb=bb:gsub("path",_b)package.path=cb.."rom/?"
|
||||
local function db(bc)
|
||||
local cc=require("errorManager")cc.header="Basalt Loading Error"cc.error(bc)end;local _c,ac=pcall(require,"main")if not _c then db(ac)else return ac end end
|
||||
project["elements/BaseFrame.lua"] = function(...) local d=require("elements/Container")
|
||||
local _a=require("render")local aa=setmetatable({},d)aa.__index=aa
|
||||
function aa.new(ba,ca)
|
||||
local da=setmetatable({},aa):__init()da:init(ba,ca)da.terminal=term.current()
|
||||
da._render=_a.new(da.terminal)da._renderUpdate=true;local _b,ab=da.terminal.getSize()
|
||||
da.set("width",_b)da.set("height",ab)
|
||||
da.set("background",colors.red)da.set("type","BaseFrame")return da end;function aa:multiBlit(ba,ca,da,_b,ab,bb,cb)
|
||||
self._render:multiBlit(ba,ca,da,_b,ab,bb,cb)end;function aa:textFg(ba,ca,da,_b)
|
||||
self._render:textFg(ba,ca,da,_b)end
|
||||
function aa:render()if(self._renderUpdate)then d.render(self)
|
||||
self._render:render()self._renderUpdate=false end end;return aa end
|
||||
project["elements/Button.lua"] = function(...) local d=require("elements/VisualElement")
|
||||
local _a=require("libraries/utils").getCenteredPosition;local aa=setmetatable({},d)aa.__index=aa
|
||||
aa.defineProperty(aa,"text",{default="Button",type="string"})aa.listenTo(aa,"mouse_click")
|
||||
function aa.new(ba,ca)
|
||||
local da=setmetatable({},aa):__init()da:init(ba,ca)da.set("type","Button")
|
||||
da.set("width",10)da.set("height",3)da.set("z",5)return da end
|
||||
function aa:render()d.render(self)local ba=self.get("text")
|
||||
local ca,da=_a(ba,self.get("width"),self.get("height"))
|
||||
self:textFg(ca,da,ba,self.get("foreground"))end;return aa end
|
||||
project["elements/VisualElement.lua"] = function(...) local d=require("elements/BaseElement")
|
||||
local _a=setmetatable({},d)_a.__index=_a;local aa=require("libraries/colorHex")
|
||||
d.defineProperty(_a,"x",{default=1,type="number",canTriggerRender=true})
|
||||
d.defineProperty(_a,"y",{default=1,type="number",canTriggerRender=true})
|
||||
d.defineProperty(_a,"z",{default=1,type="number",canTriggerRender=true,setter=function(ba,ca)
|
||||
ba.basalt.LOGGER.debug("Setting z to "..ca)if ba.parent then ba.parent:sortChildren()end;return ca end})
|
||||
d.defineProperty(_a,"width",{default=1,type="number",canTriggerRender=true})
|
||||
d.defineProperty(_a,"height",{default=1,type="number",canTriggerRender=true})
|
||||
d.defineProperty(_a,"background",{default=colors.black,type="number",canTriggerRender=true})
|
||||
d.defineProperty(_a,"foreground",{default=colors.white,type="number",canTriggerRender=true})
|
||||
d.defineProperty(_a,"clicked",{default=false,type="boolean"})
|
||||
function _a.new(ba,ca)local da=setmetatable({},_a):__init()
|
||||
da:init(ba,ca)da.set("type","VisualElement")return da end;function _a:multiBlit(ba,ca,da,_b,ab,bb,cb)ba=ba+self.get("x")-1;ca=ca+self.get("y")-
|
||||
1
|
||||
self.parent:multiBlit(ba,ca,da,_b,ab,bb,cb)end;function _a:textFg(ba,ca,da,_b)ba=ba+
|
||||
self.get("x")-1;ca=ca+self.get("y")-1
|
||||
self.parent:textFg(ba,ca,da,_b)end
|
||||
function _a:isInBounds(ba,ca)
|
||||
local da,_b=self.get("x"),self.get("y")local ab,bb=self.get("width"),self.get("height")return
|
||||
ba>=da and ba<=
|
||||
da+ab-1 and ca>=_b and ca<=_b+bb-1 end
|
||||
function _a:mouse_click(ba,ca,da)if self:isInBounds(ca,da)then self.set("clicked",true)
|
||||
self:fireEvent("mouse_click",ba,ca,da)return true end end
|
||||
function _a:mouse_up(ba,ca,da)if self:isInBounds(ca,da)then self.set("clicked",false)
|
||||
self:fireEvent("mouse_up",ba,ca,da)return true end
|
||||
self:fireEvent("mouse_release",ba,ca,da)end;function _a:mouse_release()self.set("clicked",false)end
|
||||
function _a:handleEvent(ba,...)if
|
||||
(self[ba])then return self[ba](self,...)end end
|
||||
function _a:getAbsolutePosition(ba,ca)if(ba==nil)or(ca==nil)then
|
||||
ba,ca=self.get("x"),self.get("y")end;local da=self.parent
|
||||
while da do
|
||||
local _b,ab=da.get("x"),da.get("y")ba=ba+_b-1;ca=ca+ab-1;da=da.parent end;return ba,ca end
|
||||
function _a:getRelativePosition(ba,ca)if(ba==nil)or(ca==nil)then
|
||||
ba,ca=self.get("x"),self.get("y")end;local da,_b=1,1;if self.parent then
|
||||
da,_b=self.parent:getRelativePosition()end;local ab=self.get("x")
|
||||
local bb=self.get("y")return ba- (ab-1)- (da-1),ca- (bb-1)- (_b-1)end
|
||||
function _a:render()local ba,ca=self.get("width"),self.get("height")
|
||||
self:multiBlit(1,1,ba,ca," ",aa[self.get("foreground")],aa[self.get("background")])end;return _a end
|
||||
project["elements/BaseElement.lua"] = function(...) local c=require("propertySystem")local d=setmetatable({},c)
|
||||
d.__index=d;d._events={}
|
||||
d.defineProperty(d,"type",{default="BaseElement",type="string"})
|
||||
d.defineProperty(d,"eventCallbacks",{default={},type="table"})
|
||||
function d.new(_a,aa)local ba=setmetatable({},d):__init()
|
||||
ba:init(_a,aa)ba.set("type","BaseElement")return ba end
|
||||
function d:init(_a,aa)self.id=_a;self.basalt=aa;self._registeredEvents={}
|
||||
if d._events then
|
||||
for ba in
|
||||
pairs(d._events)do self._registeredEvents[ba]=true
|
||||
local ca="on"..
|
||||
ba:gsub("_(%l)",function(da)return da:upper()end):gsub("^%l",string.upper)
|
||||
self[ca]=function(da,...)da:registerCallback(ba,...)end end end;return self end;function d.listenTo(_a,aa)if not _a._events then _a._events={}end
|
||||
_a._events[aa]=true end
|
||||
function d:listenEvent(_a,aa)aa=aa~=false
|
||||
if aa~= (
|
||||
self._registeredEvents[_a]or false)then
|
||||
if aa then
|
||||
self._registeredEvents[_a]=true
|
||||
if self.parent then self.parent:registerChildEvent(self,_a)end else self._registeredEvents[_a]=nil;if self.parent then
|
||||
self.parent:unregisterChildEvent(self,_a)end end end;return self end
|
||||
function d:registerCallback(_a,aa)if not self._registeredEvents[_a]then
|
||||
self:listenEvent(_a,true)end
|
||||
if
|
||||
not self._values.eventCallbacks[_a]then self._values.eventCallbacks[_a]={}end
|
||||
table.insert(self._values.eventCallbacks[_a],aa)return self end
|
||||
function d:fireEvent(_a,...)
|
||||
if self._values.eventCallbacks[_a]then for aa,ba in
|
||||
ipairs(self._values.eventCallbacks[_a])do local ca=ba(self,...)return ca end end;return self end
|
||||
function d:updateRender()if(self.parent)then self.parent:updateRender()else
|
||||
self._renderUpdate=true end end;return d end
|
||||
project["elements/Container.lua"] = function(...) local aa=require("elements/VisualElement")
|
||||
local ba=require("elementManager")local ca=require("libraries/expect")local da=math.max
|
||||
local _b=setmetatable({},aa)_b.__index=_b
|
||||
_b.defineProperty(_b,"children",{default={},type="table"})
|
||||
_b.defineProperty(_b,"childrenEvents",{default={},type="table"})
|
||||
_b.defineProperty(_b,"eventListenerCount",{default={},type="table"})
|
||||
for ab,bb in pairs(ba:getElementList())do
|
||||
local cb=ab:sub(1,1):upper()..ab:sub(2)
|
||||
_b["add"..cb]=function(db,...)ca(1,db,"table")
|
||||
local _c=db.basalt.create(ab,...)
|
||||
db.basalt.LOGGER.debug(cb.." created with ID: ".._c.id)db:addChild(_c)return _c end end
|
||||
function _b.new(ab,bb)local cb=setmetatable({},_b):__init()
|
||||
cb:init(ab,bb)cb.set("type","Container")return cb end
|
||||
function _b:addChild(ab)
|
||||
if ab==self then error("Cannot add container to itself")end;local bb=ab.get("z")local cb=1;for db,_c in ipairs(self._values.children)do if
|
||||
_c.get("z")>bb then break end;cb=db+1 end
|
||||
table.insert(self._values.children,cb,ab)ab.parent=self;self:registerChildrenEvents(ab)return self end;function _b:sortChildren()
|
||||
table.sort(self._values.children,function(ab,bb)
|
||||
return ab.get("z")<bb.get("z")end)end
|
||||
function _b:sortChildrenEvents(ab)if
|
||||
self._values.childrenEvents[ab]then
|
||||
table.sort(self._values.childrenEvents[ab],function(bb,cb)return
|
||||
bb.get("z")>cb.get("z")end)end end
|
||||
function _b:registerChildrenEvents(ab)for bb in pairs(ab._registeredEvents)do
|
||||
self:registerChildEvent(ab,bb)end end
|
||||
function _b:registerChildEvent(ab,bb)
|
||||
if not self._values.childrenEvents[bb]then
|
||||
self._values.childrenEvents[bb]={}self._values.eventListenerCount[bb]=0;if self.parent then
|
||||
self.parent:registerChildEvent(self,bb)end end;for _c,ac in ipairs(self._values.childrenEvents[bb])do
|
||||
if ac==ab then return end end;local cb=ab.get("z")local db=1
|
||||
for _c,ac in
|
||||
ipairs(self._values.childrenEvents[bb])do if ac.get("z")<cb then break end;db=_c+1 end
|
||||
table.insert(self._values.childrenEvents[bb],db,ab)self._values.eventListenerCount[bb]=
|
||||
self._values.eventListenerCount[bb]+1 end
|
||||
function _b:removeChildrenEvents(ab)for bb in pairs(ab._registeredEvents)do
|
||||
self:unregisterChildEvent(ab,bb)end end
|
||||
function _b:unregisterChildEvent(ab,bb)
|
||||
if self._values.childrenEvents[bb]then
|
||||
for cb,db in
|
||||
ipairs(self._values.childrenEvents[bb])do
|
||||
if db==ab then
|
||||
table.remove(self._values.childrenEvents[bb],cb)self._values.eventListenerCount[bb]=
|
||||
self._values.eventListenerCount[bb]-1
|
||||
if
|
||||
self._values.eventListenerCount[bb]<=0 then
|
||||
self._values.childrenEvents[bb]=nil;self._values.eventListenerCount[bb]=nil;if self.parent then
|
||||
self.parent:unregisterChildEvent(self,bb)end end;break end end end end
|
||||
function _b:removeChild(ab)
|
||||
for bb,cb in ipairs(self.children)do if cb==ab then
|
||||
table.remove(self._values.children,bb)ab.parent=nil;break end end;return self end
|
||||
function _b:handleEvent(ab,...)
|
||||
if(aa.handleEvent(self,ab,...))then local bb={...}if ab:find("mouse_")then local cb,db,_c=...
|
||||
local ac,bc=self:getRelativePosition(db,_c)bb={cb,ac,bc}end
|
||||
if
|
||||
self._values.childrenEvents[ab]then
|
||||
for cb,db in ipairs(self._values.childrenEvents[ab])do if
|
||||
(db:handleEvent(ab,table.unpack(bb)))then return true end end end end end
|
||||
function _b:multiBlit(ab,bb,cb,db,_c,ac,bc)local cc,dc=self.get("width"),self.get("height")cb=ab<1 and math.min(
|
||||
cb+ab-1,cc)or
|
||||
math.min(cb,math.max(0,cc-ab+1))db=bb<1 and math.min(
|
||||
db+bb-1,dc)or
|
||||
math.min(db,math.max(0,dc-bb+1))if
|
||||
cb<=0 or db<=0 then return end
|
||||
aa.multiBlit(self,math.max(1,ab),math.max(1,bb),cb,db,_c,ac,bc)end
|
||||
function _b:textFg(ab,bb,cb,db)local _c,ac=self.get("width"),self.get("height")if
|
||||
bb<1 or bb>ac then return end;local bc=ab<1 and(2 -ab)or 1
|
||||
local cc=math.min(#cb-bc+1,
|
||||
_c-math.max(1,ab)+1)if cc<=0 then return end
|
||||
aa.textFg(self,math.max(1,ab),math.max(1,bb),cb:sub(bc,bc+cc-1),db)end
|
||||
function _b:render()aa.render(self)
|
||||
for ab,bb in ipairs(self._values.children)do if bb==self then
|
||||
self.basalt.LOGGER.error("CIRCULAR REFERENCE DETECTED!")return end;bb:render()end end;return _b end
|
||||
project["elements/Frame.lua"] = function(...) local c=require("elements/Container")
|
||||
local d=setmetatable({},c)d.__index=d
|
||||
function d.new(_a,aa)local ba=setmetatable({},d):__init()
|
||||
ba:init(_a,aa)ba.set("width",12)ba.set("height",6)
|
||||
ba.set("background",colors.blue)ba.set("type","Frame")ba.set("z",10)return ba end;return d end
|
||||
project["errorManager.lua"] = function(...) local d=require("log")
|
||||
local _a={tracebackEnabled=true,header="Basalt Error"}local function aa(ba,ca)term.setTextColor(ca)print(ba)
|
||||
term.setTextColor(colors.white)end
|
||||
@@ -133,6 +301,20 @@ repeat _c=db.readLine()if
|
||||
ac==tonumber(bb)then aa("\149Line "..bb,colors.cyan)
|
||||
aa(_c,colors.lightGray)break end;ac=ac+1 until not _c;db.close()end end;term.setBackgroundColor(colors.black)
|
||||
d.error(ba)error()end;return _a end
|
||||
project["libraries/utils.lua"] = function(...) local d,_a=math.floor,string.len;local aa={}
|
||||
function aa.getCenteredPosition(ba,ca,da)local _b=_a(ba)local ab=d(
|
||||
(ca-_b+1)/2 +0.5)local bb=d(da/2 +0.5)return ab,bb end
|
||||
function aa.deepCopy(ba)if type(ba)~="table"then return ba end;local ca={}for da,_b in pairs(ba)do
|
||||
ca[aa.deepCopy(da)]=aa.deepCopy(_b)end;return ca end;return aa end
|
||||
project["libraries/expect.lua"] = function(...) local c=require("errorManager")
|
||||
local function d(_a,aa,ba)local ca=type(aa)
|
||||
if ba=="element"then if ca=="table"and
|
||||
aa.get("type")~=nil then return true end end
|
||||
if ba=="color"then
|
||||
if ca=="number"and aa>=1 and aa<=32768 then return true end;if ca=="string"and colors[aa]then return true end end;if ca~=ba then c.header="Basalt Type Error"
|
||||
c.error(string.format("Bad argument #%d: expected %s, got %s",_a,ba,ca))end;return true end;return d end
|
||||
project["libraries/colorHex.lua"] = function(...) local b={}for i=0,15 do b[2 ^i]=("%x"):format(i)
|
||||
b[("%x"):format(i)]=2 ^i end;return b end
|
||||
project["log.lua"] = function(...) local aa={}aa._logs={}aa._enabled=true;aa._logToFile=true
|
||||
aa._logFile="basalt.log"fs.delete(aa._logFile)
|
||||
aa.LEVEL={DEBUG=1,INFO=2,WARN=3,ERROR=4}
|
||||
@@ -175,7 +357,7 @@ function bb.run(bc)db=bc
|
||||
if(bc==nil)then db=true end
|
||||
local function cc()ac()while db do _c(os.pullEventRaw())end end
|
||||
while db do local dc,_d=pcall(cc)if not(dc)then ab.header="Basalt Runtime Error"
|
||||
ab.error(_d)end end end;return bb end
|
||||
ab.error(_d)end end end;bb.autoUpdate=bb.run;return bb end
|
||||
project["propertySystem.lua"] = function(...) local d=require("libraries/utils").deepCopy
|
||||
local _a=require("libraries/expect")local aa={}aa.__index=aa;aa._properties={}
|
||||
function aa.defineProperty(ba,ca,da)if
|
||||
|
||||
Reference in New Issue
Block a user