From 6895c6883ff55bd3e373906daca611d8e3347cfd Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Sun, 14 May 2023 04:37:50 +1000 Subject: [PATCH 1/3] Consolidate loadLayout implementations --- Basalt/plugins/xml.lua | 129 ++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 85 deletions(-) diff --git a/Basalt/plugins/xml.lua b/Basalt/plugins/xml.lua index 8d35d2a..affb3a3 100644 --- a/Basalt/plugins/xml.lua +++ b/Basalt/plugins/xml.lua @@ -317,20 +317,22 @@ return { return object end, - BaseFrame = function(base, basalt) + Container = function(base, basalt) local lastXMLReferences = {} local function xmlDefaultValues(data, obj, renderContext) - if(obj~=nil)then + 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()) + local function addXMLObjectType(tab, addFn, self, renderContext) + if (tab ~= nil) then + if (tab.properties ~= nil) then + tab = {tab} + end + for _, v in pairs(tab) do + local obj = addFn(self, v["@id"] or uuid()) lastXMLReferences[obj:getName()] = obj xmlDefaultValues(v, obj, renderContext) end @@ -338,33 +340,19 @@ return { end 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) lastXMLReferences = {} base.setValuesByXMLData(self, data, renderContext) - self:updateSpecifiedValuesByXMLData(data, { - "layout", - "xOffset" - }) - local objectList = data:children() + local children = 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) + for _, childNode in pairs(children) do + if (childNode.___name~="animation") then + local objectKey = childNode.___name:gsub("^%l", string.upper) + if(_OBJECTS[objectKey] ~= nil) then + local addFn = self["add" .. objectKey] + addXMLObjectType(childNode, addFn, self, renderContext) end end end @@ -373,10 +361,6 @@ return { return self end, - getXMLElements = function(self) - return lastXMLReferences - end, - loadLayout = function(self, path, props) if(fs.exists(path))then local renderContext = {} @@ -392,30 +376,39 @@ return { return self 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 end, 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 = { updateValue = function(self, name, value) if (value == nil) then return end @@ -437,39 +430,6 @@ return { "xOffset", "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 end, } @@ -509,7 +469,6 @@ return { Button = function(base, basalt) local object = { updateValue = function(self, name, value) - basalt.log("Updating value, " .. name .. " = " .. value) if (value == nil) then return end base.updateValue(self, name, value) if (name == "text") then From 6fad764537069e08e264cad30d1c55484ccbea25 Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Sun, 14 May 2023 19:42:06 +1000 Subject: [PATCH 2/3] Untracked --- Basalt/plugins/xml.lua | 45 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/Basalt/plugins/xml.lua b/Basalt/plugins/xml.lua index affb3a3..1836176 100644 --- a/Basalt/plugins/xml.lua +++ b/Basalt/plugins/xml.lua @@ -167,7 +167,7 @@ local function registerFunctionEvent(self, data, event, renderContext) end end -local effectStack = {} +local currentEffect = nil local clearEffectDependencies = function(effect) for _, dependency in ipairs(effect.dependencies) do @@ -186,15 +186,14 @@ return { reactive = function(initialValue) local value = initialValue local observerEffects = {} - local getter = function() - local invokingEffect = effectStack[#effectStack] - if (invokingEffect ~= nil) then - table.insert(observerEffects, invokingEffect) - table.insert(invokingEffect.dependencies, observerEffects) + local get = function() + if (currentEffect ~= nil) then + table.insert(observerEffects, currentEffect) + table.insert(currentEffect.dependencies, observerEffects) end return value end - local setter = function(newValue) + local set = function(newValue) value = newValue local observerEffectsCopy = {} for index, effect in ipairs(observerEffects) do @@ -204,16 +203,25 @@ return { effect.execute() end end - return getter, setter + return get, set + end, + + untracked = function(getter) + local lastEffect = currentEffect + currentEffect = nil + local value = getter() + currentEffect = lastEffect + return value end, effect = function(effectFn) local effect = {dependencies = {}} local execute = function() clearEffectDependencies(effect) - table.insert(effectStack, effect) + local lastEffect = currentEffect + currentEffect = effect effectFn() - table.remove(effectStack) + currentEffect = lastEffect end effect.execute = execute effect.execute() @@ -326,12 +334,12 @@ return { end end - local function addXMLObjectType(tab, addFn, self, renderContext) - if (tab ~= nil) then - if (tab.properties ~= nil) then - tab = {tab} + local function addXMLObjectType(node, addFn, self, renderContext) + if (node ~= nil) then + if (node.properties ~= nil) then + node = {node} end - for _, v in pairs(tab) do + for _, v in pairs(node) do local obj = addFn(self, v["@id"] or uuid()) lastXMLReferences[obj:getName()] = obj xmlDefaultValues(v, obj, renderContext) @@ -348,9 +356,10 @@ return { local _OBJECTS = basalt.getObjects() for _, childNode in pairs(children) do - if (childNode.___name~="animation") then - local objectKey = childNode.___name:gsub("^%l", string.upper) - if(_OBJECTS[objectKey] ~= nil) then + local tagName = childNode.___name + if (tagName ~= "animation") then + local objectKey = tagName:gsub("^%l", string.upper) + if (_OBJECTS[objectKey] ~= nil) then local addFn = self["add" .. objectKey] addXMLObjectType(childNode, addFn, self, renderContext) end From ba81a2a09205b7f3df0e70e675867f603ee7c409 Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Sun, 14 May 2023 19:51:04 +1000 Subject: [PATCH 3/3] Rename lastEffect to prevEffect --- Basalt/plugins/xml.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Basalt/plugins/xml.lua b/Basalt/plugins/xml.lua index 1836176..db97a78 100644 --- a/Basalt/plugins/xml.lua +++ b/Basalt/plugins/xml.lua @@ -207,10 +207,10 @@ return { end, untracked = function(getter) - local lastEffect = currentEffect + local prevEffect = currentEffect currentEffect = nil local value = getter() - currentEffect = lastEffect + currentEffect = prevEffect return value end, @@ -218,10 +218,10 @@ return { local effect = {dependencies = {}} local execute = function() clearEffectDependencies(effect) - local lastEffect = currentEffect + local prevEffect = currentEffect currentEffect = effect effectFn() - currentEffect = lastEffect + currentEffect = prevEffect end effect.execute = execute effect.execute()