require("common.class") ---@class PageView ---@field pageStack Page[] local PageView = { __name = "PageView" } 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 ---@return PageView function PageView.new() local self = CreateInstance(PageView) self.pageStack = {} return self end ---Get page from pageStack ---@param index? integer # defaults to 1 (top of the stack) ---@return Page function PageView:get(index) index = index or 1 return self.pageStack[index] end ---Navigate to page ---@param page Page # page to put on top of the pageStack function PageView:navigate(page) page.viewHandler = self pushStack(self.pageStack, page) self:onNavigated(false) end ---Replace the current pageStack with a new root page ---@param rootPage Page function PageView:replace(rootPage) self:clear() self:navigate(rootPage) end ---Navigate to the previous page function PageView:back() if not self:get() then game.Log(self .. ":back() : pageStack empty, cannot go back", game.LOGGER_WARNING) return end self:get().viewHandler = nil popStack(self.pageStack) self:onNavigated(true) if not self:get() then self:onEmptied() end end ---Clear the pageStack function PageView:clear() --clear pageStack while self:get() do self:back() end end ---@param back boolean # whether it's called in the back() function function PageView:onNavigated(back) end function PageView:onEmptied() end ---@param deltaTime number # frametime in seconds function PageView:render(deltaTime) if self:get() then self:get():render(deltaTime) end end return PageView