Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- AnimalScreen
- AnimationElement
- BitmapElement
- BoxLayoutElement
- BreadcrumbsElement
- ButtonElement
- ButtonOverlay
- ChatWindow
- CheckedOptionElement
- ClearElement
- ContextActionDisplay
- DialogElement
- FieldInfoDisplay
- FillLevelsDisplay
- FlowLayoutElement
- FocusManager
- FrameElement
- FrameReferenceElement
- GameInfoDisplay
- GamePausedDisplay
- Gui
- GuiDataSource
- GuiElement
- GuiMixin
- GuiOverlay
- GuiProfile
- GuiSoundPlayer
- GuiTopDownCamera
- GuiUtils
- HUDDisplayElement
- HUDElement
- HUDFrameElement
- HUDPopupMessage
- HUDTextDisplay
- IndexChangeSubjectMixin
- IndexStateElement
- InGameIcon
- IngameMap
- IngameMapElement
- InputGlyphElement
- InputHelpDisplay
- ListElement
- ListItemElement
- MapHotspot
- MapOverlayGenerator
- MixerWagonHUDExtension
- MultiTextOptionElement
- MultiValueTween
- Overlay
- PagingElement
- PlaySampleMixin
- RenderElement
- RoundStatusBar
- ScreenElement
- SettingsModel
- SideNotification
- SliderElement
- SpeakerDisplay
- SpeedMeterDisplay
- StableListElement
- StatusBar
- TabbedMenu
- TabbedMenuFrameElement
- TabbedMenuWithDetails
- TableElement
- TableHeaderElement
- TextElement
- TextInputElement
- TimerElement
- ToggleButtonElement
- TopNotification
- Tween
- TweenSequence
- VehicleHUDExtension
- VehicleSchemaDisplay
- VideoElement
- Handtools
- I3d
- Materials
- Misc
- Objects
- Placeables
- Player
- Shop
- Sounds
- Specializations
- Triggers
- Utils
- Vehicles
- Weather
Engine v1.7.1.0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- XML
- general
Foundation Reference
TabbedMenuWithDetails
DescriptionA 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 possibleParent
TabbedMenuFunctions
- exitMenu
- getBreadcrumbs
- getIsDetailMode
- getStack
- getTopFrame
- isAtRoot
- new
- onButtonBack
- onDetailClosed
- onDetailOpened
- onOpen
- onPageChange
- onPageClicked
- popDetail
- popToRoot
- pushDetail
- replaceDetail
- reset
- setPageDisabled
exitMenu
DescriptionExit the menu if allowed.Definition
exitMenu()Code
49 | function TabbedMenuWithDetails:exitMenu() |
50 | -- Make sure that detail mode is off |
51 | self:popToRoot() |
52 | |
53 | TabbedMenuWithDetails:superClass().exitMenu(self) |
54 | end |
getBreadcrumbs
DescriptionGet a list of breadcrumbs for the current pageDefinition
getBreadcrumbs()Code
294 | function TabbedMenuWithDetails:getBreadcrumbs(page) |
295 | local list = {} |
296 | |
297 | for _, item in ipairs(self:getStack(page)) do |
298 | table.insert(list, item.page.title or "") |
299 | end |
300 | |
301 | return list |
302 | end |
getIsDetailMode
DescriptionDefinitiongetIsDetailMode()Code
43 | function TabbedMenuWithDetails:getIsDetailMode() |
44 | return not self:isAtRoot() |
45 | end |
getStack
DescriptionGet the frame stack of the current tabDefinition
getStack()Code
136 | function TabbedMenuWithDetails:getStack(page) |
137 | local pageId = self.currentPageId |
138 | if page ~= nil then |
139 | pageId = self.pagingElement:getPageIndexByElement(page) |
140 | else |
141 | page = self.pagingElement:getPageElementByIndex(pageId) |
142 | end |
143 | |
144 | if self.stacks[pageId] == nil then |
145 | self.stacks[pageId] = {} |
146 | |
147 | local root = { |
148 | page = page, |
149 | pageId = pageId, |
150 | isRoot = true, |
151 | } |
152 | |
153 | table.insert(self.stacks[pageId], root) |
154 | end |
155 | |
156 | return self.stacks[pageId] |
157 | end |
getTopFrame
DescriptionGet the current top frame (page)Definition
getTopFrame()Code
167 | function TabbedMenuWithDetails:getTopFrame() |
168 | local stack = self:getStack() |
169 | return stack[#stack].page |
170 | end |
isAtRoot
DescriptionGet whether the current tab is showing its root pageDefinition
isAtRoot()Code
161 | function TabbedMenuWithDetails:isAtRoot() |
162 | return table.getn(self:getStack()) == 1 |
163 | end |
new
DescriptionDefinitionnew()Code
25 | function TabbedMenuWithDetails:new(target, customMt, messageCenter, l10n, inputManager) |
26 | local self = TabbedMenu:new(target, customMt or TabbedMenu_mt, messageCenter, l10n, inputManager) |
27 | |
28 | self.stacks = {} |
29 | |
30 | return self |
31 | end |
onButtonBack
DescriptionButton function for backing out of the menu.Definition
onButtonBack()Code
109 | function TabbedMenuWithDetails:onButtonBack() |
110 | if self:isAtRoot() then |
111 | self:exitMenu() |
112 | else |
113 | self:popDetail() |
114 | end |
115 | end |
onDetailClosed
DescriptionAbstract function called when a detail closedDefinition
onDetailClosed()Code
99 | function TabbedMenuWithDetails:onDetailClosed(detailPage) |
100 | end |
onDetailOpened
DescriptionAbstract function called when a detail openedDefinition
onDetailOpened()Code
104 | function TabbedMenuWithDetails:onDetailOpened(detailPage) |
105 | end |
onOpen
DescriptionDefinitiononOpen()Code
58 | function 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:setBlurState(true) |
65 | end |
66 | |
67 | self:playSample(GuiSoundPlayer.SOUND_SAMPLES.PAGING) |
68 | |
69 | if self.gameState ~= nil then |
70 | g_gameStateManager:setGameState(self.gameState) |
71 | end |
72 | |
73 | -- Disable all focus sounds. We play our own for opening the menu |
74 | self:setSoundSuppressed(true) |
75 | |
76 | local top = self:getTopFrame() -- also creates stack |
77 | |
78 | if self:isAtRoot() then |
79 | self:updatePages() |
80 | self.pageSelector:setState(self.restorePageIndex, true) |
81 | else |
82 | top:onFrameOpen() |
83 | self:updateButtonsPanel(top) |
84 | end |
85 | |
86 | self:setSoundSuppressed(false) |
87 | |
88 | self:onMenuOpened() |
89 | end |
onPageChange
DescriptionCallback form PagingElementDefinition
onPageChange()Code
119 | function TabbedMenuWithDetails:onPageChange(pageIndex, pageMappingIndex, element, skipTabVisualUpdate) |
120 | -- If the new page is a detail page, then do not update |
121 | if self.isChangingDetail then |
122 | skipTabVisualUpdate = true |
123 | else |
124 | self:popToRoot() |
125 | end |
126 | |
127 | TabbedMenuWithDetails:superClass().onPageChange(self, pageIndex, pageMappingIndex, element, skipTabVisualUpdate) |
128 | end |
onPageClicked
DescriptionOverride action that happens when a paging tab is clickedDefinition
onPageClicked()Code
93 | function TabbedMenuWithDetails:onPageClicked(oldPage) |
94 | self:popToRoot() |
95 | end |
popDetail
DescriptionRemove 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
219 | function TabbedMenuWithDetails:popDetail() |
220 | local stack = self:getStack() |
221 | |
222 | self.isChangingDetail = true |
223 | |
224 | if #stack == 1 then |
225 | g_logManager:error("Cannot pop from view stack at root") |
226 | return |
227 | end |
228 | |
229 | local closingPage = stack[#stack].page |
230 | table.remove(stack) |
231 | |
232 | -- Disable the popped page |
233 | closingPage:setVisible(false) |
234 | closingPage:onFrameClose() |
235 | |
236 | self:setPageDisabled(closingPage, true) |
237 | |
238 | self:onDetailClosed(detailPage) |
239 | |
240 | -- If not at root, show detail again |
241 | if #stack ~= 1 then |
242 | local detailPage = stack[#stack].page |
243 | |
244 | detailPage:onFrameOpen() |
245 | |
246 | self:setPageDisabled(detailPage, false) |
247 | |
248 | detailPage:setSoundSuppressed(true) -- avoid playing sound on page focus-triggered selection when opening |
249 | self.pagingElement:setPage(self.pagingElement:getPageMappingIndexByElement(detailPage)) |
250 | detailPage:setSoundSuppressed(false) |
251 | |
252 | self:onDetailOpened(detailPage) |
253 | else |
254 | -- Set page |
255 | self.pagingElement:setPage(self.pagingElement:getPageMappingIndexByElement(stack[1].page)) |
256 | end |
257 | |
258 | self.isChangingDetail = false |
259 | end |
popToRoot
DescriptionPop everything from the stack until only the root is kept. Used for resetting the hierarchy with clicking a tabDefinition
popToRoot()Code
263 | function TabbedMenuWithDetails:popToRoot() |
264 | local stack = self:getStack() |
265 | |
266 | -- TODO: optimize. Can close all without opening them too (just close, remove all, open) |
267 | if #stack > 1 then |
268 | for _ = #stack, 2, -1 do |
269 | self:popDetail() |
270 | end |
271 | end |
272 | end |
pushDetail
DescriptionAdd a new detail and show it. We push the detail onto the context stack, and update the visible frameDefinition
pushDetail()Code
182 | function TabbedMenuWithDetails:pushDetail(detailPage) |
183 | local stack = self:getStack() |
184 | |
185 | self.isChangingDetail = true |
186 | |
187 | -- If already a detail visible, hide it first |
188 | if not self:isAtRoot() then |
189 | local closingPage = stack[#stack].page |
190 | |
191 | -- Disable details page |
192 | detailPage:setVisible(false) |
193 | detailPage:onFrameClose() |
194 | |
195 | self:setPageDisabled(detailPage, true) |
196 | |
197 | self:onDetailClosed(closingPage) |
198 | end |
199 | |
200 | local context = { |
201 | page = detailPage |
202 | } |
203 | table.insert(stack, context) |
204 | |
205 | self:setPageDisabled(detailPage, false) |
206 | |
207 | detailPage:setSoundSuppressed(true) -- avoid playing sound on page focus-triggered selection when opening |
208 | self.pagingElement:setPage(self.pagingElement:getPageMappingIndexByElement(detailPage)) |
209 | detailPage:setSoundSuppressed(false) |
210 | |
211 | self:onDetailOpened(detailPage) |
212 | |
213 | self.isChangingDetail = false |
214 | end |
replaceDetail
DescriptionReplace current detail with the given. This is useful for keeping the back button behaviourDefinition
replaceDetail()Code
276 | function TabbedMenuWithDetails:replaceDetail(detailPage) |
277 | -- TODO optimize |
278 | |
279 | -- close |
280 | -- remove |
281 | -- add |
282 | -- open |
283 | |
284 | self:popDetail() |
285 | self:pushDetail(detailPage) |
286 | end |
reset
DescriptionDefinitionreset()Code
35 | function TabbedMenuWithDetails:reset() |
36 | TabbedMenuWithDetails:superClass().reset(self) |
37 | |
38 | self.stacks = {} |
39 | end |
setPageDisabled
DescriptionDefinitionsetPageDisabled()Code
174 | function TabbedMenuWithDetails:setPageDisabled(page, disabled) |
175 | local pageId = self.pagingElement:getPageIdByElement(page) |
176 | self.pagingElement:setPageIdDisabled(pageId, disabled) |
177 | end |