Script v1_7_1_0
- AI
- Animals
- Collections
- Contracts
- Debug
- Economy
- Elements
- EnvironmentalScore
- Errors
- Events
- GUI
- AnimalScreen
- AnimationElement
- BitmapElement
- BoxLayoutElement
- BreadcrumbsElement
- ButtonElement
- ButtonOverlay
- ChatWindow
- CheckedOptionElement
- ClearElement
- ColorPickButtonElement
- ConstructionScreen
- ContextActionDisplay
- ControlBarDisplay
- DialogElement
- DynamicFadedBitmapElement
- FillLevelsDisplay
- FlowLayoutElement
- FocusManager
- FrameElement
- FrameReferenceElement
- GameInfoDisplay
- GameInfoDisplayMobile
- GamePausedDisplay
- Gui
- GuiDataSource
- GuiElement
- GuiMixin
- GuiOverlay
- GuiProfile
- GuiSoundPlayer
- GuiTopDownCamera
- GuiTopDownCursor
- GuiUtils
- HUDDisplayElement
- HUDElement
- HUDFrameElement
- HUDPopupMessage
- HUDSliderElement
- HUDTextDisplay
- IndexChangeSubjectMixin
- IndexStateElement
- InfoDisplay
- InfoHUDBox
- InGameIcon
- IngameMap
- IngameMapElement
- InputGlyphElement
- InputGlyphElementUI
- InputHelpDisplay
- KeyValueInfoHUDBox
- ListElement
- ListItemElement
- MapOverlayGenerator
- MixerWagonHUDExtension
- MultiTextOptionElement
- MultiValueTween
- Overlay
- PagingElement
- PictureElement
- PlatformIconElement
- PlayerControlPadDisplay
- PlaySampleMixin
- RenderElement
- RoundStatusBar
- ScreenElement
- ScrollingLayoutElement
- SettingsModel
- SideNotification
- SideNotificationMobile
- SliderElement
- SpeakerDisplay
- SpeedMeterDisplay
- SpeedSliderDisplay
- StatusBar
- SteeringSliderDisplay
- TabbedMenu
- TabbedMenuFrameElement
- TabbedMenuWithDetails
- TableElement
- TableHeaderElement
- TerrainLayerElement
- TextBackdropElement
- TextElement
- TextInputElement
- ThreePartBitmapElement
- TimerElement
- ToggleButtonElement
- TopNotification
- Tween
- TweenSequence
- VariableWorkWidthHUDExten...
- VehicleHUDExtension
- VehicleSchemaDisplay
- VideoElement
- WardrobeScreen
- Handtools
- Hud
- I3d
- Input
- Jobs
- Maps
- Materials
- Misc
- Objects
- Parameters
- Placeables
- Placement
- Player
- Shop
- Sounds
- Specialization
- Specializations
- StateMachine
- Statistics
- Tasks
- Triggers
- Utils
- Vehicles
Engine v1_7_1_0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- general
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- NoteNode
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- VoiceChat
- XML
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
297 | function 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 |
305 | 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
137 | function 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] |
158 | end |
getTopFrame
DescriptionGet the current top frame (page)Definition
getTopFrame()Code
168 | function TabbedMenuWithDetails:getTopFrame() |
169 | local stack = self:getStack() |
170 | return stack[#stack].page |
171 | end |
isAtRoot
DescriptionGet whether the current tab is showing its root pageDefinition
isAtRoot()Code
162 | function TabbedMenuWithDetails:isAtRoot() |
163 | return #self:getStack() == 1 |
164 | end |
new
DescriptionDefinitionnew()Code
25 | function 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 |
31 | end |
onButtonBack
DescriptionButton function for backing out of the menu.Definition
onButtonBack()Code
110 | function TabbedMenuWithDetails:onButtonBack() |
111 | if self:isAtRoot() then |
112 | self:exitMenu() |
113 | else |
114 | self:popDetail() |
115 | end |
116 | end |
onDetailClosed
DescriptionAbstract function called when a detail closedDefinition
onDetailClosed()Code
100 | function TabbedMenuWithDetails:onDetailClosed(detailPage) |
101 | end |
onDetailOpened
DescriptionAbstract function called when a detail openedDefinition
onDetailOpened()Code
105 | function TabbedMenuWithDetails:onDetailOpened(detailPage) |
106 | 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: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() |
90 | end |
onPageChange
DescriptionCallback form PagingElementDefinition
onPageChange()Code
120 | function 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) |
129 | end |
onPageClicked
DescriptionOverride action that happens when a paging tab is clickedDefinition
onPageClicked()Code
94 | function TabbedMenuWithDetails:onPageClicked(oldPage) |
95 | self:popToRoot() |
96 | 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
220 | function 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 |
262 | end |
popToRoot
DescriptionPop everything from the stack until only the root is kept. Used for resetting the hierarchy with clicking a tabDefinition
popToRoot()Code
266 | function 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 |
275 | end |
pushDetail
DescriptionAdd a new detail and show it. We push the detail onto the context stack, and update the visible frameDefinition
pushDetail()Code
183 | function 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 |
215 | end |
replaceDetail
DescriptionReplace current detail with the given. This is useful for keeping the back button behaviourDefinition
replaceDetail()Code
279 | function TabbedMenuWithDetails:replaceDetail(detailPage) |
280 | -- TODO optimize |
281 | |
282 | -- close |
283 | -- remove |
284 | -- add |
285 | -- open |
286 | |
287 | self:popDetail() |
288 | self:pushDetail(detailPage) |
289 | end |
reset
DescriptionDefinitionreset()Code
35 | function TabbedMenuWithDetails:reset() |
36 | TabbedMenuWithDetails:superClass().reset(self) |
37 | |
38 | self.stacks = {} |
39 | end |
setPageDisabled
DescriptionDefinitionsetPageDisabled()Code
175 | function TabbedMenuWithDetails:setPageDisabled(page, disabled) |
176 | local pageId = self.pagingElement:getPageIdByElement(page) |
177 | self.pagingElement:setPageIdDisabled(pageId, disabled) |
178 | end |