Newer
Older
Kristify / src / Basalt / objects / Label.lua
@Sammy Sammy on 4 Sep 2022 5 KB Removed submodule mark
local Object = require("Object")
local utils = require("utils")
local xmlValue = utils.getValueFromXML
local createText = utils.createText
local tHex = require("tHex")
local bdf = require("miniBDF")

return function(name)
    -- Label
    local base = Object(name)
    local objectType = "Label"

    base:setZIndex(3)

    local autoSize = true
    base:setValue("Label")
    base.width = 5

    local textHorizontalAlign = "left"
    local textVerticalAlign = "top"
    local fontsize = 0
    local font = ""

    local fgColChanged,bgColChanged = false,false

    local object = {
        getType = function(self)
            return objectType
        end;
        
        setText = function(self, text)
            text = tostring(text)
            base:setValue(text)
            if (autoSize) then
                self.width = text:len()
            end
            self:updateDraw()
            return self
        end;

        setBackground = function(self, col)
            base.setBackground(self, col)
            bgColChanged = true
            self:updateDraw()
            return self
        end,

        setForeground = function(self, col)
            base.setForeground(self, col)
            fgColChanged = true
            self:updateDraw()
            return self
        end,

        setTextAlign = function(self, hor, vert)
            textHorizontalAlign = hor or textHorizontalAlign
            textVerticalAlign = vert or textVerticalAlign
            self:updateDraw()
            return self
        end;

        setFontSize = function(self, size)
            if(size>0)and(size<=4)then
                fontsize = size-1 or 0
            end
            self:updateDraw()
            return self
        end;

        getFontSize = function(self)
            return fontsize+1
        end;

        setFont = function(self, name)
            if fontBDF[name] then
                font = fontBDF[name]
            end
            self:updateDraw()
            return self
        end;

        getFont = function(self)
            return font
        end;

        setValuesByXMLData = function(self, data)
            base.setValuesByXMLData(self, data)
            if(xmlValue("text", data)~=nil)then self:setText(xmlValue("text", data)) end
            if(xmlValue("verticalAlign", data)~=nil)then textVerticalAlign = xmlValue("verticalAlign", data) end
            if(xmlValue("horizontalAlign", data)~=nil)then textHorizontalAlign = xmlValue("horizontalAlign", data) end
            if(xmlValue("size", data)~=nil)then self:setFontSize(xmlValue("size", data)) end
            if(xmlValue("font", data)~=nil)then self:setFont(xmlValue("font", data)) end
            return self
        end,

        setSize = function(self, width, height, rel)
            base.setSize(self, width, height, rel)
            autoSize = false
            self:updateDraw()
            return self
        end;

        draw = function(self)
            if (base.draw(self)) then
                if (self.parent ~= nil) then
                    local obx, oby = self:getAnchorPosition()
                    local w,h = self:getSize()
                    local verticalAlign = utils.getTextVerticalAlign(h, textVerticalAlign)
                    if(fontsize==0)then
                        if not(autoSize)then
                            local text = createText(self:getValue(), self:getWidth())
                            for k,v in pairs(text)do
                                self.parent:writeText(obx, oby+k-1, v, self.bgColor, self.fgColor)
                            end
                        else
                            self.parent:writeText(obx, oby, self:getValue(), self.bgColor, self.fgColor)
                        end
                    else
                        local blit = {[1]='0',[2]='1',[4]='2',[8]='3',[16]='4',[32]='5',[64]='6',[128]='7',[256]='8',[512]='9',[1024]='a',[2048]='b',[4096]='c',[8192]='d',[16384]='e',[32768]='f' }
                        local tData
                        if font.drawString then
                            tData = font:drawString(self:getValue())
                            tData = bdf.compress(tData, self.bgColor or colors.lightGray, self.fgColor)
                        else
                            local txt = self:getValue()
                            tData = {
                                ch={txt},
                                bg={blit[self.bgColor]:rep(#txt)},
                                fg={blit[self.fgColor]:rep(#txt)}
                            }
                        end
                        if(autoSize)then
                            self:setSize(#tData.ch[1], #tData.ch-1)
                        end
                        local oX, oY = self.parent:getSize()
                        local cX, cY = #tData.ch[1], #tData.ch
                        obx = obx or math.floor((oX - cX) / 2) + 1
                        oby = oby or math.floor((oY - cY) / 2) + 1
                    
                        for i = 1, cY do
                            self.parent:setFG(obx, oby + i - 2, tData.fg[i])
                            self.parent:setBG(obx, oby + i - 2, tData.bg[i])
                            self.parent:setText(obx, oby + i - 2, tData.ch[i])
                        end
                    end
                end
            end
        end,
        init = function(self)
            if(base.init(self))then
                self.bgColor = self.parent:getTheme("LabelBG")
                self.fgColor = self.parent:getTheme("LabelText")
                if(self.parent.bgColor==colors.black)and(self.fgColor==colors.black)then
                    self.fgColor = colors.lightGray
                end
            end
        end

    }

    return setmetatable(object, base)
end