Dynamic attributes

This commit is contained in:
Sabine Lim
2023-05-08 16:54:42 +10:00
parent 9b932704e6
commit e2723161a0
2 changed files with 613 additions and 206 deletions

View File

@@ -8,6 +8,7 @@ local function newNode(name)
node.___name = name node.___name = name
node.___children = {} node.___children = {}
node.___props = {} node.___props = {}
node.___dynProps = {}
function node:value() return self.___value end function node:value() return self.___value end
function node:setValue(val) self.___value = val end function node:setValue(val) self.___value = val end
@@ -43,7 +44,13 @@ local function newNode(name)
else else
self[lName] = value self[lName] = value
end end
table.insert(self.___props, { name = name, value = self[name] }) table.insert(self.___props, { name = name, value = self[lName] })
end
function node:dynamicProperties() return self.___dynProps end
function node:numDynamicProperties() return #self.___dynProps end
function node:addDynamicProperty(name, value)
self.___dynProps[name] = value
end end
return node return node
@@ -86,6 +93,12 @@ function XmlParser:ParseArgs(node, s)
end) end)
end end
function XmlParser:ParseDynamicArgs(node, s)
string.gsub(s, "(%w+)={(.-)}", function(w, a)
node:addDynamicProperty(w, a)
end)
end
function XmlParser:ParseXmlText(xmlText) function XmlParser:ParseXmlText(xmlText)
local stack = {} local stack = {}
local top = newNode() local top = newNode()
@@ -103,10 +116,12 @@ function XmlParser:ParseXmlText(xmlText)
if empty == "/" then -- empty element tag if empty == "/" then -- empty element tag
local lNode = newNode(label) local lNode = newNode(label)
self:ParseArgs(lNode, xarg) self:ParseArgs(lNode, xarg)
self:ParseDynamicArgs(lNode, xarg)
top:addChild(lNode) top:addChild(lNode)
elseif c == "" then -- start tag elseif c == "" then -- start tag
local lNode = newNode(label) local lNode = newNode(label)
self:ParseArgs(lNode, xarg) self:ParseArgs(lNode, xarg)
self:ParseDynamicArgs(lNode, xarg)
table.insert(stack, lNode) table.insert(stack, lNode)
top = lNode top = lNode
else -- end tag else -- end tag
@@ -130,24 +145,6 @@ function XmlParser:ParseXmlText(xmlText)
return top return top
end end
function XmlParser:loadFile(xmlFilename, base)
if not base then
base = ""
end
local path = fs.combine(base, xmlFilename)
local hFile, err = io.open(path, "r");
if hFile and not err then
local xmlText = hFile:read("*a"); -- read file content
io.close(hFile);
return self:ParseXmlText(xmlText), nil;
else
print(err)
return nil
end
end
local function executeScript(scripts) local function executeScript(scripts)
for k,v in pairs(scripts)do for k,v in pairs(scripts)do
if(k~="env")then if(k~="env")then
@@ -178,16 +175,58 @@ return {
VisualObject = function(base, basalt) VisualObject = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
local x, y = self:getPosition()
local w, h = self:getSize()
if (name == "x") then
self:setPosition(value, y)
elseif (name == "y") then
self:setPosition(x, value)
elseif (name == "width") then
self:setSize(value, h)
elseif (name == "height") then
self:setSize(w, value)
elseif (name == "background") then
self:setBackground(colors[value])
elseif (name == "foreground") then
self:setForeground(colors[value])
end
end,
updateSpecifiedValuesByXMLData = function(self, data, valueNames)
for _, name in ipairs(valueNames) do
local value = xmlValue(name, data)
if (value ~= nil) then
self:updateValue(name, value)
end
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
scripts.env[self:getName()] = self scripts.env[self:getName()] = self
local x, y = self:getPosition() for k,v in pairs(data:dynamicProperties()) do
local w, h = nil, nil local sharedVariable = string.sub(v, 8, -1)
if(xmlValue("x", data)~=nil)then x = xmlValue("x", data) end local sharedObservers = scripts.env.sharedObservers
if(xmlValue("y", data)~=nil)then y = xmlValue("y", data) end if (sharedObservers[sharedVariable]) == nil then
if(xmlValue("width", data)~=nil)then w = xmlValue("width", data) end sharedObservers[sharedVariable] = {}
if(xmlValue("height", data)~=nil)then h = xmlValue("height", data) end end
if(xmlValue("background", data)~=nil)then self:setBackground(colors[xmlValue("background", data)]) end table.insert(
if(xmlValue("foreground", data)~=nil)then self:setForeground(colors[xmlValue("foreground", data)]) end sharedObservers[sharedVariable],
function(val)
self:updateValue(k, val)
end
)
end
self:updateSpecifiedValuesByXMLData(data, {
"x",
"y",
"width",
"height",
"background",
"foreground"
})
if(xmlValue("script", data)~=nil)then if(xmlValue("script", data)~=nil)then
@@ -203,13 +242,6 @@ return {
registerFunctionEvent(self, xmlValue(v, data), self[v], scripts) registerFunctionEvent(self, xmlValue(v, data), self[v], scripts)
end end
end end
self:setPosition(x, y)
if(w~=nil or h~=nil)then
local w1, h1 = self:getSize()
if w==nil then w = w1 end
if h==nil then h = h1 end
self:setSize(w, h)
end
return self return self
end, end,
@@ -219,9 +251,19 @@ return {
ChangeableObject = function(base, basalt) ChangeableObject = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "value") then
self:setValue(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("value", data)~=nil)then self:setValue(xmlValue("value", data)) end self:updateSpecifiedValuesByXMLData(data, {
"value"
})
if(xmlValue("onChange", data)~=nil)then if(xmlValue("onChange", data)~=nil)then
registerFunctionEvent(self, xmlValue("onChange", data), self.onChange, scripts) registerFunctionEvent(self, xmlValue("onChange", data), self.onChange, scripts)
end end
@@ -252,13 +294,24 @@ return {
end end
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local xOffset, yOffset = self:getOffset()
if (name == "layout") then
self:setLayout(value)
elseif (name == "xOffset") then
self:setOffset(value, yOffset)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
lastXMLReferences = {} lastXMLReferences = {}
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local xOffset, yOffset = self:getOffset() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("layout", data)~=nil)then self:loadLayout(xmlValue("layout", data)) end "layout",
if(xmlValue("xOffset", data)~=nil)then xOffset = xmlValue("xOffset", data) end "xOffset"
self:setOffset(xOffset, yOffset) })
local objectList = data:children() local objectList = data:children()
local _OBJECTS = basalt.getObjects() local _OBJECTS = basalt.getObjects()
@@ -286,6 +339,22 @@ return {
scripts.env = _ENV scripts.env = _ENV
scripts.env.basalt = basalt scripts.env.basalt = basalt
scripts.env.shared = {} scripts.env.shared = {}
scripts.env.sharedObservers = {}
local shared = {}
setmetatable(scripts.env.shared, {
__index = function(_, k)
return shared[k]
end,
__newindex = function(_, k, v)
local observers = scripts.env.sharedObservers[k]
if observers ~= nil then
for _,observer in pairs(observers) do
observer(v)
end
end
shared[k] = v
end
})
local f = fs.open(path, "r") local f = fs.open(path, "r")
local data = XmlParser:ParseXmlText(f.readAll()) local data = XmlParser:ParseXmlText(f.readAll())
f.close() f.close()
@@ -321,13 +390,26 @@ return {
end end
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local xOffset, yOffset = self:getOffset()
if (name == "layout") then
self:setLayout(value)
elseif (name == "xOffset") then
self:setOffset(value, yOffset)
elseif (name == "yOffset") then
self:setOffset(xOffset, value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local xOffset, yOffset = self:getOffset() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("layout", data)~=nil)then self:loadLayout(xmlValue("layout", data)) end "layout",
if(xmlValue("xOffset", data)~=nil)then xOffset = xmlValue("xOffset", data) end "xOffset",
if(xmlValue("yOffset", data)~=nil)then yOffset = xmlValue("yOffset", data) end "yOffset"
self:setOffset(xOffset, yOffset) })
local objectList = data:children() local objectList = data:children()
local _OBJECTS = basalt.getObjects() local _OBJECTS = basalt.getObjects()
@@ -371,11 +453,25 @@ return {
Flexbox = function(base, basalt) Flexbox = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "flexDirection") then
self:setFlexDirection(value)
elseif (name == "justifyContent") then
self:setJustifyContent(value)
elseif (name == "spacing") then
self:setSpacing(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("flexDirection", data)~=nil)then self:setFlexDirection(xmlValue("flexDirection", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("justifyContent", data)~=nil)then self:setJustifyContent(xmlValue("justifyContent", data)) end "flexDirection",
if(xmlValue("spacing", data)~=nil)then self:setSpacing(xmlValue("spacing", data)) end "justifyContent",
"spacing"
})
return self return self
end, end,
} }
@@ -384,11 +480,25 @@ return {
Button = function(base, basalt) Button = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "text") then
self:setText(value)
elseif (name == "horizontalAlign") then
self:setHorizontalAlign(value)
elseif (name == "verticalAlign") then
self:setVerticalAlign(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("text", data)~=nil)then self:setText(xmlValue("text", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("horizontalAlign", data)~=nil)then self:setHorizontalAlign(xmlValue("horizontalAlign", data)) end "text",
if(xmlValue("verticalAlign", data)~=nil)then self:setText(xmlValue("verticalAlign", data)) end "horizontalAlign",
"verticalAlign"
})
return self return self
end, end,
} }
@@ -397,10 +507,22 @@ return {
Label = function(base, basalt) Label = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "text") then
self:setText(value)
elseif (name == "align") then
self:setAlign(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("text", data)~=nil)then self:setText(xmlValue("text", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("align", data)~=nil)then self:setTextAlign(xmlValue("align", data)) end "text",
"align"
})
return self return self
end, end,
} }
@@ -409,17 +531,38 @@ return {
Input = function(base, basalt) Input = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local defaultText, defaultFG, defaultBG = self:getDefaultText()
if (name == "defaultText") then
self:setDefaultText(value, defaultFG, defaultBG)
elseif (name == "defaultFG") then
self:setDefaultText(defaultText, value, defaultBG)
elseif (name == "defaultBG") then
self:setDefaultText(defaultText, defaultFG, value)
elseif (name == "offset") then
self:setOffset(value)
elseif (name == "textOffset") then
self:setTextOffset(value)
elseif (name == "text") then
self:setText(value)
elseif (name == "inputLimit") then
self:setInputLimit(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local defaultText, defaultFG, defaultBG = self:getDefaultText() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("defaultText", data)~=nil)then defaultText = xmlValue("defaultText", data) end "defaultText",
if(xmlValue("defaultFG", data)~=nil)then defaultFG = xmlValue("defaultFG", data) end "defaultFG",
if(xmlValue("defaultBG", data)~=nil)then defaultBG = xmlValue("defaultBG", data) end "defaultBG",
self:setDefaultText(defaultText, defaultFG, defaultBG) "offset",
if(xmlValue("offset", data)~=nil)then self:setOffset(xmlValue("offset", data)) end "textOffset",
if(xmlValue("textOffset", data)~=nil)then self:setTextOffset(xmlValue("textOffset", data)) end "text",
if(xmlValue("text", data)~=nil)then self:setValue(xmlValue("text", data)) end "inputLimit"
if(xmlValue("inputLimit", data)~=nil)then self:setInputLimit(xmlValue("inputLimit", data)) end })
return self return self
end, end,
} }
@@ -428,15 +571,33 @@ return {
Image = function(base, basalt) Image = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local xOffset, yOffset = self:getOffset()
if (name == "xOffset") then
self:setOffset(value, yOffset)
elseif (name == "yOffset") then
self:setOffset(xOffset, value)
elseif (name == "path") then
self:loadImage(value)
elseif (name == "usePalette") then
self:usePalette(value)
elseif (name == "play") then
self:play(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local xOffset, yOffset = self:getOffset() local xOffset, yOffset = self:getOffset()
if(xmlValue("xOffset", data)~=nil)then xOffset = xmlValue("xOffset", data) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("yOffset", data)~=nil)then yOffset = xmlValue("yOffset", data) end "xOffset",
self:setOffset(xOffset, yOffset) "yOffset",
if(xmlValue("path", data)~=nil)then self:loadImage(xmlValue("path", data)) end "path",
if(xmlValue("usePalette", data)~=nil)then self:usePalette(xmlValue("usePalette", data)) end "usePalette",
if(xmlValue("play", data)~=nil)then self:play(xmlValue("play", data)) end "play"
})
return self return self
end, end,
} }
@@ -445,15 +606,32 @@ return {
Checkbox = function(base, basalt) Checkbox = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local activeSymbol, inactiveSymbol = self:getSymbol()
if (name == "text") then
self:setText(value)
elseif (name == "checked") then
self:setChecked(value)
elseif (name == "textPosition") then
self:setTextPosition(value)
elseif (name == "activeSymbol") then
self:setSymbol(value, inactiveSymbol)
elseif (name == "inactiveSymbol") then
self:setSymbol(activeSymbol, value)
end
end,
setValuesByXMLData = function(self, dat, scriptsa) setValuesByXMLData = function(self, dat, scriptsa)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local activeSymbol, inactiveSymbol = self:getSymbol() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("text", data)~=nil)then self:setText(xmlValue("text", data)) end "text",
if(xmlValue("checked", data)~=nil)then self:setChecked(xmlValue("checked", data)) end "checked",
if(xmlValue("textPosition", data)~=nil)then self:setTextPosition(xmlValue("textPosition", data)) end "textPosition",
if(xmlValue("activeSymbol", data)~=nil)then activeSymbol = xmlValue("activeSymbol", data) end "activeSymbol",
if(xmlValue("inactiveSymbol", data)~=nil)then inactiveSymbol = xmlValue("inactiveSymbol", data) end "inactiveSymbol"
self:setSymbol(activeSymbol, inactiveSymbol) })
return self return self
end, end,
} }
@@ -462,9 +640,19 @@ return {
Program = function(base, basalt) Program = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "execute") then
self:execute(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("execute", data)~=nil)then self:execute(xmlValue("execute", data)) end self:updateSpecifiedValuesByXMLData(data, {
"execute"
})
return self return self
end, end,
} }
@@ -473,15 +661,35 @@ return {
Progressbar = function(base, basalt) Progressbar = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local activeBarColor, activeBarSymbol, activeBarSymbolCol = self:getProgressBar()
if (name == "direction") then
self:setDirection(value)
elseif (name == "activeBarColor") then
self:setProgressBar(value, activeBarSymbol, activeBarSymbolCol)
elseif (name == "activeBarSymbol") then
self:setProgressBar(activeBarColor, value, activeBarSymbolCol)
elseif (name == "activeBarSymbolColor") then
self:setProgressBar(activeBarColor, activeBarSymbol, value)
elseif (name == "backgroundSymbol") then
self:setBackgroundSymbol(value)
elseif (name == "progress") then
self:setProgress(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local activeBarColor, activeBarSymbol, activeBarSymbolCol = self:getProgressBar() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("direction", data)~=nil)then self:setDirection(xmlValue("direction", data)) end "direction",
if(xmlValue("activeBarColor", data)~=nil)then activeBarColor = colors[xmlValue("activeBarColor", data)] end "activeBarColor",
if(xmlValue("activeBarSymbol", data)~=nil)then activeBarSymbol = xmlValue("activeBarSymbol", data) end "activeBarSymbol",
if(xmlValue("activeBarSymbolColor", data)~=nil)then activeBarSymbolCol = colors[xmlValue("activeBarSymbolColor", data)] end "activeBarSymbolColor",
if(xmlValue("backgroundSymbol", data)~=nil)then self:setBackgroundSymbol(xmlValue("backgroundSymbol", data)) end "backgroundSymbol",
if(xmlValue("progress", data)~=nil)then self:setProgress(xmlValue("progress", data)) end "progress"
})
return self return self
end, end,
} }
@@ -490,13 +698,31 @@ return {
Slider = function(base, basalt) Slider = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "symbol") then
self:setSymbol(value)
elseif (name == "symbolColor") then
self:setSymbolColor(value)
elseif (name == "index") then
self:setIndex(value)
elseif (name == "maxValue") then
self:setMaxValue(value)
elseif (name == "barType") then
self:setBarType(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("symbol", data)~=nil)then self:setSymbol(xmlValue("symbol", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("symbolColor", data)~=nil)then self:setSymbolColor(xmlValue("symbolColor", data)) end "symbol",
if(xmlValue("index", data)~=nil)then self:setIndex(xmlValue("index", data)) end "symbolColor",
if(xmlValue("maxValue", data)~=nil)then self:setIndex(xmlValue("maxValue", data)) end "index",
if(xmlValue("barType", data)~=nil)then self:setBarType(xmlValue("barType", data)) end "maxValue",
"barType"
})
return self return self
end, end,
} }
@@ -505,15 +731,37 @@ return {
Scrollbar = function(base, basalt) Scrollbar = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "symbol") then
self:setSymbol(value)
elseif (name == "symbolColor") then
self:setSymbolColor(value)
elseif (name == "symbolSize") then
self:setSymbolSize(value)
elseif (name == "scrollAmount") then
self:setScrollAmount(value)
elseif (name == "index") then
self:setIndex(value)
elseif (name == "maxValue") then
self:setMaxValue(value)
elseif (name == "barType") then
self:setBarType(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("symbol", data)~=nil)then self:setSymbol(xmlValue("symbol", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("symbolColor", data)~=nil)then self:setSymbolColor(xmlValue("symbolColor", data)) end "symbol",
if(xmlValue("symbolSize", data)~=nil)then self:setSymbolSize(xmlValue("symbolSize", data)) end "symbolColor",
if(xmlValue("scrollAmount", data)~=nil)then self:setScrollAmount(xmlValue("scrollAmount", data)) end "symbolSize",
if(xmlValue("index", data)~=nil)then self:setIndex(xmlValue("index", data)) end "scrollAmount",
if(xmlValue("maxValue", data)~=nil)then self:setIndex(xmlValue("maxValue", data)) end "index",
if(xmlValue("barType", data)~=nil)then self:setBarType(xmlValue("barType", data)) end "maxValue",
"barType"
})
return self return self
end, end,
} }
@@ -522,9 +770,19 @@ return {
MonitorFrame = function(base, basalt) MonitorFrame = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "monitor") then
self:setMonitor(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("monitor", data)~=nil)then self:setSymbol(xmlValue("monitor", data)) end self:updateSpecifiedValuesByXMLData(data, {
"monitor"
})
return self return self
end, end,
} }
@@ -533,11 +791,25 @@ return {
Switch = function(base, basalt) Switch = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "symbol") then
self:setSymbol(value)
elseif (name == "activeBackground") then
self:setActiveBackground(value)
elseif (name == "inactiveBackground") then
self:setInactiveBackground(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("symbol", data)~=nil)then self:setSymbol(xmlValue("symbol", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("activeBackground", data)~=nil)then self:setActiveBackground(xmlValue("activeBackground", data)) end "symbol",
if(xmlValue("inactiveBackground", data)~=nil)then self:setInactiveBackground(xmlValue("inactiveBackground", data)) end "activeBackground",
"inactiveBackground"
})
return self return self
end, end,
} }
@@ -546,54 +818,68 @@ return {
Textfield = function(base, basalt) Textfield = function(base, basalt)
local object = { local object = {
setValuesByXMLData = function(self, data, scripts) updateValue = function(self, name, value)
base.setValuesByXMLData(self, data, scripts) if (value == null) then return end
local bgSel, fgSel = self:getSelection() base.updateValue(self, name, value)
local xOffset, yOffset = self:getOffset() local fgSel, bgSel = self:getSelection()
if(xmlValue("bgSelection", data)~=nil)then bgSel = xmlValue("bgSelection", data) end local xOffset, yOffset = self:getOffset()
if(xmlValue("fgSelection", data)~=nil)then fgSel = xmlValue("fgSelection", data) end if (name == "bgSelection") then
if(xmlValue("xOffset", data)~=nil)then xOffset = xmlValue("xOffset", data) end self:setSelection(fgSel, value)
if(xmlValue("yOffset", data)~=nil)then yOffset = xmlValue("yOffset", data) end elseif (name == "fgSelection") then
self:setSelection(fgSel, bgSel) self:setSelection(value, bgSel)
self:setOffset(xOffset, yOffset) elseif (name == "xOffset") then
self:setOffset(value, yOffset)
elseif (name == "yOffset") then
if(data["lines"]~=nil)then self:setOffset(xOffset, value)
local l = data["lines"]["line"]
if(l.properties~=nil)then l = {l} end
for k,v in pairs(l)do
self:addLine(v:value())
end end
end end,
if(data["keywords"]~=nil)then
for k,v in pairs(data["keywords"])do setValuesByXMLData = function(self, data, scripts)
if(colors[k]~=nil)then base.setValuesByXMLData(self, data, scripts)
local entry = v self:updateSpecifiedValuesByXMLData(data, {
if(entry.properties~=nil)then entry = {entry} end "bgSelection",
local tab = {} "fgSelection",
for a,b in pairs(entry)do "xOffset",
local keywordList = b["keyword"] "yOffset"
if(b["keyword"].properties~=nil)then keywordList = {b["keyword"]} end })
for c,d in pairs(keywordList)do
table.insert(tab, d:value())
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
self:addLine(v:value())
end
end
if(data["keywords"]~=nil)then
for k,v in pairs(data["keywords"])do
if(colors[k]~=nil)then
local entry = v
if(entry.properties~=nil)then entry = {entry} end
local tab = {}
for a,b in pairs(entry)do
local keywordList = b["keyword"]
if(b["keyword"].properties~=nil)then keywordList = {b["keyword"]} end
for c,d in pairs(keywordList)do
table.insert(tab, d:value())
end
end
self:addKeywords(colors[k], tab)
end
end
end
if(data["rules"]~=nil)then
if(data["rules"]["rule"]~=nil)then
local tab = data["rules"]["rule"]
if(data["rules"]["rule"].properties~=nil)then tab = {data["rules"]["rule"]} end
for k,v in pairs(tab)do
if(xmlValue("pattern", v)~=nil)then
self:addRule(xmlValue("pattern", v), colors[xmlValue("fg", v)], colors[xmlValue("bg", v)])
end end
end end
self:addKeywords(colors[k], tab)
end end
end end
end
if(data["rules"]~=nil)then
if(data["rules"]["rule"]~=nil)then
local tab = data["rules"]["rule"]
if(data["rules"]["rule"].properties~=nil)then tab = {data["rules"]["rule"]} end
for k,v in pairs(tab)do
if(xmlValue("pattern", v)~=nil)then
self:addRule(xmlValue("pattern", v), colors[xmlValue("fg", v)], colors[xmlValue("bg", v)])
end
end
end
end
return self return self
end, end,
} }
@@ -615,10 +901,22 @@ return {
Timer = function(base, basalt) Timer = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "start") then
self:start(value)
elseif (name == "time") then
self:setTime(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("start", data)~=nil)then self:start(xmlValue("start", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("time", data)~=nil)then self:setTime(xmlValue("time", data)) end "start",
"time"
})
if(xmlValue("onCall", data)~=nil)then if(xmlValue("onCall", data)~=nil)then
registerFunctionEvent(self, xmlValue("onCall", data), self.onCall, scripts) registerFunctionEvent(self, xmlValue("onCall", data), self.onCall, scripts)
@@ -631,16 +929,32 @@ return {
List = function(base, basalt) List = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local selBg, selFg = self:getSelectionColor()
if (name == "align") then
self:setTextAlign(value)
elseif (name == "offset") then
self:setOffset(value)
elseif (name == "selectionBg") then
self:setSelectionColor(value, selFg)
elseif (name == "selectionFg") then
self:setSelectionColor(selBg, value)
elseif (name == "scrollable") then
self:setScrollable(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local selBg, selFg = self:getSelectionColor() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("align", data)~=nil)then self:setTextAlign(xmlValue("align", data)) end "align",
if(xmlValue("offset", data)~=nil)then self:setOffset(xmlValue("offset", data)) end "offset",
if(xmlValue("selectionBg", data)~=nil)then selBg = xmlValue("selectionBg", data) end "selectionBg",
if(xmlValue("selectionFg", data)~=nil)then selFg = xmlValue("selectionFg", data) end "selectionFg",
self:setSelectionColor(selBg, selFg) "scrollable"
})
if(xmlValue("scrollable", data)~=nil)then self:setScrollable(xmlValue("scrollable", data)) end
if(data["item"]~=nil)then if(data["item"]~=nil)then
local tab = data["item"] local tab = data["item"]
@@ -659,12 +973,23 @@ return {
Dropdown = function(base, basalt) Dropdown = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local w, h = self:getDropdownSize()
if (name == "dropdownWidth") then
self:setDropdownSize(value, h)
elseif (name == "dropdownHeight") then
self:setDropdownSize(w, value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local w, h = self:getDropdownSize() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("dropdownWidth", data)~=nil)then w = xmlValue("dropdownWidth", data) end "dropdownWidth",
if(xmlValue("dropdownHeight", data)~=nil)then h = xmlValue("dropdownHeight", data) end "dropdownHeight"
self:setDropdownSize(w, h) })
return self return self
end, end,
} }
@@ -673,18 +998,30 @@ return {
Radio = function(base, basalt) Radio = function(base, basalt)
local object = { local object = {
setValuesByXMLData = function(self, data, scripts) updateValue = function(self, name, value)
base.setValuesByXMLData(self, data, scripts) if (value == null) then return end
base.updateValue(self, name, value)
local selBg, selFg = self:getBoxSelectionColor() local selBg, selFg = self:getBoxSelectionColor()
local defBg, defFg = self:setBoxDefaultColor() local defBg, defFg = self:setBoxDefaultColor()
if (name == "selectionBg") then
self:setBoxSelectionColor(value, selFg)
elseif (name == "selectionFg") then
self:setBoxSelectionColor(selBg, value)
elseif (name == "defaultBg") then
self:setBoxDefaultColor(value, defFg)
elseif (name == "defaultFg") then
self:setBoxDefaultColor(defBg, value)
end
end,
if(xmlValue("selectionBg", data)~=nil)then selBg = xmlValue("selectionBg", data) end setValuesByXMLData = function(self, data, scripts)
if(xmlValue("selectionFg", data)~=nil)then selFg = xmlValue("selectionFg", data) end base.setValuesByXMLData(self, data, scripts)
self:setBoxSelectionColor(selBg, selFg) self:updateSpecifiedValuesByXMLData(data, {
"selectionBg",
if(xmlValue("defaultBg", data)~=nil)then defBg = xmlValue("defaultBg", data) end "selectionFg",
if(xmlValue("defaultFg", data)~=nil)then defFg = xmlValue("defaultFg", data) end "defaultBg",
self:setBoxDefaultColor(defBg, defFg) "defaultFg"
})
if(data["item"]~=nil)then if(data["item"]~=nil)then
local tab = data["item"] local tab = data["item"]
@@ -701,10 +1038,22 @@ return {
Menubar = function(base, basalt) Menubar = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
if (name == "space") then
self:setSpace(value)
elseif (name == "scrollable") then
self:setScrollable(value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
if(xmlValue("space", data)~=nil)then self:setSpace(xmlValue("space", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("scrollable", data)~=nil)then self:setScrollable(xmlValue("scrollable", data)) end "space",
"scrollable"
})
return self return self
end, end,
} }
@@ -713,16 +1062,35 @@ return {
Graph = function(base, basalt) Graph = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local symbol, symbolCol = self:getGraphSymbol()
if (name == "maxEntries") then
self:setMaxEntries(value)
elseif (name == "type") then
self:setType(value)
elseif (name == "minValue") then
self:setMinValue(value)
elseif (name == "maxValue") then
self:setMaxValue(value)
elseif (name == "symbol") then
self:setGraphSymbol(value, symbolCol)
elseif (name == "symbolColor") then
self:setGraphSymbol(symbol, value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local symbol, symbolCol = self:getGraphSymbol() self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("maxEntries", data)~=nil)then self:setMaxEntries(xmlValue("maxEntries", data)) end "maxEntries",
if(xmlValue("type", data)~=nil)then self:setGraphType(xmlValue("type", data)) end "type",
if(xmlValue("minValue", data)~=nil)then self:setMinValue(xmlValue("minValue", data)) end "minValue",
if(xmlValue("maxValue", data)~=nil)then self:setMaxValue(xmlValue("maxValue", data)) end "maxValue",
if(xmlValue("symbol", data)~=nil)then symbol = xmlValue("symbol", data) end "symbol",
if(xmlValue("symbolColor", data)~=nil)then symbolCol = xmlValue("symbolColor", data) end "symbolColor"
self:setGraphSymbol(symbol, symbolCol) })
if(data["item"]~=nil)then if(data["item"]~=nil)then
local tab = data["item"] local tab = data["item"]
if(tab.properties~=nil)then tab = {tab} end if(tab.properties~=nil)then tab = {tab} end
@@ -738,18 +1106,38 @@ return {
Treeview = function(base, basalt) Treeview = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value)
if (value == null) then return end
base.updateValue(self, name, value)
local selBg, selFg = self:getSelectionColor()
local xOffset, yOffset = self:getOffset()
if (name == "space") then
self:setSpace(value)
elseif (name == "scrollable") then
self:setScrollable(value)
elseif (name == "selectionBg") then
self:setSelectionColor(value, selFg)
elseif (name == "selectionFg") then
self:setSelectionColor(selBg, value)
elseif (name == "xOffset") then
self:setOffset(value, yOffset)
elseif (name == "yOffset") then
self:setOffset(xOffset, value)
end
end,
setValuesByXMLData = function(self, data, scripts) setValuesByXMLData = function(self, data, scripts)
base.setValuesByXMLData(self, data, scripts) base.setValuesByXMLData(self, data, scripts)
local selBg, selFg = self:getSelectionColor() local selBg, selFg = self:getSelectionColor()
local xOffset, yOffset = self:getOffset() local xOffset, yOffset = self:getOffset()
if(xmlValue("space", data)~=nil)then self:setSpace(xmlValue("space", data)) end self:updateSpecifiedValuesByXMLData(data, {
if(xmlValue("scrollable", data)~=nil)then self:setScrollable(xmlValue("scrollable", data)) end "space",
if(xmlValue("selectionBg", data)~=nil)then selBg = xmlValue("selectionBg", data) end "scrollable",
if(xmlValue("selectionFg", data)~=nil)then selFg = xmlValue("selectionFg", data) end "selectionBg",
self:setSelectionColor(selBg, selFg) "selectionFg",
if(xmlValue("xOffset", data)~=nil)then xOffset = xmlValue("xOffset", data) end "xOffset",
if(xmlValue("yOffset", data)~=nil)then yOffset = xmlValue("yOffset", data) end "yOffset"
self:setOffset(xOffset, yOffset) })
local function addNode(node, data) local function addNode(node, data)
if(data["node"]~=nil)then if(data["node"]~=nil)then
local tab = data["node"] local tab = data["node"]

View File

@@ -107,3 +107,22 @@ In both examples, you can see that XML provides a straightforward way to build a
Notably, you can access UI elements by their assigned ID directly in the event code. In the examples above, the titleLabel and okButton elements are accessed simply by referencing their IDs. This convenient feature eliminates the need to search for or store references to the elements in your code. Notably, you can access UI elements by their assigned ID directly in the event code. In the examples above, the titleLabel and okButton elements are accessed simply by referencing their IDs. This convenient feature eliminates the need to search for or store references to the elements in your code.
Remember: IDs have to be unique! Remember: IDs have to be unique!
## Dynamic attributes (BETA)
Most attributes can also be set to track a shared variable using the curly braces {} syntax. In this case, the initial value for the variable should be set inside the `<script>` tag.
The earlier example rewritten using dynamic attributes:
```xml
<label id="titleLabel" text="Welcome to Basalt!" x="10" y="2" />
<button id="okButton" text={shared.okButtonText} x="10" y="5">
<onClick>
shared.okButtonText = "Button clicked!"
</onClick>
</button>
<script>
shared.okButtonText = "OK"
</script>
```