[XML] Consolidate loadLayout implementations #73

Merged
thesabinelim merged 1 commits from consolidate-load-layout into master 2023-05-14 02:41:49 +08:00

View File

@@ -317,20 +317,22 @@ return {
return object return object
end, end,
BaseFrame = function(base, basalt) Container = function(base, basalt)
local lastXMLReferences = {} local lastXMLReferences = {}
local function xmlDefaultValues(data, obj, renderContext) local function xmlDefaultValues(data, obj, renderContext)
if(obj~=nil)then if (obj~=nil) then
obj:setValuesByXMLData(data, renderContext) obj:setValuesByXMLData(data, renderContext)
end end
end end
local function addXMLObjectType(tab, f, self, renderContext) local function addXMLObjectType(tab, addFn, self, renderContext)
if(tab~=nil)then if (tab ~= nil) then
if(tab.properties~=nil)then tab = {tab} end if (tab.properties ~= nil) then
for _,v in pairs(tab)do tab = {tab}
local obj = f(self, v["@id"] or uuid()) end
for _, v in pairs(tab) do
local obj = addFn(self, v["@id"] or uuid())
lastXMLReferences[obj:getName()] = obj lastXMLReferences[obj:getName()] = obj
xmlDefaultValues(v, obj, renderContext) xmlDefaultValues(v, obj, renderContext)
end end
@@ -338,33 +340,19 @@ return {
end end
local object = { local object = {
updateValue = function(self, name, value)
if (value == nil) then return end
base.updateValue(self, name, value)
local _, yOffset = self:getOffset()
if (name == "layout") then
self:setLayout(value)
elseif (name == "xOffset") then
self:setOffset(value, yOffset)
end
end,
setValuesByXMLData = function(self, data, renderContext) setValuesByXMLData = function(self, data, renderContext)
lastXMLReferences = {} lastXMLReferences = {}
base.setValuesByXMLData(self, data, renderContext) base.setValuesByXMLData(self, data, renderContext)
self:updateSpecifiedValuesByXMLData(data, {
"layout",
"xOffset"
})
local objectList = data:children() local children = data:children()
local _OBJECTS = basalt.getObjects() local _OBJECTS = basalt.getObjects()
for _,v in pairs(objectList)do for _, childNode in pairs(children) do
if(v.___name~="animation")then if (childNode.___name~="animation") then
local name = v.___name:gsub("^%l", string.upper) local objectKey = childNode.___name:gsub("^%l", string.upper)
if(_OBJECTS[name]~=nil)then if(_OBJECTS[objectKey] ~= nil) then
addXMLObjectType(v, self["add"..name], self, renderContext) local addFn = self["add" .. objectKey]
addXMLObjectType(childNode, addFn, self, renderContext)
end end
end end
end end
@@ -373,10 +361,6 @@ return {
return self return self
end, end,
getXMLElements = function(self)
return lastXMLReferences
end,
loadLayout = function(self, path, props) loadLayout = function(self, path, props)
if(fs.exists(path))then if(fs.exists(path))then
local renderContext = {} local renderContext = {}
@@ -392,30 +376,39 @@ return {
return self return self
end, end,
getXMLElements = function(self)
return lastXMLReferences
end,
}
return object
end,
BaseFrame = function(base, basalt)
local object = {
updateValue = function(self, name, value)
if (value == nil) then return end
base.updateValue(self, name, value)
local _, yOffset = self:getOffset()
if (name == "layout") then
self:setLayout(value)
elseif (name == "xOffset") then
self:setOffset(value, yOffset)
end
end,
setValuesByXMLData = function(self, data, renderContext)
base.setValuesByXMLData(self, data, renderContext)
self:updateSpecifiedValuesByXMLData(data, {
"layout",
"xOffset"
})
return self
end,
} }
return object return object
end, end,
Frame = function(base, basalt) Frame = function(base, basalt)
local lastXMLReferences = {}
local function xmlDefaultValues(data, obj, renderContext)
if(obj~=nil)then
obj:setValuesByXMLData(data, renderContext)
end
end
local function addXMLObjectType(tab, f, self, renderContext)
if(tab~=nil)then
if(tab.properties~=nil)then tab = {tab} end
for _,v in pairs(tab)do
local obj = f(self, v["@id"] or uuid())
lastXMLReferences[obj:getName()] = obj
xmlDefaultValues(v, obj, renderContext)
end
end
end
local object = { local object = {
updateValue = function(self, name, value) updateValue = function(self, name, value)
if (value == nil) then return end if (value == nil) then return end
@@ -437,39 +430,6 @@ return {
"xOffset", "xOffset",
"yOffset" "yOffset"
}) })
local objectList = data:children()
local _OBJECTS = basalt.getObjects()
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, renderContext)
end
end
end
addXMLObjectType(data["animation"], self.addAnimation, self, renderContext)
return self
end,
getXMLElements = function(self)
return lastXMLReferences
end,
loadLayout = function(self, path, props)
if(fs.exists(path))then
local renderContext = {}
renderContext.env = _ENV
renderContext.env.props = props
local f = fs.open(path, "r")
local data = XmlParser:ParseXmlText(f.readAll())
f.close()
lastXMLReferences = {}
maybeExecuteScript(data, renderContext)
self:setValuesByXMLData(data, renderContext)
end
return self return self
end, end,
} }
@@ -509,7 +469,6 @@ return {
Button = function(base, basalt) Button = function(base, basalt)
local object = { local object = {
updateValue = function(self, name, value) updateValue = function(self, name, value)
basalt.log("Updating value, " .. name .. " = " .. value)
if (value == nil) then return end if (value == nil) then return end
base.updateValue(self, name, value) base.updateValue(self, name, value)
if (name == "text") then if (name == "text") then