From 19d7fa9a61477d01b849ba0e4074c5c7f3519979 Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Mon, 8 May 2023 06:34:47 +1000 Subject: [PATCH 1/5] Add Flexbox-specific XML parameter support --- Basalt/plugins/xml.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Basalt/plugins/xml.lua b/Basalt/plugins/xml.lua index 072c64c..3fcb1dc 100644 --- a/Basalt/plugins/xml.lua +++ b/Basalt/plugins/xml.lua @@ -369,6 +369,19 @@ return { return object end, + Flexbox = function(base, basalt) + local object = { + setValuesByXMLData = function(self, data, scripts) + base.setValuesByXMLData(self, data, scripts) + if(xmlValue("flexDirection", data)~=nil)then self:setFlexDirection(xmlValue("flexDirection", data)) end + if(xmlValue("justifyContent", data)~=nil)then self:setJustifyContent(xmlValue("justifyContent", data)) end + if(xmlValue("spacing", data)~=nil)then self:setFlexDirection(xmlValue("spacing", data)) end + return self + end, + } + return object + end, + Button = function(base, basalt) local object = { setValuesByXMLData = function(self, data, scripts) -- 2.49.1 From c9ff68dd9ec712ea08db81c3d6d559e0d994836e Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Mon, 8 May 2023 07:00:28 +1000 Subject: [PATCH 2/5] Flexbox docs --- docs/objects/Flexbox.md | 28 ++++++++++++++++++----- docs/objects/Flexbox/getSpacing.md | 19 +++++++++++++++ docs/objects/Flexbox/setFlexDirection.md | 23 +++++++++++++++++++ docs/objects/Flexbox/setJustifyContent.md | 23 +++++++++++++++++++ docs/objects/Flexbox/setSpacing.md | 23 +++++++++++++++++++ 5 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 docs/objects/Flexbox/getSpacing.md create mode 100644 docs/objects/Flexbox/setFlexDirection.md create mode 100644 docs/objects/Flexbox/setJustifyContent.md create mode 100644 docs/objects/Flexbox/setSpacing.md diff --git a/docs/objects/Flexbox.md b/docs/objects/Flexbox.md index 81c2991..98e02c3 100644 --- a/docs/objects/Flexbox.md +++ b/docs/objects/Flexbox.md @@ -4,9 +4,25 @@ In addition to the methods inherited from Frame, Container, VisualObject and Obj | | | |---|---| -|[setDirection](objects/BaseFrame/getOffset.md)|Sets the direction in which the children will be placed -|[getDirection](objects/BaseFrame/getOffset.md)|Returns the direction -|[setSpacing](objects/BaseFrame/setOffset.md)|Sets the space between objects -|[getSpacing](objects/BaseFrame/setOffset.md)|Returns the space -|[setJuustifyContent](objects/BaseFrame/getOffset.md)|Determines how the children are aligned along the main axis -|[getJuustifyContent](objects/BaseFrame/getOffset.md)|Returns the justify content +|[setSpacing](objects/Flexbox/setSpacing.md)|Sets the space between objects +|[getSpacing](objects/Flexbox/getSpacing.md)|Returns the space between objects +|[setFlexDirection](objects/Flexbox/setFlexDirection.md)|Sets the direction in which the children will be placed +|[setJustifyContent](objects/Flexbox/setJustifyContent.md)|Determines how the children are aligned along the main axis + +### Example + +Here's an example of how to create a Flexbox object: + +```lua +local main = basalt.createFrame() +local flexbox = main:addFlexbox() + :setFlexDirection("column") + :setJustifyContent("space-between") + :setSpacing(5) +``` + +Alternatively, you can create a flexbox using an XML layout: + +```xml + +``` diff --git a/docs/objects/Flexbox/getSpacing.md b/docs/objects/Flexbox/getSpacing.md new file mode 100644 index 0000000..ed299e9 --- /dev/null +++ b/docs/objects/Flexbox/getSpacing.md @@ -0,0 +1,19 @@ +## getSpacing + +### Description + +Returns the space between objects + +### Returns + +1. `number` Number of pixels of spacing between each object + +### Usage + +* Creates a default flexbox and prints the default spacing. + +```lua +local main = basalt.createFrame() +local flexbox = mainFrame:addFlexbox() +basalt.debug(flexbox:getSpacing()) +``` diff --git a/docs/objects/Flexbox/setFlexDirection.md b/docs/objects/Flexbox/setFlexDirection.md new file mode 100644 index 0000000..d78115f --- /dev/null +++ b/docs/objects/Flexbox/setFlexDirection.md @@ -0,0 +1,23 @@ +## setFlexDirection + +### Description + +Sets the direction in which the children will be placed + +### Parameters + +1. `string` One of ("row", "column") - default is row + +### Returns + +1. `object` The object in use + +### Usage + +* Creates a default flexbox and sets the flex direction to column. + +```lua +local main = basalt.createFrame() +local flexbox = mainFrame:addFlexbox() + :setFlexDirection("column") +``` diff --git a/docs/objects/Flexbox/setJustifyContent.md b/docs/objects/Flexbox/setJustifyContent.md new file mode 100644 index 0000000..b9d8eb3 --- /dev/null +++ b/docs/objects/Flexbox/setJustifyContent.md @@ -0,0 +1,23 @@ +## setJustifyContent + +### Description + +Determines how the children are aligned along the main axis + +### Parameters + +1. `string` One of ("flex-start", "flex-end", "center", "space-between", "space-around") - default is flex-start. Works the same as the property of the same name in [CSS flexboxes](https://css-tricks.com/snippets/css/a-guide-to-flexbox/#aa-flexbox-properties) + +### Returns + +1. `object` The object in use + +### Usage + +* Creates a default flexbox and sets the justify content to space-between. + +```lua +local main = basalt.createFrame() +local flexbox = mainFrame:addFlexbox() + :setJustifyContent("space-between") +``` diff --git a/docs/objects/Flexbox/setSpacing.md b/docs/objects/Flexbox/setSpacing.md new file mode 100644 index 0000000..ae55e88 --- /dev/null +++ b/docs/objects/Flexbox/setSpacing.md @@ -0,0 +1,23 @@ +## setSpacing + +### Description + +Sets the space between objects + +### Parameters + +1. `number` Number of pixels of spacing between each object - default is 1 + +### Returns + +1. `object` The object in use + +### Usage + +* Creates a default flexbox and sets the spacing to 5 pixels. + +```lua +local main = basalt.createFrame() +local flexbox = mainFrame:addFlexbox() + :setSpacing(5) +``` -- 2.49.1 From 2fb0f1c8ce4d42ddca09cedc9c723de87523a95e Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Sun, 7 May 2023 23:09:21 +0200 Subject: [PATCH 3/5] Small fix - Added default autosize for images - removed unnecessary Graphic object - removed unnecessary module file --- Basalt/libraries/bimg.lua | 21 ++-- Basalt/libraries/images.lua | 1 + Basalt/libraries/module.lua | 4 - Basalt/objects/Graphic.lua | 214 ------------------------------------ Basalt/objects/Image.lua | 25 ++++- 5 files changed, 36 insertions(+), 229 deletions(-) delete mode 100644 Basalt/libraries/module.lua delete mode 100644 Basalt/objects/Graphic.lua diff --git a/Basalt/libraries/bimg.lua b/Basalt/libraries/bimg.lua index f07cc77..6ca28bf 100644 --- a/Basalt/libraries/bimg.lua +++ b/Basalt/libraries/bimg.lua @@ -187,6 +187,12 @@ return function(img) local metadata = {creator="Bimg Library by NyoriE", date=os.date("!%Y-%m-%dT%TZ")} local width,height = 0, 0 + if(img~=nil)then + if(img[1][1][1]~=nil)then + width,height = metadata.width or #img[1][1][1], metadata.height or #img[1] + end + end + local manager = {} local function addFrame(id, data) @@ -363,18 +369,19 @@ return function(img) for k,v in pairs(img)do if(type(k)=="string")then metadata[k] = v - else - addFrame(k, v) end end if(metadata.width==nil)or(metadata.height==nil)then - for k,v in pairs(frames)do - local w, h = v.getSize() - if(w>width)then w = width end - if(h>height)then h = height end - end + width = metadata.width or #img[1][1][1] + height = metadata.height or #img[1] manager.updateSize(width, height, true) end + + for k,v in pairs(img)do + if(type(k)=="number")then + addFrame(k, v) + end + end else addFrame(1) end diff --git a/Basalt/libraries/images.lua b/Basalt/libraries/images.lua index ffa58c7..ce6ac00 100644 --- a/Basalt/libraries/images.lua +++ b/Basalt/libraries/images.lua @@ -12,6 +12,7 @@ local function loadBIMG(path, binaryMode) local f = fs.open(path, binaryMode and "rb" or "r") if(f==nil)then error("Path - "..path.." doesn't exist!") end local content = textutils.unserialize(f.readAll()) + f.close() if(content~=nil)then return content, "bimg" diff --git a/Basalt/libraries/module.lua b/Basalt/libraries/module.lua deleted file mode 100644 index 75f39cf..0000000 --- a/Basalt/libraries/module.lua +++ /dev/null @@ -1,4 +0,0 @@ -return function(path) - local exists, content = pcall(require, path) - return exists and content or nil -end \ No newline at end of file diff --git a/Basalt/objects/Graphic.lua b/Basalt/objects/Graphic.lua deleted file mode 100644 index f8f18e5..0000000 --- a/Basalt/objects/Graphic.lua +++ /dev/null @@ -1,214 +0,0 @@ -local Object = require("Object") -local tHex = require("tHex") -local xmlValue = require("utils").getValueFromXML -local bimgLib = require("bimg") -local images = require("images") - -local sub,len,max,min = string.sub,string.len,math.max,math.min - -return function(name) - -- Graphic - local base = Object(name) - local objectType = "Graphic" - local imgData = bimgLib() - local bimgFrame = imgData.getFrameObject(1) - local bimg - local selectedFrame = 1 - base:setZIndex(5) - - local xOffset, yOffset = 0, 0 - - local object = { - getType = function(self) - return objectType - end; - - setOffset = function(self, _x, _y, rel) - if(rel)then - xOffset = xOffset + _x or 0 - yOffset = yOffset + _y or 0 - else - xOffset = _x or xOffset - yOffset = _y or yOffset - end - self:updateDraw() - return self - end, - - getOffset = function(self) - return xOffset,yOffset - end, - - setValuesByXMLData = function(self, data) - base.setValuesByXMLData(self, data) - - return self - end, - - selectFrame = function(self, id) - if(imgData.getFrameObject(id)==nil)then - imgData.addFrame(id) - end - bimgFrame = imgData.getFrameObject(id) - bimg = bimgFrame.getImage(id) - selectedFrame = id - self:updateDraw() - end, - - addFrame = function(self, id) - imgData.addFrame(id) - return self - end, - - getFrameMetadata = function(self, id, key) - return imgData.getFrameData(id, key) - end, - - setFrameMetadata = function(self, id, key, val) - imgData.setFrameData(id, key, val) - return self - end, - - getMetadata = function(self, key) - return imgData.getMetadata(key) - end, - - setMetadata = function(self, key, value) - return imgData.setMetadata(key, value) - end, - - getFrame = function(self, id) - return imgData.getFrame(id) - end, - - getFrameObject = function(self, id) - return imgData.getFrameObject(id) - end, - - removeFrame = function(self, id) - imgData.removeFrame(id) - return self - end, - - moveFrame = function(self, id, dir) - imgData.moveFrame(id, dir) - return self - end, - - getFrames = function(self) - return imgData.getFrames() - end, - - getFrameCount = function(self) - return #imgData.getFrames() - end, - - getSelectedFrame = function(self) - return selectedFrame - end, - - blit = function(self, text, fg, bg, _x, _y) - x = _x or x - y = _y or y - bimgFrame.blit(text, fg, bg, x, y) - bimg = bimgFrame.getImage() - self:updateDraw() - return self - end, - - setText = function(self, text, _x, _y) - x = _x or x - y = _y or y - bimgFrame.text(text, x, y) - bimg = bimgFrame.getImage() - self:updateDraw() - return self - end, - - setBg = function(self, bg, _x, _y) - x = _x or x - y = _y or y - bimgFrame.bg(bg, x, y) - bimg = bimgFrame.getImage() - self:updateDraw() - return self - end, - - setFg = function(self, fg, _x, _y) - x = _x or x - y = _y or y - bimgFrame.fg(fg, x, y) - bimg = bimgFrame.getImage() - self:updateDraw() - return self - end, - - getImageSize = function(self) - return imgData.getSize() - end, - - setImageSize = function(self, w, h) - imgData.setSize(w, h) - bimg = bimgFrame.getImage() - self:updateDraw() - return self - end, - - resizeImage = function(self, w, h) - local newBimg = images.resizeBIMG(imgData.createBimg(), w, h) - imgData = bimgLib(newBimg) - selectedFrame = 1 - bimgFrame = imgData.getFrameObject(1) - bimg = bimgFrame.getImage() - self:updateDraw() - return self - end, - - loadImage = function(self, path) - if(fs.exists(path))then - local newBimg = images.loadBIMG(path) - imgData = bimgLib(newBimg) - selectedFrame = 1 - bimgFrame = imgData.getFrameObject(1) - bimg = bimgFrame.getImage() - self:updateDraw() - end - return self - end, - - clear = function(self) - imgData = bimgLib() - bimg = nil - self:updateDraw() - return self - end, - - getImage = function(self) - return imgData.createBimg() - end, - - draw = function(self) - if (base.draw(self)) then - if (self.parent ~= nil) then - local obx, oby = self:getAnchorPosition() - local w,h = self:getSize() - if(bimg~=nil)then - for k,v in pairs(bimg)do - if(k<=h-yOffset)and(k+yOffset>=1)then - self.parent:blit(obx+xOffset, oby+k-1+yOffset, v[1], v[2], v[3]) - end - end - end - end - end - end, - - init = function(self) - if(base.init(self))then - self.bgColor = self.parent:getTheme("GraphicBG") - end - end, - } - - return setmetatable(object, base) -end \ No newline at end of file diff --git a/Basalt/objects/Image.lua b/Basalt/objects/Image.lua index f80a760..5e6d7fb 100644 --- a/Basalt/objects/Image.lua +++ b/Basalt/objects/Image.lua @@ -15,6 +15,7 @@ return function(name, basalt) local infinitePlay = false local animTimer local usePalette = false + local autoSize = true local xOffset, yOffset = 0, 0 @@ -44,6 +45,14 @@ return function(name, basalt) return p end + local function checkAutoSize() + if(autoSize)then + if(bimgLibrary~=nil)then + base:setSize(bimgLibrary.getSize()) + end + end + end + local object = { getType = function(self) return objectType @@ -64,6 +73,12 @@ return function(name, basalt) return self end, + setSize = function(self, _x, _y) + base:setSize(_x, _y) + autoSize = false + return self + end, + getOffset = function(self) return xOffset, yOffset end, @@ -74,7 +89,7 @@ return function(name, basalt) end bimgFrame = bimgLibrary.getFrameObject(id) image = bimgFrame.getImage(id) - selectedFrame = id + activeFrame = id self:updateDraw() end, @@ -117,10 +132,11 @@ return function(name, basalt) if(fs.exists(path))then local newBimg = images.loadBIMG(path) bimgLibrary = bimg(newBimg) - selectedFrame = 1 + activeFrame = 1 bimgFrame = bimgLibrary.getFrameObject(1) originalImage = bimgLibrary.createBimg() image = bimgFrame.getImage() + checkAutoSize() self:updateDraw() end return self @@ -129,10 +145,11 @@ return function(name, basalt) setImage = function(self, t) if(type(t)=="table")then bimgLibrary = bimg(t) - selectedFrame = 1 + activeFrame = 1 bimgFrame = bimgLibrary.getFrameObject(1) originalImage = bimgLibrary.createBimg() image = bimgFrame.getImage() + checkAutoSize() self:updateDraw() end return self @@ -266,7 +283,7 @@ return function(name, basalt) resizeImage = function(self, w, h) local newBimg = images.resizeBIMG(originalImage, w, h) bimgLibrary = bimg(newBimg) - selectedFrame = 1 + activeFrame = 1 bimgFrame = bimgLibrary.getFrameObject(1) image = bimgFrame.getImage() self:updateDraw() -- 2.49.1 From 43ebd3fc3c1e94783ec1476f2e04b65a2597a8e2 Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Mon, 8 May 2023 07:15:38 +1000 Subject: [PATCH 4/5] Fix changeable object docs --- docs/objects/ChangeableObject.md | 38 ++++++-------------------------- docs/objects/Object.md | 1 - docs/objects/Object/onChange.md | 32 --------------------------- 3 files changed, 7 insertions(+), 64 deletions(-) delete mode 100644 docs/objects/Object/onChange.md diff --git a/docs/objects/ChangeableObject.md b/docs/objects/ChangeableObject.md index 1080723..2305de1 100644 --- a/docs/objects/ChangeableObject.md +++ b/docs/objects/ChangeableObject.md @@ -1,38 +1,14 @@ The ChangeableObject class is a subclass of VisualObject and Object that provides additional methods for handling changes to objects. -In addition to the Object and VisualObject methods, changeableObjects also have the following methods: +In addition to the Object and VisualObject methods, ChangeableObjects also have the following methods: | | | |---|---| -|[setValue](objects/Button/setText.md)|Changes the button text -|[getValue](objects/Button/setHorizontalAlign.md)|Changes the horizontal text position -|[onChange](objects/Button/setVerticalAlign.md)|Changes the vertical text position +|[setValue](objects/ChangeableObject/setValue.md)|Sets the value of your object +|[getValue](objects/ChangeableObject/getValue.md)|Gets the value of your object -# Example +### Events -Here's an example of how to create a fully functional button using the Button object: - -```lua -local main = basalt.createFrame() -local aButton = main:addButton():setText("Click") - -aButton:onClick(function(self,event,button,x,y) - if(event=="mouse_click")and(button==1)then - basalt.debug("Left mousebutton got clicked!") - end -end) -``` - -Alternatively, you can create a button using an XML layout: - -```xml - -``` - -In these examples, a button is created with the text "Click". When the left mouse button is clicked on the button, the message "Left mouse button got clicked!" is printed. +| | | +|---|---| +|[onChange](objects/ChangeableObject/onChange.md)|Fires when the object value has changed diff --git a/docs/objects/Object.md b/docs/objects/Object.md index 3ef9373..10d1c64 100644 --- a/docs/objects/Object.md +++ b/docs/objects/Object.md @@ -30,7 +30,6 @@ Events are actions or occurrences that happen during the execution of your progr |[onKey](objects/Object/onKey.md)|Fires when the object is focused and a keyboard key is pressed |[onChar](objects/Object/onChar.md)|Fires when the object is focused and a character key is pressed |[onKeyUp](objects/Object/onKeyUp.md)|Fires when the object is focused and a keyboard key is released -|[onChange](objects/Object/onChange.md)|Fires when the object value has changed |[onGetFocus](objects/Object/onGetFocus.md)|Fires when the object gains focus |[onLoseFocus](objects/Object/onLoseFocus.md)|Fires when the object loses focus |[onEvent](objects/Object/onEvent.md)|Fires for any other event diff --git a/docs/objects/Object/onChange.md b/docs/objects/Object/onChange.md deleted file mode 100644 index 0bfa518..0000000 --- a/docs/objects/Object/onChange.md +++ /dev/null @@ -1,32 +0,0 @@ -# Object - Event - -## onChange - -`onChange(self)` - -This is a custom event which gets triggered as soon as the function :setValue() is called. This function is also called by basalt, for example if you change the input, textfield or checkbox (or all the different types of lists) objects. - -Here is a example on how to add a onChange event to your input, and also another example for your checkbox: - -```lua -local basalt = require("basalt") - -local main = basalt.createFrame() -local aInput = main:addInput():setPosition(3,3) -local aCheckbox = main:addCheckbox():setPosition(3,5) - -local function checkInput(input) - if(string.lower(input:getValue())=="hello")then - basalt.debug("Hello back!") - end -end - -local function checkCheckbox(checkbox) - if(checkbox:getValue()==true)then -- or if(checkbox:getValue())then - basalt.debug("Checkbox is active, let's do something!") - end -end - -aInput:onChange(checkInput) -aCheckbox:onChange(checkCheckbox) -``` -- 2.49.1 From 0b7d5d5bb7d8c274b7cb888bb5b3cc4980d53252 Mon Sep 17 00:00:00 2001 From: Sabine Lim Date: Mon, 8 May 2023 07:16:59 +1000 Subject: [PATCH 5/5] 2 hashes not 3 --- docs/objects/ChangeableObject.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/objects/ChangeableObject.md b/docs/objects/ChangeableObject.md index 2305de1..809c3bd 100644 --- a/docs/objects/ChangeableObject.md +++ b/docs/objects/ChangeableObject.md @@ -7,7 +7,7 @@ In addition to the Object and VisualObject methods, ChangeableObjects also have |[setValue](objects/ChangeableObject/setValue.md)|Sets the value of your object |[getValue](objects/ChangeableObject/getValue.md)|Gets the value of your object -### Events +## Events | | | |---|---| -- 2.49.1