Merge branch 'main' of https://github.com/Pyroxenium/Basalt2
This commit is contained in:
282
config.lua
282
config.lua
@@ -1,156 +1,160 @@
|
||||
return {
|
||||
["files"] = {
|
||||
["src/elements/Container.lua"] = {
|
||||
["name"] = "Container",
|
||||
["path"] = "elements/Container.lua",
|
||||
},
|
||||
["src/elements/Input.lua"] = {
|
||||
["name"] = "Input",
|
||||
["path"] = "elements/Input.lua",
|
||||
},
|
||||
["src/libraries/utils.lua"] = {
|
||||
["name"] = "utils",
|
||||
["path"] = "libraries/utils.lua",
|
||||
},
|
||||
["src/elements/ProgressBar.lua"] = {
|
||||
["name"] = "ProgressBar",
|
||||
["path"] = "elements/ProgressBar.lua",
|
||||
},
|
||||
["src/propertySystem.lua"] = {
|
||||
["name"] = "propertySystem",
|
||||
["path"] = "propertySystem.lua",
|
||||
},
|
||||
["src/errorManager.lua"] = {
|
||||
["name"] = "errorManager",
|
||||
["path"] = "errorManager.lua",
|
||||
},
|
||||
["src/plugins/debug.lua"] = {
|
||||
["name"] = "debug",
|
||||
["path"] = "plugins/debug.lua",
|
||||
},
|
||||
["src/plugins/state.lua"] = {
|
||||
["name"] = "state",
|
||||
["path"] = "plugins/state.lua",
|
||||
},
|
||||
["src/elements/Label.lua"] = {
|
||||
["name"] = "Label",
|
||||
["path"] = "elements/Label.lua",
|
||||
},
|
||||
["src/plugins/pluginTemplate.lua"] = {
|
||||
["name"] = "pluginTemplate",
|
||||
["path"] = "plugins/pluginTemplate.lua",
|
||||
},
|
||||
["src/elements/Checkbox.lua"] = {
|
||||
["name"] = "Checkbox",
|
||||
["path"] = "elements/Checkbox.lua",
|
||||
},
|
||||
["src/elements/Flexbox.lua"] = {
|
||||
["name"] = "Flexbox",
|
||||
["path"] = "elements/Flexbox.lua",
|
||||
},
|
||||
["src/elements/List.lua"] = {
|
||||
["name"] = "List",
|
||||
["path"] = "elements/List.lua",
|
||||
},
|
||||
["src/plugins/benchmark.lua"] = {
|
||||
["name"] = "benchmark",
|
||||
["path"] = "plugins/benchmark.lua",
|
||||
},
|
||||
["src/elementManager.lua"] = {
|
||||
["name"] = "elementManager",
|
||||
["path"] = "elementManager.lua",
|
||||
},
|
||||
["src/elements/Program.lua"] = {
|
||||
["name"] = "Program",
|
||||
["path"] = "elements/Program.lua",
|
||||
},
|
||||
["src/render.lua"] = {
|
||||
["name"] = "render",
|
||||
["path"] = "render.lua",
|
||||
},
|
||||
["src/elements/Slider.lua"] = {
|
||||
["name"] = "Slider",
|
||||
["path"] = "elements/Slider.lua",
|
||||
},
|
||||
["src/elements/BaseFrame.lua"] = {
|
||||
["name"] = "BaseFrame",
|
||||
["path"] = "elements/BaseFrame.lua",
|
||||
},
|
||||
["src/libraries/colorHex.lua"] = {
|
||||
["name"] = "colorHex",
|
||||
["path"] = "libraries/colorHex.lua",
|
||||
},
|
||||
["src/LuaLS.lua"] = {
|
||||
["name"] = "LuaLS",
|
||||
["path"] = "LuaLS.lua",
|
||||
},
|
||||
["src/elements/VisualElement.lua"] = {
|
||||
["name"] = "VisualElement",
|
||||
["path"] = "elements/VisualElement.lua",
|
||||
},
|
||||
["src/init.lua"] = {
|
||||
["name"] = "init",
|
||||
["path"] = "init.lua",
|
||||
},
|
||||
["src/elements/Dropdown.lua"] = {
|
||||
["name"] = "Dropdown",
|
||||
["path"] = "elements/Dropdown.lua",
|
||||
},
|
||||
["src/elements/Frame.lua"] = {
|
||||
["name"] = "Frame",
|
||||
["path"] = "elements/Frame.lua",
|
||||
},
|
||||
["src/elements/TextBox.lua"] = {
|
||||
["name"] = "TextBox",
|
||||
["path"] = "elements/TextBox.lua",
|
||||
},
|
||||
["src/elements/Tree.lua"] = {
|
||||
["name"] = "Tree",
|
||||
["path"] = "elements/Tree.lua",
|
||||
},
|
||||
["src/plugins/animation.lua"] = {
|
||||
["name"] = "animation",
|
||||
["path"] = "plugins/animation.lua",
|
||||
},
|
||||
["src/elements/Menu.lua"] = {
|
||||
["name"] = "Menu",
|
||||
["path"] = "elements/Menu.lua",
|
||||
},
|
||||
["src/plugins/xml.lua"] = {
|
||||
["name"] = "xml",
|
||||
["path"] = "plugins/xml.lua",
|
||||
},
|
||||
["src/plugins/reactive.lua"] = {
|
||||
["name"] = "reactive",
|
||||
["path"] = "plugins/reactive.lua",
|
||||
},
|
||||
["src/log.lua"] = {
|
||||
["name"] = "log",
|
||||
["path"] = "log.lua",
|
||||
},
|
||||
["src/libraries/expect.lua"] = {
|
||||
["name"] = "expect",
|
||||
["path"] = "libraries/expect.lua",
|
||||
},
|
||||
["src/plugins/theme.lua"] = {
|
||||
["name"] = "theme",
|
||||
["path"] = "plugins/theme.lua",
|
||||
},
|
||||
["src/main.lua"] = {
|
||||
["name"] = "main",
|
||||
["path"] = "main.lua",
|
||||
},
|
||||
["src/elements/Table.lua"] = {
|
||||
["name"] = "Table",
|
||||
["path"] = "elements/Table.lua",
|
||||
},
|
||||
["src/elements/BaseElement.lua"] = {
|
||||
["name"] = "BaseElement",
|
||||
["path"] = "elements/BaseElement.lua",
|
||||
["src/propertySystem.lua"] = {
|
||||
["name"] = "propertySystem",
|
||||
["path"] = "propertySystem.lua",
|
||||
},
|
||||
["src/elements/Button.lua"] = {
|
||||
["name"] = "Button",
|
||||
["path"] = "elements/Button.lua",
|
||||
},
|
||||
["src/elements/Program.lua"] = {
|
||||
["name"] = "Program",
|
||||
["path"] = "elements/Program.lua",
|
||||
},
|
||||
["src/elements/Container.lua"] = {
|
||||
["name"] = "Container",
|
||||
["path"] = "elements/Container.lua",
|
||||
},
|
||||
["src/render.lua"] = {
|
||||
["name"] = "render",
|
||||
["path"] = "render.lua",
|
||||
},
|
||||
["src/elements/Label.lua"] = {
|
||||
["name"] = "Label",
|
||||
["path"] = "elements/Label.lua",
|
||||
},
|
||||
["src/elements/VisualElement.lua"] = {
|
||||
["name"] = "VisualElement",
|
||||
["path"] = "elements/VisualElement.lua",
|
||||
},
|
||||
["src/plugins/theme.lua"] = {
|
||||
["name"] = "theme",
|
||||
["path"] = "plugins/theme.lua",
|
||||
},
|
||||
["src/elements/Checkbox.lua"] = {
|
||||
["name"] = "Checkbox",
|
||||
["path"] = "elements/Checkbox.lua",
|
||||
},
|
||||
["src/main.lua"] = {
|
||||
["name"] = "main",
|
||||
["path"] = "main.lua",
|
||||
},
|
||||
["src/elements/Slider.lua"] = {
|
||||
["name"] = "Slider",
|
||||
["path"] = "elements/Slider.lua",
|
||||
},
|
||||
["src/plugins/debug.lua"] = {
|
||||
["name"] = "debug",
|
||||
["path"] = "plugins/debug.lua",
|
||||
},
|
||||
["src/elements/Frame.lua"] = {
|
||||
["name"] = "Frame",
|
||||
["path"] = "elements/Frame.lua",
|
||||
},
|
||||
["src/libraries/utils.lua"] = {
|
||||
["name"] = "utils",
|
||||
["path"] = "libraries/utils.lua",
|
||||
},
|
||||
["src/plugins/pluginTemplate.lua"] = {
|
||||
["name"] = "pluginTemplate",
|
||||
["path"] = "plugins/pluginTemplate.lua",
|
||||
},
|
||||
["src/elements/BaseElement.lua"] = {
|
||||
["name"] = "BaseElement",
|
||||
["path"] = "elements/BaseElement.lua",
|
||||
},
|
||||
["src/plugins/reactive.lua"] = {
|
||||
["name"] = "reactive",
|
||||
["path"] = "plugins/reactive.lua",
|
||||
},
|
||||
["src/libraries/colorHex.lua"] = {
|
||||
["name"] = "colorHex",
|
||||
["path"] = "libraries/colorHex.lua",
|
||||
},
|
||||
["src/elements/Input.lua"] = {
|
||||
["name"] = "Input",
|
||||
["path"] = "elements/Input.lua",
|
||||
},
|
||||
["src/LuaLS.lua"] = {
|
||||
["name"] = "LuaLS",
|
||||
["path"] = "LuaLS.lua",
|
||||
},
|
||||
["src/elements/Scrollbar.lua"] = {
|
||||
["name"] = "Scrollbar",
|
||||
["path"] = "elements/Scrollbar.lua",
|
||||
},
|
||||
["src/elements/List.lua"] = {
|
||||
["name"] = "List",
|
||||
["path"] = "elements/List.lua",
|
||||
},
|
||||
["src/libraries/expect.lua"] = {
|
||||
["name"] = "expect",
|
||||
["path"] = "libraries/expect.lua",
|
||||
},
|
||||
["src/plugins/animation.lua"] = {
|
||||
["name"] = "animation",
|
||||
["path"] = "plugins/animation.lua",
|
||||
},
|
||||
["src/plugins/xml.lua"] = {
|
||||
["name"] = "xml",
|
||||
["path"] = "plugins/xml.lua",
|
||||
},
|
||||
["src/elements/Tree.lua"] = {
|
||||
["name"] = "Tree",
|
||||
["path"] = "elements/Tree.lua",
|
||||
},
|
||||
["src/elements/ProgressBar.lua"] = {
|
||||
["name"] = "ProgressBar",
|
||||
["path"] = "elements/ProgressBar.lua",
|
||||
},
|
||||
["src/log.lua"] = {
|
||||
["name"] = "log",
|
||||
["path"] = "log.lua",
|
||||
},
|
||||
["src/elements/Dropdown.lua"] = {
|
||||
["name"] = "Dropdown",
|
||||
["path"] = "elements/Dropdown.lua",
|
||||
},
|
||||
["src/elements/TextBox.lua"] = {
|
||||
["name"] = "TextBox",
|
||||
["path"] = "elements/TextBox.lua",
|
||||
},
|
||||
["src/elements/Flexbox.lua"] = {
|
||||
["name"] = "Flexbox",
|
||||
["path"] = "elements/Flexbox.lua",
|
||||
},
|
||||
["src/elements/BaseFrame.lua"] = {
|
||||
["name"] = "BaseFrame",
|
||||
["path"] = "elements/BaseFrame.lua",
|
||||
},
|
||||
["src/elements/Menu.lua"] = {
|
||||
["name"] = "Menu",
|
||||
["path"] = "elements/Menu.lua",
|
||||
},
|
||||
["src/plugins/benchmark.lua"] = {
|
||||
["name"] = "benchmark",
|
||||
["path"] = "plugins/benchmark.lua",
|
||||
},
|
||||
["src/plugins/state.lua"] = {
|
||||
["name"] = "state",
|
||||
["path"] = "plugins/state.lua",
|
||||
},
|
||||
["src/errorManager.lua"] = {
|
||||
["name"] = "errorManager",
|
||||
["path"] = "errorManager.lua",
|
||||
},
|
||||
["src/elements/Table.lua"] = {
|
||||
["name"] = "Table",
|
||||
["path"] = "elements/Table.lua",
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -152,38 +152,48 @@ function _b:removeProperty(cb)self._values[cb]=nil;self._properties[cb]=nil;self
|
||||
nil
|
||||
local db=cb:sub(1,1):upper()..cb:sub(2)self["get"..db]=nil;self["set"..db]=nil;return self end
|
||||
function _b:getPropertyConfig(cb)return self._properties[cb]end;return _b end
|
||||
project["main.lua"] = function(...) local bc=require("elementManager")
|
||||
local cc=require("errorManager")local dc=require("propertySystem")local _d={}_d.traceback=true
|
||||
_d._events={}_d._schedule={}_d._plugins={}_d.LOGGER=require("log")
|
||||
_d.path=fs.getDir(select(2,...))local ad=nil;local bd=false;local cd=type;local dd={}local __a=10;local a_a=0;local b_a=false;local function c_a()if(b_a)then return end
|
||||
a_a=os.startTimer(0.2)b_a=true end;local function d_a(caa)
|
||||
for _=1,caa do local daa=dd[1]if(daa)then
|
||||
daa:create()end;table.remove(dd,1)end end
|
||||
local function _aa(caa,daa)if(caa=="timer")then
|
||||
if(daa==a_a)then
|
||||
d_a(__a)b_a=false;a_a=0;if(#dd>0)then c_a()end;return true end end end
|
||||
function _d.create(caa,daa,_ba,aba)if(cd(daa)=="string")then daa={name=daa}end;if(daa==nil)then
|
||||
daa={name=caa}end;local bba=bc.getElement(caa)
|
||||
if(_ba)then
|
||||
local cba=dc.blueprint(bba,daa,_d,aba)table.insert(dd,cba)c_a()return cba else local cba=bba.new()
|
||||
cba:init(daa,_d)return cba end end;function _d.createFrame()local caa=_d.create("BaseFrame")caa:postInit()ad=caa
|
||||
return caa end
|
||||
function _d.getElementManager()return bc end
|
||||
function _d.getMainFrame()if(ad==nil)then ad=_d.createFrame()end;return ad end;function _d.setActiveFrame(caa)ad=caa end;function _d.scheduleUpdate(caa)
|
||||
table.insert(_d._schedule,caa)return#_d._schedule end;function _d.removeSchedule(caa)_d._schedule[caa]=
|
||||
nil end
|
||||
local function aaa(caa,...)
|
||||
if(caa=="terminate")then _d.stop()end;if _aa(caa,...)then return end;if(ad)then
|
||||
if(ad:dispatchEvent(caa,...))then return end end;if _d._events[caa]then for daa,_ba in ipairs(_d._events[caa])do
|
||||
_ba(...)end end end;local function baa()if(ad)then ad:render()end end;function _d.update()
|
||||
for caa,daa in
|
||||
pairs(_d._schedule)do if type(daa)=="function"then daa()end end end;function _d.stop()term.clear()
|
||||
term.setCursorPos(1,1)bd=false end
|
||||
function _d.run(caa)bd=caa
|
||||
if(caa==nil)then bd=true end;local function daa()baa()
|
||||
while bd do aaa(os.pullEventRaw())baa()end end
|
||||
while bd do local _ba,aba=pcall(daa)if not(_ba)then
|
||||
cc.header="Basalt Runtime Error"cc.error(aba)end end end;function _d.getAPI(caa)return bc.getAPI(caa)end;return _d end
|
||||
project["main.lua"] = function(...) local cc=require("elementManager")
|
||||
local dc=require("errorManager")local _d=require("propertySystem")
|
||||
local ad=require("libraries/expect")local bd={}bd.traceback=true;bd._events={}bd._schedule={}bd._plugins={}
|
||||
bd.LOGGER=require("log")bd.path=fs.getDir(select(2,...))local cd=nil;local dd=false
|
||||
local __a=type;local a_a={}local b_a=10;local c_a=0;local d_a=false;local function _aa()if(d_a)then return end
|
||||
c_a=os.startTimer(0.2)d_a=true end;local function aaa(_ba)
|
||||
for _=1,_ba do local aba=a_a[1]if(aba)then
|
||||
aba:create()end;table.remove(a_a,1)end end
|
||||
local function baa(_ba,aba)if(_ba=="timer")then
|
||||
if(aba==c_a)then
|
||||
aaa(b_a)d_a=false;c_a=0;if(#a_a>0)then _aa()end;return true end end end
|
||||
function bd.create(_ba,aba,bba,cba)if(__a(aba)=="string")then aba={name=aba}end;if(aba==nil)then
|
||||
aba={name=_ba}end;local dba=cc.getElement(_ba)
|
||||
if(bba)then
|
||||
local _ca=_d.blueprint(dba,aba,bd,cba)table.insert(a_a,_ca)_aa()return _ca else local _ca=dba.new()
|
||||
_ca:init(aba,bd)return _ca end end;function bd.createFrame()local _ba=bd.create("BaseFrame")_ba:postInit()cd=_ba
|
||||
return _ba end
|
||||
function bd.getElementManager()return cc end
|
||||
function bd.getMainFrame()if(cd==nil)then cd=bd.createFrame()end;return cd end;function bd.setActiveFrame(_ba)cd=_ba end
|
||||
function bd.schedule(_ba)ad(1,_ba,"function")
|
||||
local aba=coroutine.create(_ba)local bba,cba=coroutine.resume(aba)
|
||||
if(bba)then
|
||||
table.insert(bd._schedule,{coroutine=aba,filter=cba})else dc.header="Basalt Schedule Error"dc.error(cba)end;return aba end
|
||||
function bd.removeSchedule(_ba)
|
||||
for aba,bba in ipairs(bd._schedule)do if(bba.coroutine==_ba)then
|
||||
table.remove(bd._schedule,aba)return true end end;return false end
|
||||
local function caa(_ba,...)if(_ba=="terminate")then bd.stop()end
|
||||
if baa(_ba,...)then return end
|
||||
if(cd)then if(cd:dispatchEvent(_ba,...))then return end end
|
||||
for aba,bba in ipairs(bd._schedule)do if(_ba==bba.filter)then
|
||||
local cba,dba=coroutine.resume(bba.coroutine,_ba,...)
|
||||
if(not cba)then dc.header="Basalt Schedule Error"dc.error(dba)end end
|
||||
if(
|
||||
coroutine.status(bba.coroutine)=="dead")then bd.removeSchedule(bba.coroutine)end end;if bd._events[_ba]then
|
||||
for aba,bba in ipairs(bd._events[_ba])do bba(...)end end end;local function daa()if(cd)then cd:render()end end;function bd.update(...)caa(...)
|
||||
daa()end;function bd.stop()term.clear()
|
||||
term.setCursorPos(1,1)dd=false end
|
||||
function bd.run(_ba)dd=_ba
|
||||
if(_ba==nil)then dd=true end;local function aba()daa()
|
||||
while dd do caa(os.pullEventRaw())daa()end end
|
||||
while dd do local bba,cba=pcall(aba)if not(bba)then
|
||||
dc.header="Basalt Runtime Error"dc.error(cba)end end end;function bd.getAPI(_ba)return cc.getAPI(_ba)end;return bd end
|
||||
project["init.lua"] = function(...) local da={...}local _b=fs.getDir(da[2])local ab=package.path
|
||||
local bb="path;/path/?.lua;/path/?/init.lua;"local cb=bb:gsub("path",_b)package.path=cb.."rom/?"
|
||||
local function db(bc)
|
||||
@@ -745,12 +755,16 @@ self end;function ca:multiBlit(da,_b,ab,bb,cb,db,_c)
|
||||
self._render:multiBlit(da,_b,ab,bb,cb,db,_c)end;function ca:textFg(da,_b,ab,bb)
|
||||
self._render:textFg(da,_b,ab,bb)end;function ca:textBg(da,_b,ab,bb)
|
||||
self._render:textBg(da,_b,ab,bb)end;function ca:blit(da,_b,ab,bb,cb)
|
||||
self._render:blit(da,_b,ab,bb,cb)end;function ca:setCursor(da,_b,ab)local bb=self.get("term")
|
||||
self._render:setCursor(da,_b,ab)end;function ca:render()
|
||||
if(self._renderUpdate)then if
|
||||
self._render~=nil then aa.render(self)self._render:render()
|
||||
self._renderUpdate=false end end end
|
||||
return ca end
|
||||
self._render:blit(da,_b,ab,bb,cb)end;function ca:setCursor(da,_b,ab,bb)local cb=self.get("term")
|
||||
self._render:setCursor(da,_b,ab,bb)end
|
||||
function ca:mouse_up(da,_b,ab)
|
||||
aa.mouse_up(self,da,_b,ab)aa.mouse_release(self,da,_b,ab)end;function ca:render()
|
||||
if(self._renderUpdate)then if self._render~=nil then aa.render(self)
|
||||
self._render:render()self._renderUpdate=false end end end
|
||||
function ca:term_resize()
|
||||
local da,_b=self.get("term").getSize()if
|
||||
(da==self.get("width")and _b==self.get("height"))then return end;self.set("width",da)
|
||||
self.set("height",_b)self._render:setSize(da,_b)self._renderUpdate=true end;return ca end
|
||||
project["elements/ProgressBar.lua"] = function(...) local c=require("elements/VisualElement")
|
||||
local d=setmetatable({},c)d.__index=d
|
||||
d.defineProperty(d,"progress",{default=0,type="number",canTriggerRender=true})
|
||||
@@ -964,143 +978,156 @@ function ab:render()
|
||||
if
|
||||
(self.get("flexUpdateLayout"))then
|
||||
ac(self,self.get("flexDirection"),self.get("flexSpacing"),self.get("flexJustifyContent"),self.get("flexWrap"))end;_b.render(self)end;return ab end
|
||||
project["elements/Container.lua"] = function(...) local _b=require("elementManager")
|
||||
local ab=_b.getElement("VisualElement")local bb=require("libraries/expect")
|
||||
local cb=require("libraries/utils").split;local db=math.max;local _c=setmetatable({},ab)_c.__index=_c
|
||||
_c.defineProperty(_c,"children",{default={},type="table"})
|
||||
_c.defineProperty(_c,"childrenSorted",{default=true,type="boolean"})
|
||||
_c.defineProperty(_c,"childrenEventsSorted",{default=true,type="boolean"})
|
||||
_c.defineProperty(_c,"childrenEvents",{default={},type="table"})
|
||||
_c.defineProperty(_c,"eventListenerCount",{default={},type="table"})
|
||||
_c.defineProperty(_c,"focusedChild",{default=nil,type="table",setter=function(dc,_d,ad)local bd=dc._values.focusedChild
|
||||
if _d==bd then return _d end
|
||||
if bd then
|
||||
if bd:isType("Container")then bd.set("focusedChild",nil,true)end;bd.set("focused",false,true)end
|
||||
if _d and not ad then _d.set("focused",true,true)if dc.parent then
|
||||
dc.parent:setFocusedChild(dc)end end;return _d end})
|
||||
_c.defineProperty(_c,"visibleChildren",{default={},type="table"})
|
||||
_c.defineProperty(_c,"visibleChildrenEvents",{default={},type="table"})
|
||||
for dc,_d in pairs(_b:getElementList())do
|
||||
local ad=dc:sub(1,1):upper()..dc:sub(2)
|
||||
if ad~="BaseFrame"then
|
||||
_c["add"..ad]=function(bd,...)bb(1,bd,"table")
|
||||
local cd=bd.basalt.create(dc,...)bd:addChild(cd)cd:postInit()return cd end
|
||||
_c["addDelayed"..ad]=function(bd,cd)bb(1,bd,"table")
|
||||
local dd=bd.basalt.create(dc,cd,true,bd)return dd end end end
|
||||
function _c.new()local dc=setmetatable({},_c):__init()return dc end
|
||||
function _c:init(dc,_d)ab.init(self,dc,_d)self.set("type","Container")end
|
||||
function _c:isChildVisible(dc)local _d,ad=dc.get("x"),dc.get("y")
|
||||
local bd,cd=dc.get("width"),dc.get("height")local dd,__a=self.get("width"),self.get("height")
|
||||
project["elements/Container.lua"] = function(...) local ca=require("elementManager")
|
||||
local da=ca.getElement("VisualElement")local _b=require("libraries/expect")
|
||||
local ab=require("libraries/utils").split;local bb=setmetatable({},da)bb.__index=bb
|
||||
bb.defineProperty(bb,"children",{default={},type="table"})
|
||||
bb.defineProperty(bb,"childrenSorted",{default=true,type="boolean"})
|
||||
bb.defineProperty(bb,"childrenEventsSorted",{default=true,type="boolean"})
|
||||
bb.defineProperty(bb,"childrenEvents",{default={},type="table"})
|
||||
bb.defineProperty(bb,"eventListenerCount",{default={},type="table"})
|
||||
bb.defineProperty(bb,"focusedChild",{default=nil,type="table",setter=function(_c,ac,bc)local cc=_c._values.focusedChild
|
||||
if ac==cc then return ac end
|
||||
if cc then
|
||||
if cc:isType("Container")then cc.set("focusedChild",nil,true)end;cc.set("focused",false,true)end
|
||||
if ac and not bc then ac.set("focused",true,true)if _c.parent then
|
||||
_c.parent:setFocusedChild(_c)end end;return ac end})
|
||||
bb.defineProperty(bb,"visibleChildren",{default={},type="table"})
|
||||
bb.defineProperty(bb,"visibleChildrenEvents",{default={},type="table"})
|
||||
for _c,ac in pairs(ca:getElementList())do
|
||||
local bc=_c:sub(1,1):upper().._c:sub(2)
|
||||
if bc~="BaseFrame"then
|
||||
bb["add"..bc]=function(cc,...)_b(1,cc,"table")
|
||||
local dc=cc.basalt.create(_c,...)cc:addChild(dc)dc:postInit()return dc end
|
||||
bb["addDelayed"..bc]=function(cc,dc)_b(1,cc,"table")
|
||||
local _d=cc.basalt.create(_c,dc,true,cc)return _d end end end
|
||||
function bb.new()local _c=setmetatable({},bb):__init()return _c end
|
||||
function bb:init(_c,ac)da.init(self,_c,ac)self.set("type","Container")end
|
||||
function bb:isChildVisible(_c)local ac,bc=_c.get("x"),_c.get("y")
|
||||
local cc,dc=_c.get("width"),_c.get("height")local _d,ad=self.get("width"),self.get("height")
|
||||
return
|
||||
_d<=dd and ad<=__a and _d+bd>0 and ad+cd>0 end
|
||||
function _c:addChild(dc)
|
||||
if dc==self then error("Cannot add container to itself")end;table.insert(self._values.children,dc)
|
||||
dc.parent=self;self.set("childrenSorted",false)
|
||||
self:registerChildrenEvents(dc)return self end
|
||||
local function ac(dc,_d)local ad={}
|
||||
for bd,cd in ipairs(_d)do if dc:isChildVisible(cd)and cd.get("visible")then
|
||||
table.insert(ad,cd)end end
|
||||
for i=2,#ad do local bd=ad[i]local cd=bd.get("z")local dd=i-1
|
||||
while dd>0 do
|
||||
local __a=ad[dd].get("z")if __a>cd then ad[dd+1]=ad[dd]dd=dd-1 else break end end;ad[dd+1]=bd end;return ad end
|
||||
function _c:clear()self.set("children",{})
|
||||
ac<=_d and bc<=ad and ac+cc>0 and bc+dc>0 end
|
||||
function bb:addChild(_c)
|
||||
if _c==self then error("Cannot add container to itself")end;table.insert(self._values.children,_c)
|
||||
_c.parent=self;self.set("childrenSorted",false)
|
||||
self:registerChildrenEvents(_c)return self end
|
||||
local function cb(_c,ac)local bc={}
|
||||
for cc,dc in ipairs(ac)do if _c:isChildVisible(dc)and dc.get("visible")then
|
||||
table.insert(bc,dc)end end
|
||||
for i=2,#bc do local cc=bc[i]local dc=cc.get("z")local _d=i-1
|
||||
while _d>0 do
|
||||
local ad=bc[_d].get("z")if ad>dc then bc[_d+1]=bc[_d]_d=_d-1 else break end end;bc[_d+1]=cc end;return bc end
|
||||
function bb:clear()self.set("children",{})
|
||||
self.set("childrenEvents",{})self.set("visibleChildren",{})
|
||||
self.set("visibleChildrenEvents",{})self.set("childrenSorted",true)
|
||||
self.set("childrenEventsSorted",true)return self end
|
||||
function _c:sortChildren()
|
||||
self.set("visibleChildren",ac(self,self._values.children))self.set("childrenSorted",true)return self end
|
||||
function _c:sortChildrenEvents(dc)if self._values.childrenEvents[dc]then
|
||||
self._values.visibleChildrenEvents[dc]=ac(self,self._values.childrenEvents[dc])end
|
||||
function bb:sortChildren()
|
||||
self.set("visibleChildren",cb(self,self._values.children))self.set("childrenSorted",true)return self end
|
||||
function bb:sortChildrenEvents(_c)if self._values.childrenEvents[_c]then
|
||||
self._values.visibleChildrenEvents[_c]=cb(self,self._values.childrenEvents[_c])end
|
||||
self.set("childrenEventsSorted",true)return self end
|
||||
function _c:registerChildrenEvents(dc)if(dc._registeredEvents==nil)then return end
|
||||
for _d in
|
||||
pairs(dc._registeredEvents)do self:registerChildEvent(dc,_d)end;return self end
|
||||
function _c:registerChildEvent(dc,_d)
|
||||
if not self._values.childrenEvents[_d]then
|
||||
self._values.childrenEvents[_d]={}self._values.eventListenerCount[_d]=0;if self.parent then
|
||||
self.parent:registerChildEvent(self,_d)end end;for ad,bd in ipairs(self._values.childrenEvents[_d])do
|
||||
if bd==dc then return self end end
|
||||
function bb:registerChildrenEvents(_c)if(_c._registeredEvents==nil)then return end
|
||||
for ac in
|
||||
pairs(_c._registeredEvents)do self:registerChildEvent(_c,ac)end;return self end
|
||||
function bb:registerChildEvent(_c,ac)
|
||||
if not self._values.childrenEvents[ac]then
|
||||
self._values.childrenEvents[ac]={}self._values.eventListenerCount[ac]=0;if self.parent then
|
||||
self.parent:registerChildEvent(self,ac)end end;for bc,cc in ipairs(self._values.childrenEvents[ac])do
|
||||
if cc==_c then return self end end
|
||||
self.set("childrenEventsSorted",false)
|
||||
table.insert(self._values.childrenEvents[_d],dc)self._values.eventListenerCount[_d]=
|
||||
self._values.eventListenerCount[_d]+1;return self end
|
||||
function _c:removeChildrenEvents(dc)if(dc._registeredEvents==nil)then return self end
|
||||
for _d in
|
||||
pairs(dc._registeredEvents)do self:unregisterChildEvent(dc,_d)end;return self end
|
||||
function _c:unregisterChildEvent(dc,_d)
|
||||
if self._values.childrenEvents[_d]then
|
||||
for ad,bd in
|
||||
ipairs(self._values.childrenEvents[_d])do
|
||||
if bd==dc then
|
||||
table.remove(self._values.childrenEvents[_d],ad)self._values.eventListenerCount[_d]=
|
||||
self._values.eventListenerCount[_d]-1
|
||||
table.insert(self._values.childrenEvents[ac],_c)self._values.eventListenerCount[ac]=
|
||||
self._values.eventListenerCount[ac]+1;return self end
|
||||
function bb:removeChildrenEvents(_c)if(_c._registeredEvents==nil)then return self end
|
||||
for ac in
|
||||
pairs(_c._registeredEvents)do self:unregisterChildEvent(_c,ac)end;return self end
|
||||
function bb:unregisterChildEvent(_c,ac)
|
||||
if self._values.childrenEvents[ac]then
|
||||
for bc,cc in
|
||||
ipairs(self._values.childrenEvents[ac])do
|
||||
if cc==_c then
|
||||
table.remove(self._values.childrenEvents[ac],bc)self._values.eventListenerCount[ac]=
|
||||
self._values.eventListenerCount[ac]-1
|
||||
if
|
||||
self._values.eventListenerCount[_d]<=0 then
|
||||
self._values.childrenEvents[_d]=nil;self._values.eventListenerCount[_d]=nil;if self.parent then
|
||||
self.parent:unregisterChildEvent(self,_d)end end;break end end end;return self end
|
||||
function _c:removeChild(dc)
|
||||
for _d,ad in ipairs(self._values.children)do if ad==dc then
|
||||
table.remove(self._values.children,_d)dc.parent=nil;break end end;self:removeChildrenEvents(dc)return self end
|
||||
function _c:getChild(dc)
|
||||
if type(dc)=="string"then local _d=cb(dc,"/")
|
||||
for ad,bd in
|
||||
pairs(self._values.children)do if bd.get("name")==_d[1]then
|
||||
if#_d==1 then return bd else if(bd:isType("Container"))then return
|
||||
bd:find(table.concat(_d,"/",2))end end end end end;return nil end
|
||||
local function bc(dc,_d,...)local ad={...}if _d:find("mouse_")then local bd,cd,dd=...
|
||||
local __a,a_a=dc:getRelativePosition(cd,dd)ad={bd,__a,a_a}end
|
||||
return ad end
|
||||
local function cc(dc,_d,ad,...)
|
||||
local bd=_d and dc.get("visibleChildrenEvents")or dc.get("childrenEvents")
|
||||
if bd[ad]then local cd=bd[ad]for i=#cd,1,-1 do local dd=cd[i]
|
||||
if(dd:dispatchEvent(ad,...))then return true,dd end end end;return false end
|
||||
function _c:handleEvent(dc,...)ab.handleEvent(self,dc,...)local _d=bc(self,dc,...)return
|
||||
cc(self,false,dc,table.unpack(_d))end
|
||||
function _c:mouse_click(dc,_d,ad)
|
||||
if ab.mouse_click(self,dc,_d,ad)then
|
||||
local bd=bc(self,"mouse_click",dc,_d,ad)
|
||||
local cd,dd=cc(self,true,"mouse_click",table.unpack(bd))
|
||||
if(cd)then self.set("focusedChild",dd)return true end;self.set("focusedChild",nil)return true end;return false end
|
||||
function _c:mouse_up(dc,_d,ad)
|
||||
if ab.mouse_up(self,dc,_d,ad)then local bd=bc(self,"mouse_up",dc,_d,ad)
|
||||
local cd,dd=cc(self,true,"mouse_up",table.unpack(bd))if(cd)then return true end end;return false end;function _c:key(dc)if self.get("focusedChild")then return
|
||||
self.get("focusedChild"):dispatchEvent("key",dc)end
|
||||
self._values.eventListenerCount[ac]<=0 then
|
||||
self._values.childrenEvents[ac]=nil;self._values.eventListenerCount[ac]=nil;if self.parent then
|
||||
self.parent:unregisterChildEvent(self,ac)end end;break end end end;return self end
|
||||
function bb:removeChild(_c)
|
||||
for ac,bc in ipairs(self._values.children)do if bc==_c then
|
||||
table.remove(self._values.children,ac)_c.parent=nil;break end end;self:removeChildrenEvents(_c)return self end
|
||||
function bb:getChild(_c)
|
||||
if type(_c)=="string"then local ac=ab(_c,"/")
|
||||
for bc,cc in
|
||||
pairs(self._values.children)do if cc.get("name")==ac[1]then
|
||||
if#ac==1 then return cc else if(cc:isType("Container"))then return
|
||||
cc:find(table.concat(ac,"/",2))end end end end end;return nil end
|
||||
local function db(_c,ac,...)local bc={...}if ac:find("mouse_")then local cc,dc,_d=...
|
||||
local ad,bd=_c:getRelativePosition(dc,_d)bc={cc,ad,bd}end;return bc end
|
||||
function bb:callChildrenEvents(_c,ac,...)local bc=_c and self.get("visibleChildrenEvents")or
|
||||
self.get("childrenEvents")
|
||||
if
|
||||
bc[ac]then local cc=bc[ac]for i=#cc,1,-1 do local dc=cc[i]
|
||||
if(dc:dispatchEvent(ac,...))then return true,dc end end end;return false end
|
||||
function bb:handleEvent(_c,...)da.handleEvent(self,_c,...)local ac=db(self,_c,...)return
|
||||
self:callChildrenEvents(false,_c,table.unpack(ac))end
|
||||
function bb:mouse_click(_c,ac,bc)
|
||||
if da.mouse_click(self,_c,ac,bc)then
|
||||
local cc=db(self,"mouse_click",_c,ac,bc)
|
||||
local dc,_d=self:callChildrenEvents(true,"mouse_click",table.unpack(cc))
|
||||
if(dc)then self.set("focusedChild",_d)return true end;self.set("focusedChild",nil)return true end;return false end
|
||||
function bb:mouse_up(_c,ac,bc)
|
||||
if da.mouse_up(self,_c,ac,bc)then local cc=db(self,"mouse_up",_c,ac,bc)
|
||||
local dc,_d=self:callChildrenEvents(true,"mouse_up",table.unpack(cc))if(dc)then return true end end;return false end
|
||||
function bb:mouse_release(_c,ac,bc)da.mouse_release(self,_c,ac,bc)
|
||||
local cc=db(self,"mouse_release",_c,ac,bc)
|
||||
self:callChildrenEvents(false,"mouse_release",table.unpack(cc))end
|
||||
function bb:mouse_move(_c,ac,bc)
|
||||
if da.mouse_move(self,_c,ac,bc)then
|
||||
local cc=db(self,"mouse_move",_c,ac,bc)
|
||||
local dc,_d=self:callChildrenEvents(true,"mouse_move",table.unpack(cc))if(dc)then return true end end;return false end
|
||||
function bb:mouse_drag(_c,ac,bc)
|
||||
if da.mouse_drag(self,_c,ac,bc)then
|
||||
local cc=db(self,"mouse_drag",_c,ac,bc)
|
||||
local dc,_d=self:callChildrenEvents(true,"mouse_drag",table.unpack(cc))if(dc)then return true end end;return false end
|
||||
function bb:mouse_scroll(_c,ac,bc)
|
||||
if da.mouse_scroll(self,_c,ac,bc)then
|
||||
local cc=db(self,"mouse_scroll",_c,ac,bc)
|
||||
local dc,_d=self:callChildrenEvents(true,"mouse_scroll",table.unpack(cc))if(dc)then return true end;return false end end;function bb:key(_c)if self.get("focusedChild")then return
|
||||
self.get("focusedChild"):dispatchEvent("key",_c)end
|
||||
return true end
|
||||
function _c:char(dc)if
|
||||
function bb:char(_c)if
|
||||
self.get("focusedChild")then
|
||||
return self.get("focusedChild"):dispatchEvent("char",dc)end;return true end;function _c:key_up(dc)
|
||||
return self.get("focusedChild"):dispatchEvent("char",_c)end;return true end;function bb:key_up(_c)
|
||||
if self.get("focusedChild")then return
|
||||
self.get("focusedChild"):dispatchEvent("key_up",dc)end;return true end
|
||||
function _c:multiBlit(dc,_d,ad,bd,cd,dd,__a)
|
||||
local a_a,b_a=self.get("width"),self.get("height")ad=dc<1 and math.min(ad+dc-1,a_a)or
|
||||
math.min(ad,math.max(0,a_a-dc+1))bd=_d<1 and math.min(
|
||||
bd+_d-1,b_a)or
|
||||
math.min(bd,math.max(0,b_a-_d+1))if ad<=0 or
|
||||
bd<=0 then return self end
|
||||
ab.multiBlit(self,math.max(1,dc),math.max(1,_d),ad,bd,cd,dd,__a)return self end
|
||||
function _c:textFg(dc,_d,ad,bd)local cd,dd=self.get("width"),self.get("height")if
|
||||
_d<1 or _d>dd then return self end;local __a=dc<1 and(2 -dc)or 1
|
||||
local a_a=math.min(#ad-
|
||||
__a+1,cd-math.max(1,dc)+1)if a_a<=0 then return self end
|
||||
ab.textFg(self,math.max(1,dc),math.max(1,_d),ad:sub(__a,
|
||||
__a+a_a-1),bd)end
|
||||
function _c:blit(dc,_d,ad,bd,cd)local dd,__a=self.get("width"),self.get("height")if
|
||||
_d<1 or _d>__a then return self end;local a_a=dc<1 and(2 -dc)or 1
|
||||
local b_a=math.min(
|
||||
#ad-a_a+1,dd-math.max(1,dc)+1)
|
||||
local c_a=math.min(#bd-a_a+1,dd-math.max(1,dc)+1)
|
||||
local d_a=math.min(#cd-a_a+1,dd-math.max(1,dc)+1)if b_a<=0 then return self end;local _aa=ad:sub(a_a,a_a+b_a-1)local aaa=bd:sub(a_a,
|
||||
a_a+c_a-1)
|
||||
local baa=cd:sub(a_a,a_a+d_a-1)
|
||||
ab.blit(self,math.max(1,dc),math.max(1,_d),_aa,aaa,baa)return self end
|
||||
function _c:render()ab.render(self)if not self.get("childrenSorted")then
|
||||
self.get("focusedChild"):dispatchEvent("key_up",_c)end;return true end
|
||||
function bb:multiBlit(_c,ac,bc,cc,dc,_d,ad)
|
||||
local bd,cd=self.get("width"),self.get("height")bc=_c<1 and math.min(bc+_c-1,bd)or
|
||||
math.min(bc,math.max(0,bd-_c+1))cc=ac<1 and math.min(
|
||||
cc+ac-1,cd)or
|
||||
math.min(cc,math.max(0,cd-ac+1))if
|
||||
bc<=0 or cc<=0 then return self end
|
||||
da.multiBlit(self,math.max(1,_c),math.max(1,ac),bc,cc,dc,_d,ad)return self end
|
||||
function bb:textFg(_c,ac,bc,cc)local dc,_d=self.get("width"),self.get("height")if
|
||||
ac<1 or ac>_d then return self end;local ad=_c<1 and(2 -_c)or 1
|
||||
local bd=math.min(#bc-
|
||||
ad+1,dc-math.max(1,_c)+1)if bd<=0 then return self end
|
||||
da.textFg(self,math.max(1,_c),math.max(1,ac),bc:sub(ad,ad+bd-1),cc)return self end
|
||||
function bb:blit(_c,ac,bc,cc,dc)local _d,ad=self.get("width"),self.get("height")if
|
||||
ac<1 or ac>ad then return self end;local bd=_c<1 and(2 -_c)or 1
|
||||
local cd=math.min(#bc-
|
||||
bd+1,_d-math.max(1,_c)+1)
|
||||
local dd=math.min(#cc-bd+1,_d-math.max(1,_c)+1)
|
||||
local __a=math.min(#dc-bd+1,_d-math.max(1,_c)+1)if cd<=0 then return self end;local a_a=bc:sub(bd,bd+cd-1)
|
||||
local b_a=cc:sub(bd,bd+dd-1)local c_a=dc:sub(bd,bd+__a-1)
|
||||
da.blit(self,math.max(1,_c),math.max(1,ac),a_a,b_a,c_a)return self end
|
||||
function bb:render()da.render(self)if not self.get("childrenSorted")then
|
||||
self:sortChildren()end
|
||||
if
|
||||
not self.get("childrenEventsSorted")then for dc in pairs(self._values.childrenEvents)do
|
||||
self:sortChildrenEvents(dc)end end
|
||||
for dc,_d in ipairs(self.get("visibleChildren"))do if _d==self then
|
||||
self.basalt.LOGGER.error("CIRCULAR REFERENCE DETECTED!")return end;_d:render()end end;function _c:destroy()
|
||||
for dc,_d in ipairs(self._values.children)do _d:destroy()end;ab.destroy(self)end;return
|
||||
_c end
|
||||
not self.get("childrenEventsSorted")then for _c in pairs(self._values.childrenEvents)do
|
||||
self:sortChildrenEvents(_c)end end
|
||||
for _c,ac in ipairs(self.get("visibleChildren"))do if ac==self then
|
||||
self.basalt.LOGGER.error("CIRCULAR REFERENCE DETECTED!")return end;ac:render()end end;function bb:destroy()
|
||||
for _c,ac in ipairs(self._values.children)do ac:destroy()end;da.destroy(self)end;return
|
||||
bb end
|
||||
project["elements/Slider.lua"] = function(...) local c=require("elements/VisualElement")
|
||||
local d=setmetatable({},c)d.__index=d
|
||||
d.defineProperty(d,"step",{default=1,type="number",canTriggerRender=true})
|
||||
@@ -1145,17 +1172,18 @@ da~=nil and da<1 then return ba._values.type end;return ba._values.type[
|
||||
da or 1]end})
|
||||
aa.defineProperty(aa,"id",{default="",type="string",readonly=true})
|
||||
aa.defineProperty(aa,"name",{default="",type="string"})
|
||||
aa.defineProperty(aa,"eventCallbacks",{default={},type="table"})function aa.listenTo(ba,ca)if not ba._events then ba._events={}end
|
||||
ba._events[ca]=true end;function aa.new()
|
||||
aa.defineProperty(aa,"eventCallbacks",{default={},type="table"})function aa.listenTo(ba,ca,da)if not ba._events then ba._events={}end
|
||||
ba._events[ca]={enabled=true,name=ca,event=da}end;function aa.new()
|
||||
local ba=setmetatable({},aa):__init()return ba end
|
||||
function aa:init(ba,ca)self._props=ba
|
||||
self._values.id=_a()self.basalt=ca;self._registeredEvents={}
|
||||
if aa._events then
|
||||
for da in pairs(aa._events)do
|
||||
self._registeredEvents[da]=true
|
||||
local _b="on"..
|
||||
da:gsub("_(%l)",function(ab)return ab:upper()end):gsub("^%l",string.upper)
|
||||
self[_b]=function(ab,...)ab:registerCallback(da,...)return ab end end end;return self end
|
||||
for da,_b in pairs(aa._events)do self._registeredEvents[
|
||||
_b.event or _b.name]=true
|
||||
local ab="on"..
|
||||
_b.name:gsub("_(%l)",function(bb)return
|
||||
bb:upper()end):gsub("^%l",string.upper)
|
||||
self[ab]=function(bb,...)bb:registerCallback(_b.name,...)return bb end end end;return self end
|
||||
function aa:postInit()if(self._props)then
|
||||
for ba,ca in pairs(self._props)do self.set(ba,ca)end end;self._props=nil;return self end;function aa:isType(ba)
|
||||
for ca,da in ipairs(self._values.type)do if da==ba then return true end end;return false end
|
||||
@@ -1211,7 +1239,8 @@ aa.defineProperty(aa,"maxLength",{default=nil,type="number"})
|
||||
aa.defineProperty(aa,"placeholder",{default="...",type="string"})
|
||||
aa.defineProperty(aa,"placeholderColor",{default=colors.gray,type="number"})
|
||||
aa.defineProperty(aa,"focusedColor",{default=colors.blue,type="number"})
|
||||
aa.defineProperty(aa,"pattern",{default=nil,type="string"})aa.listenTo(aa,"mouse_click")aa.listenTo(aa,"key")
|
||||
aa.defineProperty(aa,"pattern",{default=nil,type="string"})
|
||||
aa.defineProperty(aa,"cursorColor",{default=nil,type="number"})aa.listenTo(aa,"mouse_click")aa.listenTo(aa,"key")
|
||||
aa.listenTo(aa,"char")function aa.new()local ba=setmetatable({},aa):__init()
|
||||
ba.set("width",8)ba.set("z",3)return ba end
|
||||
function aa:init(ba,ca)
|
||||
@@ -1233,13 +1262,15 @@ self.set("viewOffset",ca-ab+1)end end elseif
|
||||
ba==keys.backspace then if ca>1 then
|
||||
self.set("text",da:sub(1,ca-2)..da:sub(ca))self.set("cursorPos",ca-1)self:updateRender()
|
||||
self:updateViewport()end end
|
||||
local bb=self.get("cursorPos")-self.get("viewOffset")self:setCursor(bb,1,true)return true end
|
||||
local bb=self.get("cursorPos")-self.get("viewOffset")
|
||||
self:setCursor(bb,1,true,self.get("cursorColor")or self.get("foreground"))return true end
|
||||
function aa:focus()d.focus(self)self:updateRender()end
|
||||
function aa:blur()d.blur(self)self:updateRender()end
|
||||
function aa:mouse_click(ba,ca,da)
|
||||
if d.mouse_click(self,ba,ca,da)then
|
||||
local _b,ab=self:getRelativePosition(ca,da)local bb=self.get("text")
|
||||
self:setCursor(math.min(_b,#bb+1),ab,true)
|
||||
self:setCursor(math.min(_b,#bb+1),ab,true,
|
||||
self.get("cursorColor")or self.get("foreground"))
|
||||
self:set("cursorPos",_b+self.get("viewOffset"))return true end end
|
||||
function aa:updateViewport()local ba=self.get("width")
|
||||
local ca=self.get("cursorPos")local da=self.get("viewOffset")
|
||||
@@ -1268,6 +1299,7 @@ _b.defineProperty(_b,"height",{default=1,type="number",canTriggerRender=true})
|
||||
_b.defineProperty(_b,"background",{default=colors.black,type="number",canTriggerRender=true})
|
||||
_b.defineProperty(_b,"foreground",{default=colors.white,type="number",canTriggerRender=true})
|
||||
_b.defineProperty(_b,"clicked",{default=false,type="boolean"})
|
||||
_b.defineProperty(_b,"hover",{default=false,type="boolean"})
|
||||
_b.defineProperty(_b,"backgroundEnabled",{default=true,type="boolean",canTriggerRender=true})
|
||||
_b.defineProperty(_b,"focused",{default=false,type="boolean",setter=function(cb,db,_c)local ac=cb.get("focused")
|
||||
if db==ac then return db end;if db then cb:focus()else cb:blur()end;if not _c and cb.parent then
|
||||
@@ -1278,6 +1310,7 @@ if(cb.parent~=nil)then
|
||||
cb.parent.set("childrenSorted",false)cb.parent.set("childrenEventsSorted",false)end;return db end})_b.combineProperties(_b,"position","x","y")
|
||||
_b.combineProperties(_b,"size","width","height")
|
||||
_b.combineProperties(_b,"color","foreground","background")_b.listenTo(_b,"focus")_b.listenTo(_b,"blur")
|
||||
_b.listenTo(_b,"mouse_enter","mouse_move")_b.listenTo(_b,"mouse_leave","mouse_move")
|
||||
local ab,bb=math.max,math.min
|
||||
function _b.new()local cb=setmetatable({},_b):__init()return cb end;function _b:init(cb,db)ca.init(self,cb,db)
|
||||
self.set("type","VisualElement")end;function _b:multiBlit(cb,db,_c,ac,bc,cc,dc)
|
||||
@@ -1296,12 +1329,21 @@ _c+bc-1 and db>=ac and db<=ac+cc-1 end
|
||||
function _b:mouse_click(cb,db,_c)if self:isInBounds(db,_c)then self.set("clicked",true)
|
||||
self:fireEvent("mouse_click",cb,self:getRelativePosition(db,_c))return true end;return
|
||||
false end
|
||||
function _b:mouse_up(cb,db,_c)self.set("clicked",false)if self:isInBounds(db,_c)then
|
||||
self:fireEvent("mouse_up",cb,db,_c)return true end
|
||||
self:fireEvent("mouse_release",cb,self:getRelativePosition(db,_c))end
|
||||
function _b:mouse_up(cb,db,_c)if self:isInBounds(db,_c)then self.set("clicked",false)
|
||||
self:fireEvent("mouse_up",cb,self:getRelativePosition(db,_c))return true end;return
|
||||
false end
|
||||
function _b:mouse_release(cb,db,_c)
|
||||
if self.get("clicked")then
|
||||
self:fireEvent("mouse_release",cb,self:getRelativePosition(db,_c))self.set("clicked",false)return true end;return false end;function _b:focus()self:fireEvent("focus")end;function _b:blur()
|
||||
self:fireEvent("mouse_release",cb,self:getRelativePosition(db,_c))self.set("clicked",false)end
|
||||
function _b:mouse_move(cb,db,_c)if(db==nil)or(_c==nil)then return end
|
||||
local ac=self.get("hover")
|
||||
if(self:isInBounds(db,_c))then if(not ac)then self.set("hover",true)
|
||||
self:fireEvent("mouse_enter",self:getRelativePosition(db,_c))end;return true else if(ac)then
|
||||
self.set("hover",false)
|
||||
self:fireEvent("mouse_leave",self:getRelativePosition(db,_c))end end;return false end
|
||||
function _b:mouse_scroll(cb,db,_c)if(self:isInBounds(db,_c))then
|
||||
self:fireEvent("mouse_scroll",cb,self:getRelativePosition(db,_c))return true end;return false end
|
||||
function _b:mouse_drag(cb,db,_c)if(self.get("clicked"))then
|
||||
self:fireEvent("mouse_drag",cb,self:getRelativePosition(db,_c))return true end;return false end;function _b:focus()self:fireEvent("focus")end;function _b:blur()
|
||||
self:fireEvent("blur")self:setCursor(1,1,false)end
|
||||
function _b:getAbsolutePosition(cb,db)
|
||||
local _c,ac=self.get("x"),self.get("y")if(cb~=nil)then _c=_c+cb-1 end;if(db~=nil)then ac=ac+db-1 end
|
||||
@@ -1311,13 +1353,77 @@ function _b:getRelativePosition(cb,db)if(cb==nil)or(db==nil)then
|
||||
cb,db=self.get("x"),self.get("y")end;local _c,ac=1,1;if self.parent then
|
||||
_c,ac=self.parent:getRelativePosition()end;local bc=self.get("x")
|
||||
local cc=self.get("y")return cb- (bc-1)- (_c-1),db- (cc-1)- (ac-1)end
|
||||
function _b:setCursor(cb,db,_c)
|
||||
if self.parent then local ac,bc=self:getAbsolutePosition(cb,db)
|
||||
ac=ab(self.get("x"),bb(ac,
|
||||
self.get("width")+self.get("x")-1))return self.parent:setCursor(ac,bc,_c)end end
|
||||
function _b:setCursor(cb,db,_c,ac)
|
||||
if self.parent then local bc,cc=self:getAbsolutePosition(cb,db)
|
||||
bc=ab(self.get("x"),bb(bc,
|
||||
self.get("width")+self.get("x")-1))return self.parent:setCursor(bc,cc,_c,ac)end end
|
||||
function _b:render()
|
||||
if(not self.get("backgroundEnabled"))then return end;local cb,db=self.get("width"),self.get("height")
|
||||
self:multiBlit(1,1,cb,db," ",da[self.get("foreground")],da[self.get("background")])end;return _b end
|
||||
project["elements/Scrollbar.lua"] = function(...) local aa=require("elements/VisualElement")
|
||||
local ba=require("libraries/colorHex")local ca=setmetatable({},aa)ca.__index=ca
|
||||
ca.defineProperty(ca,"value",{default=0,type="number",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"min",{default=0,type="number",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"max",{default=100,type="number",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"step",{default=10,type="number"})
|
||||
ca.defineProperty(ca,"dragMultiplier",{default=1,type="number"})
|
||||
ca.defineProperty(ca,"symbol",{default=" ",type="string",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"symbolColor",{default=colors.gray,type="number",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"symbolBackgroundColor",{default=colors.black,type="number",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"backgroundSymbol",{default="\127",type="string",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"attachedElement",{default=nil,type="table"})
|
||||
ca.defineProperty(ca,"attachedProperty",{default=nil,type="string"})
|
||||
ca.defineProperty(ca,"minValue",{default=0,type="number"})
|
||||
ca.defineProperty(ca,"maxValue",{default=100,type="number"})
|
||||
ca.defineProperty(ca,"orientation",{default="vertical",type="string",canTriggerRender=true})
|
||||
ca.defineProperty(ca,"handleSize",{default=2,type="number",canTriggerRender=true})ca.listenTo(ca,"mouse_click")
|
||||
ca.listenTo(ca,"mouse_release")ca.listenTo(ca,"mouse_drag")
|
||||
ca.listenTo(ca,"mouse_scroll")
|
||||
function ca.new()local ab=setmetatable({},ca):__init()
|
||||
ab.set("width",1)ab.set("height",10)return ab end;function ca:init(ab,bb)aa.init(self,ab,bb)self.set("type","Scrollbar")return
|
||||
self end
|
||||
function ca:attach(ab,bb)
|
||||
self.set("attachedElement",ab)self.set("attachedProperty",bb.property)self.set("minValue",
|
||||
bb.min or 0)
|
||||
self.set("maxValue",bb.max or 100)return self end
|
||||
function ca:updateAttachedElement()local ab=self.get("attachedElement")
|
||||
if not ab then return end;local bb=self.get("value")local cb=self.get("minValue")
|
||||
local db=self.get("maxValue")if type(cb)=="function"then cb=cb()end;if type(db)=="function"then
|
||||
db=db()end;local _c=cb+ (bb/100)* (db-cb)ab.set(self.get("attachedProperty"),math.floor(
|
||||
_c+0.5))end;local function da(ab)
|
||||
return
|
||||
ab.get("orientation")=="vertical"and ab.get("height")or ab.get("width")end
|
||||
local function _b(ab,bb,cb)
|
||||
local db,_c=ab:getRelativePosition(bb,cb)return
|
||||
ab.get("orientation")=="vertical"and _c or db end
|
||||
function ca:mouse_click(ab,bb,cb)
|
||||
if aa.mouse_click(self,ab,bb,cb)then local db=da(self)
|
||||
local _c=self.get("value")local ac=self.get("handleSize")local bc=
|
||||
math.floor((_c/100)* (db-ac))+1;local cc=_b(self,bb,cb)
|
||||
if
|
||||
cc>=bc and cc<bc+ac then self.dragOffset=cc-bc else local dc=( (cc-1)/ (db-ac))*100
|
||||
self.set("value",math.min(100,math.max(0,dc)))self:updateAttachedElement()end;return true end end
|
||||
function ca:mouse_drag(ab,bb,cb)
|
||||
if(aa.mouse_drag(self,ab,bb,cb))then local db=da(self)
|
||||
local _c=self.get("handleSize")local ac=self.get("dragMultiplier")local bc=_b(self,bb,cb)
|
||||
bc=math.max(1,math.min(db,bc))local cc=bc- (self.dragOffset or 0)local dc=
|
||||
(cc-1)/ (db-_c)*100 *ac
|
||||
self.set("value",math.min(100,math.max(0,dc)))self:updateAttachedElement()return true end end
|
||||
function ca:mouse_scroll(ab,bb,cb)
|
||||
if not self:isInBounds(bb,cb)then return false end;ab=ab>0 and-1 or 1;local db=self.get("step")
|
||||
local _c=self.get("value")local ac=_c-ab*db
|
||||
self.set("value",math.min(100,math.max(0,ac)))self:updateAttachedElement()return true end
|
||||
function ca:render()aa.render(self)local ab=da(self)local bb=self.get("value")
|
||||
local cb=self.get("handleSize")local db=self.get("symbol")local _c=self.get("symbolColor")
|
||||
local ac=self.get("symbolBackgroundColor")local bc=self.get("backgroundSymbol")local cc=self.get("orientation")==
|
||||
"vertical"local dc=
|
||||
math.floor((bb/100)* (ab-cb))+1
|
||||
for i=1,ab do
|
||||
if cc then
|
||||
self:blit(1,i,bc,ba[self.get("foreground")],ba[self.get("background")])else
|
||||
self:blit(i,1,bc,ba[self.get("foreground")],ba[self.get("background")])end end
|
||||
for i=dc,dc+cb-1 do if cc then self:blit(1,i,db,ba[_c],ba[ac])else
|
||||
self:blit(i,1,db,ba[_c],ba[ac])end end end;return ca end
|
||||
project["elements/List.lua"] = function(...) local c=require("elements/VisualElement")
|
||||
local d=setmetatable({},c)d.__index=d
|
||||
d.defineProperty(d,"items",{default={},type="table",canTriggerRender=true})
|
||||
@@ -1372,6 +1478,7 @@ ba.defineProperty(ba,"nodes",{default={},type="table",canTriggerRender=true})
|
||||
ba.defineProperty(ba,"selectedNode",{default=nil,type="table",canTriggerRender=true})
|
||||
ba.defineProperty(ba,"expandedNodes",{default={},type="table",canTriggerRender=true})
|
||||
ba.defineProperty(ba,"scrollOffset",{default=0,type="number",canTriggerRender=true})
|
||||
ba.defineProperty(ba,"horizontalOffset",{default=0,type="number",canTriggerRender=true})
|
||||
ba.defineProperty(ba,"nodeColor",{default=colors.white,type="number"})
|
||||
ba.defineProperty(ba,"selectedColor",{default=colors.lightBlue,type="number"})ba.listenTo(ba,"mouse_click")
|
||||
ba.listenTo(ba,"mouse_scroll")
|
||||
@@ -1390,29 +1497,35 @@ ab or 0;for cb,db in ipairs(da)do table.insert(bb,{node=db,level=ab})
|
||||
if
|
||||
_b[db]and db.children then ca(db.children,_b,ab+1,bb)end end;return bb end
|
||||
function ba:mouse_click(da,_b,ab)
|
||||
if not _a.mouse_click(self,da,_b,ab)then return false end;local bb,cb=self:getRelativePosition(_b,ab)
|
||||
if _a.mouse_click(self,da,_b,ab)then
|
||||
local bb,cb=self:getRelativePosition(_b,ab)
|
||||
local db=ca(self.get("nodes"),self.get("expandedNodes"))local _c=cb+self.get("scrollOffset")
|
||||
if db[_c]then local ac=db[_c]
|
||||
local bc=ac.node
|
||||
if bb<=ac.level*2 +2 then self:toggleNode(bc)end;self.set("selectedNode",bc)
|
||||
self:fireEvent("node_select",bc)end;return true end
|
||||
self:fireEvent("node_select",bc)end;return true end end
|
||||
function ba:onSelect(da)self:registerCallback("node_select",da)return self end
|
||||
function ba:mouse_scroll(da)
|
||||
local _b=ca(self.get("nodes"),self.get("expandedNodes"))
|
||||
local ab=math.max(0,#_b-self.get("height"))
|
||||
local bb=math.min(ab,math.max(0,self.get("scrollOffset")+da))self.set("scrollOffset",bb)return true end
|
||||
function ba:mouse_scroll(da,_b,ab)
|
||||
if _a.mouse_scroll(self,da,_b,ab)then
|
||||
local bb=ca(self.get("nodes"),self.get("expandedNodes"))
|
||||
local cb=math.max(0,#bb-self.get("height"))
|
||||
local db=math.min(cb,math.max(0,self.get("scrollOffset")+da))self.set("scrollOffset",db)return true end end
|
||||
function ba:getNodeSize()local da,_b=0,0
|
||||
local ab=ca(self.get("nodes"),self.get("expandedNodes"))for bb,cb in ipairs(ab)do
|
||||
da=math.max(da,cb.level+#cb.node.text)end;_b=#ab;return da,_b end
|
||||
function ba:render()_a.render(self)
|
||||
local da=ca(self.get("nodes"),self.get("expandedNodes"))local _b=self.get("height")local ab=self.get("selectedNode")
|
||||
local bb=self.get("expandedNodes")local cb=self.get("scrollOffset")
|
||||
for y=1,_b do local db=da[y+cb]
|
||||
if db then local _c=db.node
|
||||
local ac=db.level;local bc=string.rep(" ",ac)local cc=" "if
|
||||
_c.children and#_c.children>0 then cc=bb[_c]and"\31"or"\16"end
|
||||
local dc=
|
||||
_c==ab and self.get("selectedColor")or self.get("background")
|
||||
local _d=bc..cc.." ".. (_c.text or"Node")_d=aa(_d,1,self.get("width"))
|
||||
self:textFg(1,y,_d..string.rep(" ",
|
||||
self.get("width")-#_d),self.get("foreground"))else
|
||||
local db=self.get("horizontalOffset")
|
||||
for y=1,_b do local _c=da[y+cb]
|
||||
if _c then local ac=_c.node;local bc=_c.level
|
||||
local cc=string.rep(" ",bc)local dc=" "if ac.children and#ac.children>0 then
|
||||
dc=bb[ac]and"\31"or"\16"end
|
||||
local _d=
|
||||
ac==ab and self.get("selectedColor")or self.get("background")
|
||||
local ad=cc..dc.." ".. (ac.text or"Node")local bd=aa(ad,db+1,db+self.get("width"))
|
||||
self:textFg(1,y,
|
||||
bd..string.rep(" ",self.get("width")-#bd),self.get("foreground"))else
|
||||
self:textFg(1,y,string.rep(" ",self.get("width")),self.get("foreground"),self.get("background"))end end end;return ba end
|
||||
project["elements/TextBox.lua"] = function(...) local ca=require("elements/VisualElement")
|
||||
local da=require("libraries/colorHex")local _b=setmetatable({},ca)_b.__index=_b
|
||||
@@ -1422,7 +1535,8 @@ _b.defineProperty(_b,"cursorY",{default=1,type="number"})
|
||||
_b.defineProperty(_b,"scrollX",{default=0,type="number",canTriggerRender=true})
|
||||
_b.defineProperty(_b,"scrollY",{default=0,type="number",canTriggerRender=true})
|
||||
_b.defineProperty(_b,"editable",{default=true,type="boolean"})
|
||||
_b.defineProperty(_b,"syntaxPatterns",{default={},type="table"})_b.listenTo(_b,"mouse_click")_b.listenTo(_b,"key")
|
||||
_b.defineProperty(_b,"syntaxPatterns",{default={},type="table"})
|
||||
_b.defineProperty(_b,"cursorColor",{default=nil,type="number"})_b.listenTo(_b,"mouse_click")_b.listenTo(_b,"key")
|
||||
_b.listenTo(_b,"char")_b.listenTo(_b,"mouse_scroll")
|
||||
function _b.new()
|
||||
local _c=setmetatable({},_b):__init()_c.set("width",20)_c.set("height",10)return _c end;function _b:init(_c,ac)ca.init(self,_c,ac)self.set("type","TextBox")
|
||||
@@ -1464,18 +1578,21 @@ self.set("cursorX",math.min(bc,
|
||||
#ac[cc-1]+1))elseif _c==keys.down and cc<#ac then self.set("cursorY",cc+1)
|
||||
self.set("cursorX",math.min(bc,
|
||||
#ac[cc+1]+1))end;self:updateRender()self:updateViewport()return true end
|
||||
function _b:mouse_scroll(_c,ac,bc)if self:isInBounds(ac,bc)then local cc=self.get("scrollY")self.set("scrollY",math.max(0,
|
||||
function _b:mouse_scroll(_c,ac,bc)
|
||||
if self:isInBounds(ac,bc)then local cc=self.get("scrollY")
|
||||
local dc=self.get("height")local _d=self.get("lines")local ad=math.max(0,#_d-dc+2)local bd=math.max(0,math.min(ad,
|
||||
cc+_c))
|
||||
self:updateRender()return true end;return
|
||||
false end
|
||||
self.set("scrollY",bd)self:updateRender()return true end;return false end
|
||||
function _b:mouse_click(_c,ac,bc)
|
||||
if ca.mouse_click(self,_c,ac,bc)then
|
||||
local cc,dc=self:getRelativePosition(ac,bc)local _d=self.get("scrollX")local ad=self.get("scrollY")
|
||||
local bd=dc+ad;local cd=self.get("lines")if bd<=#cd then self.set("cursorY",bd)
|
||||
self.set("cursorX",math.min(
|
||||
cc+_d,#cd[bd]+1))end;return true end;return false end
|
||||
function _b:setText(_c)self.set("lines",{""})for ac in _c:gmatch("[^\n]+")do
|
||||
table.insert(self.get("lines"),ac)end;return self end
|
||||
cc+_d,#cd[bd]+1))end;self:updateRender()return
|
||||
true end;return false end
|
||||
function _b:setText(_c)local ac={}
|
||||
if _c==""then ac={""}else for bc in(_c.."\n"):gmatch("([^\n]*)\n")do
|
||||
table.insert(ac,bc)end end;self.set("lines",ac)return self end
|
||||
function _b:getText()return table.concat(self.get("lines"),"\n")end
|
||||
local function db(_c,ac)local bc=ac
|
||||
local cc=string.rep(da[_c.get("foreground")],#bc)local dc=_c.get("syntaxPatterns")
|
||||
@@ -1492,9 +1609,9 @@ for y=1,dc do local bd=y+bc;local cd=_c[bd]or""local dd=cd:sub(ac+1,ac+cc)if#dd<
|
||||
cc-#dd)end
|
||||
local __a,a_a=db(self,dd)self:blit(1,y,__a,a_a,string.rep(ad,#dd))end
|
||||
if self.get("focused")then local bd=self.get("cursorX")-ac;local cd=
|
||||
self.get("cursorY")-bc
|
||||
if
|
||||
bd>=1 and bd<=cc and cd>=1 and cd<=dc then self:setCursor(bd,cd,true)end end end;return _b end
|
||||
self.get("cursorY")-bc;if
|
||||
bd>=1 and bd<=cc and cd>=1 and cd<=dc then
|
||||
self:setCursor(bd,cd,true,self.get("cursorColor")or self.get("foreground"))end end end;return _b end
|
||||
project["elements/Dropdown.lua"] = function(...) local _a=require("elements/VisualElement")
|
||||
local aa=require("elements/List")local ba=require("libraries/colorHex")
|
||||
local ca=setmetatable({},aa)ca.__index=ca
|
||||
@@ -1544,98 +1661,106 @@ self.get("background"))
|
||||
local dc=bc and(_c.selectedForeground or colors.white)or(_c.foreground or
|
||||
self.get("foreground"))self:textBg(1,i,string.rep(" ",cb),cc)
|
||||
self:textFg(1,i,ac,dc)end end end end end;return ca end
|
||||
project["render.lua"] = function(...) local c=require("libraries/colorHex")local d={}d.__index=d
|
||||
function d.new(_a)
|
||||
local aa=setmetatable({},d)aa.terminal=_a;aa.width,aa.height=_a.getSize()
|
||||
aa.buffer={text={},fg={},bg={},dirtyRects={}}
|
||||
for y=1,aa.height do aa.buffer.text[y]=string.rep(" ",aa.width)
|
||||
aa.buffer.fg[y]=string.rep("0",aa.width)aa.buffer.bg[y]=string.rep("f",aa.width)end;return aa end;function d:addDirtyRect(_a,aa,ba,ca)
|
||||
table.insert(self.buffer.dirtyRects,{x=_a,y=aa,width=ba,height=ca})return self end
|
||||
function d:blit(_a,aa,ba,ca,da)if aa<1 or aa>
|
||||
self.height then return self end
|
||||
if
|
||||
(#ba~=#ca or#ba~=#da)then error("Text, fg, and bg must be the same length")end
|
||||
self.buffer.text[aa]=
|
||||
self.buffer.text[aa]:sub(1,_a-1)..
|
||||
ba..self.buffer.text[aa]:sub(_a+#ba)
|
||||
self.buffer.fg[aa]=
|
||||
self.buffer.fg[aa]:sub(1,_a-1)..ca..self.buffer.fg[aa]:sub(_a+#ca)
|
||||
self.buffer.bg[aa]=
|
||||
self.buffer.bg[aa]:sub(1,_a-1)..da..self.buffer.bg[aa]:sub(_a+#da)self:addDirtyRect(_a,aa,#ba,1)return self end
|
||||
function d:multiBlit(_a,aa,ba,ca,da,_b,ab)if aa<1 or aa>self.height then return self end;if(
|
||||
#da~=#_b or#da~=#ab)then
|
||||
error("Text, fg, and bg must be the same length")end;da=da:rep(ba)
|
||||
_b=_b:rep(ba)ab=ab:rep(ba)
|
||||
for dy=0,ca-1 do local bb=aa+dy
|
||||
if bb>=1 and bb<=self.height then
|
||||
self.buffer.text[bb]=self.buffer.text[bb]:sub(1,
|
||||
_a-1)..da..
|
||||
self.buffer.text[bb]:sub(_a+#da)
|
||||
self.buffer.fg[bb]=
|
||||
self.buffer.fg[bb]:sub(1,_a-1).._b..self.buffer.fg[bb]:sub(_a+#_b)
|
||||
self.buffer.bg[bb]=
|
||||
self.buffer.bg[bb]:sub(1,_a-1)..ab..self.buffer.bg[bb]:sub(_a+#ab)end end;self:addDirtyRect(_a,aa,ba,ca)return self end
|
||||
function d:textFg(_a,aa,ba,ca)if aa<1 or aa>self.height then return self end
|
||||
ca=c[ca]or"0"
|
||||
self.buffer.text[aa]=
|
||||
self.buffer.text[aa]:sub(1,_a-1)..
|
||||
ba..self.buffer.text[aa]:sub(_a+#ba)
|
||||
self.buffer.fg[aa]=
|
||||
self.buffer.fg[aa]:sub(1,_a-1)..
|
||||
ca:rep(#ba)..self.buffer.fg[aa]:sub(_a+#ba)self:addDirtyRect(_a,aa,#ba,1)return self end
|
||||
function d:textBg(_a,aa,ba,ca)if aa<1 or aa>self.height then return self end
|
||||
ca=c[ca]or"f"
|
||||
self.buffer.text[aa]=
|
||||
self.buffer.text[aa]:sub(1,_a-1)..
|
||||
ba..self.buffer.text[aa]:sub(_a+#ba)
|
||||
self.buffer.bg[aa]=
|
||||
self.buffer.bg[aa]:sub(1,_a-1)..
|
||||
ca:rep(#ba)..self.buffer.bg[aa]:sub(_a+#ba)self:addDirtyRect(_a,aa,#ba,1)return self end
|
||||
function d:text(_a,aa,ba)if aa<1 or aa>self.height then return self end
|
||||
self.buffer.text[aa]=self.buffer.text[aa]:sub(1,
|
||||
_a-1)..ba..
|
||||
self.buffer.text[aa]:sub(_a+#ba)self:addDirtyRect(_a,aa,#ba,1)return self end
|
||||
function d:fg(_a,aa,ba)if aa<1 or aa>self.height then return self end
|
||||
self.buffer.fg[aa]=self.buffer.fg[aa]:sub(1,
|
||||
_a-1)..ba..
|
||||
self.buffer.fg[aa]:sub(_a+#ba)self:addDirtyRect(_a,aa,#ba,1)return self end
|
||||
function d:bg(_a,aa,ba)if aa<1 or aa>self.height then return self end
|
||||
self.buffer.bg[aa]=self.buffer.bg[aa]:sub(1,
|
||||
_a-1)..ba..
|
||||
self.buffer.bg[aa]:sub(_a+#ba)self:addDirtyRect(_a,aa,#ba,1)return self end
|
||||
function d:clear(_a)local aa=c[_a]or"f"
|
||||
project["render.lua"] = function(...) local _a=require("libraries/colorHex")local aa=require("log")
|
||||
local ba={}ba.__index=ba;local ca=string.sub
|
||||
function ba.new(da)local _b=setmetatable({},ba)
|
||||
_b.terminal=da;_b.width,_b.height=da.getSize()
|
||||
_b.buffer={text={},fg={},bg={},dirtyRects={}}
|
||||
for y=1,_b.height do _b.buffer.text[y]=string.rep(" ",_b.width)
|
||||
_b.buffer.fg[y]=string.rep("0",_b.width)_b.buffer.bg[y]=string.rep("f",_b.width)end;return _b end;function ba:addDirtyRect(da,_b,ab,bb)
|
||||
table.insert(self.buffer.dirtyRects,{x=da,y=_b,width=ab,height=bb})return self end
|
||||
function ba:blit(da,_b,ab,bb,cb)if
|
||||
_b<1 or _b>self.height then return self end;if(#ab~=#bb or
|
||||
#ab~=#cb)then
|
||||
error("Text, fg, and bg must be the same length")end
|
||||
self.buffer.text[_b]=ca(self.buffer.text[_b]:sub(1,
|
||||
da-1)..ab..
|
||||
self.buffer.text[_b]:sub(da+#ab),1,self.width)
|
||||
self.buffer.fg[_b]=ca(
|
||||
self.buffer.fg[_b]:sub(1,da-1)..bb..self.buffer.fg[_b]:sub(da+#bb),1,self.width)
|
||||
self.buffer.bg[_b]=ca(
|
||||
self.buffer.bg[_b]:sub(1,da-1)..cb..self.buffer.bg[_b]:sub(da+#cb),1,self.width)self:addDirtyRect(da,_b,#ab,1)return self end
|
||||
function ba:multiBlit(da,_b,ab,bb,cb,db,_c)if _b<1 or _b>self.height then return self end;if(
|
||||
#cb~=#db or#cb~=#_c)then
|
||||
error("Text, fg, and bg must be the same length")end;cb=cb:rep(ab)
|
||||
db=db:rep(ab)_c=_c:rep(ab)
|
||||
for dy=0,bb-1 do local ac=_b+dy
|
||||
if ac>=1 and ac<=self.height then
|
||||
self.buffer.text[ac]=ca(self.buffer.text[ac]:sub(1,
|
||||
da-1)..cb..
|
||||
self.buffer.text[ac]:sub(da+#cb),1,self.width)
|
||||
self.buffer.fg[ac]=ca(
|
||||
self.buffer.fg[ac]:sub(1,da-1)..db..self.buffer.fg[ac]:sub(da+#db),1,self.width)
|
||||
self.buffer.bg[ac]=ca(
|
||||
self.buffer.bg[ac]:sub(1,da-1).._c..self.buffer.bg[ac]:sub(da+#_c),1,self.width)end end;self:addDirtyRect(da,_b,ab,bb)return self end
|
||||
function ba:textFg(da,_b,ab,bb)if _b<1 or _b>self.height then return self end
|
||||
bb=_a[bb]or"0"bb=bb:rep(#ab)
|
||||
self.buffer.text[_b]=ca(self.buffer.text[_b]:sub(1,
|
||||
da-1)..ab..
|
||||
self.buffer.text[_b]:sub(da+#ab),1,self.width)
|
||||
self.buffer.fg[_b]=ca(
|
||||
self.buffer.fg[_b]:sub(1,da-1)..bb..self.buffer.fg[_b]:sub(da+#bb),1,self.width)self:addDirtyRect(da,_b,#ab,1)return self end
|
||||
function ba:textBg(da,_b,ab,bb)if _b<1 or _b>self.height then return self end
|
||||
bb=_a[bb]or"f"
|
||||
self.buffer.text[_b]=ca(
|
||||
self.buffer.text[_b]:sub(1,da-1)..
|
||||
ab..self.buffer.text[_b]:sub(da+#ab),1,self.width)
|
||||
self.buffer.bg[_b]=ca(
|
||||
self.buffer.bg[_b]:sub(1,da-1)..
|
||||
bb:rep(#ab)..self.buffer.bg[_b]:sub(da+#ab),1,self.width)self:addDirtyRect(da,_b,#ab,1)return self end
|
||||
function ba:text(da,_b,ab)if _b<1 or _b>self.height then return self end
|
||||
self.buffer.text[_b]=ca(self.buffer.text[_b]:sub(1,
|
||||
da-1)..ab..
|
||||
self.buffer.text[_b]:sub(da+#ab),1,self.width)self:addDirtyRect(da,_b,#ab,1)return self end
|
||||
function ba:fg(da,_b,ab)if _b<1 or _b>self.height then return self end
|
||||
self.buffer.fg[_b]=ca(self.buffer.fg[_b]:sub(1,
|
||||
da-1)..ab..
|
||||
self.buffer.fg[_b]:sub(da+#ab),1,self.width)self:addDirtyRect(da,_b,#ab,1)return self end
|
||||
function ba:bg(da,_b,ab)if _b<1 or _b>self.height then return self end
|
||||
self.buffer.bg[_b]=ca(self.buffer.bg[_b]:sub(1,
|
||||
da-1)..ab..
|
||||
self.buffer.bg[_b]:sub(da+#ab),1,self.width)self:addDirtyRect(da,_b,#ab,1)return self end
|
||||
function ba:clear(da)local _b=_a[da]or"f"
|
||||
for y=1,self.height do
|
||||
self.buffer.text[y]=string.rep(" ",self.width)self.buffer.fg[y]=string.rep("0",self.width)
|
||||
self.buffer.bg[y]=string.rep(aa,self.width)self:addDirtyRect(1,y,self.width,1)end;return self end
|
||||
function d:render()local _a={}
|
||||
for aa,ba in ipairs(self.buffer.dirtyRects)do local ca=false;for da,_b in ipairs(_a)do
|
||||
self.buffer.bg[y]=string.rep(_b,self.width)self:addDirtyRect(1,y,self.width,1)end;return self end
|
||||
function ba:render()local da={}
|
||||
for _b,ab in ipairs(self.buffer.dirtyRects)do local bb=false;for cb,db in ipairs(da)do
|
||||
if
|
||||
self:rectOverlaps(ba,_b)then self:mergeRects(_b,ba)ca=true;break end end;if not ca then
|
||||
table.insert(_a,ba)end end
|
||||
for aa,ba in ipairs(_a)do
|
||||
for y=ba.y,ba.y+ba.height-1 do
|
||||
self:rectOverlaps(ab,db)then self:mergeRects(db,ab)bb=true;break end end;if not bb then
|
||||
table.insert(da,ab)end end
|
||||
for _b,ab in ipairs(da)do
|
||||
for y=ab.y,ab.y+ab.height-1 do
|
||||
if y>=1 and y<=self.height then
|
||||
self.terminal.setCursorPos(ba.x,y)
|
||||
self.terminal.blit(self.buffer.text[y]:sub(ba.x,ba.x+ba.width-1),self.buffer.fg[y]:sub(ba.x,
|
||||
ba.x+ba.width-1),self.buffer.bg[y]:sub(ba.x,
|
||||
ba.x+ba.width-1))end end end;self.buffer.dirtyRects={}if self.blink then
|
||||
self.terminal.setCursorPos(ab.x,y)
|
||||
self.terminal.blit(self.buffer.text[y]:sub(ab.x,ab.x+ab.width-1),self.buffer.fg[y]:sub(ab.x,
|
||||
ab.x+ab.width-1),self.buffer.bg[y]:sub(ab.x,
|
||||
ab.x+ab.width-1))end end end;self.buffer.dirtyRects={}
|
||||
if self.blink then
|
||||
self.terminal.setTextColor(self.cursorColor)
|
||||
self.terminal.setCursorPos(self.xCursor,self.yCursor)self.terminal.setCursorBlink(true)else
|
||||
self.terminal.setCursorBlink(false)end;return
|
||||
self end
|
||||
function d:rectOverlaps(_a,aa)return
|
||||
self.terminal.setCursorBlink(false)end;return self end
|
||||
function ba:rectOverlaps(da,_b)return
|
||||
not(
|
||||
_a.x+_a.width<=aa.x or aa.x+aa.width<=_a.x or _a.y+_a.height<=aa.y or
|
||||
aa.y+aa.height<=_a.y)end
|
||||
function d:mergeRects(_a,aa)local ba=math.min(_a.x,aa.x)
|
||||
local ca=math.min(_a.y,aa.y)
|
||||
local da=math.max(_a.x+_a.width,aa.x+aa.width)
|
||||
local _b=math.max(_a.y+_a.height,aa.y+aa.height)_a.x=ba;_a.y=ca;_a.width=da-ba;_a.height=_b-ca end
|
||||
function d:setCursor(_a,aa,ba)self.terminal.setCursorPos(_a,aa)
|
||||
self.terminal.setCursorBlink(ba)self.xCursor=_a;self.yCursor=aa;self.blink=ba;return self end
|
||||
function d:clearArea(_a,aa,ba,ca,da)local _b=c[da]or"f"
|
||||
for dy=0,ca-1 do local ab=aa+dy
|
||||
if ab>=1 and ab<=self.height then
|
||||
local bb=string.rep(" ",ba)local cb=string.rep(_b,ba)self:blit(_a,ab,bb,"0",_b)end end;return self end;function d:getSize()return self.width,self.height end;return d end
|
||||
da.x+da.width<=_b.x or _b.x+_b.width<=da.x or da.y+da.height<=_b.y or
|
||||
_b.y+_b.height<=da.y)end
|
||||
function ba:mergeRects(da,_b)local ab=math.min(da.x,_b.x)
|
||||
local bb=math.min(da.y,_b.y)
|
||||
local cb=math.max(da.x+da.width,_b.x+_b.width)
|
||||
local db=math.max(da.y+da.height,_b.y+_b.height)da.x=ab;da.y=bb;da.width=cb-ab;da.height=db-bb end
|
||||
function ba:setCursor(da,_b,ab,bb)
|
||||
if bb~=nil then self.terminal.setTextColor(bb)end;self.terminal.setCursorPos(da,_b)
|
||||
self.terminal.setCursorBlink(ab)self.xCursor=da;self.yCursor=_b;self.blink=ab;self.cursorColor=bb
|
||||
return self end
|
||||
function ba:clearArea(da,_b,ab,bb,cb)local db=_a[cb]or"f"
|
||||
for dy=0,bb-1 do local _c=_b+dy;if
|
||||
_c>=1 and _c<=self.height then local ac=string.rep(" ",ab)local bc=string.rep(db,ab)
|
||||
self:blit(da,_c,ac,"0",db)end end;return self end;function ba:getSize()return self.width,self.height end
|
||||
function ba:setSize(da,_b)
|
||||
self.width=da;self.height=_b
|
||||
for y=1,self.height do
|
||||
self.buffer.text[y]=string.rep(" ",self.width)self.buffer.fg[y]=string.rep("0",self.width)
|
||||
self.buffer.bg[y]=string.rep("f",self.width)end;return self end;return ba 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}
|
||||
|
||||
301
src/LuaLS.lua
301
src/LuaLS.lua
@@ -365,6 +365,14 @@ function Container:addProgressBar()
|
||||
return self
|
||||
end
|
||||
|
||||
--- Adds a new Scrollbar to the container
|
||||
---@generic Element: Container
|
||||
---@param self Element
|
||||
---@return Scrollbar
|
||||
function Container:addScrollbar()
|
||||
return self
|
||||
end
|
||||
|
||||
--- Adds a new Slider to the container
|
||||
---@generic Element: Container
|
||||
---@param self Element
|
||||
@@ -506,6 +514,7 @@ end
|
||||
---@field placeholder string
|
||||
---@field placeholderColor color
|
||||
---@field focusedColor color
|
||||
---@field cursorColor number
|
||||
local Input = {}
|
||||
|
||||
--- Gets the The current text content of the input
|
||||
@@ -616,6 +625,24 @@ function Input:setFocusedColor(focusedColor)
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Color of the cursor
|
||||
---@generic Element: Input
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Input:getCursorColor()
|
||||
return self.cursorColor
|
||||
end
|
||||
|
||||
--- Sets the Color of the cursor
|
||||
---@generic Element: Input
|
||||
---@param self Element
|
||||
---@param cursorColor number
|
||||
---@return Element
|
||||
function Input:setCursorColor(cursorColor)
|
||||
self.cursorColor = cursorColor
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
---@class Label
|
||||
---@field text string
|
||||
@@ -832,6 +859,219 @@ function ProgressBar:setProgressColor(progressColor)
|
||||
end
|
||||
|
||||
|
||||
---@class Scrollbar
|
||||
---@field value number
|
||||
---@field min number
|
||||
---@field max number
|
||||
---@field step number
|
||||
---@field dragMultiplier number
|
||||
---@field symbol string
|
||||
---@field backgroundSymbol string
|
||||
---@field symbolBackgroundColor color
|
||||
---@field backgroundSymbol string
|
||||
---@field orientation string
|
||||
---@field handleSize number
|
||||
local Scrollbar = {}
|
||||
|
||||
--- Gets the Current scroll value
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Scrollbar:getValue()
|
||||
return self.value
|
||||
end
|
||||
|
||||
--- Sets the Current scroll value
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param value number
|
||||
---@return Element
|
||||
function Scrollbar:setValue(value)
|
||||
self.value = value
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Minimum scroll value
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Scrollbar:getMin()
|
||||
return self.min
|
||||
end
|
||||
|
||||
--- Sets the Minimum scroll value
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param min number
|
||||
---@return Element
|
||||
function Scrollbar:setMin(min)
|
||||
self.min = min
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Maximum scroll value
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Scrollbar:getMax()
|
||||
return self.max
|
||||
end
|
||||
|
||||
--- Sets the Maximum scroll value
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param max number
|
||||
---@return Element
|
||||
function Scrollbar:setMax(max)
|
||||
self.max = max
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Step size for scroll operations
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Scrollbar:getStep()
|
||||
return self.step
|
||||
end
|
||||
|
||||
--- Sets the Step size for scroll operations
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param step number
|
||||
---@return Element
|
||||
function Scrollbar:setStep(step)
|
||||
self.step = step
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the How fast the scrollbar moves when dragging
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Scrollbar:getDragMultiplier()
|
||||
return self.dragMultiplier
|
||||
end
|
||||
|
||||
--- Sets the How fast the scrollbar moves when dragging
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param dragMultiplier number
|
||||
---@return Element
|
||||
function Scrollbar:setDragMultiplier(dragMultiplier)
|
||||
self.dragMultiplier = dragMultiplier
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the " Symbol used for the scrollbar handle
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return string
|
||||
function Scrollbar:getSymbol()
|
||||
return self.symbol
|
||||
end
|
||||
|
||||
--- Sets the " Symbol used for the scrollbar handle
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param symbol string
|
||||
---@return Element
|
||||
function Scrollbar:setSymbol(symbol)
|
||||
self.symbol = symbol
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Symbol used for the scrollbar background
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return string
|
||||
function Scrollbar:getBackgroundSymbol()
|
||||
return self.backgroundSymbol
|
||||
end
|
||||
|
||||
--- Sets the Symbol used for the scrollbar background
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param backgroundSymbol string
|
||||
---@return Element
|
||||
function Scrollbar:setBackgroundSymbol(backgroundSymbol)
|
||||
self.backgroundSymbol = backgroundSymbol
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Background color of the scrollbar handle
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return color
|
||||
function Scrollbar:getSymbolBackgroundColor()
|
||||
return self.symbolBackgroundColor
|
||||
end
|
||||
|
||||
--- Sets the Background color of the scrollbar handle
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param symbolBackgroundColor color
|
||||
---@return Element
|
||||
function Scrollbar:setSymbolBackgroundColor(symbolBackgroundColor)
|
||||
self.symbolBackgroundColor = symbolBackgroundColor
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Symbol used for the scrollbar background
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return string
|
||||
function Scrollbar:getBackgroundSymbol()
|
||||
return self.backgroundSymbol
|
||||
end
|
||||
|
||||
--- Sets the Symbol used for the scrollbar background
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param backgroundSymbol string
|
||||
---@return Element
|
||||
function Scrollbar:setBackgroundSymbol(backgroundSymbol)
|
||||
self.backgroundSymbol = backgroundSymbol
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Orientation of the scrollbar ("vertical" or "horizontal")
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return string
|
||||
function Scrollbar:getOrientation()
|
||||
return self.orientation
|
||||
end
|
||||
|
||||
--- Sets the Orientation of the scrollbar ("vertical" or "horizontal")
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param orientation string
|
||||
---@return Element
|
||||
function Scrollbar:setOrientation(orientation)
|
||||
self.orientation = orientation
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Size of the scrollbar handle in characters
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Scrollbar:getHandleSize()
|
||||
return self.handleSize
|
||||
end
|
||||
|
||||
--- Sets the Size of the scrollbar handle in characters
|
||||
---@generic Element: Scrollbar
|
||||
---@param self Element
|
||||
---@param handleSize number
|
||||
---@return Element
|
||||
function Scrollbar:setHandleSize(handleSize)
|
||||
self.handleSize = handleSize
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
---@class Slider
|
||||
---@field step number
|
||||
---@field max number
|
||||
@@ -1085,6 +1325,7 @@ end
|
||||
---@field scrollY number
|
||||
---@field editable boolean
|
||||
---@field syntaxPatterns table
|
||||
---@field cursorColor number
|
||||
local TextBox = {}
|
||||
|
||||
--- Gets the Array of text lines
|
||||
@@ -1213,11 +1454,30 @@ function TextBox:setSyntaxPatterns(syntaxPatterns)
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Color of the cursor
|
||||
---@generic Element: TextBox
|
||||
---@param self Element
|
||||
---@return number
|
||||
function TextBox:getCursorColor()
|
||||
return self.cursorColor
|
||||
end
|
||||
|
||||
--- Sets the Color of the cursor
|
||||
---@generic Element: TextBox
|
||||
---@param self Element
|
||||
---@param cursorColor number
|
||||
---@return Element
|
||||
function TextBox:setCursorColor(cursorColor)
|
||||
self.cursorColor = cursorColor
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
---@class Tree
|
||||
---@field nodes table
|
||||
---@field expandedNodes table
|
||||
---@field scrollOffset number
|
||||
---@field horizontalOffset number
|
||||
---@field nodeColor color
|
||||
---@field selectedColor color
|
||||
local Tree = {}
|
||||
@@ -1258,7 +1518,7 @@ function Tree:setExpandedNodes(expandedNodes)
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Current scroll position
|
||||
--- Gets the Current vertical scroll position
|
||||
---@generic Element: Tree
|
||||
---@param self Element
|
||||
---@return number
|
||||
@@ -1266,7 +1526,7 @@ function Tree:getScrollOffset()
|
||||
return self.scrollOffset
|
||||
end
|
||||
|
||||
--- Sets the Current scroll position
|
||||
--- Sets the Current vertical scroll position
|
||||
---@generic Element: Tree
|
||||
---@param self Element
|
||||
---@param scrollOffset number
|
||||
@@ -1276,6 +1536,24 @@ function Tree:setScrollOffset(scrollOffset)
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Current horizontal scroll position
|
||||
---@generic Element: Tree
|
||||
---@param self Element
|
||||
---@return number
|
||||
function Tree:getHorizontalOffset()
|
||||
return self.horizontalOffset
|
||||
end
|
||||
|
||||
--- Sets the Current horizontal scroll position
|
||||
---@generic Element: Tree
|
||||
---@param self Element
|
||||
---@param horizontalOffset number
|
||||
---@return Element
|
||||
function Tree:setHorizontalOffset(horizontalOffset)
|
||||
self.horizontalOffset = horizontalOffset
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Color of unselected nodes
|
||||
---@generic Element: Tree
|
||||
---@param self Element
|
||||
@@ -1322,6 +1600,7 @@ end
|
||||
---@field background color
|
||||
---@field foreground color
|
||||
---@field clicked boolean
|
||||
---@field hover boolean
|
||||
---@field backgroundEnabled boolean
|
||||
---@field focused boolean
|
||||
---@field visible boolean
|
||||
@@ -1471,6 +1750,24 @@ function VisualElement:setClicked(clicked)
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Whether the mouse is currently hover over the element (Craftos-PC only)
|
||||
---@generic Element: VisualElement
|
||||
---@param self Element
|
||||
---@return boolean
|
||||
function VisualElement:getHover()
|
||||
return self.hover
|
||||
end
|
||||
|
||||
--- Sets the Whether the mouse is currently hover over the element (Craftos-PC only)
|
||||
---@generic Element: VisualElement
|
||||
---@param self Element
|
||||
---@param hover boolean
|
||||
---@return Element
|
||||
function VisualElement:setHover(hover)
|
||||
self.hover = hover
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the Whether to render the background
|
||||
---@generic Element: VisualElement
|
||||
---@param self Element
|
||||
|
||||
Reference in New Issue
Block a user