sonic-radiance/sonic-radiance.love/birb/modules/gui/mixins/elements.lua

84 lines
2 KiB
Lua
Raw Normal View History

2021-08-21 12:45:49 +02:00
local ElementList = Object:extend()
function ElementList:initElements()
self.elements = {}
self.focusedElement = nil
2021-08-31 10:01:24 +02:00
self.lastFocused = nil
2021-08-22 12:39:44 +02:00
self.nbrElement = 0
2021-08-21 12:45:49 +02:00
end
function ElementList:addElement(name, element)
2021-08-22 12:39:44 +02:00
self.nbrElement = self.nbrElement + 1
2021-08-21 12:45:49 +02:00
self.elements[name] = element
2021-08-22 12:39:44 +02:00
return self.nbrElement
2021-08-21 12:45:49 +02:00
end
function ElementList:deleteElement(name)
self.elements[name] = nil
end
function ElementList:setFocus(name)
assert(self:elementExists(name), "Element " .. name .. " doesn't exists")
2021-08-31 10:01:24 +02:00
self:storeLastFocus()
self.focusedElement = name
self.elements[name].isVisible = true
end
2021-08-31 10:01:24 +02:00
function ElementList:removeFocus()
self:storeLastFocus()
self.focusedElement = nil
end
function ElementList:storeLastFocus()
if (self.focusedElement ~= nil) then
self.lastFocused = self.focusedElement
end
end
function ElementList:setLastFocus()
if (self:elementExists(self.lastFocused)) then
self:setFocus(self.lastFocused)
end
end
function ElementList:elementExists(name)
return (self:getElement(name) ~= nil)
end
function ElementList:haveFocus()
return self:elementExists(self.focusedElement)
end
function ElementList:getFocusedElement()
return self:getElement(self.focusedElement)
end
function ElementList:getElement(name)
if (not utils.string.isEmpty(name)) then
return self.elements[name]
end
return nil
end
2021-08-21 12:45:49 +02:00
function ElementList:getVisibleElement(topLayer)
local visibleList = {}
2021-08-22 13:02:52 +02:00
for _, element in pairs(self.elements) do
2021-08-21 12:45:49 +02:00
if (element ~= nil) then
if (element:getVisibility() and ((element.depth) < 0 == topLayer)) then
table.insert(visibleList, element)
end
end
end
2021-08-22 12:39:44 +02:00
table.sort(visibleList, function (a, b)
if (a.depth == b.depth) then
return (a.creationId < b.creationId)
else
return (a.depth > b.depth)
end
end)
2021-08-21 12:45:49 +02:00
return visibleList
end
return ElementList