- added new animations (:setMode("animname")
- added :addMode("animname", f) to create custom easings
- Fixed a bug in input when using - or . nothing happens (inputmode number)
- Added a event for labels when using multiple line text and the window/frame gets resized)
- Changed some backend stuff for programs
- added a setEnviroment method for programs
- Added a program_done event and a program_error event for programs (:onError() and :onDone())
- Fixed a bug in textfields (when using editLine it doesn't update colors)
- seperated the char event from the key event (before both events executed :onKey events, now there is a :onChar() and :onKey() event
169 lines
6.2 KiB
Lua
169 lines
6.2 KiB
Lua
local Object = require("Object")
|
|
local utils = require("utils")
|
|
local xmlValue = utils.getValueFromXML
|
|
local createText = utils.createText
|
|
local tHex = require("tHex")
|
|
local bigFont = require("bigfont")
|
|
|
|
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 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
|
|
if(text:len()+self:getX()>self.parent:getWidth())then
|
|
local newW = self.parent:getWidth() - self:getX()
|
|
base.setSize(self, newW, #createText(text, newW))
|
|
else
|
|
base.setSize(self, text:len(), 1)
|
|
end
|
|
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;
|
|
|
|
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("font", data)~=nil)then self:setFontSize(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;
|
|
|
|
eventHandler = function(self, event)
|
|
if(event=="basalt_resize")then
|
|
if (autoSize) then
|
|
local text = self:getValue()
|
|
if(text:len()+self:getX()>self.parent:getWidth())then
|
|
local newW = self.parent:getWidth() - self:getX()
|
|
base.setSize(self, newW, #createText(text, newW))
|
|
else
|
|
base.setSize(self, text:len(), 1)
|
|
end
|
|
else
|
|
--self.parent:removeEvent("other_event", self)
|
|
end
|
|
end
|
|
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
|
|
if(k<=h)then
|
|
self.parent:writeText(obx, oby+k-1, v, self.bgColor, self.fgColor)
|
|
end
|
|
end
|
|
else
|
|
if(#self:getValue()+obx>self.parent:getWidth())then
|
|
local text = createText(self:getValue(), self:getWidth())
|
|
for k,v in pairs(text)do
|
|
if(k<=h)then
|
|
self.parent:writeText(obx, oby+k-1, v, self.bgColor, self.fgColor)
|
|
end
|
|
end
|
|
else
|
|
self.parent:writeText(obx, oby, self:getValue(), self.bgColor, self.fgColor)
|
|
end
|
|
end
|
|
else
|
|
local tData = bigFont(fontsize, self:getValue(), self.fgColor, self.bgColor or colors.lightGray)
|
|
if(autoSize)then
|
|
self:setSize(#tData[1][1], #tData[1]-1)
|
|
end
|
|
local oX, oY = self.parent:getSize()
|
|
local cX, cY = #tData[1][1], #tData[1]
|
|
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 - 1, tData[2][i])
|
|
self.parent:setBG(obx, oby + i - 1, tData[3][i])
|
|
self.parent:setText(obx, oby + i - 1, tData[1][i])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
init = function(self)
|
|
self.parent:addEvent("other_event", 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 |