LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

IndexStateElement

Description
Index state display element. Displays a visual element per screen page to let the player see an indication of their current list, page or multi- option selection index. The element points at a UI element which supports indexed access, such as ListElement, PageElement or MultiTextOption. For other cases, UI views directly manipulate the states (e.g. cycling hints in the loading screen).
Parent
BoxLayoutElement
XML Configuration Parameters
GuiElement#stateElementTemplateIdstring ID of a descendant, sibling or sibling's descendant GUI element which is duplicated per page. The element should be configured to have different visuals for normal and selected GuiOverlay states (layers).
GuiElement#indexableElementstring ID of a descendant, sibling or sibling's descendant GUI element which has an IndexChangeSubjectMixin included.

Functions

copyAttributes

Description
Definition
copyAttributes()
Code
72function IndexStateElement:copyAttributes(src)
73 IndexStateElement:superClass().copyAttributes(self, src)
74
75 self.stateElementTemplate = src.stateElementTemplate
76 self.indexableElement = src.indexableElement
77 self.reverseElements = src.reverseElements
78 self.indexMinimizeWidth = src.indexMinimizeWidth
79end

loadFromXML

Description
Definition
loadFromXML()
Code
52function IndexStateElement:loadFromXML(xmlFile, key)
53 IndexStateElement:superClass().loadFromXML(self, xmlFile, key)
54
55 self.stateElementTemplateId = getXMLString(xmlFile, key .. "#stateElementTemplateId")
56 self.indexableElementId = getXMLString(xmlFile, key .. "#indexableElementId")
57 self.reverseElements = getXMLBool(xmlFile, key .. "#reverseElements") or self.reverseElements
58 self.indexMinimizeWidth = Utils.getNoNil(getXMLBool(xmlFile, key .. "#indexMinimizeWidth"), self.indexMinimizeWidth)
59end

loadProfile

Description
Definition
loadProfile()
Code
63function IndexStateElement:loadProfile(profile, applyProfile)
64 IndexStateElement:superClass().loadProfile(self, profile, applyProfile)
65
66 self.reverseElements = profile:getBool("reverseElements", self.reverseElements)
67 self.indexMinimizeWidth = profile:getBool("indexMinimizeWidth", self.indexMinimizeWidth)
68end

locateIndexableElement

Description
Find and store the indexable element which is configured in #indexableElementId. The function first locates the current view root (if possible) and then searches downwards. The search is broader than locateStateElementTemplate() to allow more flexibility in UI design and configuration.
Definition
locateIndexableElement()
Code
115function IndexStateElement:locateIndexableElement()
116 if self.indexableElementId then -- locate indexable element if reference is set
117 local root = self.parent
118 local levels = 20
119 while root.parent and levels > 0 do
120 root = root.parent
121 levels = levels - 1
122 end
123
124 self.indexableElement = root:getDescendantById(self.indexableElementId)
125
126 if self.indexableElement then
127 if self.indexableElement:hasIncluded(IndexChangeSubjectMixin) then
128 self.indexableElement:addIndexChangeObserver(self, self.onIndexChange)
129 else
130 print("Warning: Element " .. tostring(self.indexableElement) .. " does not support index change observers and is not valid to be targeted by IndexStateElement " .. tostring(self) ..". Check configuration.")
131 end
132 else
133 print("Warning: IndexStateElement " .. tostring(self) .. " could not find valid indexable element with ID [" .. tostring(self.indexableElementId) .. "]. Check configuration.")
134 end
135 end -- otherwise assume custom control over this element
136end

locateStateElementTemplate

Description
Find and store the state element template which is configured in #stateElementTemplateId. The function searches from this elements parent downwards, so any descendant of this element or its siblings may contain the state element template.
Definition
locateStateElementTemplate()
Code
99function IndexStateElement:locateStateElementTemplate()
100 -- get template element from configured ID
101 self.stateElementTemplate = self.parent:getDescendantById(self.stateElementTemplateId)
102 if self.stateElementTemplate then
103 self.stateElementTemplate:setVisible(false)
104 self.stateElementTemplate:setHandleFocus(false) -- no focus, no highlight
105 self.stateElementTemplate:unlinkElement() -- take out of hierarchy to avoid further updates
106 else
107 print("Warning: IndexStateElement " .. tostring(self) .. " could not find state element template with ID [" .. tostring(self.stateElementTemplateId) .. "]. Check configuration.")
108 end
109end

new

Description
Definition
new()
Code
24function IndexStateElement.new(target, custom_mt)
25 if custom_mt == nil then
26 custom_mt = IndexStateElement_mt
27 end
28
29 local self = BoxLayoutElement.new(target, custom_mt)
30
31 self.pageElements = {}
32 self.currentPageIndex = 1
33 self.indexableElementId = nil
34 self.indexableElement = nil
35 self.stateElementTemplateId = nil
36 self.stateElementTemplate = nil
37 self.reverseElements = false
38 self.indexMinimizeWidth = false
39
40 return self
41end

onGuiSetupFinished

Description
Definition
onGuiSetupFinished()
Code
83function IndexStateElement:onGuiSetupFinished()
84 IndexStateElement:superClass().onGuiSetupFinished(self)
85
86 if not self.stateElementTemplate then
87 self:locateStateElementTemplate()
88 end
89
90 if not self.indexableElement and self.indexableElementId ~= nil then
91 self:locateIndexableElement()
92 end
93end

onIndexChange

Description
Event handler for index changes.
Definition
onIndexChange(index New, count (New))
Arguments
indexNewindex
count(New)item count
Code
142function IndexStateElement:onIndexChange(index, count)
143 if count ~= #self.pageElements then
144 self:setPageCount(count, index)
145 end
146
147 self:setPageIndex(index)
148end

setPageCount

Description
Set the page count. Clears current page elements and rebuilds as many as needed from the configured template.
Definition
setPageCount(count Number, initialIndex [optional])
Arguments
countNumberof page indicators to display
initialIndex[optional]Page index to set after rebuilding
Code
155function IndexStateElement:setPageCount(count, initialIndex)
156 -- locate the state element template if page count has been set before GUI finalization
157 if not self.stateElementTemplate then
158 self:locateStateElementTemplate()
159 end
160
161 if count ~= #self.pageElements then
162 -- clear pages
163 for _, element in pairs(self.pageElements) do
164 self:removeElement(element)
165 element:delete()
166 end
167 self.pageElements = {}
168
169 -- replicate template
170 for _ = 1, count do
171 local stateElement = self.stateElementTemplate:clone(self)
172 stateElement:setVisible(true)
173 table.insert(self.pageElements, stateElement)
174 end
175
176 -- rebuild layout
177 self:invalidateLayout()
178 if initialIndex then
179 self:setPageIndex(initialIndex)
180 end
181
182 self:updateSize()
183 end
184end