From 0af0a6252883ac4586af054da9b867e1ad740f02 Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:03:51 +0100 Subject: [PATCH] Updated color properties Small container fix --- src/elements/Container.lua | 4 ++ src/elements/Image.lua | 127 ++++++++++++++++++++++++--------- src/elements/Input.lua | 6 +- src/elements/Label.lua | 5 +- src/elements/List.lua | 4 +- src/elements/Menu.lua | 2 +- src/elements/ProgressBar.lua | 2 +- src/elements/Scrollbar.lua | 4 +- src/elements/Slider.lua | 4 +- src/elements/Table.lua | 6 +- src/elements/TextBox.lua | 2 +- src/elements/Tree.lua | 4 +- src/elements/VisualElement.lua | 4 +- src/libraries/expect.lua | 2 +- 14 files changed, 123 insertions(+), 53 deletions(-) diff --git a/src/elements/Container.lua b/src/elements/Container.lua index 8023b07..548a954 100644 --- a/src/elements/Container.lua +++ b/src/elements/Container.lua @@ -278,6 +278,8 @@ function Container:unregisterChildEvent(child, eventName) self.parent:unregisterChildEvent(self, eventName) end end + self.set("childrenEventsSorted", false) + self:updateRender() break end end @@ -298,6 +300,8 @@ function Container:removeChild(child) end end self:removeChildrenEvents(child) + self:updateRender() + self.set("childrenSorted", false) return self end diff --git a/src/elements/Image.lua b/src/elements/Image.lua index ed646bc..cd532ff 100644 --- a/src/elements/Image.lua +++ b/src/elements/Image.lua @@ -15,8 +15,6 @@ Image.__index = Image Image.defineProperty(Image, "bimg", {default = {{}}, type = "table", canTriggerRender = true}) ---@property currentFrame number 1 Current animation frame Image.defineProperty(Image, "currentFrame", {default = 1, type = "number", canTriggerRender = true}) ----@property metadata table {} Image metadata (version, palette, etc) -Image.defineProperty(Image, "metadata", {default = {}, type = "table"}) ---@property autoResize boolean false Whether to automatically resize the image when content exceeds bounds Image.defineProperty(Image, "autoResize", {default = false, type = "boolean"}) ---@property offsetX number 0 Horizontal offset for viewing larger images @@ -51,35 +49,6 @@ function Image:init(props, basalt) return self end ---- Loads a bimg format image ---- @shortDescription Loads a bimg format image ---- @param bimgData table The bimg image data ---- @return Image self The Image instance -function Image:loadBimg(bimgData) - if type(bimgData) ~= "table" then return self end - - local frames = {} - local metadata = {} - - for k, v in pairs(bimgData) do - if type(k) == "number" then - frames[k] = v - else - metadata[k] = v - end - end - - self.set("bimg", frames) - self.set("metadata", metadata) - - if frames[1] and frames[1][1] then - self.set("width", #frames[1][1][2]) - self.set("height", #frames[1]) - end - - return self -end - --- Resizes the image to the specified width and height --- @shortDescription Resizes the image to the specified width and height --- @param width number The new width of the image @@ -197,6 +166,10 @@ end --- @return Image self The Image instance function Image:setText(x, y, text) if type(text) ~= "string" or #text < 1 or x < 1 or y < 1 then return self end + if not self.get("autoResize")then + local imgWidth, imgHeight = self:getImageSize() + if y > imgHeight then return self end + end local frame = ensureFrame(self, y) if self.get("autoResize") then @@ -214,6 +187,21 @@ function Image:setText(x, y, text) return self end +function Image:getText(x, y, length) + if not x or not y then return end + local frame = self.get("bimg")[self.get("currentFrame")] + if not frame or not frame[y] then return end + + local text = frame[y][1] + if not text then return end + + if length then + return text:sub(x, x + length - 1) + else + return text:sub(x, x) + end +end + --- Sets the foreground color at the specified position --- @shortDescription Sets the foreground color at the specified position --- @param x number The x position @@ -222,6 +210,10 @@ end --- @return Image self The Image instance function Image:setFg(x, y, pattern) if type(pattern) ~= "string" or #pattern < 1 or x < 1 or y < 1 then return self end + if not self.get("autoResize")then + local imgWidth, imgHeight = self:getImageSize() + if y > imgHeight then return self end + end local frame = ensureFrame(self, y) if self.get("autoResize") then @@ -239,6 +231,21 @@ function Image:setFg(x, y, pattern) return self end +function Image:getFg(x, y, length) + if not x or not y then return end + local frame = self.get("bimg")[self.get("currentFrame")] + if not frame or not frame[y] then return end + + local fg = frame[y][2] + if not fg then return end + + if length then + return fg:sub(x, x + length - 1) + else + return fg:sub(x) + end +end + --- Sets the background color at the specified position --- @shortDescription Sets the background color at the specified position --- @param x number The x position @@ -247,6 +254,10 @@ end --- @return Image self The Image instance function Image:setBg(x, y, pattern) if type(pattern) ~= "string" or #pattern < 1 or x < 1 or y < 1 then return self end + if not self.get("autoResize")then + local imgWidth, imgHeight = self:getImageSize() + if y > imgHeight then return self end + end local frame = ensureFrame(self, y) if self.get("autoResize") then @@ -264,6 +275,21 @@ function Image:setBg(x, y, pattern) return self end +function Image:getBg(x, y, length) + if not x or not y then return end + local frame = self.get("bimg")[self.get("currentFrame")] + if not frame or not frame[y] then return end + + local bg = frame[y][3] + if not bg then return end + + if length then + return bg:sub(x, x + length - 1) + else + return bg:sub(x) + end +end + --- Sets the pixel at the specified position --- @shortDescription Sets the pixel at the specified position --- @param x number The x position @@ -283,7 +309,7 @@ end --- @shortDescription Advances to the next frame in the animation --- @return Image self The Image instance function Image:nextFrame() - if not self.get("metadata").animation then return self end + if not self.get("bimg").animation then return self end local frames = self.get("bimg") local current = self.get("currentFrame") @@ -310,6 +336,43 @@ function Image:addFrame() return self end +function Image:updateFrame(frameIndex, frame) + local frames = self.get("bimg") + frames[frameIndex] = frame + self:updateRender() + return self +end + +function Image:getFrame(frameIndex) + local frames = self.get("bimg") + return frames[frameIndex or self.get("currentFrame")] +end + +function Image:getMetadata() + local metadata = {} + local bimg = self.get("bimg") + for k,v in pairs(bimg)do + if(type(v)=="string")then + metadata[k] = v + end + end + return metadata +end + +function Image:setMetadata(key, value) + if(type(key)=="table")then + for k,v in pairs(key)do + self:setMetadata(k, v) + end + return self + end + local bimg = self.get("bimg") + if(type(value)=="string")then + bimg[key] = value + end + return self +end + --- @shortDescription Renders the Image --- @protected function Image:render() diff --git a/src/elements/Input.lua b/src/elements/Input.lua index 95325aa..7168fcf 100644 --- a/src/elements/Input.lua +++ b/src/elements/Input.lua @@ -19,11 +19,11 @@ Input.defineProperty(Input, "maxLength", {default = nil, type = "number"}) ---@property placeholder string ... Text to display when input is empty Input.defineProperty(Input, "placeholder", {default = "...", type = "string"}) ---@property placeholderColor color gray Color of the placeholder text -Input.defineProperty(Input, "placeholderColor", {default = colors.gray, type = "number"}) +Input.defineProperty(Input, "placeholderColor", {default = colors.gray, type = "color"}) ---@property focusedBackground color blue Background color when input is focused -Input.defineProperty(Input, "focusedBackground", {default = colors.blue, type = "number"}) +Input.defineProperty(Input, "focusedBackground", {default = colors.blue, type = "color"}) ---@property focusedForeground color white Foreground color when input is focused -Input.defineProperty(Input, "focusedForeground", {default = colors.white, type = "number"}) +Input.defineProperty(Input, "focusedForeground", {default = colors.white, type = "color"}) ---@property pattern string? nil Regular expression pattern for input validation Input.defineProperty(Input, "pattern", {default = nil, type = "string"}) ---@property cursorColor number nil Color of the cursor diff --git a/src/elements/Label.lua b/src/elements/Label.lua index b9227d3..9a6dd72 100644 --- a/src/elements/Label.lua +++ b/src/elements/Label.lua @@ -42,7 +42,6 @@ function Label.new() return self end ---- Initializes the Label instance --- @shortDescription Initializes the Label instance --- @param props table The properties to initialize the element with --- @param basalt table The basalt instance @@ -50,6 +49,10 @@ end --- @protected function Label:init(props, basalt) VisualElement.init(self, props, basalt) + if(self.parent)then + self.set("background", self.parent.get("background")) + self.set("foreground", self.parent.get("foreground")) + end self.set("type", "Label") return self end diff --git a/src/elements/List.lua b/src/elements/List.lua index 0dca9ec..a010c80 100644 --- a/src/elements/List.lua +++ b/src/elements/List.lua @@ -16,9 +16,9 @@ List.defineProperty(List, "multiSelection", {default = false, type = "boolean"}) ---@property offset number 0 Current scroll offset for viewing long lists List.defineProperty(List, "offset", {default = 0, type = "number", canTriggerRender = true}) ---@property selectedBackground color blue Background color for selected items -List.defineProperty(List, "selectedBackground", {default = colors.blue, type = "number"}) +List.defineProperty(List, "selectedBackground", {default = colors.blue, type = "color"}) ---@property selectedForeground color white Text color for selected items -List.defineProperty(List, "selectedForeground", {default = colors.white, type = "number"}) +List.defineProperty(List, "selectedForeground", {default = colors.white, type = "color"}) ---@event onSelect {index number, item any} Fired when an item is selected List.defineEvent(List, "mouse_click") diff --git a/src/elements/Menu.lua b/src/elements/Menu.lua index bca6d47..3d906a3 100644 --- a/src/elements/Menu.lua +++ b/src/elements/Menu.lua @@ -10,7 +10,7 @@ local Menu = setmetatable({}, List) Menu.__index = Menu ---@property separatorColor color gray The color used for separator items in the menu -Menu.defineProperty(Menu, "separatorColor", {default = colors.gray, type = "number"}) +Menu.defineProperty(Menu, "separatorColor", {default = colors.gray, type = "color"}) --- Creates a new Menu instance --- @shortDescription Creates a new Menu instance diff --git a/src/elements/ProgressBar.lua b/src/elements/ProgressBar.lua index 5fae3b6..9609927 100644 --- a/src/elements/ProgressBar.lua +++ b/src/elements/ProgressBar.lua @@ -11,7 +11,7 @@ ProgressBar.defineProperty(ProgressBar, "progress", {default = 0, type = "number ---@property showPercentage boolean false Whether to show the percentage text in the center ProgressBar.defineProperty(ProgressBar, "showPercentage", {default = false, type = "boolean"}) ---@property progressColor color lime The color used for the filled portion of the progress bar -ProgressBar.defineProperty(ProgressBar, "progressColor", {default = colors.black, type = "number"}) +ProgressBar.defineProperty(ProgressBar, "progressColor", {default = colors.black, type = "color"}) --- Creates a new ProgressBar instance --- @shortDescription Creates a new ProgressBar instance diff --git a/src/elements/Scrollbar.lua b/src/elements/Scrollbar.lua index 33c9083..5baa296 100644 --- a/src/elements/Scrollbar.lua +++ b/src/elements/Scrollbar.lua @@ -19,9 +19,9 @@ Scrollbar.defineProperty(Scrollbar, "dragMultiplier", {default = 1, type = "numb ---@property symbol string " " Symbol used for the scrollbar handle Scrollbar.defineProperty(Scrollbar, "symbol", {default = " ", type = "string", canTriggerRender = true}) ---@property backgroundSymbol string "\127" Symbol used for the scrollbar background -Scrollbar.defineProperty(Scrollbar, "symbolColor", {default = colors.gray, type = "number", canTriggerRender = true}) +Scrollbar.defineProperty(Scrollbar, "symbolColor", {default = colors.gray, type = "color", canTriggerRender = true}) ---@property symbolBackgroundColor color black Background color of the scrollbar handle -Scrollbar.defineProperty(Scrollbar, "symbolBackgroundColor", {default = colors.black, type = "number", canTriggerRender = true}) +Scrollbar.defineProperty(Scrollbar, "symbolBackgroundColor", {default = colors.black, type = "color", canTriggerRender = true}) ---@property backgroundSymbol string "\127" Symbol used for the scrollbar background Scrollbar.defineProperty(Scrollbar, "backgroundSymbol", {default = "\127", type = "string", canTriggerRender = true}) ---@property attachedElement table? nil The element this scrollbar is attached to diff --git a/src/elements/Slider.lua b/src/elements/Slider.lua index 9983017..c6c374d 100644 --- a/src/elements/Slider.lua +++ b/src/elements/Slider.lua @@ -13,9 +13,9 @@ Slider.defineProperty(Slider, "max", {default = 100, type = "number"}) ---@property horizontal boolean true Whether the slider is horizontal (false for vertical) Slider.defineProperty(Slider, "horizontal", {default = true, type = "boolean", canTriggerRender = true}) ---@property barColor color gray Color of the slider track -Slider.defineProperty(Slider, "barColor", {default = colors.gray, type = "number", canTriggerRender = true}) +Slider.defineProperty(Slider, "barColor", {default = colors.gray, type = "color", canTriggerRender = true}) ---@property sliderColor color blue Color of the slider handle -Slider.defineProperty(Slider, "sliderColor", {default = colors.blue, type = "number", canTriggerRender = true}) +Slider.defineProperty(Slider, "sliderColor", {default = colors.blue, type = "color", canTriggerRender = true}) ---@event onChange {value number} Fired when the slider value changes Slider.defineEvent(Slider, "mouse_click") diff --git a/src/elements/Table.lua b/src/elements/Table.lua index cef7582..3c5b641 100644 --- a/src/elements/Table.lua +++ b/src/elements/Table.lua @@ -14,11 +14,11 @@ Table.defineProperty(Table, "data", {default = {}, type = "table", canTriggerRen ---@property selectedRow number? nil Currently selected row index Table.defineProperty(Table, "selectedRow", {default = nil, type = "number", canTriggerRender = true}) ---@property headerColor color blue Color of the column headers -Table.defineProperty(Table, "headerColor", {default = colors.blue, type = "number"}) +Table.defineProperty(Table, "headerColor", {default = colors.blue, type = "color"}) ---@property selectedColor color lightBlue Background color of selected row -Table.defineProperty(Table, "selectedColor", {default = colors.lightBlue, type = "number"}) +Table.defineProperty(Table, "selectedColor", {default = colors.lightBlue, type = "color"}) ---@property gridColor color gray Color of grid lines -Table.defineProperty(Table, "gridColor", {default = colors.gray, type = "number"}) +Table.defineProperty(Table, "gridColor", {default = colors.gray, type = "color"}) ---@property sortColumn number? nil Currently sorted column index Table.defineProperty(Table, "sortColumn", {default = nil, type = "number"}) ---@property sortDirection string "asc" Sort direction ("asc" or "desc") diff --git a/src/elements/TextBox.lua b/src/elements/TextBox.lua index a0065b7..66b58b1 100644 --- a/src/elements/TextBox.lua +++ b/src/elements/TextBox.lua @@ -23,7 +23,7 @@ TextBox.defineProperty(TextBox, "editable", {default = true, type = "boolean"}) ---@property syntaxPatterns table {} Syntax highlighting patterns TextBox.defineProperty(TextBox, "syntaxPatterns", {default = {}, type = "table"}) ---@property cursorColor number nil Color of the cursor -TextBox.defineProperty(TextBox, "cursorColor", {default = nil, type = "number"}) +TextBox.defineProperty(TextBox, "cursorColor", {default = nil, type = "color"}) TextBox.defineEvent(TextBox, "mouse_click") TextBox.defineEvent(TextBox, "key") diff --git a/src/elements/Tree.lua b/src/elements/Tree.lua index ca32173..d085576 100644 --- a/src/elements/Tree.lua +++ b/src/elements/Tree.lua @@ -24,9 +24,9 @@ Tree.defineProperty(Tree, "scrollOffset", {default = 0, type = "number", canTrig ---@property horizontalOffset number 0 Current horizontal scroll position Tree.defineProperty(Tree, "horizontalOffset", {default = 0, type = "number", canTriggerRender = true}) ---@property nodeColor color white Color of unselected nodes -Tree.defineProperty(Tree, "nodeColor", {default = colors.white, type = "number"}) +Tree.defineProperty(Tree, "nodeColor", {default = colors.white, type = "color"}) ---@property selectedColor color lightBlue Background color of selected node -Tree.defineProperty(Tree, "selectedColor", {default = colors.lightBlue, type = "number"}) +Tree.defineProperty(Tree, "selectedColor", {default = colors.lightBlue, type = "color"}) Tree.defineEvent(Tree, "mouse_click") Tree.defineEvent(Tree, "mouse_scroll") diff --git a/src/elements/VisualElement.lua b/src/elements/VisualElement.lua index b3be31b..05ea402 100644 --- a/src/elements/VisualElement.lua +++ b/src/elements/VisualElement.lua @@ -26,9 +26,9 @@ VisualElement.defineProperty(VisualElement, "width", {default = 1, type = "numbe ---@property height number 1 The height of the element VisualElement.defineProperty(VisualElement, "height", {default = 1, type = "number", canTriggerRender = true}) ---@property background color black The background color -VisualElement.defineProperty(VisualElement, "background", {default = colors.black, type = "number", canTriggerRender = true}) +VisualElement.defineProperty(VisualElement, "background", {default = colors.black, type = "color", canTriggerRender = true}) ---@property foreground color white The text/foreground color -VisualElement.defineProperty(VisualElement, "foreground", {default = colors.white, type = "number", canTriggerRender = true}) +VisualElement.defineProperty(VisualElement, "foreground", {default = colors.white, type = "color", canTriggerRender = true}) ---@property clicked boolean false Whether the element is currently clicked VisualElement.defineProperty(VisualElement, "clicked", {default = false, type = "boolean"}) ---@property hover boolean false Whether the mouse is currently hover over the element (Craftos-PC only) diff --git a/src/libraries/expect.lua b/src/libraries/expect.lua index 000a35c..b5be067 100644 --- a/src/libraries/expect.lua +++ b/src/libraries/expect.lua @@ -11,7 +11,7 @@ local function expect(position, value, expectedType) end if expectedType == "color" then - if valueType == "number" and value >= 1 and value <= 32768 then + if valueType == "number" then return true end if valueType == "string" and colors[value] then