From 92b93a386257e11e5313f4ee378adda6a8a9d93d Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Mon, 1 May 2023 16:04:36 +0200 Subject: [PATCH] Fixed XML stuff - Added a XML Guide - Fixed some XML Code --- Basalt/libraries/utils.lua | 23 +++++ Basalt/objects/ChangeableObject.lua | 2 +- Basalt/objects/Label.lua | 9 ++ Basalt/plugin.lua | 2 +- Basalt/plugins/advancedBackground.lua | 7 +- Basalt/plugins/animations.lua | 3 + Basalt/plugins/bigfonts.lua | 12 +-- Basalt/plugins/border.lua | 3 + Basalt/plugins/dynamicValues.lua | 4 +- Basalt/plugins/shadow.lua | 7 +- Basalt/plugins/textures.lua | 7 +- Basalt/plugins/xml.lua | 40 ++++----- docs/_sidebar.md | 1 + docs/guides/dynamicvalues.md | 6 +- docs/guides/xml.md | 119 ++++++++++++++++++++++++++ 15 files changed, 198 insertions(+), 47 deletions(-) create mode 100644 docs/guides/xml.md diff --git a/Basalt/libraries/utils.lua b/Basalt/libraries/utils.lua index 9ad8e08..6f99e70 100644 --- a/Basalt/libraries/utils.lua +++ b/Basalt/libraries/utils.lua @@ -98,6 +98,29 @@ wrapText = function(str, width) return result end, +xmlValue = function(name, tab) + local var + if(type(tab)~="table")then return end + if(tab[name]~=nil)then + if(type(tab[name])=="table")then + if(tab[name].value~=nil)then + var = tab[name]:value() + end + end + end + if(var==nil)then var = tab["@"..name] end + + if(var=="true")then + var = true + elseif(var=="false")then + var = false + elseif(tonumber(var)~=nil)then + var = tonumber(var) + end + return var +end, + + uuid = function() return string.gsub(string.format('%x-%x-%x-%x-%x', math.random(0, 0xffff), math.random(0, 0xffff), math.random(0, 0xffff), math.random(0, 0x0fff) + 0x4000, math.random(0, 0x3fff) + 0x8000), ' ', '0') end diff --git a/Basalt/objects/ChangeableObject.lua b/Basalt/objects/ChangeableObject.lua index 8779d8c..3ef6dd7 100644 --- a/Basalt/objects/ChangeableObject.lua +++ b/Basalt/objects/ChangeableObject.lua @@ -37,4 +37,4 @@ return function(name, basalt) object.__index = object return setmetatable(object, base) -end +end \ No newline at end of file diff --git a/Basalt/objects/Label.lua b/Basalt/objects/Label.lua index 8867d18..b8c19c1 100644 --- a/Basalt/objects/Label.lua +++ b/Basalt/objects/Label.lua @@ -32,6 +32,15 @@ return function(name, basalt) return self end, + getAutoSize = function(self) + return autoSize + end, + + setAutoSize = function(self, bool) + autoSize = bool + return self + end, + getText = function(self) return text end, diff --git a/Basalt/plugin.lua b/Basalt/plugin.lua index 373a9fe..706bad7 100644 --- a/Basalt/plugin.lua +++ b/Basalt/plugin.lua @@ -53,4 +53,4 @@ return { end return objects end -} +} \ No newline at end of file diff --git a/Basalt/plugins/advancedBackground.lua b/Basalt/plugins/advancedBackground.lua index c85e45c..022d78d 100644 --- a/Basalt/plugins/advancedBackground.lua +++ b/Basalt/plugins/advancedBackground.lua @@ -1,3 +1,6 @@ +local utils = require("utils") +local xmlValue = utils.xmlValue + return { VisualObject = function(base) local bgSymbol = false @@ -26,8 +29,8 @@ return { return bgSymbolColor end, - setValuesByXMLData = function(self, data) - base.setValuesByXMLData(self, data) + setValuesByXMLData = function(self, data, scripts) + base.setValuesByXMLData(self, data, scripts) if(xmlValue("background-symbol", data)~=nil)then self:setBackgroundSymbol(xmlValue("background-symbol", data), xmlValue("background-symbol-color", data)) end return self end, diff --git a/Basalt/plugins/animations.lua b/Basalt/plugins/animations.lua index feb1726..b1c7663 100644 --- a/Basalt/plugins/animations.lua +++ b/Basalt/plugins/animations.lua @@ -215,6 +215,9 @@ local lerp = { easeInOutBounce=easeInOutBounce, } +local utils = require("utils") +local xmlValue = utils.xmlValue + return { VisualObject = function(base, basalt) local activeAnimations = {} diff --git a/Basalt/plugins/bigfonts.lua b/Basalt/plugins/bigfonts.lua index 09d8bd7..ddd347f 100644 --- a/Basalt/plugins/bigfonts.lua +++ b/Basalt/plugins/bigfonts.lua @@ -140,11 +140,12 @@ local function makeText(nSize, sString, nFC, nBC, bBlit) end -- The following code is related to basalt and has nothing to do with bigfonts, it creates a plugin which will be added to labels: +local utils = require("utils") +local xmlValue = utils.xmlValue return { Label = function(base) local fontsize = 1 local bigfont - local autoSize local object = { setFontSize = function(self, newFont) @@ -153,7 +154,7 @@ return { if(fontsize>1)then self:setDrawState("label", false) bigfont = makeText(fontsize-1, self:getText(), self:getForeground(), self:getBackground() or colors.lightGray) - if(autoSize)then + if(self:getAutoSize())then self:getBase():setSize(#bigfont[1][1], #bigfont[1]-1) end else @@ -168,12 +169,6 @@ return { return fontsize end, - setSize = function(self, w, h, r) - base.setSize(self, w, h, r) - autoSize = false - return self - end, - getSize = function(self) local w, h = base.getSize(self) if(fontsize>1)then @@ -203,7 +198,6 @@ return { setValuesByXMLData = function(self, data, scripts) base.setValuesByXMLData(self, data, scripts) - if(xmlValue("text", data)~=nil)then self:setText(xmlValue("text", data)) end if(xmlValue("fontSize", data)~=nil)then self:setFontSize(xmlValue("fontSize", data)) end return self end, diff --git a/Basalt/plugins/border.lua b/Basalt/plugins/border.lua index eebf20a..6c00d5c 100644 --- a/Basalt/plugins/border.lua +++ b/Basalt/plugins/border.lua @@ -1,3 +1,6 @@ +local utils = require("utils") +local xmlValue = utils.xmlValue + return { VisualObject = function(base) local inline = true diff --git a/Basalt/plugins/dynamicValues.lua b/Basalt/plugins/dynamicValues.lua index b6fa591..7c58315 100644 --- a/Basalt/plugins/dynamicValues.lua +++ b/Basalt/plugins/dynamicValues.lua @@ -1,4 +1,6 @@ -local count = require("utils").tableCount +local utils = require("utils") +local count = utils.tableCount +local xmlValue = utils.xmlValue return { VisualObject = function(base, basalt) diff --git a/Basalt/plugins/shadow.lua b/Basalt/plugins/shadow.lua index 49bfb81..c53c188 100644 --- a/Basalt/plugins/shadow.lua +++ b/Basalt/plugins/shadow.lua @@ -1,3 +1,6 @@ +local utils = require("utils") +local xmlValue = utils.xmlValue + return { VisualObject = function(base) local shadow = false @@ -28,8 +31,8 @@ return { end) end, - setValuesByXMLData = function(self, data) - base.setValuesByXMLData(self, data) + setValuesByXMLData = function(self, data, scripts) + base.setValuesByXMLData(self, data, scripts) if(xmlValue("shadow", data)~=nil)then self:setShadow(xmlValue("shadow", data)) end return self end diff --git a/Basalt/plugins/textures.lua b/Basalt/plugins/textures.lua index ff77019..2cc40ba 100644 --- a/Basalt/plugins/textures.lua +++ b/Basalt/plugins/textures.lua @@ -1,5 +1,6 @@ local images = require("images") - +local utils = require("utils") +local xmlValue = utils.xmlValue return { VisualObject = function(base) local textureId, infinitePlay = 1, true @@ -108,8 +109,8 @@ return { self:setDrawState("texture-base", false) end, - setValuesByXMLData = function(self, data) - base.setValuesByXMLData(self, data) + setValuesByXMLData = function(self, data, scripts) + base.setValuesByXMLData(self, data, scripts) if(xmlValue("texture", data)~=nil)then self:addTexture(xmlValue("texture", data), xmlValue("animate", data)) end if(xmlValue("textureMode", data)~=nil)then self:setTextureMode(xmlValue("textureMode", data)) end if(xmlValue("infinitePlay", data)~=nil)then self:setInfinitePlay(xmlValue("infinitePlay", data)) end diff --git a/Basalt/plugins/xml.lua b/Basalt/plugins/xml.lua index 6f1885b..4f5200e 100644 --- a/Basalt/plugins/xml.lua +++ b/Basalt/plugins/xml.lua @@ -1,5 +1,6 @@ local utils = require("utils") local uuid = utils.uuid +local xmlValue = utils.xmlValue local function newNode(name) local node = {} @@ -147,28 +148,6 @@ function XmlParser:loadFile(xmlFilename, base) end end -local function xmlValue(name, tab) - local var - if(type(tab)~="table")then return end - if(tab[name]~=nil)then - if(type(tab[name])=="table")then - if(tab[name].value~=nil)then - var = tab[name]:value() - end - end - end - if(var==nil)then var = tab["@"..name] end - - if(var=="true")then - var = true - elseif(var=="false")then - var = false - elseif(tonumber(var)~=nil)then - var = tonumber(var) - end - return var -end - local function executeScript(scripts) for k,v in pairs(scripts)do if(k~="env")then @@ -193,14 +172,16 @@ return { local object = { setValuesByXMLData = function(self, data, scripts) + scripts.env[self:getName()] = self local x, y = self:getPosition() - local w, h = self:getSize() + local w, h = nil, nil if(xmlValue("x", data)~=nil)then x = xmlValue("x", data) end if(xmlValue("y", data)~=nil)then y = xmlValue("y", data) end if(xmlValue("width", data)~=nil)then w = xmlValue("width", data) end if(xmlValue("height", data)~=nil)then h = xmlValue("height", data) end if(xmlValue("background", data)~=nil)then self:setBackground(colors[xmlValue("background", data)]) end + if(xmlValue("script", data)~=nil)then if(scripts[1]==nil)then scripts[1] = {} @@ -215,7 +196,12 @@ return { end end self:setPosition(x, y) - self:setSize(w, h) + 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 end, @@ -259,6 +245,7 @@ return { local object = { setValuesByXMLData = function(self, data, scripts) + lastXMLReferences = {} base.setValuesByXMLData(self, data, scripts) local xOffset, yOffset = self:getOffset() if(xmlValue("layout", data)~=nil)then self:addLayout(xmlValue("layout", data)) end @@ -281,12 +268,15 @@ return { return self end, + getXMLElements = function(self) + return lastXMLReferences + end, + loadLayout = function(self, path) if(fs.exists(path))then local scripts = {} scripts.env = _ENV scripts.env.basalt = basalt - scripts.env.main = self scripts.env.shared = {} local f = fs.open(path, "r") local data = XmlParser:ParseXmlText(f.readAll()) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 837094a..13bf16f 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -37,3 +37,4 @@ - Guides - [Introduction to Basalt](guides/introduction.md) - [Dynamic Values](guides/dynamicvalues.md) + - [XML](guides/xml.md) diff --git a/docs/guides/dynamicvalues.md b/docs/guides/dynamicvalues.md index 3d81177..04f7132 100644 --- a/docs/guides/dynamicvalues.md +++ b/docs/guides/dynamicvalues.md @@ -51,9 +51,9 @@ Dynamic Values can be used to access various attributes of a UI element, such as You can use different accessors to refer to objects when using Dynamic Values: -1. `parent` The x-coordinate of the element -2. `self` The y-coordinate of the element -3. `ObjectID` The width of the element +1. `parent` Access the parent object +2. `self` Access the current object +3. `ObjectID` Access a specific object using its ObjectID This allows for a more dynamic and responsive layout, as you can adjust an element's attributes based on the properties of other elements. Here's an example of using Dynamic Values to set the position and size of a UI element: diff --git a/docs/guides/xml.md b/docs/guides/xml.md new file mode 100644 index 0000000..6146a43 --- /dev/null +++ b/docs/guides/xml.md @@ -0,0 +1,119 @@ +XML (eXtensible Markup Language) is a popular and widely-used markup language for defining structured data. In this guide, we will explain how to use XML with Basalt to create and manage UI elements and layouts more efficiently. + +## Loading an XML File in Basalt + +To load an XML file in Basalt, you'll need to use the `frame:loadLayout` function. This function reads an XML file and returns a table containing the parsed XML data. + +Here's an example of how to load an XML file: + +```lua +local basalt = require("basalt") + +local main = basalt.createFrame():loadLayout("path/to/your/layout.xml") +``` + +Make sure that the specified XML file is accessible and located within your project's file system. + +## Using XML for Basalt + +Basalt uses XML to define UI elements and their properties. By using XML, you can create more organized and easily maintainable UI layouts. Basalt can read and interpret the XML data to create the corresponding UI elements with the specified properties and structure. + +Here's an example of an XML file that defines a simple UI layout for Basalt: + +```xml + +