slabOS/lib/basalt/objects/Label.lua
2025-06-02 10:23:40 +03:00

115 lines
3.4 KiB
Lua

local utils = require("utils")
local wrapText = utils.wrapText
local writeWrappedText = utils.writeWrappedText
local tHex = require("tHex")
return function(name, basalt)
-- Label
local base = basalt.getObject("VisualObject")(name, basalt)
local objectType = "Label"
base:setZIndex(3)
base:setSize(5, 1)
base:setBackground(false)
local autoSize = true
local text, textAlign = "Label", "left"
local object = {
--- Returns the object type.
--- @return string
getType = function(self)
return objectType
end,
--- Returns the label's base object.
--- @return object
getBase = function(self)
return base
end,
--- Changes the label's text.
--- @param newText string The new text of the label.
--- @return object
setText = function(self, newText)
text = tostring(newText)
if(autoSize)then
local t = wrapText(text, #text)
local newW, newH = 1,1
for k,v in pairs(t)do
newH = newH+1
newW = math.max(newW, v:len())
end
self:setSize(newW, newH)
autoSize = true
end
self:updateDraw()
return self
end,
--- Returns the label's autoSize property.
--- @return boolean
getAutoSize = function(self)
return autoSize
end,
--- Sets the label's autoSize property.
--- @param bool boolean The new value of the autoSize property.
--- @return object
setAutoSize = function(self, bool)
autoSize = bool
return self
end,
--- Returns the label's text.
--- @return string
getText = function(self)
return text
end,
--- Sets the size of the label.
--- @param width number The width of the label.
--- @param height number The height of the label.
--- @return object
setSize = function(self, width, height)
base.setSize(self, width, height)
autoSize = false
return self
end,
--- Gets the text alignment of the label.
--- @return string
getTextAlign = function(self)
return textAlign
end,
--- Sets the text alignment of the label.
--- @param align string The alignment of the text. Can be "left", "center", or "right".
--- @return object
setTextAlign = function(self, align)
textAlign = align or textAlign
return self;
end,
--- Queues a new draw function to be called when the object is drawn.
draw = function(self)
base.draw(self)
self:addDraw("label", function()
local w, h = self:getSize()
local align = textAlign=="center" and math.floor(w/2-text:len()/2+0.5) or textAlign=="right" and w-(text:len()-1) or 1
writeWrappedText(self, align, 1, text, w+1, h)
end)
end,
--- Initializes the label.
init = function(self)
base.init(self)
local parent = self:getParent()
self:setForeground(parent:getForeground())
end
}
object.__index = object
return setmetatable(object, base)
end