LUADOC - Farming Simulator 22

MultiTextOptionElement

Description
Multiple choice text element. This element requires a specific configuration setup to be properly used: In the configuration, it must contain the following child elements in this order: 1. ButtonElement, 2. ButtonElement, 3. TextElement, 4. TextElement. The first three elements are mandatory, as they are the buttons to change this element's value and the label which displays the value. The fourth (text) element is optional and used as a header label for this element if defined.
Parent
GuiElement
XML Configuration Parameters
GuiElement#wrapbool [optional] If false, values will not cycle when the end or start of the value list is reached.
GuiElement#buttonRLChangebool [optional] If true, requires controller shoulder buttons as input to change the value.
GuiElement#textsstring [optional] Selectable options, defaults to empty list. Format: "[text1]|[text2]|[text3]". If the prefix "$l10n_" is used in an option text, it is resolved as a variable by the localization system to the corresponding text in the current language.
GuiElement#onClickcallback [optional] onClick(index, element) Called when one of the change buttons is clicked / activated. Receives the current option index and this element.
GuiElement#onFocuscallback [optional] onFocus(element) Called when this element receives focus. Receives this element as an argument.
GuiElement#onLeavecallback [optional] onLeave(element) Called when this element loses focus. Receives this element as an argument.

Functions

addElement

Description
Definition
addElement()
Code
157function MultiTextOptionElement:addElement(element)
158 MultiTextOptionElement:superClass().addElement(self, element)
159
160 if element.name == "ignore" then
161 -- do nothing with this element
162 return
163 end
164
165 if self.namedComponents then
166 if element.name == "left" then
167 -- left
168 self.leftButtonElement = element
169 self.leftButtonElement.forceHighlight = true
170 element:setHandleFocus(false)
171 element.target = self
172 element:setCallback("onClickCallback", "onLeftButtonClicked")
173 self:setDisabled(self.disabled)
174 elseif element.name == "right" then
175 -- right button
176 self.rightButtonElement = element
177 self.rightButtonElement.forceHighlight = true
178 element.target = self
179 element:setHandleFocus(false)
180 element:setCallback("onClickCallback", "onRightButtonClicked")
181 self:setDisabled(self.disabled)
182 elseif element.name == "label" then
183 self.labelElement = element
184 elseif element.name == "text" then
185 if element:isa(TextElement) then
186 self.textElement = element
187 self:updateContentElement()
188 end
189 elseif element.name == "icon" then
190 self.iconElement = element
191 self:updateContentElement()
192 elseif element.name == "gradient" then
193 if element:isa(BitmapElement) then
194 table.insert(self.gradientElements, element)
195 end
196 end
197
198 else
199 -- TODO: this is super easy to get wrong when writing configurations from scratch. Make it smarter, e.g. using names to resolve collaborators.
200 local numElements = #self.elements
201 if numElements == 1 then
202 -- left
203 self.leftButtonElement = element
204 self.leftButtonElement.forceHighlight = true
205 element:setHandleFocus(false)
206 element.target = self
207 element:setCallback("onClickCallback", "onLeftButtonClicked")
208 self:setDisabled(self.disabled)
209 elseif numElements == 2 then
210 -- right button
211 self.rightButtonElement = element
212 self.rightButtonElement.forceHighlight = true
213 element.target = self
214 element:setHandleFocus(false)
215 element:setCallback("onClickCallback", "onRightButtonClicked")
216 self:setDisabled(self.disabled)
217 elseif numElements == 3 then
218 if element:isa(TextElement) then
219 self.textElement = element
220 self:updateContentElement()
221 else
222 self.iconElement = element
223 self:updateContentElement()
224 end
225 elseif numElements == 4 then
226 self.labelElement = element
227 elseif numElements == 5 then
228 -- alternative text element
229 if element:isa(TextElement) then
230 self.textElement = element
231 self:updateContentElement()
232 end
233 elseif numElements == 6 or numElements == 7 then
234 if self.textElement ~= nil and self.textElement ~= nil then
235 if element:isa(BitmapElement) then
236 table.insert(self.gradientElements, element)
237 end
238 end
239 end
240 end
241end

addText

Description
Definition
addText()
Code
257function MultiTextOptionElement:addText(text, i)
258 if i == nil then
259 table.insert(self.texts, text)
260 else
261 table.insert(self.texts, i, text)
262 end
263 self:updateContentElement()
264
265 self:notifyIndexChange(self.state, #self.texts)
266end

canReceiveFocus

Description
Definition
canReceiveFocus()
Code
478function MultiTextOptionElement:canReceiveFocus(element, direction)
479 return not self.disabled and self:getIsVisible() and self.handleFocus
480end

copyAttributes

Description
Definition
copyAttributes()
Code
111function MultiTextOptionElement:copyAttributes(src)
112 MultiTextOptionElement:superClass().copyAttributes(self, src)
113
114 self.isChecked = src.isChecked
115 self.buttonLRChange = src.buttonLRChange
116 self.state = src.state
117 self.wrap = src.wrap
118 self.scrollDelayDuration = src.scrollDelayDuration
119 self.canChangeState = src.canChangeState
120 self.namedComponents = src.namedComponents
121
122 self.onClickCallback = src.onClickCallback
123 self.onLeaveCallback = src.onLeaveCallback
124 self.onFocusCallback = src.onFocusCallback
125 for _, text in pairs(src.texts) do
126 self:addText(text)
127 end
128
129 GuiMixin.cloneMixin(IndexChangeSubjectMixin, src, self)
130 GuiMixin.cloneMixin(PlaySampleMixin, src, self)
131end

disableButtonSounds

Description
Disable automatic playing of sound samples in child buttons.
Definition
disableButtonSounds()
Code
245function MultiTextOptionElement:disableButtonSounds()
246 if self.leftButtonElement ~= nil then
247 self.leftButtonElement:disablePlaySample()
248 end
249
250 if self.rightButtonElement ~= nil then
251 self.rightButtonElement:disablePlaySample()
252 end
253end

getCanChangeState

Description
Definition
getCanChangeState()
Code
466function MultiTextOptionElement:getCanChangeState()
467 return self.canChangeState
468end

getState

Description
Definition
getState()
Code
577function MultiTextOptionElement:getState()
578 return self.state
579end

inputEvent

Description
Definition
inputEvent()
Code
319function MultiTextOptionElement:inputEvent(action, value, eventUsed)
320 eventUsed = MultiTextOptionElement:superClass().inputEvent(self, action, value, eventUsed)
321
322 if not eventUsed then
323 if action == InputAction.MENU_AXIS_LEFT_RIGHT then
324 if value < -g_analogStickHTolerance then
325 eventUsed = true
326 self:inputLeft(false)
327 elseif value > g_analogStickHTolerance then
328 eventUsed = true
329 self:inputRight(false)
330 end
331 elseif action == InputAction.MENU_PAGE_PREV then
332 eventUsed = true
333 self:inputLeft(true)
334 elseif action == InputAction.MENU_PAGE_NEXT then
335 eventUsed = true
336 self:inputRight(true)
337 end
338 end
339
340 return eventUsed
341end

loadFromXML

Description
Definition
loadFromXML()
Code
64function MultiTextOptionElement:loadFromXML(xmlFile, key)
65 MultiTextOptionElement:superClass().loadFromXML(self, xmlFile, key)
66
67 self:addCallback(xmlFile, key.."#onClick", "onClickCallback")
68 self:addCallback(xmlFile, key.."#onFocus", "onFocusCallback")
69 self:addCallback(xmlFile, key.."#onLeave", "onLeaveCallback")
70
71 self.wrap = Utils.getNoNil(getXMLBool(xmlFile, key.."#wrap"), self.wrap)
72 self.buttonLRChange = Utils.getNoNil(getXMLBool(xmlFile, key.."#buttonLRChange"), self.buttonLRChange)
73 self.scrollDelayDuration = Utils.getNoNil(getXMLInt(xmlFile, key .. "#scrollDelayDuration"), self.scrollDelayDuration)
74 self.namedComponents = Utils.getNoNil(getXMLBool(xmlFile, key .. "#namedComponents"), self.namedComponents)
75
76 local text = getXMLString(xmlFile, key.."#texts")
77 if text ~= nil then
78 local texts = text:split("|")
79 for _, textPart in pairs(texts) do
80 if textPart:sub(1,6) == "$l10n_" then
81 textPart = g_i18n:getText(textPart:sub(7))
82 end
83 table.insert(self.texts, textPart)
84 end
85 end
86end

loadProfile

Description
Definition
loadProfile()
Code
90function MultiTextOptionElement:loadProfile(profile, applyProfile)
91 MultiTextOptionElement:superClass().loadProfile(self, profile, applyProfile)
92
93 self.wrap = profile:getBool("wrap", self.wrap)
94 self.buttonLRChange = profile:getBool("buttonLRChange", self.buttonLRChange)
95 self.scrollDelayDuration = profile:getValue("scrollDelayDuration", self.scrollDelayDuration)
96
97 local text = profile:getValue("texts")
98 if text ~= nil then
99 local texts = text:split("|")
100 for _, textPart in pairs(texts) do
101 if textPart:sub(1,6) == "$l10n_" then
102 textPart = g_i18n:getText(textPart:sub(7))
103 end
104 table.insert(self.texts, textPart)
105 end
106 end
107end

mouseEvent

Description
Definition
mouseEvent()
Code
296function MultiTextOptionElement:mouseEvent(posX, posY, isDown, isUp, button, eventUsed)
297 if self:getIsActive() then
298 if MultiTextOptionElement:superClass().mouseEvent(self, posX, posY, isDown, isUp, button, eventUsed) then
299 eventUsed = true
300 end
301
302 if not eventUsed and not self.forceHighlight and GuiUtils.checkOverlayOverlap(posX, posY, self.absPosition[1], self.absPosition[2], self.absSize[1], self.absSize[2], nil) then
303 if not self.mouseEntered and not self.focusActive then
304 FocusManager:setHighlight(self)
305 self.mouseEntered = true
306 end
307 else
308 if self.mouseEntered and not self.focusActive then
309 FocusManager:unsetHighlight(self)
310 self.mouseEntered = false
311 end
312 end
313 end
314 return eventUsed
315end

new

Description
Definition
new()
Code
29function MultiTextOptionElement.new(target, custom_mt)
30 local self = GuiElement.new(target, custom_mt or MultiTextOptionElement_mt)
31 self:include(IndexChangeSubjectMixin) -- add index change subject mixin for observers
32 self:include(PlaySampleMixin) -- add sound playing
33
34 self.isChecked = false
35 self.mouseEntered = false
36 self.buttonLRChange = false
37 self.canChangeState = true
38
39 self.state = 1
40 self.wrap = true
41 self.texts = {}
42
43 self.scrollDelayDuration = FocusManager.FIRST_LOCK
44 self.leftDelayTime = 0
45 self.rightDelayTime = 0
46
47 self.forceHighlight = false
48
49 self.leftButtonElement = nil
50 self.rightButtonElement = nil
51 self.textElement = nil
52 self.labelElement = nil
53 self.iconElement = nil
54
55 self.namedComponents = false
56
57 self.gradientElements = {}
58
59 return self
60end

onFocusEnter

Description
Definition
onFocusEnter()
Code
499function MultiTextOptionElement:onFocusEnter()
500 MultiTextOptionElement:superClass().onFocusEnter(self)
501
502 if self.rightButtonElement ~= nil and self.rightButtonElement.state ~= GuiOverlay.STATE_FOCUSED then
503 self.rightButtonElement:onFocusEnter()
504 end
505 if self.leftButtonElement ~= nil and self.leftButtonElement.state ~= GuiOverlay.STATE_FOCUSED then
506 self.leftButtonElement:onFocusEnter()
507 end
508 self:raiseCallback("onFocusCallback", self)
509end

onFocusLeave

Description
Definition
onFocusLeave()
Code
484function MultiTextOptionElement:onFocusLeave()
485 MultiTextOptionElement:superClass().onFocusLeave(self)
486
487 self:raiseCallback("onLeaveCallback", self)
488
489 if self.rightButtonElement ~= nil and self.rightButtonElement.state ~= GuiOverlay.STATE_NORMAL then
490 self.rightButtonElement:onFocusLeave()
491 end
492 if self.leftButtonElement ~= nil and self.leftButtonElement.state ~= GuiOverlay.STATE_NORMAL then
493 self.leftButtonElement:onFocusLeave()
494 end
495end

onHighlight

Description
Definition
onHighlight()
Code
513function MultiTextOptionElement:onHighlight()
514 MultiTextOptionElement:superClass().onHighlight(self)
515
516 if self.rightButtonElement ~= nil and self.rightButtonElement:getOverlayState() == GuiOverlay.STATE_NORMAL then
517 self.rightButtonElement:setOverlayState(GuiOverlay.STATE_HIGHLIGHTED)
518 end
519
520 if self.leftButtonElement ~= nil and self.leftButtonElement:getOverlayState() == GuiOverlay.STATE_NORMAL then
521 self.leftButtonElement:setOverlayState(GuiOverlay.STATE_HIGHLIGHTED)
522 end
523end

onHighlightRemove

Description
Definition
onHighlightRemove()
Code
527function MultiTextOptionElement:onHighlightRemove()
528 MultiTextOptionElement:superClass().onHighlightRemove(self)
529
530 if self.rightButtonElement ~= nil and self.rightButtonElement:getOverlayState() == GuiOverlay.STATE_HIGHLIGHTED then
531 self.rightButtonElement:setOverlayState(GuiOverlay.STATE_NORMAL)
532 end
533
534 if self.leftButtonElement ~= nil and self.leftButtonElement:getOverlayState() == GuiOverlay.STATE_HIGHLIGHTED then
535 self.leftButtonElement:setOverlayState(GuiOverlay.STATE_NORMAL)
536 end
537end

onLeftButtonClicked

Description
Definition
onLeftButtonClicked()
Code
428function MultiTextOptionElement:onLeftButtonClicked(steps, noFocus)
429 if self:getCanChangeState() then
430 if steps == nil then steps = 1 end
431 if steps ~= nil and type(steps) ~= "number" then steps = 1 end
432 for _ = 1, steps do
433 if self.wrap then
434 self.state = self.state - 1
435 if self.state < 1 then
436 self.state = table.getn(self.texts)
437 end
438 else
439 self.state = math.max(self.state-1, 1)
440 end
441 end
442
443 self:playSample(GuiSoundPlayer.SOUND_SAMPLES.CLICK)
444
445 self:setSoundSuppressed(true)
446 FocusManager:setFocus(self)
447 self:setSoundSuppressed(false)
448
449 self:updateContentElement()
450 self:raiseClickCallback(true)
451 self:notifyIndexChange(self.state, #self.texts)
452
453 if (noFocus == nil or not noFocus) then
454 if self.leftButtonElement ~= nil then
455 self.leftButtonElement:onFocusEnter()
456 end
457 if self.rightButtonElement ~= nil then
458 self.rightButtonElement:onFocusEnter()
459 end
460 end
461 end
462end

onRightButtonClicked

Description
Definition
onRightButtonClicked()
Code
386function MultiTextOptionElement:onRightButtonClicked(steps, noFocus)
387 if self:getCanChangeState() then
388 if steps == nil then steps = 1 end
389 if steps ~= nil and type(steps) ~= "number" then steps = 1 end
390 for _ = 1, steps do
391 if self.wrap then
392 self.state = self.state + 1
393 if self.state > #self.texts then
394 self.state = 1
395 end
396 else
397 self.state = math.min(self.state+1, #self.texts)
398 end
399 end
400
401 self:playSample(GuiSoundPlayer.SOUND_SAMPLES.CLICK)
402
403 self:setSoundSuppressed(true)
404 FocusManager:setFocus(self)
405 self:setSoundSuppressed(false)
406
407 self:updateContentElement()
408 self:raiseClickCallback(false)
409 self:notifyIndexChange(self.state, #self.texts)
410
411 if (noFocus == nil or not noFocus) then
412 if self.leftButtonElement ~= nil then
413 self.leftButtonElement:onFocusEnter()
414 end
415 if self.rightButtonElement ~= nil then
416 self.rightButtonElement:onFocusEnter()
417 end
418 end
419 end
420end

setCanChangeState

Description
Definition
setCanChangeState()
Code
472function MultiTextOptionElement:setCanChangeState(canChangeState)
473 self.canChangeState = canChangeState
474end

setForceHighlight

Description
Set the force highlight state of this element. If force highlight is enabled, this element will not be highlighted automatically but must receive the highlight state manually by calls to FocusManager:setHighlight().
Definition
setForceHighlight()
Code
151function MultiTextOptionElement:setForceHighlight(needForceHighlight)
152 self.forceHighlight = needForceHighlight
153end

setIcons

Description
Definition
setIcons()
Code
280function MultiTextOptionElement:setIcons(icons)
281 self.texts = icons or {}
282 self.state = math.min(self.state, #self.texts)
283 self:updateContentElement()
284
285 self:notifyIndexChange(self.state, #self.texts)
286end

setLabel

Description
Definition
setLabel()
Code
290function MultiTextOptionElement:setLabel(labelString)
291 self.labelElement:setText(labelString)
292end

setState

Description
Definition
setState()
Code
135function MultiTextOptionElement:setState(state, forceEvent)
136 local numTexts = #self.texts
137 self.state = math.max(math.min(state, numTexts), 1)
138 self:updateContentElement()
139
140 if forceEvent then
141 self:raiseClickCallback(true)
142 end
143
144 self:notifyIndexChange(self.state, numTexts)
145end

setTexts

Description
Definition
setTexts()
Code
270function MultiTextOptionElement:setTexts(texts)
271 self.texts = texts or {}
272 self.state = math.min(self.state, #self.texts)
273 self:updateContentElement()
274
275 self:notifyIndexChange(self.state, #self.texts)
276end

updateContentElement

Description
Definition
updateContentElement()
Code
541function MultiTextOptionElement:updateContentElement()
542 local value = self.texts[self.state]
543 local isFilename = value ~= nil and (value:lower():contains(".png") or value:lower():contains(".dds"))
544
545 local useIcon = false
546 if self.iconElement ~= nil then
547 if value ~= nil then
548 if isFilename then
549 self.iconElement:setImageFilename(value)
550 self.iconElement:setVisible(true)
551 for i=1, #self.gradientElements do
552 self.gradientElements[i]:setVisible(false)
553 end
554 useIcon = true
555 end
556 end
557
558 if not useIcon then
559 self.iconElement:setVisible(false)
560 for i=1, #self.gradientElements do
561 self.gradientElements[i]:setVisible(true)
562 end
563 end
564 end
565
566 if self.textElement ~= nil then
567 if not useIcon and value ~= nil and not isFilename then
568 self.textElement:setText(value)
569 else
570 self.textElement:setText("")
571 end
572 end
573end