ExperimentalGear/scripts/components/pager/page.lua

91 lines
1.9 KiB
Lua

require("common.class")
---@class Page
---@field content Field[]
---@field viewHandler nil|PageView
local Page = {
__tostring = function() return "Page" end,
drawBackground = nil, ---@type nil|fun(deltaTime: number)
drawHeader = nil, ---@type nil|fun(deltaTime: number)
drawFooter = nil, ---@type nil|fun(deltaTime: number)
}
---Create a new Page instance
---@param o? table
---@return Page
function Page:new(o)
o = o or {}
--set instance members
o.content = o.content or {}
o.viewHandler = o.viewHandler or nil
return Base(self, o)
end
---Initialize members that need further actions after construction
---@return Page
function Page:init()
return self
end
---Add field to page
---@param field Field
function Page:addField(field)
field.parent = self
table.insert(self.content, field)
end
---Refresh content values
function Page:refreshFields()
for _, field in ipairs(self.content) do
field.parent = self
end
end
---Handle controller button input
---
---Overload this function to implement page-specific behaviour
---@param button integer
function Page:handleButtonInput(button)
if button == game.BUTTON_BCK then
if self.viewHandler then
self.viewHandler:back()
end
end
end
---Handle controller knob input
---
---Overload this function to implement page-specific behaviour
---@param knob integer
---@param delta number
function Page:handleKnobInput(knob, delta) end
---Render page
---@param deltaTime number frametime in seconds
function Page:render(deltaTime)
---background
if self.drawBackground then
self:drawBackground(deltaTime)
end
--render children
for _, child in ipairs(self.content) do
child:render(deltaTime)
end
---header
if self.drawHeader then
self:drawHeader(deltaTime)
end
---footer
if self.drawFooter then
self:drawFooter(deltaTime)
end
end
return Page