Small Fixes

- added Label RichText System - experimental
- moved eventhandlers to object
- Fixed still listening to incomming events when removing a object
- Fixed not passing args when creating a event via xml, args are now always stored inside a table called event
This commit is contained in:
Robert Jelic
2023-05-07 15:17:27 +02:00
parent f3f8105459
commit c9a74dfbd4
9 changed files with 356 additions and 104 deletions

View File

@@ -10,7 +10,6 @@ return function(name, basalt)
local events = {}
local container = {}
local activeEvents = {}
local focusedObject
local sorted = true
@@ -69,14 +68,14 @@ return function(name, basalt)
local function updateZIndex(self, element, newZ)
objId = objId + 1
evId = evId + 1
for k,v in pairs(elements)do
for _,v in pairs(elements)do
if(v.element==element)then
v.zIndex = newZ
v.objId = objId
break
end
end
for k,v in pairs(events)do
for _,v in pairs(events)do
for a,b in pairs(v)do
if(b.element==element)then
b.zIndex = newZ
@@ -109,7 +108,6 @@ return function(name, basalt)
end
end
if(tableCount(events[a])<=0)then
activeEvents[a] = false
if(parent~=nil)then
parent:removeEvent(a, self)
end
@@ -143,7 +141,6 @@ return function(name, basalt)
end
local function removeEvent(self, event, element)
local parent = self:getParent()
if(events[event]~=nil)then
for a, b in pairs(events[event]) do
if(b.element == element)then
@@ -288,11 +285,11 @@ return function(name, basalt)
getEvent = getEvent,
addEvent = addEvent,
removeEvent = removeEvent,
removeEvents = removeEvents,
updateZIndex = updateZIndex,
listenEvent = function(self, event, active)
base.listenEvent(self, event, active)
activeEvents[event] = active~=nil and active or true
if(events[event]==nil)then events[event] = {} end
return self
end,
@@ -348,8 +345,10 @@ return function(name, basalt)
if(self.getOffset~=nil)then
xO, yO = self:getOffset()
end
if(obj.element.getIgnoreOffset())then
xO, yO = 0, 0
if(obj.element.getIgnoreOffset~=nil)then
if(obj.element.getIgnoreOffset())then
xO, yO = 0, 0
end
end
if (obj.element[v[1]](obj.element, btn, x+xO, y+yO, ...)) then
return true

View File

@@ -1,5 +1,6 @@
local utils = require("utils")
local wrapText = utils.wrapText
local writeWrappedText = utils.writeWrappedText
local tHex = require("tHex")
return function(name, basalt)
@@ -8,92 +9,97 @@ return function(name, basalt)
local objectType = "Label"
base:setZIndex(3)
base:setSize(5, 1)
base:setBackground(false)
local autoSize = true
local fgColChanged,bgColChanged = false,false
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,
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
self:setSize(#text, 1)
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,
setBackground = function(self, col)
base.setBackground(self, col)
bgColChanged = true
return self
end,
setForeground = function(self, col)
base.setForeground(self, col)
fgColChanged = true
return self
end,
setSize = function(self, ...)
base.setSize(self, ...)
--- 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,
--- 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 parent = self:getParent()
local obx, oby = self:getPosition()
local w,h = self:getSize()
local bgCol,fgCol = self:getBackground(), self:getForeground()
if not(autoSize)then
local text = wrapText(text, w)
for k,v in pairs(text)do
if(k<=h)then
local align = textAlign=="center" and math.floor(w/2-v:len()/2+0.5) or textAlign=="right" and w-(v:len()-1) or 1
self:addText(align, k, v)
end
end
else
self:addText(1, 1, text:sub(1,w))
end
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, h)
end)
end,
--- Initializes the label.
init = function(self)
base.init(self)
local parent = self:getParent()
self:setForeground(parent:getForeground())
self:setBackground(parent:getBackground())
end
}

View File

@@ -99,6 +99,7 @@ return function(name, basalt)
remove = function(self)
if (parent ~= nil) then
parent:removeObject(self)
parent:removeEvents(self)
end
self:updateDraw()
return self
@@ -140,6 +141,17 @@ return function(name, basalt)
return eventSystem:removeEvent(event, index)
end,
eventHandler = function(self, event, ...)
local val = self:sendEvent("other_event", event, ...)
if(val~=nil)then return val end
end,
customEventHandler = function(self, event, ...)
local val = self:sendEvent("custom_event", event, ...)
if(val~=nil)then return val end
return true
end,
sendEvent = function(self, event, ...)
return eventSystem:sendEvent(event, self, event, ...)
end,

View File

@@ -85,6 +85,7 @@ return function(name, basalt)
end,
eventHandler = function(self, event, ...)
base.eventHandler(self, event, ...)
if (isActive) then
if (coroutine.status(cRoutine) == "suspended") then
if(filter~=nil)then

View File

@@ -48,7 +48,8 @@ return function(name, basalt)
return self
end,
eventHandler = function(self, event, tObj)
eventHandler = function(self, event, ...)
base.eventHandler(self, event, ...)
if event == "timer" and tObj == timerObj and timerIsActive then
self:sendEvent("timed_event")
if (repeats >= 1) then

View File

@@ -395,17 +395,6 @@ return function(name, basalt)
end
end,
eventHandler = function(self, event, ...)
local val = self:sendEvent("other_event", ...)
if(val~=nil)then return val end
end,
customEventHandler = function(self, event, ...)
local val = self:sendEvent("custom_event", ...)
if(val~=nil)then return val end
return true
end,
getFocusHandler = function(self)
local val = self:sendEvent("get_focus")
if(val~=nil)then return val end