LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

TabbedMenuWithDetails

Description
A tabbed menu with support for detail pages for a hierarchy Please note that this is a hack to make such a system work with the rest of the UI system. Instead, the UI system should be hierarchycal top-down to begin with automatically supporting something like this (by view controllers in tab controller) TODO: A bug exists regarding pageIndex/pageMappingIndex. When there is an invisible page between the tabs (pageIndex does not match pageMappingIndex), and a player switches from a tab with detail open with Q to the tab that is not ordered 'right', it does nothing and the tab is hidden. To 'fix': reorder tabs in xml if possible
Parent
TabbedMenu
Functions

exitMenu

Description
Exit the menu if allowed.
Definition
exitMenu()
Code
49function TabbedMenuWithDetails:exitMenu()
50 -- Make sure that detail mode is off
51 self:popToRoot()
52
53 TabbedMenuWithDetails:superClass().exitMenu(self)
54end

getBreadcrumbs

Description
Get a list of breadcrumbs for the current page
Definition
getBreadcrumbs()
Code
297function TabbedMenuWithDetails:getBreadcrumbs(page)
298 local list = {}
299
300 for _, item in ipairs(self:getStack(page)) do
301 table.insert(list, item.page.title or "")
302 end
303
304 return list
305end

getIsDetailMode

Description
Definition
getIsDetailMode()
Code
43function TabbedMenuWithDetails:getIsDetailMode()
44 return not self:isAtRoot()
45end

getStack

Description
Get the frame stack of the current tab
Definition
getStack()
Code
137function TabbedMenuWithDetails:getStack(page)
138 local pageId = self.currentPageId
139 if page ~= nil then
140 pageId = self.pagingElement:getPageIndexByElement(page)
141 else
142 page = self.pagingElement:getPageElementByIndex(pageId)
143 end
144
145 if self.stacks[pageId] == nil then
146 self.stacks[pageId] = {}
147
148 local root = {
149 page = page,
150 pageId = pageId,
151 isRoot = true,
152 }
153
154 table.insert(self.stacks[pageId], root)
155 end
156
157 return self.stacks[pageId]
158end

getTopFrame

Description
Get the current top frame (page)
Definition
getTopFrame()
Code
168function TabbedMenuWithDetails:getTopFrame()
169 local stack = self:getStack()
170 return stack[#stack].page
171end

isAtRoot

Description
Get whether the current tab is showing its root page
Definition
isAtRoot()
Code
162function TabbedMenuWithDetails:isAtRoot()
163 return #self:getStack() == 1
164end

new

Description
Definition
new()
Code
25function TabbedMenuWithDetails.new(target, customMt, messageCenter, l10n, inputManager)
26 local self = TabbedMenu.new(target, customMt or TabbedMenuWithDetails_mt, messageCenter, l10n, inputManager)
27
28 self.stacks = {}
29
30 return self
31end

onButtonBack

Description
Button function for backing out of the menu.
Definition
onButtonBack()
Code
110function TabbedMenuWithDetails:onButtonBack()
111 if self:isAtRoot() then
112 self:exitMenu()
113 else
114 self:popDetail()
115 end
116end

onDetailClosed

Description
Abstract function called when a detail closed
Definition
onDetailClosed()
Code
100function TabbedMenuWithDetails:onDetailClosed(detailPage)
101end

onDetailOpened

Description
Abstract function called when a detail opened
Definition
onDetailOpened()
Code
105function TabbedMenuWithDetails:onDetailOpened(detailPage)
106end

onOpen

Description
Definition
onOpen()
Code
58function TabbedMenuWithDetails:onOpen(element)
59 -- HACK: Skip over any code in TabbedMenu. It causes a double blur context and too many sounds
60 -- We still want its super class to be called
61 TabbedMenu:superClass().onOpen(self)
62
63 if self.performBackgroundBlur then
64 g_depthOfFieldManager:pushArea(0, 0, 1, 1)
65 -- popped by non-overwritten onClose
66 end
67
68 self:playSample(GuiSoundPlayer.SOUND_SAMPLES.PAGING)
69
70 if self.gameState ~= nil then
71 g_gameStateManager:setGameState(self.gameState)
72 end
73
74 -- Disable all focus sounds. We play our own for opening the menu
75 self:setSoundSuppressed(true)
76
77 local top = self:getTopFrame() -- also creates stack
78
79 if self:isAtRoot() then
80 self:updatePages()
81 self.pageSelector:setState(self.restorePageIndex, true)
82 else
83 top:onFrameOpen()
84 self:updateButtonsPanel(top)
85 end
86
87 self:setSoundSuppressed(false)
88
89 self:onMenuOpened()
90end

onPageChange

Description
Callback form PagingElement
Definition
onPageChange()
Code
120function TabbedMenuWithDetails:onPageChange(pageIndex, pageMappingIndex, element, skipTabVisualUpdate)
121 -- If the new page is a detail page, then do not update
122 if self.isChangingDetail then
123 skipTabVisualUpdate = true
124 else
125 self:popToRoot()
126 end
127
128 TabbedMenuWithDetails:superClass().onPageChange(self, pageIndex, pageMappingIndex, element, skipTabVisualUpdate)
129end

onPageClicked

Description
Override action that happens when a paging tab is clicked
Definition
onPageClicked()
Code
94function TabbedMenuWithDetails:onPageClicked(oldPage)
95 self:popToRoot()
96end

popDetail

Description
Remove current detail and go back to the previous one (or root) We remove the detail onto the context stack, and update the visible frame.
Definition
popDetail()
Code
220function TabbedMenuWithDetails:popDetail()
221 local stack = self:getStack()
222
223 self.isChangingDetail = true
224
225 if #stack == 1 then
226 Logging.error("Cannot pop from view stack at root")
227 return
228 end
229
230 local closingPage = stack[#stack].page
231 table.remove(stack)
232
233 -- Disable the popped page
234 closingPage:setVisible(false)
235 closingPage:onFrameClose()
236
237 self.pagingElement.neuterPageUpdates = true
238 self:setPageDisabled(closingPage, true)
239
240 self:onDetailClosed(closingPage)
241 self.pagingElement.neuterPageUpdates = false
242
243 -- If not at root, show detail again
244 if #stack ~= 1 then
245 local detailPage = stack[#stack].page
246
247 detailPage:onFrameOpen()
248
249 self:setPageDisabled(detailPage, false)
250
251 detailPage:setSoundSuppressed(true) -- avoid playing sound on page focus-triggered selection when opening
252 self.pagingElement:setPage(self.pagingElement:getPageMappingIndexByElement(detailPage))
253 detailPage:setSoundSuppressed(false)
254
255 self:onDetailOpened(detailPage)
256 else
257 -- Set page
258 self.pagingElement:setPage(self.pagingElement:getPageMappingIndexByElement(stack[1].page))
259 end
260
261 self.isChangingDetail = false
262end

popToRoot

Description
Pop everything from the stack until only the root is kept. Used for resetting the hierarchy with clicking a tab
Definition
popToRoot()
Code
266function TabbedMenuWithDetails:popToRoot()
267 local stack = self:getStack()
268
269 -- TODO: optimize. Can close all without opening them too (just close, remove all, open)
270 if #stack > 1 then
271 for _ = #stack, 2, -1 do
272 self:popDetail()
273 end
274 end
275end

pushDetail

Description
Add a new detail and show it. We push the detail onto the context stack, and update the visible frame
Definition
pushDetail()
Code
183function TabbedMenuWithDetails:pushDetail(detailPage)
184 local stack = self:getStack()
185
186 self.isChangingDetail = true
187
188 -- If already a detail visible, hide it first
189 if not self:isAtRoot() then
190 local closingPage = stack[#stack].page
191
192 -- Disable details page
193 detailPage:setVisible(false)
194 detailPage:onFrameClose()
195
196 self:setPageDisabled(detailPage, true)
197
198 self:onDetailClosed(closingPage)
199 end
200
201 local context = {
202 page = detailPage
203 }
204 table.insert(stack, context)
205
206 self:setPageDisabled(detailPage, false)
207
208 detailPage:setSoundSuppressed(true) -- avoid playing sound on page focus-triggered selection when opening
209 self.pagingElement:setPage(self.pagingElement:getPageMappingIndexByElement(detailPage))
210 detailPage:setSoundSuppressed(false)
211
212 self:onDetailOpened(detailPage)
213
214 self.isChangingDetail = false
215end

replaceDetail

Description
Replace current detail with the given. This is useful for keeping the back button behaviour
Definition
replaceDetail()
Code
279function TabbedMenuWithDetails:replaceDetail(detailPage)
280 -- TODO optimize
281
282 -- close
283 -- remove
284 -- add
285 -- open
286
287 self:popDetail()
288 self:pushDetail(detailPage)
289end

reset

Description
Definition
reset()
Code
35function TabbedMenuWithDetails:reset()
36 TabbedMenuWithDetails:superClass().reset(self)
37
38 self.stacks = {}
39end

setPageDisabled

Description
Definition
setPageDisabled()
Code
175function TabbedMenuWithDetails:setPageDisabled(page, disabled)
176 local pageId = self.pagingElement:getPageIdByElement(page)
177 self.pagingElement:setPageIdDisabled(pageId, disabled)
178end