LUADOC - Farming Simulator 19

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
62function IndexStateElement:copyAttributes(src)
63 IndexStateElement:superClass().copyAttributes(self, src)
64
65 self.stateElementTemplate = src.stateElementTemplate
66 self.indexableElement = src.indexableElement
67 self.reverseElements = src.reverseElements
68end

loadFromXML

Description
Definition
loadFromXML()
Code
44function IndexStateElement:loadFromXML(xmlFile, key)
45 IndexStateElement:superClass().loadFromXML(self, xmlFile, key)
46
47 self.stateElementTemplateId = getXMLString(xmlFile, key .. "#stateElementTemplateId")
48 self.indexableElementId = getXMLString(xmlFile, key .. "#indexableElementId")
49 self.reverseElements = getXMLBool(xmlFile, key .. "#reverseElements") or self.reverseElements
50end

loadProfile

Description
Definition
loadProfile()
Code
54function IndexStateElement:loadProfile(profile, applyProfile)
55 IndexStateElement:superClass().loadProfile(self, profile, applyProfile)
56
57 self.reverseElements = profile:getBool("reverseElements", self.reverseElements)
58end

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
104function IndexStateElement:locateIndexableElement()
105 if self.indexableElementId then -- locate indexable element if reference is set
106 local root = self.parent
107 local levels = 20
108 while root.parent and levels > 0 do
109 root = root.parent
110 levels = levels - 1
111 end
112
113 self.indexableElement = root:getDescendantById(self.indexableElementId)
114
115 if self.indexableElement then
116 if self.indexableElement:hasIncluded(IndexChangeSubjectMixin) then
117 self.indexableElement:addIndexChangeObserver(self, self.onIndexChange)
118 else
119 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.")
120 end
121 else
122 print("Warning: IndexStateElement " .. tostring(self) .. " could not find valid indexable element with ID [" .. tostring(self.indexableElementId) .. "]. Check configuration.")
123 end
124 end -- otherwise assume custom control over this element
125end

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
88function IndexStateElement:locateStateElementTemplate()
89 -- get template element from configured ID
90 self.stateElementTemplate = self.parent:getDescendantById(self.stateElementTemplateId)
91 if self.stateElementTemplate then
92 self.stateElementTemplate:setVisible(false)
93 self.stateElementTemplate:setHandleFocus(false) -- no focus, no highlight
94 self.stateElementTemplate:unlinkElement() -- take out of hierarchy to avoid further updates
95 else
96 print("Warning: IndexStateElement " .. tostring(self) .. " could not find state element template with ID [" .. tostring(self.stateElementTemplateId) .. "]. Check configuration.")
97 end
98end

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
39 return self
40end

onGuiSetupFinished

Description
Definition
onGuiSetupFinished()
Code
72function IndexStateElement:onGuiSetupFinished()
73 IndexStateElement:superClass().onGuiSetupFinished(self)
74
75 if not self.stateElementTemplate then
76 self:locateStateElementTemplate()
77 end
78
79 if not self.indexableElement and self.indexableElementId ~= nil then
80 self:locateIndexableElement()
81 end
82end

onIndexChange

Description
Event handler for index changes.
Definition
onIndexChange(index New, count (New))
Arguments
indexNewindex
count(New)item count
Code
131function IndexStateElement:onIndexChange(index, count)
132 if count ~= #self.pageElements then
133 self:setPageCount(count, index)
134 end
135
136 self:setPageIndex(index)
137end

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
144function IndexStateElement:setPageCount(count, initialIndex)
145 -- locate the state element template if page count has been set before GUI finalization
146 if not self.stateElementTemplate then
147 self:locateStateElementTemplate()
148 end
149
150 if count ~= #self.pageElements then
151 -- clear pages
152 for _, element in pairs(self.pageElements) do
153 self:removeElement(element)
154 element:delete()
155 end
156 self.pageElements = {}
157
158 -- replicate template
159 for i = 1, count do
160 local stateElement = self.stateElementTemplate:clone(self)
161 stateElement:setVisible(true)
162 table.insert(self.pageElements, stateElement)
163 end
164
165 -- rebuild layout
166 self:invalidateLayout()
167 if initialIndex then
168 self:setPageIndex(initialIndex)
169 end
170 end
171end