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
+
+
+
+
+```
+
+In this example, we define a `Frame` containing a `Label` and a `Button` with their respective properties, such as `id`, `text`, `x`, and `y`.
+
+To use the loaded XML data to create the UI elements in Basalt, you can use `main:getXMLElements()`:
+
+```lua
+local basalt = require("basalt")
+
+local main = basalt.createFrame():loadLayout("path/to/your/layout.xml")
+
+local uiElements = main:getXMLElements()
+
+local titleLabel = uiElements["titleLabel"]
+
+titleLabel:setText("New Title")
+```
+
+## Using Lua Code in XML
+
+In addition to defining UI elements, you can also include Lua code within your XML files for Basalt. This allows you to perform more complex operations or customize your UI elements based on conditions or data.
+
+To include Lua code in your XML file, you can use the `
+```
+
+To share variables or data between multiple `
+
+
+
+
+
+```
+
+In this example, we first store a value in the shared table in one `