diff --git a/Basalt/plugins/xml.lua b/Basalt/plugins/xml.lua index ba24713..1db26ae 100644 --- a/Basalt/plugins/xml.lua +++ b/Basalt/plugins/xml.lua @@ -144,18 +144,14 @@ function XmlParser:ParseXmlText(xmlText) return top end -local function executeScript(scripts) - for k,v in pairs(scripts)do - if(k~="env")then - for a,b in pairs(v)do - load(b, nil, "t", scripts.env)() - end - end +local function maybeExecuteScript(renderContext) + if (renderContext.script ~= nil) then + load(renderContext.script, nil, "t", renderContext.env)() end end -local function registerFunctionEvent(self, data, event, scripts) - local eventEnv = scripts.env +local function registerFunctionEvent(self, data, event, renderContext) + local eventEnv = renderContext.env if(data:sub(1,1)=="$")then local data = data:sub(2) event(self, self:getBasalt().getVariable(data)) @@ -175,7 +171,7 @@ return { local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end local x, y = self:getPosition() local w, h = self:getSize() if (name == "x") then @@ -202,8 +198,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - scripts.env[self:getName()] = self + setValuesByXMLData = function(self, data, renderContext) + renderContext.env[self:getName()] = self for k,v in pairs(data:reactiveProperties()) do local parts, nParts = utils.splitString(v, "%.") if (nParts ~= 2) then @@ -212,9 +208,9 @@ return { local tableName = parts[1] local entryName = parts[2] if (tableName == "props") then - self:updateValue(k, scripts.env.props[entryName]) + self:updateValue(k, renderContext.env.props[entryName]) elseif (tableName == "shared") then - local sharedObservers = scripts.env.sharedObservers + local sharedObservers = renderContext.sharedObservers if (sharedObservers[entryName]) == nil then sharedObservers[entryName] = {} end @@ -238,16 +234,13 @@ return { if(xmlValue("script", data)~=nil)then - if(scripts[1]==nil)then - scripts[1] = {} - end - table.insert(scripts[1], xmlValue("script", data)) + renderContext.script = xmlValue("script", data) end local events = {"onClick", "onClickUp", "onHover", "onScroll", "onDrag", "onKey", "onKeyUp", "onRelease", "onChar", "onGetFocus", "onLoseFocus", "onResize", "onReposition", "onEvent", "onLeave"} for _,v in pairs(events)do if(xmlValue(v, data)~=nil)then - registerFunctionEvent(self, xmlValue(v, data), self[v], scripts) + registerFunctionEvent(self, xmlValue(v, data), self[v], renderContext) end end @@ -260,20 +253,20 @@ return { ChangeableObject = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "value") then self:setValue(value) end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "value" }) if(xmlValue("onChange", data)~=nil)then - registerFunctionEvent(self, xmlValue("onChange", data), self.onChange, scripts) + registerFunctionEvent(self, xmlValue("onChange", data), self.onChange, renderContext) end return self end, @@ -284,28 +277,28 @@ return { BaseFrame = function(base, basalt) local lastXMLReferences = {} - local function xmlDefaultValues(data, obj, scripts) + local function xmlDefaultValues(data, obj, renderContext) if(obj~=nil)then - obj:setValuesByXMLData(data, scripts) + obj:setValuesByXMLData(data, renderContext) end end - local function addXMLObjectType(tab, f, self, scripts) + local function addXMLObjectType(tab, f, self, renderContext) if(tab~=nil)then if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,v in pairs(tab)do local obj = f(self, v["@id"] or uuid()) lastXMLReferences[obj:getName()] = obj - xmlDefaultValues(v, obj, scripts) + xmlDefaultValues(v, obj, renderContext) end end end local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) - local xOffset, yOffset = self:getOffset() + local _, yOffset = self:getOffset() if (name == "layout") then self:setLayout(value) elseif (name == "xOffset") then @@ -313,9 +306,9 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) lastXMLReferences = {} - base.setValuesByXMLData(self, data, scripts) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "layout", "xOffset" @@ -323,17 +316,17 @@ return { local objectList = data:children() local _OBJECTS = basalt.getObjects() - - for k,v in pairs(objectList)do + + for _,v in pairs(objectList)do if(v.___name~="animation")then local name = v.___name:gsub("^%l", string.upper) if(_OBJECTS[name]~=nil)then - addXMLObjectType(v, self["add"..name], self, scripts) + addXMLObjectType(v, self["add"..name], self, renderContext) end end end - addXMLObjectType(data["animation"], self.addAnimation, self, scripts) + addXMLObjectType(data["animation"], self.addAnimation, self, renderContext) return self end, @@ -343,19 +336,19 @@ return { loadLayout = function(self, path, props) if(fs.exists(path))then - local scripts = {} - scripts.env = _ENV - scripts.env.basalt = basalt - scripts.env.props = props - scripts.env.shared = {} - scripts.env.sharedObservers = {} + local renderContext = {} + renderContext.env = _ENV + renderContext.env.basalt = basalt + renderContext.env.props = props + renderContext.env.shared = {} + renderContext.sharedObservers = {} local shared = {} - setmetatable(scripts.env.shared, { + setmetatable(renderContext.env.shared, { __index = function(_, k) return shared[k] end, __newindex = function(_, k, v) - local observers = scripts.env.sharedObservers[k] + local observers = renderContext.sharedObservers[k] if observers ~= nil then for _,observer in pairs(observers) do observer(v) @@ -368,8 +361,8 @@ return { local data = XmlParser:ParseXmlText(f.readAll()) f.close() lastXMLReferences = {} - self:setValuesByXMLData(data, scripts) - executeScript(scripts) + maybeExecuteScript(renderContext) + self:setValuesByXMLData(data, renderContext) end return self end, @@ -381,26 +374,26 @@ return { Frame = function(base, basalt) local lastXMLReferences = {} - local function xmlDefaultValues(data, obj, scripts) + local function xmlDefaultValues(data, obj, renderContext) if(obj~=nil)then - obj:setValuesByXMLData(data, scripts) + obj:setValuesByXMLData(data, renderContext) end end - local function addXMLObjectType(tab, f, self, scripts) + local function addXMLObjectType(tab, f, self, renderContext) if(tab~=nil)then if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,v in pairs(tab)do local obj = f(self, v["@id"] or uuid()) lastXMLReferences[obj:getName()] = obj - xmlDefaultValues(v, obj, scripts) + xmlDefaultValues(v, obj, renderContext) end end end local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local xOffset, yOffset = self:getOffset() if (name == "layout") then @@ -412,8 +405,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "layout", "xOffset", @@ -423,16 +416,16 @@ return { local objectList = data:children() local _OBJECTS = basalt.getObjects() - for k,v in pairs(objectList)do + for _,v in pairs(objectList)do if(v.___name~="animation")then local name = v.___name:gsub("^%l", string.upper) if(_OBJECTS[name]~=nil)then - addXMLObjectType(v, self["add"..name], self, scripts) + addXMLObjectType(v, self["add"..name], self, renderContext) end end end - addXMLObjectType(data["animation"], self.addAnimation, self, scripts) + addXMLObjectType(data["animation"], self.addAnimation, self, renderContext) return self end, @@ -442,20 +435,20 @@ return { loadLayout = function(self, path, props) if(fs.exists(path))then - local scripts = {} - scripts.env = _ENV - scripts.env.basalt = basalt - scripts.env.main = self - scripts.env.props = props - scripts.env.shared = {} - scripts.env.sharedObservers = {} + local renderContext = {} + renderContext.env = _ENV + renderContext.env.basalt = basalt + renderContext.env.main = self + renderContext.env.props = props + renderContext.env.shared = {} + renderContext.sharedObservers = {} local shared = {} - setmetatable(scripts.env.shared, { + setmetatable(renderContext.env.shared, { __index = function(_, k) return shared[k] end, __newindex = function(_, k, v) - local observers = scripts.env.sharedObservers[k] + local observers = renderContext.sharedObservers[k] if observers ~= nil then for _,observer in pairs(observers) do observer(v) @@ -468,8 +461,8 @@ return { local data = XmlParser:ParseXmlText(f.readAll()) f.close() lastXMLReferences = {} - self:setValuesByXMLData(data, scripts) - executeScript(scripts) + maybeExecuteScript(renderContext) + self:setValuesByXMLData(data, renderContext) end return self end, @@ -480,7 +473,7 @@ return { Flexbox = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "flexDirection") then self:setFlexDirection(value) @@ -493,8 +486,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "flexDirection", "justifyContent", @@ -510,7 +503,7 @@ return { Button = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "text") then self:setText(value) @@ -521,8 +514,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "text", "horizontalAlign", @@ -537,7 +530,7 @@ return { Label = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "text") then self:setText(value) @@ -546,8 +539,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "text", "align" @@ -561,7 +554,7 @@ return { Input = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local defaultText, defaultFG, defaultBG = self:getDefaultText() if (name == "defaultText") then @@ -581,8 +574,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "defaultText", "defaultFG", @@ -601,7 +594,7 @@ return { Image = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local xOffset, yOffset = self:getOffset() if (name == "xOffset") then @@ -617,9 +610,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) - local xOffset, yOffset = self:getOffset() + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "xOffset", "yOffset", @@ -636,7 +628,7 @@ return { Checkbox = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local activeSymbol, inactiveSymbol = self:getSymbol() if (name == "text") then @@ -652,8 +644,8 @@ return { end end, - setValuesByXMLData = function(self, dat, scriptsa) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "text", "checked", @@ -670,15 +662,15 @@ return { Program = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "execute") then self:execute(value) end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "execute" }) @@ -691,7 +683,7 @@ return { Progressbar = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local activeBarColor, activeBarSymbol, activeBarSymbolCol = self:getProgressBar() if (name == "direction") then @@ -709,8 +701,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "direction", "activeBarColor", @@ -728,7 +720,7 @@ return { Slider = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "symbol") then self:setSymbol(value) @@ -743,8 +735,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "symbol", "symbolColor", @@ -761,7 +753,7 @@ return { Scrollbar = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "symbol") then self:setSymbol(value) @@ -780,8 +772,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "symbol", "symbolColor", @@ -800,15 +792,15 @@ return { MonitorFrame = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "monitor") then self:setMonitor(value) end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "monitor" }) @@ -821,7 +813,7 @@ return { Switch = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "symbol") then self:setSymbol(value) @@ -832,8 +824,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "symbol", "activeBackground", @@ -848,7 +840,7 @@ return { Textfield = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local fgSel, bgSel = self:getSelection() local xOffset, yOffset = self:getOffset() @@ -863,8 +855,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "bgSelection", "fgSelection", @@ -876,7 +868,7 @@ return { if(data["lines"]~=nil)then local l = data["lines"]["line"] if(l.properties~=nil)then l = {l} end - for k,v in pairs(l)do + for _,v in pairs(l)do self:addLine(v:value()) end end @@ -917,9 +909,10 @@ return { Thread = function(base, basalt) local object = { - setValuesByXMLData = function(self, data, scripts) - if(xmlValue("start", data)~=nil)then - local f = load(xmlValue("start", data), nil, "t", scripts.env) + setValuesByXMLData = function(self, data, renderContext) + local script = xmlValue("start", data)~=nil + if(script~=nil)then + local f = load(script, nil, "t", renderContext.env) self:start(f) end return self @@ -931,7 +924,7 @@ return { Timer = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "start") then self:start(value) @@ -940,15 +933,15 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "start", "time" }) if(xmlValue("onCall", data)~=nil)then - registerFunctionEvent(self, xmlValue("onCall", data), self.onCall, scripts) + registerFunctionEvent(self, xmlValue("onCall", data), self.onCall, renderContext) end return self end, @@ -959,7 +952,7 @@ return { List = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local selBg, selFg = self:getSelectionColor() if (name == "align") then @@ -975,8 +968,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "align", "offset", @@ -988,7 +981,7 @@ return { if(data["item"]~=nil)then local tab = data["item"] if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,v in pairs(tab)do if(self:getType()~="Radio")then self:addItem(xmlValue("text", v), colors[xmlValue("bg", v)], colors[xmlValue("fg", v)]) end @@ -1003,7 +996,7 @@ return { Dropdown = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local w, h = self:getDropdownSize() if (name == "dropdownWidth") then @@ -1013,8 +1006,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "dropdownWidth", "dropdownHeight" @@ -1028,7 +1021,7 @@ return { Radio = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local selBg, selFg = self:getBoxSelectionColor() local defBg, defFg = self:setBoxDefaultColor() @@ -1043,8 +1036,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "selectionBg", "selectionFg", @@ -1055,7 +1048,7 @@ return { if(data["item"]~=nil)then local tab = data["item"] if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,v in pairs(tab)do self:addItem(xmlValue("text", v), xmlValue("x", v), xmlValue("y", v), colors[xmlValue("bg", v)], colors[xmlValue("fg", v)]) end end @@ -1068,7 +1061,7 @@ return { Menubar = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) if (name == "space") then self:setSpace(value) @@ -1077,8 +1070,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "space", "scrollable" @@ -1092,7 +1085,7 @@ return { Graph = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local symbol, symbolCol = self:getGraphSymbol() if (name == "maxEntries") then @@ -1110,8 +1103,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "maxEntries", "type", @@ -1123,7 +1116,7 @@ return { if(data["item"]~=nil)then local tab = data["item"] if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,_ in pairs(tab)do self:addDataPoint(xmlValue("value")) end end @@ -1136,7 +1129,7 @@ return { Treeview = function(base, basalt) local object = { updateValue = function(self, name, value) - if (value == null) then return end + if (value == nil) then return end base.updateValue(self, name, value) local selBg, selFg = self:getSelectionColor() local xOffset, yOffset = self:getOffset() @@ -1155,10 +1148,8 @@ return { end end, - setValuesByXMLData = function(self, data, scripts) - base.setValuesByXMLData(self, data, scripts) - local selBg, selFg = self:getSelectionColor() - local xOffset, yOffset = self:getOffset() + setValuesByXMLData = function(self, data, renderContext) + base.setValuesByXMLData(self, data, renderContext) self:updateSpecifiedValuesByXMLData(data, { "space", "scrollable", @@ -1171,7 +1162,7 @@ return { if(data["node"]~=nil)then local tab = data["node"] if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,v in pairs(tab)do local n = node:addNode(xmlValue("text", v), colors[xmlValue("bg", v)], colors[xmlValue("fg", v)]) addNode(n, v) end @@ -1180,7 +1171,7 @@ return { if(data["node"]~=nil)then local tab = data["node"] if(tab.properties~=nil)then tab = {tab} end - for k,v in pairs(tab)do + for _,v in pairs(tab)do local n = self:addNode(xmlValue("text", v), colors[xmlValue("bg", v)], colors[xmlValue("fg", v)]) addNode(n, v) end