2022-04-03 19:43:50 +02:00
|
|
|
require("common.class")
|
|
|
|
|
2022-04-03 01:35:41 +02:00
|
|
|
---@class PageView
|
|
|
|
---@field pageStack Page[]
|
2022-04-05 23:53:19 +02:00
|
|
|
local PageView = {
|
2022-04-11 18:47:26 +02:00
|
|
|
__tostring = function() return "PageView" end
|
2022-04-05 23:53:19 +02:00
|
|
|
}
|
2022-04-03 01:35:41 +02:00
|
|
|
|
|
|
|
local function pushStack(t, o)
|
|
|
|
table.insert(t, 1, o)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function popStack(t)
|
|
|
|
return table.remove(t, 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
---Create a new PageView instance
|
|
|
|
---@param rootPage Page
|
|
|
|
---@return PageView
|
2022-04-27 02:40:22 +02:00
|
|
|
function PageView.new(rootPage)
|
2022-04-11 18:47:26 +02:00
|
|
|
local o = {}
|
2022-04-03 01:35:41 +02:00
|
|
|
|
|
|
|
--set viewHandler as this instance for rootPage
|
|
|
|
|
|
|
|
rootPage.viewHandler = o
|
|
|
|
|
|
|
|
--set instance members
|
|
|
|
|
|
|
|
o.pageStack = {}
|
|
|
|
pushStack(o.pageStack, rootPage)
|
|
|
|
|
2022-04-27 02:40:22 +02:00
|
|
|
return CreateInstance(PageView, o)
|
2022-04-03 01:35:41 +02:00
|
|
|
end
|
|
|
|
|
2022-04-05 23:55:50 +02:00
|
|
|
---Get page from pageStack
|
2022-04-12 23:45:28 +02:00
|
|
|
---@param index? integer # defaults to 1 (top of the stack)
|
2022-04-05 23:55:50 +02:00
|
|
|
---@return Page
|
|
|
|
function PageView:get(index)
|
|
|
|
index = index or 1
|
|
|
|
|
|
|
|
return self.pageStack[index]
|
|
|
|
end
|
|
|
|
|
2022-04-03 01:35:41 +02:00
|
|
|
---Navigate to page
|
2022-04-12 23:45:28 +02:00
|
|
|
---@param page Page # page to put on top of the pageStack
|
2022-04-03 01:35:41 +02:00
|
|
|
function PageView:navigate(page)
|
|
|
|
page.viewHandler = self
|
|
|
|
pushStack(self.pageStack, page)
|
|
|
|
end
|
|
|
|
|
2022-04-03 04:59:43 +02:00
|
|
|
---Replace the current pageStack with a new root page
|
2022-04-05 23:55:50 +02:00
|
|
|
---@param rootPage Page
|
|
|
|
function PageView:replace(rootPage)
|
2022-04-24 01:38:28 +02:00
|
|
|
self:clear()
|
2022-04-05 23:55:50 +02:00
|
|
|
self:navigate(rootPage)
|
2022-04-03 04:59:43 +02:00
|
|
|
end
|
|
|
|
|
2022-04-03 01:35:41 +02:00
|
|
|
---Navigate to the previous page
|
|
|
|
function PageView:back()
|
2022-04-05 23:55:50 +02:00
|
|
|
if not self:get() then
|
|
|
|
game.Log(self .. ":back() : pageStack empty, cannot go back", game.LOGGER_WARNING)
|
2022-04-03 01:35:41 +02:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2022-04-05 23:55:50 +02:00
|
|
|
self:get().viewHandler = nil
|
2022-04-03 01:35:41 +02:00
|
|
|
popStack(self.pageStack)
|
|
|
|
end
|
|
|
|
|
2022-04-24 01:38:28 +02:00
|
|
|
---Clear the pageStack
|
|
|
|
function PageView:clear()
|
|
|
|
--clear pageStack
|
|
|
|
while self:get() do
|
|
|
|
self:back()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-04-12 23:45:28 +02:00
|
|
|
---@param deltaTime number # frametime in seconds
|
2022-04-03 01:35:41 +02:00
|
|
|
function PageView:render(deltaTime)
|
2022-04-05 23:55:50 +02:00
|
|
|
if self:get() then
|
|
|
|
self:get():render(deltaTime)
|
2022-04-03 01:35:41 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-04-05 23:53:19 +02:00
|
|
|
return PageView
|