This commit is contained in:
Robert Jelic
2025-10-29 17:55:31 +01:00
3 changed files with 5059 additions and 4828 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,62 +1,293 @@
return { return {
["metadata"] = {
["generated"] = "Wed Oct 29 08:11:08 2025",
["version"] = "2.0",
},
["categories"] = { ["categories"] = {
["core"] = { ["elements"] = {
["description"] = "Core Files", ["description"] = "UI Elements",
["files"] = { ["files"] = {
["elementManager"] = { ["Menu"] = {
["description"] = "", ["description"] = "A horizontal menu bar with selectable items.",
["size"] = 15411, ["size"] = 4679,
["path"] = "elementManager.lua", ["path"] = "elements/Menu.lua",
["default"] = true,
["requires"] = {
[1] = "List",
},
},
["Frame"] = {
["description"] = "A frame element that serves as a grouping container for other elements.",
["size"] = 6508,
["path"] = "elements/Frame.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["ScrollBar"] = {
["description"] = "A ScrollBar element that can be attached to other elements to control their scroll properties.",
["size"] = 9665,
["path"] = "elements/ScrollBar.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["VisualElement"] = {
["description"] = "The Visual Element class which is the base class for all visual UI elements",
["size"] = 43413,
["path"] = "elements/VisualElement.lua",
["default"] = true,
["requires"] = {
[1] = "BaseElement",
},
},
["TabControl"] = {
["description"] = "A TabControl element that provides tabbed interface with multiple content areas.",
["size"] = 18961,
["path"] = "elements/TabControl.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["BaseElement"] = {
["description"] = "The base class for all UI elements in Basalt.",
["size"] = 13859,
["path"] = "elements/BaseElement.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
}, },
["propertySystem"] = { ["Table"] = {
["description"] = "", ["description"] = "",
["size"] = 18186, ["size"] = 16214,
["path"] = "propertySystem.lua", ["path"] = "elements/Table.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["ComboBox"] = {
["description"] = "A ComboBox that combines dropdown selection with editable text input",
["size"] = 13718,
["path"] = "elements/ComboBox.lua",
["default"] = false,
["requires"] = {
[1] = "DropDown",
},
},
["Label"] = {
["description"] = "A simple text display element that automatically resizes its width based on the text content.",
["size"] = 3092,
["path"] = "elements/Label.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["LineChart"] = {
["description"] = "",
["size"] = 3227,
["path"] = "elements/LineChart.lua",
["default"] = false,
["requires"] = {
},
},
["Tree"] = {
["description"] = "",
["size"] = 8519,
["path"] = "elements/Tree.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Input"] = {
["description"] = "A text input field with various features",
["size"] = 9200,
["path"] = "elements/Input.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Program"] = {
["description"] = "",
["size"] = 11435,
["path"] = "elements/Program.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["SideNav"] = {
["description"] = "A SideNav element that provides sidebar navigation with multiple content areas.",
["size"] = 20221,
["path"] = "elements/SideNav.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["DropDown"] = {
["description"] = "A DropDown menu that shows a list of selectable items",
["size"] = 8123,
["path"] = "elements/DropDown.lua",
["default"] = false,
["requires"] = {
[1] = "List",
},
},
["ProgressBar"] = {
["description"] = "",
["size"] = 3397,
["path"] = "elements/ProgressBar.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Display"] = {
["description"] = "The Display is a special element which uses the CC Window API which you can use.",
["size"] = 5071,
["path"] = "elements/Display.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["List"] = {
["description"] = "A scrollable list of selectable items",
["size"] = 15095,
["path"] = "elements/List.lua",
["default"] = true,
["requires"] = {
[1] = "Collection",
},
},
["BarChart"] = {
["description"] = "",
["size"] = 3590,
["path"] = "elements/BarChart.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
}, },
["init"] = { ["BigFont"] = {
["description"] = "", ["description"] = "",
["size"] = 622, ["size"] = 21649,
["path"] = "init.lua", ["path"] = "elements/BigFont.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["Timer"] = {
["description"] = "",
["size"] = 2914,
["path"] = "elements/Timer.lua",
["default"] = true,
["requires"] = {
[1] = "BaseElement",
},
},
["BaseFrame"] = {
["description"] = "This is the base frame class. It is the root element of all elements and the only element without a parent.",
["size"] = 9017,
["path"] = "elements/BaseFrame.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["TextBox"] = {
["description"] = "A multi-line text editor component with cursor support and text manipulation features",
["size"] = 43530,
["path"] = "elements/TextBox.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["Switch"] = {
["description"] = "The Switch is a standard Switch element with click handling and state management.",
["size"] = 3269,
["path"] = "elements/Switch.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Slider"] = {
["description"] = "",
["size"] = 4977,
["path"] = "elements/Slider.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["CheckBox"] = {
["description"] = "This is a checkbox. It is a visual element that can be checked.",
["size"] = 3763,
["path"] = "elements/CheckBox.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
}, },
["errorManager"] = { ["Graph"] = {
["description"] = "", ["description"] = "A point based graph element",
["size"] = 3789, ["size"] = 6989,
["path"] = "errorManager.lua", ["path"] = "elements/Graph.lua",
["default"] = true, ["default"] = false,
["requires"] = { ["requires"] = {
}, },
}, },
["log"] = { ["Button"] = {
["description"] = "", ["description"] = "The Button is a standard button element with click handling and state management.",
["size"] = 3142, ["size"] = 2556,
["path"] = "log.lua", ["path"] = "elements/Button.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
}, },
}, },
["render"] = { ["Container"] = {
["description"] = "", ["description"] = "The container class. It is a visual element that can contain other elements. It is the base class for all containers",
["size"] = 12422, ["size"] = 26177,
["path"] = "render.lua", ["path"] = "elements/Container.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
}, },
}, },
["main"] = { ["Image"] = {
["description"] = "", ["description"] = "An element that displays an image in bimg format",
["size"] = 19883, ["size"] = 15125,
["path"] = "main.lua", ["path"] = "elements/Image.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["Collection"] = {
["description"] = "A collection of items",
["size"] = 7703,
["path"] = "elements/Collection.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
},
},
["FlexBox"] = {
["description"] = "A flexbox container that arranges its children in a flexible layout.",
["size"] = 32431,
["path"] = "elements/FlexBox.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
}, },
}, },
}, },
@@ -64,10 +295,10 @@ return {
["plugins"] = { ["plugins"] = {
["description"] = "Plugins", ["description"] = "Plugins",
["files"] = { ["files"] = {
["debug"] = { ["theme"] = {
["description"] = "", ["description"] = "",
["size"] = 6250, ["size"] = 6775,
["path"] = "plugins/debug.lua", ["path"] = "plugins/theme.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
@@ -88,6 +319,14 @@ return {
["requires"] = { ["requires"] = {
}, },
}, },
["animation"] = {
["description"] = "",
["size"] = 18421,
["path"] = "plugins/animation.lua",
["default"] = true,
["requires"] = {
},
},
["benchmark"] = { ["benchmark"] = {
["description"] = "", ["description"] = "",
["size"] = 12581, ["size"] = 12581,
@@ -97,25 +336,17 @@ return {
[1] = "VisualElement", [1] = "VisualElement",
}, },
}, },
["animation"] = { ["debug"] = {
["description"] = "", ["description"] = "",
["size"] = 18421, ["size"] = 6250,
["path"] = "plugins/animation.lua", ["path"] = "plugins/debug.lua",
["default"] = true,
["requires"] = {
},
},
["theme"] = {
["description"] = "",
["size"] = 6775,
["path"] = "plugins/theme.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
}, },
["xml"] = { ["xml"] = {
["description"] = "", ["description"] = "",
["size"] = 9940, ["size"] = 13484,
["path"] = "plugins/xml.lua", ["path"] = "plugins/xml.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
@@ -123,290 +354,63 @@ return {
}, },
}, },
}, },
["elements"] = { ["core"] = {
["description"] = "UI Elements", ["description"] = "Core Files",
["files"] = { ["files"] = {
["Timer"] = { ["render"] = {
["description"] = "", ["description"] = "",
["size"] = 2914, ["size"] = 12422,
["path"] = "elements/Timer.lua", ["path"] = "render.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "BaseElement",
}, },
}, },
["ComboBox"] = { ["elementManager"] = {
["description"] = "A ComboBox that combines dropdown selection with editable text input",
["size"] = 13718,
["path"] = "elements/ComboBox.lua",
["default"] = false,
["requires"] = {
[1] = "DropDown",
},
},
["LineChart"] = {
["description"] = "", ["description"] = "",
["size"] = 3227, ["size"] = 15411,
["path"] = "elements/LineChart.lua", ["path"] = "elementManager.lua",
["default"] = false, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
}, },
["TextBox"] = { ["errorManager"] = {
["description"] = "A multi-line text editor component with cursor support and text manipulation features",
["size"] = 43530,
["path"] = "elements/TextBox.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["ProgressBar"] = {
["description"] = "", ["description"] = "",
["size"] = 3397, ["size"] = 3789,
["path"] = "elements/ProgressBar.lua", ["path"] = "errorManager.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
}, },
}, },
["List"] = { ["log"] = {
["description"] = "A scrollable list of selectable items",
["size"] = 6039,
["path"] = "elements/List.lua",
["default"] = true,
["requires"] = {
[1] = "Collection",
},
},
["Display"] = {
["description"] = "The Display is a special element which uses the CC Window API which you can use.",
["size"] = 5071,
["path"] = "elements/Display.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["Button"] = {
["description"] = "The Button is a standard button element with click handling and state management.",
["size"] = 2556,
["path"] = "elements/Button.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Menu"] = {
["description"] = "A horizontal menu bar with selectable items.",
["size"] = 4679,
["path"] = "elements/Menu.lua",
["default"] = true,
["requires"] = {
[1] = "List",
},
},
["Container"] = {
["description"] = "The container class. It is a visual element that can contain other elements. It is the base class for all containers",
["size"] = 26177,
["path"] = "elements/Container.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["SideNav"] = {
["description"] = "A SideNav element that provides sidebar navigation with multiple content areas.",
["size"] = 20221,
["path"] = "elements/SideNav.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["Switch"] = {
["description"] = "The Switch is a standard Switch element with click handling and state management.",
["size"] = 3269,
["path"] = "elements/Switch.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["VisualElement"] = {
["description"] = "The Visual Element class which is the base class for all visual UI elements",
["size"] = 43413,
["path"] = "elements/VisualElement.lua",
["default"] = true,
["requires"] = {
[1] = "BaseElement",
},
},
["BaseFrame"] = {
["description"] = "This is the base frame class. It is the root element of all elements and the only element without a parent.",
["size"] = 9017,
["path"] = "elements/BaseFrame.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["Frame"] = {
["description"] = "A frame element that serves as a grouping container for other elements.",
["size"] = 6508,
["path"] = "elements/Frame.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["TabControl"] = {
["description"] = "A TabControl element that provides tabbed interface with multiple content areas.",
["size"] = 18961,
["path"] = "elements/TabControl.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["BigFont"] = {
["description"] = "", ["description"] = "",
["size"] = 21649, ["size"] = 3142,
["path"] = "elements/BigFont.lua", ["path"] = "log.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["ScrollBar"] = {
["description"] = "A ScrollBar element that can be attached to other elements to control their scroll properties.",
["size"] = 9665,
["path"] = "elements/ScrollBar.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
}, },
}, },
["Input"] = { ["init"] = {
["description"] = "A text input field with various features",
["size"] = 9200,
["path"] = "elements/Input.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Label"] = {
["description"] = "A simple text display element that automatically resizes its width based on the text content.",
["size"] = 3092,
["path"] = "elements/Label.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Graph"] = {
["description"] = "A point based graph element",
["size"] = 6989,
["path"] = "elements/Graph.lua",
["default"] = false,
["requires"] = {
},
},
["Table"] = {
["description"] = "", ["description"] = "",
["size"] = 16214, ["size"] = 622,
["path"] = "elements/Table.lua", ["path"] = "init.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
}, },
}, },
["Collection"] = { ["main"] = {
["description"] = "A collection of items",
["size"] = 6008,
["path"] = "elements/Collection.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["Tree"] = {
["description"] = "", ["description"] = "",
["size"] = 8519, ["size"] = 19883,
["path"] = "elements/Tree.lua", ["path"] = "main.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
}, },
}, },
["Slider"] = { ["propertySystem"] = {
["description"] = "", ["description"] = "",
["size"] = 4977, ["size"] = 18186,
["path"] = "elements/Slider.lua", ["path"] = "propertySystem.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
[1] = "VisualElement",
},
},
["FlexBox"] = {
["description"] = "A flexbox container that arranges its children in a flexible layout.",
["size"] = 32431,
["path"] = "elements/FlexBox.lua",
["default"] = true,
["requires"] = {
[1] = "Container",
},
},
["BarChart"] = {
["description"] = "",
["size"] = 3590,
["path"] = "elements/BarChart.lua",
["default"] = true,
["requires"] = {
},
},
["Image"] = {
["description"] = "An element that displays an image in bimg format",
["size"] = 15125,
["path"] = "elements/Image.lua",
["default"] = false,
["requires"] = {
[1] = "VisualElement",
},
},
["Program"] = {
["description"] = "",
["size"] = 11435,
["path"] = "elements/Program.lua",
["default"] = true,
["requires"] = {
[1] = "VisualElement",
},
},
["CheckBox"] = {
["description"] = "This is a checkbox. It is a visual element that can be checked.",
["size"] = 3763,
["path"] = "elements/CheckBox.lua",
["default"] = true,
["requires"] = {
},
},
["BaseElement"] = {
["description"] = "The base class for all UI elements in Basalt.",
["size"] = 13859,
["path"] = "elements/BaseElement.lua",
["default"] = true,
["requires"] = {
},
},
["DropDown"] = {
["description"] = "A DropDown menu that shows a list of selectable items",
["size"] = 8100,
["path"] = "elements/DropDown.lua",
["default"] = false,
["requires"] = {
[1] = "List",
}, },
}, },
}, },
@@ -414,14 +418,6 @@ return {
["libraries"] = { ["libraries"] = {
["description"] = "Libraries", ["description"] = "Libraries",
["files"] = { ["files"] = {
["colorHex"] = {
["description"] = "",
["size"] = 132,
["path"] = "libraries/colorHex.lua",
["default"] = true,
["requires"] = {
},
},
["expect"] = { ["expect"] = {
["description"] = "", ["description"] = "",
["size"] = 846, ["size"] = 846,
@@ -430,10 +426,10 @@ return {
["requires"] = { ["requires"] = {
}, },
}, },
["utils"] = { ["colorHex"] = {
["description"] = "", ["description"] = "",
["size"] = 2661, ["size"] = 132,
["path"] = "libraries/utils.lua", ["path"] = "libraries/colorHex.lua",
["default"] = true, ["default"] = true,
["requires"] = { ["requires"] = {
}, },
@@ -446,11 +442,15 @@ return {
["requires"] = { ["requires"] = {
}, },
}, },
["utils"] = {
["description"] = "",
["size"] = 2661,
["path"] = "libraries/utils.lua",
["default"] = true,
["requires"] = {
},
},
}, },
}, },
}, },
["metadata"] = {
["generated"] = "Mon Oct 27 16:47:10 2025",
["version"] = "2.0",
},
} }

View File

@@ -1801,62 +1801,53 @@ self.get("width")-#a_a)
local c_a=ca[cd]:rep(#b_a)or ca[colors.black]:rep(#b_a) local c_a=ca[cd]:rep(#b_a)or ca[colors.black]:rep(#b_a)
local d_a=ca[dd]:rep(#b_a)or ca[colors.white]:rep(#b_a)self:blit(1,y,b_a,d_a,c_a)else local d_a=ca[dd]:rep(#b_a)or ca[colors.white]:rep(#b_a)self:blit(1,y,b_a,d_a,c_a)else
self:blit(1,y,string.rep(" ",self.get("width")),ca[self.get("foreground")]:rep(self.get("width")),ca[self.get("background")]:rep(self.get("width")))end end end;return da end self:blit(1,y,string.rep(" ",self.get("width")),ca[self.get("foreground")]:rep(self.get("width")),ca[self.get("background")]:rep(self.get("width")))end end end;return da end
project["elements/DropDown.lua"] = function(...) local aa=require("elements/VisualElement") project["elements/DropDown.lua"] = function(...) local _a=require("elements/VisualElement")
local ba=require("elements/List")local ca=require("elements/ScrollBar") local aa=require("elements/List")local ba=require("libraries/colorHex")
local da=require("libraries/colorHex")local _b=setmetatable({},ba)_b.__index=_b local ca=setmetatable({},aa)ca.__index=ca
_b.defineProperty(_b,"dropdownHeight",{default=5,type="number"}) ca.defineProperty(ca,"dropdownHeight",{default=5,type="number"})
_b.defineProperty(_b,"selectedText",{default="",type="string"}) ca.defineProperty(ca,"selectedText",{default="",type="string"})
_b.defineProperty(_b,"dropSymbol",{default="\31",type="string"})function _b.new()local ab=setmetatable({},_b):__init() ca.defineProperty(ca,"dropSymbol",{default="\31",type="string"})function ca.new()local da=setmetatable({},ca):__init()
ab.class=_b;ab.set("width",16)ab.set("height",1)ab.set("z",8) da.class=ca;da.set("width",16)da.set("height",1)da.set("z",8)
return ab end;function _b:init(ab,bb) return da end;function ca:init(da,_b)
ba.init(self,ab,bb)self.set("type","DropDown") aa.init(self,da,_b)self.set("type","DropDown")
self:registerState("opened",nil,200)return self end self:registerState("opened",nil,200)return self end
function _b:mouse_click(ab,bb,cb) function ca:mouse_click(da,_b,ab)
if if
not aa.mouse_click(self,ab,bb,cb)then return false end;local db,_c=self:getRelativePosition(bb,cb) not _a.mouse_click(self,da,_b,ab)then return false end;local bb,cb=self:getRelativePosition(_b,ab)
local ac=self:hasState("opened") local db=self:hasState("opened")
if _c==1 then if cb==1 then
if ac then self.set("height",1)self:unsetState("opened")else if db then self.set("height",1)self:unsetState("opened")else
self.set("height", self.set("height",
1 + 1 +
math.min(self.get("dropdownHeight"),#self.get("items")))self:setState("opened")end;return true elseif ac and _c>1 and self.get("selectable")then local bc=(_c-1)+ math.min(self.get("dropdownHeight"),#self.get("items")))self:setState("opened")end;return true elseif db and cb>1 then return aa.mouse_click(self,da,_b,ab-1)end;return false end
self.get("offset")local cc=self.get("items") function ca:mouse_drag(da,_b,ab)if self:hasState("opened")then
if bc<=#cc then return aa.mouse_drag(self,da,_b,ab-1)end;return
local dc=cc[bc]if type(dc)=="string"then dc={text=dc}cc[bc]=dc end _a.mouse_drag and _a.mouse_drag(self,da,_b,ab)or false end
if not function ca:mouse_up(da,_b,ab)
self.get("multiSelection")then for _d,ad in ipairs(cc)do if self:hasState("opened")then
if type(ad)=="table"then ad.selected=false end end end;dc.selected=not dc.selected local bb,cb=self:getRelativePosition(_b,ab)
if dc.callback then dc.callback(self)end;self:fireEvent("select",bc,dc)
self:unsetState("opened")self:unsetState("clicked")self.set("height",1)
self:updateRender()return true end end;return false end
function _b:render()aa.render(self)local ab=self.get("selectedText")
local bb=self:hasState("opened")local cb=self:getSelectedItems()
if#cb>0 then local db=cb[1]
ab=db.text or""ab=ab:sub(1,self.get("width")-2)end
self:blit(1,1,ab..
string.rep(" ",self.get("width")-#ab-1).. (bb and"\31"or"\17"),string.rep(da[self.getResolved("foreground")],self.get("width")),string.rep(da[self.getResolved("background")],self.get("width")))
if bb then local db=self.get("items")
local _c=self.get("height")-1;local ac=self.get("offset")local bc=self.get("width")
for i=1,_c do local cc=i+ac
local dc=db[cc]
if dc then if type(dc)=="string"then dc={text=dc}db[cc]=dc end
if if
dc.separator then local _d=(dc.text or"-"):sub(1,1) cb>1 and self.get("selectable")and not self._scrollBarDragging then local db=(cb-1)+self.get("offset")
local ad=string.rep(_d,bc) local _c=self.get("items")
local bd=dc.fg or self.getResolved("foreground") if db<=#_c then local ac=_c[db]
local cd=dc.bg or self.getResolved("background")self:textBg(1,i+1,string.rep(" ",bc),cd)self:textFg(1, if type(ac)=="string"then ac={text=ac}_c[db]=ac end
i+1,ad,bd)else local _d=dc.text;local ad=dc.selected if not self.get("multiSelection")then for bc,cc in ipairs(_c)do if type(cc)=="table"then
_d=_d:sub(1,bc) cc.selected=false end end end;ac.selected=not ac.selected
local bd=ad and if ac.callback then ac.callback(self)end;self:fireEvent("select",db,ac)
(dc.selectedBg or self.getResolved("selectedBackground"))or self:unsetState("opened")self:unsetState("clicked")self.set("height",1)
(dc.bg or self.getResolved("background")) self:updateRender()return true end end;aa.mouse_up(self,da,_b,ab-1)
local cd=ad and self:unsetState("clicked")return true end;return
(dc.selectedFg or self.getResolved("selectedForeground"))or _a.mouse_up and _a.mouse_up(self,da,_b,ab)or false end
(dc.fg or self.getResolved("foreground"))self:textBg(1,i+1,string.rep(" ",bc),bd)self:textFg(1, function ca:render()_a.render(self)local da=self.get("selectedText")
i+1,_d,cd)end end end end end local _b=self:hasState("opened")local ab=self:getSelectedItems()
function _b:focus()aa.focus(self)self:setState("opened")end if#ab>0 then local bb=ab[1]
function _b:blur()aa.blur(self)self:unsetState("opened") da=bb.text or""da=da:sub(1,self.get("width")-2)end;if _b then aa.render(self,1)end
self.set("height",1)self:updateRender()end;return _b end self:blit(1,1,da..
string.rep(" ",
self.get("width")-#da-1).. (_b and"\31"or"\17"),string.rep(ba[self.getResolved("foreground")],self.get("width")),string.rep(ba[self.getResolved("background")],self.get("width")))end
function ca:focus()_a.focus(self)self:setState("opened")end
function ca:blur()_a.blur(self)self:unsetState("opened")
self.set("height",1)self:updateRender()end;return ca end
project["elements/Display.lua"] = function(...) local ba=require("elementManager") project["elements/Display.lua"] = function(...) local ba=require("elementManager")
local ca=ba.getElement("VisualElement") local ca=ba.getElement("VisualElement")
local da=require("libraries/utils").getCenteredPosition;local _b=require("libraries/utils").deepcopy local da=require("libraries/utils").getCenteredPosition;local _b=require("libraries/utils").deepcopy
@@ -2788,51 +2779,124 @@ if(self.parent)then self.parent:removeChild(self)end;self._destroyed=true;self:r
self:setFocused(false)end;function ca:updateRender() self:setFocused(false)end;function ca:updateRender()
if if
(self.parent)then self.parent:updateRender()else self._renderUpdate=true end;return self end;return ca end (self.parent)then self.parent:updateRender()else self._renderUpdate=true end;return self end;return ca end
project["elements/List.lua"] = function(...) local d=require("elements/Collection") project["elements/List.lua"] = function(...) local _a=require("elements/Collection")
local _a=setmetatable({},d)_a.__index=_a local aa=require("libraries/colorHex")local ba=setmetatable({},_a)ba.__index=ba
_a.defineProperty(_a,"offset",{default=0,type="number",canTriggerRender=true})_a.defineEvent(_a,"mouse_click") ba.defineProperty(ba,"offset",{default=0,type="number",canTriggerRender=true,setter=function(da,_b)
_a.defineEvent(_a,"mouse_up")_a.defineEvent(_a,"mouse_scroll")
local aa={text={type="string",default="Entry"},bg={type="number",default=
nil},fg={type="number",default=nil},selectedBg={type="number",default=nil},selectedFg={type="number",default=nil},callback={type="function",default=
nil}}
function _a.new()local ba=setmetatable({},_a):__init()
ba.class=_a;ba.set("width",16)ba.set("height",8)ba.set("z",5)
ba.set("background",colors.gray)return ba end;function _a:init(ba,ca)d.init(self,ba,ca)self._entrySchema=aa
self.set("type","List")return self end
function _a:mouse_click(ba,ca,da)
if
d.mouse_click(self,ba,ca,da)and self.get("selectable")then
local _b,ab=self:getRelativePosition(ca,da)local bb=ab+self.get("offset")
local cb=self.get("items")
if bb<=#cb then local db=cb[bb]if not self.get("multiSelection")then
for _c,ac in ipairs(cb)do if
type(ac)=="table"then ac.selected=false end end end
db.selected=not db.selected;if db.callback then db.callback(self)end
self:fireEvent("select",bb,db)self:updateRender()end;return true end;return false end
function _a:mouse_scroll(ba,ca,da)
if d.mouse_scroll(self,ba,ca,da)then local _b=self.get("offset")
local ab=math.max(0,# local ab=math.max(0,#
self.get("items")-self.get("height"))_b=math.min(ab,math.max(0,_b+ba)) da.get("items")-da.get("height"))return math.min(ab,math.max(0,_b))end})
self.set("offset",_b)return true end;return false end ba.defineProperty(ba,"emptyText",{default="No items",type="string",canTriggerRender=true})
function _a:onSelect(ba)self:registerCallback("select",ba)return self end ba.defineProperty(ba,"showScrollBar",{default=true,type="boolean",canTriggerRender=true})
function _a:scrollToBottom() ba.defineProperty(ba,"scrollBarSymbol",{default=" ",type="string",canTriggerRender=true})
local ba=math.max(0,#self.get("items")-self.get("height"))self.set("offset",ba)return self end ba.defineProperty(ba,"scrollBarBackground",{default="\127",type="string",canTriggerRender=true})
function _a:scrollToTop()self.set("offset",0)return self end ba.defineProperty(ba,"scrollBarColor",{default=colors.lightGray,type="color",canTriggerRender=true})
function _a:render()d.render(self)local ba=self.get("items") ba.defineProperty(ba,"scrollBarBackgroundColor",{default=colors.gray,type="color",canTriggerRender=true})ba.defineEvent(ba,"mouse_click")
local ca=self.get("height")local da=self.get("offset")local _b=self.get("width") ba.defineEvent(ba,"mouse_up")ba.defineEvent(ba,"mouse_drag")
local ab=self.getResolved("background")local bb=self.getResolved("foreground") ba.defineEvent(ba,"mouse_scroll")ba.defineEvent(ba,"key")
for i=1,ca do local cb=i+da;local db=ba[cb] local ca={text={type="string",default="Entry"},bg={type="number",default=nil},fg={type="number",default=
nil},selectedBg={type="number",default=nil},selectedFg={type="number",default=nil},callback={type="function",default=nil}}
function ba.new()local da=setmetatable({},ba):__init()
da.class=ba;da.set("width",16)da.set("height",8)da.set("z",5)
da.set("background",colors.gray)return da end
function ba:init(da,_b)_a.init(self,da,_b)self._entrySchema=ca
self.set("type","List")
self:observe("items",function()
local ab=math.max(0,#self.get("items")-self.get("height"))
if self.get("offset")>ab then self.set("offset",ab)end end)
self:observe("height",function()
local ab=math.max(0,#self.get("items")-self.get("height"))
if self.get("offset")>ab then self.set("offset",ab)end end)return self end
function ba:mouse_click(da,_b,ab)
if _a.mouse_click(self,da,_b,ab)then
local bb,cb=self:getRelativePosition(_b,ab)local db=self.get("width")local _c=self.get("items")
local ac=self.get("height")local bc=self.get("showScrollBar")
if bc and#_c>ac and bb==db then local cc=
#_c-ac
local dc=math.max(1,math.floor((ac/#_c)*ac))
local _d=cc>0 and(self.get("offset")/cc*100)or 0
local ad=math.floor((_d/100)* (ac-dc))+1
if cb>=ad and cb<ad+dc then self._scrollBarDragging=true
self._scrollBarDragOffset=cb-ad else local bd=( (cb-1)/ (ac-dc))*100
local cd=math.floor((bd/100)*cc+0.5)
self.set("offset",math.max(0,math.min(cc,cd)))end;return true end
if self.get("selectable")then local cc=cb+self.get("offset")
if if
db then cc<=#_c then local dc=_c[cc]if not self.get("multiSelection")then
if db.separator then local _c=(db.text or"-"):sub(1,1) for _d,ad in ipairs(_c)do if
local ac=string.rep(_c,_b)local bc=db.fg or bb;local cc=db.bg or ab type(ad)=="table"then ad.selected=false end end end
self:textBg(1,i,string.rep(" ",_b),cc)self:textFg(1,i,ac:sub(1,_b),bc)else local _c=db.text dc.selected=not dc.selected;if dc.callback then dc.callback(self)end
local ac=db.selected self:fireEvent("select",cc,dc)self:updateRender()end end;return true end;return false end
local bc=ac and function ba:mouse_drag(da,_b,ab)
(db.selectedBg or self.getResolved("selectedBackground"))or(db.bg or ab) if self._scrollBarDragging then local bb,cb=self:getRelativePosition(_b,ab)
local cc=ac and local db=self.get("items")local _c=self.get("height")
(db.selectedFg or self.getResolved("selectedForeground"))or(db.fg or bb)self:textBg(1,i,string.rep(" ",_b),bc) local ac=math.max(1,math.floor((_c/#db)*_c))local bc=#db-_c;cb=math.max(1,math.min(_c,cb))local cc=cb- (
self:textFg(1,i,_c:sub(1,_b),cc)end end end end;return _a end self._scrollBarDragOffset or 0)local dc=
( (cc-1)/ (_c-ac))*100
local _d=math.floor((dc/100)*bc+0.5)
self.set("offset",math.max(0,math.min(bc,_d)))return true end;return
_a.mouse_drag and _a.mouse_drag(self,da,_b,ab)or false end
function ba:mouse_up(da,_b,ab)if self._scrollBarDragging then self._scrollBarDragging=false
self._scrollBarDragOffset=nil;return true end
return _a.mouse_up and
_a.mouse_up(self,da,_b,ab)or false end
function ba:mouse_scroll(da,_b,ab)
if _a.mouse_scroll(self,da,_b,ab)then local bb=self.get("offset")
local cb=math.max(0,
#self.get("items")-self.get("height"))bb=math.min(cb,math.max(0,bb+da))
self.set("offset",bb)return true end;return false end
function ba:onSelect(da)self:registerCallback("select",da)return self end
function ba:scrollToBottom()
local da=math.max(0,#self.get("items")-self.get("height"))self.set("offset",da)return self end
function ba:scrollToTop()self.set("offset",0)return self end
function ba:scrollToItem(da)local _b=self.get("height")local ab=self.get("offset")
if da<
ab+1 then self.set("offset",math.max(0,da-1))elseif da>
ab+_b then self.set("offset",da-_b)end;return self end
function ba:key(da)
if _a.key(self,da)and self.get("selectable")then
local _b=self.get("items")local ab=self:getSelectedIndex()
if da==keys.up then
self:selectPrevious()if ab and ab>1 then self:scrollToItem(ab-1)end
return true elseif da==keys.down then self:selectNext()if ab and ab<#_b then
self:scrollToItem(ab+1)end;return true elseif da==keys.home then
self:clearItemSelection()self:selectItem(1)self:scrollToTop()return true elseif
da==keys["end"]then self:clearItemSelection()self:selectItem(#_b)
self:scrollToBottom()return true elseif da==keys.pageUp then local bb=self.get("height")
local cb=math.max(1,(ab or 1)-bb)self:clearItemSelection()self:selectItem(cb)
self:scrollToItem(cb)return true elseif da==keys.pageDown then local bb=self.get("height")
local cb=math.min(#_b,(ab or 1)+bb)self:clearItemSelection()self:selectItem(cb)
self:scrollToItem(cb)return true end end;return false end
function ba:render(da)_a.render(self)local _b=self.get("items")
local ab=self.get("height")local bb=self.get("offset")local cb=self.get("width")
local db=self.getResolved("background")local _c=self.getResolved("foreground")
local ac=self.get("showScrollBar")local bc=ac and#_b>ab;local cc=bc and cb-1 or cb
if#_b==0 then
local dc=self.get("emptyText")local _d=math.floor(ab/2)+da;local ad=math.max(1,
math.floor((cb-#dc)/2)+1)for i=1,ab do
self:textBg(1,i,string.rep(" ",cb),db)end;if _d>=1 and _d<=ab then
self:textFg(ad,_d+da,dc,colors.gray)end;return end
for i=1,ab do local dc=i+bb;local _d=_b[dc]
if _d then
if _d.separator then
local ad=(
(_d.text or"-")~=""and _d.text or"-"):sub(1,1)local bd=string.rep(ad,cc)local cd=_d.fg or _c;local dd=_d.bg or db;self:textBg(1,
i+da,string.rep(" ",cc),dd)self:textFg(1,i+
da,bd,cd)else local ad=_d.text or""local bd=_d.selected
local cd=
bd and(
_d.selectedBg or self.getResolved("selectedBackground"))or(_d.bg or db)
local dd=bd and
(_d.selectedFg or self.getResolved("selectedForeground"))or(_d.fg or _c)local __a=ad
if#__a>cc then __a=__a:sub(1,cc-3).."..."else __a=__a..string.rep(" ",cc-
#__a)end;self:textBg(1,i+da,string.rep(" ",cc),cd)self:textFg(1,
i+da,__a,dd)end else self:textBg(1,i+da,string.rep(" ",cc),db)end end
if bc then
local dc=math.max(1,math.floor((ab/#_b)*ab))local _d=#_b-ab;local ad=_d>0 and(bb/_d*100)or 0;local bd=math.floor((ad/
100)* (ab-dc))+1
local cd=self.getResolved("scrollBarSymbol")local dd=self.getResolved("scrollBarBackground")
local __a=self.getResolved("scrollBarColor")local a_a=self.getResolved("scrollBarBackgroundColor")
for i=1,ab do self:blit(cb,
i+da,dd,aa[_c],aa[a_a])end;for i=bd,math.min(ab,bd+dc-1)do
self:blit(cb,i+da,cd,aa[__a],aa[a_a])end end end;return ba end
project["elements/Collection.lua"] = function(...) local d=require("elements/VisualElement") project["elements/Collection.lua"] = function(...) local d=require("elements/VisualElement")
local _a=require("libraries/collectionentry")local aa=setmetatable({},d)aa.__index=aa local _a=require("libraries/collectionentry")local aa=setmetatable({},d)aa.__index=aa
aa.defineProperty(aa,"items",{default={},type="table"}) aa.defineProperty(aa,"items",{default={},type="table"})
@@ -2868,9 +2932,23 @@ if type(ba)=="number"then
if ca[ba]and if ca[ba]and
type(ca[ba])=="table"then ca[ba].selected=false end else type(ca[ba])=="table"then ca[ba].selected=false end else
for da,_b in pairs(ca)do if _b==ba then for da,_b in pairs(ca)do if _b==ba then
if type(ca[da])=="table"then ca[da].selected=false end;break end end end;self:updateRender()return self end;function aa:clearItemSelection()local ba=self.get("items") if type(ca[da])=="table"then ca[da].selected=false end;break end end end;self:updateRender()return self end
for ca,da in ipairs(ba)do da.selected=false end;return self end;function aa:onSelect(ba) function aa:clearItemSelection()local ba=self.get("items")
self:registerCallback("select",ba)return self end;return aa end for ca,da in ipairs(ba)do da.selected=false end;self:updateRender()return self end
function aa:getSelectedIndex()local ba=self.get("items")
for ca,da in ipairs(ba)do if type(da)=="table"and
da.selected then return ca end end;return nil end
function aa:selectNext()local ba=self.get("items")
local ca=self:getSelectedIndex()
if not ca then if#ba>0 then self:selectItem(1)end elseif ca<#ba then
if not
self.get("multiSelection")then self:clearItemSelection()end;self:selectItem(ca+1)end;self:updateRender()return self end
function aa:selectPrevious()local ba=self.get("items")
local ca=self:getSelectedIndex()
if not ca then if#ba>0 then self:selectItem(#ba)end elseif ca>1 then
if not
self.get("multiSelection")then self:clearItemSelection()end;self:selectItem(ca-1)end;self:updateRender()return self end
function aa:onSelect(ba)self:registerCallback("select",ba)return self end;return aa end
project["plugins/canvas.lua"] = function(...) local ba=require("libraries/colorHex") project["plugins/canvas.lua"] = function(...) local ba=require("libraries/colorHex")
local ca=require("errorManager")local da={}da.__index=da;local _b,ab=string.sub,string.rep local ca=require("errorManager")local da={}da.__index=da;local _b,ab=string.sub,string.rep
function da.new(cb) function da.new(cb)
@@ -3082,96 +3160,127 @@ bd.hooks={destroy=function(cd)
if _d[cd]then if _d[cd]then
for dd,__a in pairs(_d[cd])do for a_a,b_a in ipairs(__a)do for dd,__a in pairs(_d[cd])do for a_a,b_a in ipairs(__a)do
b_a.target:removeObserver(b_a.property,b_a.callback)end end;_d[cd]=nil;dc[cd]=nil end end}return{BaseElement=bd} end b_a.target:removeObserver(b_a.property,b_a.callback)end end;_d[cd]=nil;dc[cd]=nil end end}return{BaseElement=bd} end
project["plugins/xml.lua"] = function(...) local ab=require("errorManager")local bb=require("log") project["plugins/xml.lua"] = function(...) local bb=require("errorManager")local cb=require("log")
local cb={new=function(ad) local db={new=function(cd)
return return
{tag=ad,value=nil,attributes={},children={},addChild=function(bd,cd) {tag=cd,value=nil,attributes={},children={},addChild=function(dd,__a)
table.insert(bd.children,cd)end,addAttribute=function(bd,cd,dd)bd.attributes[cd]=dd end}end} table.insert(dd.children,__a)end,addAttribute=function(dd,__a,a_a)dd.attributes[__a]=a_a end}end}
local db=function(ad,bd) local _c=function(cd,dd)
local cd,dd=string.gsub(bd,"(%w+)=([\"'])(.-)%2",function(b_a,c_a,d_a) local __a,a_a=string.gsub(dd,"([%w:]+)=([\"'])(.-)%2",function(d_a,_aa,aaa)
ad:addAttribute(b_a,"\""..d_a.."\"")end) cd:addAttribute(d_a,"\""..aaa.."\"")end)
local __a,a_a=string.gsub(bd,"(%w+)={(.-)}",function(b_a,c_a)ad:addAttribute(b_a,c_a)end)end local b_a,c_a=string.gsub(dd,"([%w:]+)={(.-)}",function(d_a,_aa)cd:addAttribute(d_a,_aa)end)end;local ac={}
local _c={parseText=function(ad)local bd={}local cd=cb.new()table.insert(bd,cd)local dd,__a,a_a,b_a,c_a;local d_a,_aa=1,1 ac={_customTagHandlers={},registerTagHandler=function(cd,dd)ac._customTagHandlers[cd]=dd
while cb.info(
true do "XMLParser: Registered custom tag handler for '"..cd.."'")end,unregisterTagHandler=function(cd)ac._customTagHandlers[cd]=
dd,_aa,__a,a_a,b_a,c_a=string.find(ad,"<(%/?)([%w_:]+)(.-)(%/?)>",d_a)if not dd then break end;local aaa=string.sub(ad,d_a,dd-1)if not nil
string.find(aaa,"^%s*$")then local baa=(cd.value or"")..aaa cb.info("XMLParser: Unregistered custom tag handler for '"..cd.."'")end,getTagHandler=function(cd)return
bd[#bd].value=baa end ac._customTagHandlers[cd]end,parseText=function(cd)local dd={}local __a=db.new()
if c_a=="/"then local baa=cb.new(a_a) table.insert(dd,__a)local a_a,b_a,c_a,d_a,_aa;local aaa,baa=1,1
db(baa,b_a)cd:addChild(baa)elseif __a==""then local baa=cb.new(a_a)db(baa,b_a) while true do
table.insert(bd,baa)cd=baa else local baa=table.remove(bd)cd=bd[#bd] a_a,baa,b_a,c_a,d_a,_aa=string.find(cd,"<(%/?)([%w_:]+)(.-)(%/?)>",aaa)if not a_a then break end;local caa=string.sub(cd,aaa,a_a-1)if not
if#bd<1 then ab.error( string.find(caa,"^%s*$")then local daa=(__a.value or"")..caa
"XMLParser: nothing to close with "..a_a)end;if baa.tag~=a_a then dd[#dd].value=daa end
ab.error("XMLParser: trying to close "..baa.tag.." with "..a_a)end;cd:addChild(baa)end;d_a=_aa+1 end;if#bd>1 then if _aa=="/"then local daa=db.new(c_a)
error("XMLParser: unclosed "..bd[#bd].tag)end;return cd.children end} _c(daa,d_a)__a:addChild(daa)elseif b_a==""then local daa=db.new(c_a)_c(daa,d_a)
local function ac(ad)local bd={}local cd=1 table.insert(dd,daa)__a=daa else local daa=table.remove(dd)__a=dd[#dd]
while true do local dd,__a,a_a=ad:find("%${([^}]+)}",cd) if#dd<1 then bb.error(
if not dd then break end "XMLParser: nothing to close with "..c_a)end;if daa.tag~=c_a then
table.insert(bd,{start=dd,ending=__a,expression=a_a,raw=ad:sub(dd,__a)})cd=__a+1 end;return bd end bb.error("XMLParser: trying to close "..daa.tag.." with "..c_a)end;__a:addChild(daa)end;aaa=baa+1 end;if#dd>1 then
local function bc(ad,bd)if not ad then return ad end;if error("XMLParser: unclosed "..dd[#dd].tag)end;return __a.children end}
ad:sub(1,1)=="\""and ad:sub(-1)=="\""then ad=ad:sub(2,-2)end;local cd=ac(ad) local function bc(cd)local dd={}local __a=1
for dd,__a in ipairs(cd)do while true do local a_a,b_a,c_a=cd:find("%${([^}]+)}",__a)
local a_a=__a.expression;local b_a=__a.start-1;local c_a=__a.ending+1;if bd[a_a]then ad=ad:sub(1,b_a).. if not a_a then break end
tostring(bd[a_a])..ad:sub(c_a)else table.insert(dd,{start=a_a,ending=b_a,expression=c_a,raw=cd:sub(a_a,b_a)})__a=b_a+1 end;return dd end
ab.error( local function cc(cd,dd)if not cd then return cd end;if
"XMLParser: variable '"..a_a.."' not found in scope")end end cd:sub(1,1)=="\""and cd:sub(-1)=="\""then cd=cd:sub(2,-2)end;local __a=bc(cd)
if ad:match("^%s*<!%[CDATA%[.*%]%]>%s*$")then for a_a,b_a in ipairs(__a)do
local dd=ad:match("<!%[CDATA%[(.*)%]%]>")local __a=_ENV;for a_a,b_a in pairs(bd)do __a[a_a]=b_a end;return local c_a=b_a.expression;local d_a=b_a.start-1;local _aa=b_a.ending+1;if dd[c_a]then cd=cd:sub(1,d_a)..
load("return "..dd,nil,"bt",__a)()end tostring(dd[c_a])..cd:sub(_aa)else
if ad=="true"then return true elseif ad=="false"then return false elseif colors[ad]then return colors[ad]elseif tonumber(ad)then return bb.error(
tonumber(ad)else return ad end end "XMLParser: variable '"..c_a.."' not found in scope")end end
local function cc(ad,bd)local cd={} if cd:match("^%s*<!%[CDATA%[.*%]%]>%s*$")then
for dd,__a in pairs(ad.children)do local a_a=cd:match("<!%[CDATA%[(.*)%]%]>")local b_a=_ENV;for baa,caa in pairs(dd)do b_a[baa]=caa end
if __a.tag=="item"or __a.tag=="entry"then local c_a,d_a=load("return "..a_a,nil,"bt",b_a)if not c_a then
local a_a={} bb.error("XMLParser: CDATA syntax error: "..tostring(d_a))end;local _aa,aaa=pcall(c_a)if not _aa then
for b_a,c_a in pairs(__a.attributes)do a_a[b_a]=bc(c_a,bd)end;for b_a,c_a in pairs(__a.children)do bb.error(
if c_a.value then a_a[c_a.tag]=bc(c_a.value,bd)elseif# "XMLParser: CDATA execution error: "..tostring(aaa))end;return aaa end
c_a.children>0 then a_a[c_a.tag]=cc(c_a)end end if cd=="true"then return true elseif cd=="false"then return false elseif colors[cd]then return colors[cd]elseif tonumber(cd)then return
table.insert(cd,a_a)else if __a.value then cd[__a.tag]=bc(__a.value,bd)elseif#__a.children>0 then tonumber(cd)else return cd end end
cd[__a.tag]=cc(__a)end end end;return cd end;local dc={}function dc.setup(ad) local function dc(cd,dd)local __a={}
ad.defineProperty(ad,"customXML",{default={attributes={},children={}},type="table"})end for a_a,b_a in pairs(cd.children)do
function dc:fromXML(ad,bd) if b_a.tag=="item"or b_a.tag=="entry"then
if(ad.attributes)then local c_a={}
for cd,dd in for d_a,_aa in pairs(b_a.attributes)do c_a[d_a]=cc(_aa,dd)end;for d_a,_aa in pairs(b_a.children)do
pairs(ad.attributes)do if _aa.value then c_a[_aa.tag]=cc(_aa.value,dd)elseif#
if(self._properties[cd])then self.set(cd,bc(dd,bd))elseif self[cd]then _aa.children>0 then c_a[_aa.tag]=dc(_aa)end end
if( table.insert(__a,c_a)else if b_a.value then __a[b_a.tag]=cc(b_a.value,dd)elseif#b_a.children>0 then
cd:sub(1,2)=="on")then local __a=dd:gsub("\"","") __a[b_a.tag]=dc(b_a)end end end;return __a end
if(bd[__a])then if local function _d(cd,dd,__a,a_a)local b_a,c_a=dd:match("^(.+)State:(.+)$")
(type(bd[__a])~="function")then if b_a and c_a then
ab.error("XMLParser: variable '"..__a.. c_a=c_a:gsub("^\"",""):gsub("\"$","")
"' is not a function for element '"..self:getType().."' "..cd)end local d_a=b_a:sub(1,1):upper()..b_a:sub(2)local _aa="set"..d_a.."State"
self[cd](self,bd[__a])else if cd[_aa]then
ab.error("XMLParser: variable '"..__a.."' not found in scope")end else cd[_aa](cd,c_a,cc(__a,a_a))return true else
ab.error("XMLParser: property '"..cd.. cb.warn("XMLParser: State method '".._aa..
"' not found in element '"..self:getType().."'")end else local __a=self.get("customXML") "' not found for element '"..cd:getType().."'")return true end end;return false end;local ad={}function ad.setup(cd)
__a.attributes[cd]=bc(dd,bd)end end end cd.defineProperty(cd,"customXML",{default={attributes={},children={}},type="table"})end
if(ad.children)then function ad:fromXML(cd,dd)
for cd,dd in pairs(ad.children)do if(cd.attributes)then
if(self._properties[dd.tag])then if( for __a,a_a in
self._properties[dd.tag].type=="table")then self.set(dd.tag,cc(dd,bd))else pairs(cd.attributes)do
self.set(dd.tag,bc(dd.value,bd))end else local __a={} if not _d(self,__a,a_a,dd)then
if(dd.children)then if(self._properties[__a])then
for a_a,b_a in self.set(__a,cc(a_a,dd))elseif self[__a]then
pairs(dd.children)do if(__a:sub(1,2)=="on")then local b_a=a_a:gsub("\"","")
if(b_a.tag=="param")then if(dd[b_a])then if(
table.insert(__a,bc(b_a.value,bd))elseif(b_a.tag=="table")then table.insert(__a,cc(b_a,bd))end end end type(dd[b_a])~="function")then
if(self[dd.tag])then if(#__a>0)then bb.error("XMLParser: variable '"..
self[dd.tag](self,table.unpack(__a))elseif(dd.value)then self[dd.tag](self,bc(dd.value,bd))else b_a.."' is not a function for element '"..self:getType()..
self[dd.tag](self)end else "' "..__a)end
local a_a=self.get("customXML")dd.value=bc(dd.value,bd)a_a.children[dd.tag]=dd end end end end;return self end;local _d={} self[__a](self,dd[b_a])else
function _d:loadXML(ad,bd)bd=bd or{}local cd=_c.parseText(ad) bb.error("XMLParser: variable '"..b_a.."' not found in scope")end else
self:fromXML(cd,bd) bb.error("XMLParser: property '"..__a..
if(cd)then "' not found in element '"..self:getType().."'")end else local b_a=self.get("customXML")
for dd,__a in ipairs(cd)do b_a.attributes[__a]=cc(a_a,dd)end end end end
local a_a=__a.tag:sub(1,1):upper()..__a.tag:sub(2)if self["add"..a_a]then local b_a=self["add"..a_a](self) if(cd.children)then
b_a:fromXML(__a,bd)end end end;return self end for __a,a_a in pairs(cd.children)do
function _d:fromXML(ad,bd)dc.fromXML(self,ad,bd) if a_a.tag=="state"then
if(ad.children)then local b_a=a_a.attributes and a_a.attributes.name;if not b_a then
for cd,dd in ipairs(ad.children)do local __a= bb.error("XMLParser: <state> tag requires 'name' attribute")end
dd.tag:sub(1,1):upper()..dd.tag:sub(2) b_a=b_a:gsub("^\"",""):gsub("\"$","")
if if a_a.children then
self["add"..__a]then local a_a=self["add"..__a](self)a_a:fromXML(dd,bd)end end end;return self end;return{API=_c,Container=_d,BaseElement=dc} end for c_a,d_a in ipairs(a_a.children)do local _aa=d_a.tag;local aaa=cc(d_a.value,dd)local baa=
_aa:sub(1,1):upper().._aa:sub(2)
local caa="set"..baa.."State"if self[caa]then self[caa](self,b_a,aaa)else
cb.warn("XMLParser: State method '"..
caa..
"' not found for element '"..self:getType().."'")end end end elseif(self._properties[a_a.tag])then if
(self._properties[a_a.tag].type=="table")then self.set(a_a.tag,dc(a_a,dd))else
self.set(a_a.tag,cc(a_a.value,dd))end else local b_a={}
if(a_a.children)then
for c_a,d_a in
pairs(a_a.children)do
if(d_a.tag=="param")then
table.insert(b_a,cc(d_a.value,dd))elseif(d_a.tag=="table")then table.insert(b_a,dc(d_a,dd))end end end
if(self[a_a.tag])then if(#b_a>0)then
self[a_a.tag](self,table.unpack(b_a))elseif(a_a.value)then self[a_a.tag](self,cc(a_a.value,dd))else
self[a_a.tag](self)end else
local c_a=self.get("customXML")a_a.value=cc(a_a.value,dd)c_a.children[a_a.tag]=a_a end end end end;return self end;local bd={}
function bd:loadXML(cd,dd)dd=dd or{}local __a=ac.parseText(cd)
self:fromXML(__a,dd)
if(__a)then
for a_a,b_a in ipairs(__a)do
local c_a=b_a.tag:sub(1,1):upper()..b_a.tag:sub(2)if self["add"..c_a]then local d_a=self["add"..c_a](self)
d_a:fromXML(b_a,dd)end end end;return self end
function bd:fromXML(cd,dd)ad.fromXML(self,cd,dd)
if(cd.children)then
for __a,a_a in ipairs(cd.children)do local b_a=
a_a.tag:sub(1,1):upper()..a_a.tag:sub(2)
local c_a=ac.getTagHandler(a_a.tag)
if c_a then local d_a=c_a(a_a,self,dd)elseif self["add"..b_a]then
local d_a=self["add"..b_a](self)d_a:fromXML(a_a,dd)else
cb.warn("XMLParser: Unknown tag '"..
a_a.tag.."' - no handler or element found")end end end;return self end;return{API=ac,Container=bd,BaseElement=ad} end
project["plugins/debug.lua"] = function(...) local _b=require("log")local ab=require("libraries/colorHex") project["plugins/debug.lua"] = function(...) local _b=require("log")local ab=require("libraries/colorHex")
local bb=10;local cb=false;local db={ERROR=1,WARN=2,INFO=3,DEBUG=4} local bb=10;local cb=false;local db={ERROR=1,WARN=2,INFO=3,DEBUG=4}
local function _c(dc) local function _c(dc)