LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

ListElement

Description
List display element. Layouts a list of ListItemElement instances which themselves can contain other elements. The list interacts with a slider element for scrolling, if it is set up via configuration. Use this list element for ordered displaying of a small to medium number of elements. For larger element counts or more elaborate ordering logic, consider using the TableElement instead. An important note: - Even in a single column list, set both listItemHeight and listItemWidth. Both are always used to calculate mouse click targets.
Parent
GuiElement
XML Configuration Parameters
GuiElement#focusScrollsListbool [optional] If false, changing the current focus does not affect scrolling.
GuiElement#updateSelectionOnOpenbool [optional] If false, will not re-select the currently selected item when the list is opened.
GuiElement#useSelectionOnLeavebool [optional] If true, will force selection on the last selected list item when the list loses focus.
GuiElement#selectOnScrollbool [optional] If true, will move the current selection when scrolling.
GuiElement#maxNumItemsint [optional] Maximum number of list items, defaults to no limit. Adding any more elements than this value will have no effect.
GuiElement#doubleClickIntervalint [optional] Maximum time in milliseconds between consecutive clicks to interpret them as one double click.
GuiElement#selectOnClickbool [optional] If true, mouse clicks will only select a list item and not trigger the onClick callback.
GuiElement#ignoreMousebool [optional] If true, will ignore all mouse interactions (clicking, scrolling)
GuiElement#keepSelectedInViewbool [optional] If true, will make sure a selected item is always visible after scrolling
GuiElement#isPaginatedbool [optional] If true, can scroll towards last item filling the screen with whitespace. If false, last item is always there if enough list items are available.
GuiElement#itemsPerRowint [optional] Number of items laid out horizontally per row, defaults to 1.
GuiElement#itemsPerColint [optional] Number of items laid out vertically per column, defaults to 1.
GuiElement#listItemStartXOffsetstring [optional] Pixel X offset from this list's origin for list items, defaults to 0. Format: "[x]px"
GuiElement#listItemStartYOffsetstring [optional] Pixel Y offset from this list's origin for list items, defaults to 0. Format: "[y]px"
GuiElement#listItemWidthstring [optional] Pixel width of list items in reference resolution. Format: "[width]px"
GuiElement#listItemHeightstring [optional] Pixel height of list items in reference resolution. Format: "[height]px"
GuiElement#listItemAutoSizebool [optional, default=false] If true, will set listItemWidth and listItemHeight automatically to the dimensions of the first child ListElement instance.
GuiElement#listItemPaddingstring [optional] Pixel size of horizontal space between list items in reference resolution, defaults to 0. This space will be added after each item. Format: "[padding]px"
GuiElement#listItemSpacingstring [optional] Pixel size of vertical space between list items in reference resolution, defaults to 0. This space will be added after each item. Format: "[spacing]px"
GuiElement#rowBackgroundProfilestring [optional] Profile identifier for the default row background element.
GuiElement#rowBackgroundProfileAlternatestring [optional] Profile identifier for an alternating row background element. If both this and rowBackgroundProfile are specified, table row backgrounds alternate between these profiles for visibility.
GuiElement#onSelectionChangedcallback [optional] onSelectionChanged(newIndex) Called when list item selection changes. Receives new item index.
GuiElement#onScrollcallback [optional] onScroll(firstVisibleItemIndex) Called when the list is being scrolled by user input.
GuiElement#onDoubleClickcallback [optional] onDoubleClick(selectedIndex, selectedElement) Called when a list item is double-clicked. Receives the clicked item index and the item itself.
GuiElement#onClickcallback [optional] onClick(selectedIndex, selectedElement) Called when a list item is clicked / activated. Receives the clicked item index and the item itself.

Functions

addElement

Description
Add a new element (cloning into the list element also works)
Definition
addElement()
Code
477function ListElement:addElement(element)
478 self:addElementAtPosition(element, #self.listItems + 1)
479end

addElementAtPosition

Description
Definition
addElementAtPosition()
Code
483function ListElement:addElementAtPosition(element, position)
484 ListElement:superClass().addElement(self, element)
485
486 if self.maxNumItems == nil or #self.listItems <= self.maxNumItems then
487 table.insert(self.listItems, position, element)
488
489 element:fadeOut()
490 self:setDisabled(self.disabled)
491
492 self:updateAlternatingBackground()
493
494 if self.selectedIndex >= position then
495 self:setSelectedIndex(self.selectedIndex + 1)
496 if #self.listItems == 1 then
497 self:updateItemPositions()
498 end
499 else
500 self:updateItemPositions()
501 end
502
503 self:raiseSliderUpdateEvent()
504 if not element.focusId then
505 FocusManager:loadElementFromCustomValues(element, nil, element.focusChangeData, element.focusActive, element.isAlwaysFocusedOnOpen)
506 end
507 end
508
509 self:notifyIndexChange(self.selectedIndex, #self.listItems)
510end

applyElementSelection

Description
Apply visual list item selection state based on the current data selection.
Definition
applyElementSelection()
Code
999function ListElement:applyElementSelection()
1000 if self.firstVisibleItem > 0 then
1001 local index = self:getSelectedElementIndex()
1002 for i = 1, #self.elements do
1003 local element = self.elements[i]
1004 if element.setSelected ~= nil then
1005 element:setSelected(index == i)
1006 end
1007 end
1008 end
1009end

applyListAspectScale

Description
Definition
applyListAspectScale()
Code
242function ListElement:applyListAspectScale()
243 local xScale, yScale = self:getAspectScale()
244
245 self.listItemStartXOffset = self.listItemStartXOffset * xScale
246 self.listItemWidth = self.listItemWidth * xScale
247 self.listItemPadding = self.listItemPadding * xScale
248
249 self.listItemStartYOffset = self.listItemStartYOffset * yScale
250 self.listItemHeight = self.listItemHeight * yScale
251 self.listItemSpacing = self.listItemSpacing * yScale
252end

applyScreenAlignment

Description
Definition
applyScreenAlignment()
Code
256function ListElement:applyScreenAlignment()
257 self:applyListAspectScale()
258
259 ListElement:superClass().applyScreenAlignment(self)
260end

calculateFirstVisibleItem

Description
Definition
calculateFirstVisibleItem()
Code
342function ListElement:calculateFirstVisibleItem(index)
343 local newFirstVisibleItem = self.firstVisibleItem
344 local itemFactor = self:getItemFactor()
345 local count = self:getItemCount()
346
347 -- only change firstVisibleItem if index is out of visible range
348 if index < self.firstVisibleItem then
349 newFirstVisibleItem = math.ceil(index/itemFactor) * itemFactor - (itemFactor - 1)
350 elseif index >= self.firstVisibleItem+self.visibleItems then
351 -- With pagination, we need to stick to page alignment
352 if self.isPaginated then
353 local page = math.ceil(index / self.visibleItems)
354 newFirstVisibleItem = (page - 1) * self.visibleItems + 1
355
356 -- Otherwise, just put the item inside (as last item)
357 else
358 newFirstVisibleItem = math.ceil(index/itemFactor) * itemFactor - self.visibleItems + 1
359 end
360 elseif count == 0 then
361 newFirstVisibleItem = 0
362 end
363
364 return MathUtil.clamp(newFirstVisibleItem, 1, count)
365end

canReceiveFocus

Description
Definition
canReceiveFocus()
Code
950function ListElement:canReceiveFocus()
951 return self:getIsVisible() and self.handleFocus and not self.disabled and (#self.listItems > 0)
952end

clearElementSelection

Description
Remove element selection state on all elements (e.g. when losing focus).
Definition
clearElementSelection()
Code
1013function ListElement:clearElementSelection()
1014 for i = 1, #self.elements do
1015 local element = self.elements[i]
1016 if element.setSelected ~= nil then
1017 element:setSelected(false)
1018 end
1019 end
1020end

convertVisualRowColumToReal

Description
Definition
convertVisualRowColumToReal()
Code
843function ListElement:convertVisualRowColumToReal(row, column)
844 local realRow = row
845 local realColumn = column
846
847 if self.isHorizontalList then
848 realColumn = math.floor((self.firstVisibleItem-1)/self.itemsPerCol) + column
849 else
850 realRow = math.floor((self.firstVisibleItem-1)/self.itemsPerRow) + row
851 end
852
853 return realRow, realColumn
854end

copyAttributes

Description
Definition
copyAttributes()
Code
199function ListElement:copyAttributes(src)
200 ListElement:superClass().copyAttributes(self, src)
201
202 self.doesFocusScrollList = src.doesFocusScrollList
203 self.isHorizontalList = src.isHorizontalList
204 self.updateSelectionOnOpen = src.updateSelectionOnOpen
205 self.useSelectionOnLeave = src.useSelectionOnLeave
206 self.selectOnScroll = src.selectOnScroll
207 self.supportsMouseScrolling = src.supportsMouseScrolling
208 self.doubleClickInterval = src.doubleClickInterval
209 self.selectOnClick = src.selectOnClick
210 self.ignoreMouse = src.ignoreMouse
211 self.maxNumItems = src.maxNumItems
212 self.keepSelectedInView = src.keepSelectedInView
213 self.isPaginated = src.isPaginated
214
215 self.visibleItems = src.visibleItems
216 self.itemsPerRow = src.itemsPerRow
217 self.itemsPerCol = src.itemsPerCol
218
219 self.listItemStartXOffset = src.listItemStartXOffset
220 self.listItemStartYOffset = src.listItemStartYOffset
221 self.listItemWidth = src.listItemWidth
222 self.listItemHeight = src.listItemHeight
223 self.listItemPadding = src.listItemPadding
224 self.listItemSpacing = src.listItemSpacing
225 self.listItemAutoSize = src.listItemAutoSize
226
227 self.rowBackgroundProfile = src.rowBackgroundProfile
228 self.rowBackgroundProfileAlternate = src.rowBackgroundProfileAlternate
229
230 self.onSelectionChangedCallback = src.onSelectionChangedCallback
231 self.onScrollCallback = src.onScrollCallback
232 self.onDoubleClickCallback = src.onDoubleClickCallback
233 self.onClickCallback = src.onClickCallback
234 self.onItemAppearCallback = src.onItemAppearCallback
235 self.onItemDisappearCallback = src.onItemDisappearCallback
236
237 GuiMixin.cloneMixin(IndexChangeSubjectMixin, src, self)
238end

delete

Description
Definition
delete()
Code
108function ListElement:delete()
109 -- This forwards to removeElement
110 self.deletingAllListItems = true
111
112 local numItems = #self.listItems
113 for _ = 1,numItems do
114 self.listItems[1]:delete()
115 end
116
117 ListElement:superClass().delete(self)
118end

deleteListItems

Description
Delete all list items
Definition
deleteListItems()
Code
548function ListElement:deleteListItems()
549 local numItems = #self.listItems
550 for _ = 1, numItems do
551 self.listItems[1]:delete()
552 end
553
554 self.selectedIndex = 1
555
556 self:notifyIndexChange(1, numItems)
557 self:raiseSliderUpdateEvent()
558end

getItemFactor

Description
Definition
getItemFactor()
Code
369function ListElement:getItemFactor()
370 if self.isHorizontalList then
371 return self.itemsPerCol
372 else
373 return self.itemsPerRow
374 end
375end

getItemIndexByRealRowColumn

Description
Definition
getItemIndexByRealRowColumn()
Code
835function ListElement:getItemIndexByRealRowColumn(realRow, realColumn)
836 local number = self:getUnclampedIndexByRealRowColumn(realRow, realColumn)
837
838 return MathUtil.clamp(number, 1, self:getItemCount())
839end

getItemPosition

Description
Definition
getItemPosition()
Code
766function ListElement:getItemPosition(leftPos, topPos, index, item)
767 local xPos, yPos
768
769 if self.isHorizontalList then
770 xPos = leftPos + math.floor(index / self.itemsPerCol) * (self.listItemWidth + self.listItemPadding)
771 yPos = topPos - index % self.itemsPerCol * (self.listItemHeight + self.listItemSpacing)
772 else
773 xPos = leftPos + index % self.itemsPerRow * (self.listItemWidth + self.listItemPadding)
774 yPos = topPos - math.floor(index / self.itemsPerRow) * (self.listItemHeight + self.listItemSpacing)
775 end
776
777 return xPos, yPos
778end

getNumOfColumns

Description
Get the number of colums
Definition
getNumOfColumns()
Code
804function ListElement:getNumOfColumns()
805 return math.ceil(self:getItemCount() / self.itemsPerCol)
806end

getNumOfRows

Description
Get the number of rows
Definition
getNumOfRows()
Code
798function ListElement:getNumOfRows()
799 return math.ceil(self:getItemCount() / self.itemsPerRow)
800end

getRealRowColumnByIndex

Description
Definition
getRealRowColumnByIndex()
Code
782function ListElement:getRealRowColumnByIndex(index)
783 local row, column
784
785 if self.isHorizontalList then
786 row = ((index-1) % self.itemsPerCol) + 1
787 column = math.floor((index-1)/self.itemsPerCol) + 1
788 else
789 row = math.ceil(index / self.itemsPerRow)
790 column = ((index-1) % self.itemsPerRow) + 1
791 end
792
793 return row, column
794end

getSelectedElement

Description
Get the selected element
Definition
getSelectedElement()
Code
462function ListElement:getSelectedElement()
463 if self.selectedIndex >= 1 then
464 return self.listItems[self:getSelectedElementIndex()], self.selectedIndex
465 end
466end

getSelectedElementIndex

Description
Get the currently selected list element's index.
Definition
getSelectedElementIndex()
Code
456function ListElement:getSelectedElementIndex()
457 return self.selectedIndex
458end

getUnclampedIndexByRealRowColumn

Description
Definition
getUnclampedIndexByRealRowColumn()
Code
825function ListElement:getUnclampedIndexByRealRowColumn(realRow, realColumn)
826 if self.isHorizontalList then
827 return realRow + (realColumn - 1) * self.itemsPerCol
828 else
829 return realColumn + (realRow - 1) * self.itemsPerRow
830 end
831end

getVisibleItemCount

Description
Get the number of visible items.
Definition
getVisibleItemCount()
Return Values
Numberofvisible items
Code
819function ListElement:getVisibleItemCount()
820 return self.visibleItems
821end

loadFromXML

Description
Definition
loadFromXML()
Code
122function ListElement:loadFromXML(xmlFile, key)
123 ListElement:superClass().loadFromXML(self, xmlFile, key)
124
125 self.doesFocusScrollList = Utils.getNoNil(getXMLBool(xmlFile, key.."#focusScrollsList"), self.doesFocusScrollList)
126 self.isHorizontalList = Utils.getNoNil(getXMLBool(xmlFile, key.."#isHorizontalList"), self.isHorizontalList)
127 self.updateSelectionOnOpen = Utils.getNoNil(getXMLBool(xmlFile, key.."#updateSelectionOnOpen"), self.updateSelectionOnOpen)
128 self.useSelectionOnLeave = Utils.getNoNil(getXMLBool(xmlFile, key.."#useSelectionOnLeave"), self.useSelectionOnLeave)
129 self.selectOnScroll = Utils.getNoNil(getXMLBool(xmlFile, key.."#selectOnScroll"), self.selectOnScroll)
130 self.supportsMouseScrolling = Utils.getNoNil(getXMLBool(xmlFile, key.."#supportsMouseScrolling"), self.supportsMouseScrolling)
131 self.maxNumItems = Utils.getNoNil(getXMLInt(xmlFile, key.."#maxNumItems"), self.maxNumItems)
132 self.doubleClickInterval = Utils.getNoNil(getXMLInt(xmlFile, key.."#doubleClickInterval"), self.doubleClickInterval)
133 self.selectOnClick = Utils.getNoNil(getXMLBool(xmlFile, key .. "#selectOnClick"), self.selectOnClick)
134 self.ignoreMouse = Utils.getNoNil(getXMLBool(xmlFile, key .. "#ignoreMouse"), self.ignoreMouse)
135 self.keepSelectedInView = Utils.getNoNil(getXMLBool(xmlFile, key .. "#keepSelectedInView"), self.keepSelectedInView)
136 self.isPaginated = Utils.getNoNil(getXMLBool(xmlFile, key .. "#isPaginated"), self.isPaginated)
137
138 self.itemsPerRow = Utils.getNoNil(getXMLInt(xmlFile, key.."#itemsPerRow"), self.itemsPerRow)
139 self.itemsPerCol = Utils.getNoNil(getXMLInt(xmlFile, key.."#itemsPerCol"), self.itemsPerCol)
140 self.visibleItems = self.itemsPerRow * self.itemsPerCol
141
142 self.listItemStartXOffset = unpack(GuiUtils.getNormalizedValues(getXMLString(xmlFile, key.."#listItemStartXOffset"), {self.outputSize[1]}, {self.listItemStartXOffset}))
143 self.listItemStartYOffset = unpack(GuiUtils.getNormalizedValues(getXMLString(xmlFile, key.."#listItemStartYOffset"), {self.outputSize[2]}, {self.listItemStartYOffset}))
144 self.listItemWidth = unpack(GuiUtils.getNormalizedValues(getXMLString(xmlFile, key.."#listItemWidth"), {self.outputSize[1]}, {self.listItemWidth}))
145 self.listItemHeight = unpack(GuiUtils.getNormalizedValues(getXMLString(xmlFile, key.."#listItemHeight"), {self.outputSize[2]}, {self.listItemHeight}))
146 self.listItemPadding = unpack(GuiUtils.getNormalizedValues(getXMLString(xmlFile, key.."#listItemPadding"), {self.outputSize[1]}, {self.listItemPadding}))
147 self.listItemSpacing = unpack(GuiUtils.getNormalizedValues(getXMLString(xmlFile, key.."#listItemSpacing"), {self.outputSize[2]}, {self.listItemSpacing}))
148 self.listItemAutoSize = getXMLBool(xmlFile, key .. "#listItemAutoSize") or self.listItemAutoSize
149
150 self.rowBackgroundProfile = Utils.getNoNil(getXMLString(xmlFile, key.."#rowBackgroundProfile"), self.rowBackgroundProfile)
151 self.rowBackgroundProfileAlternate = Utils.getNoNil(getXMLString(xmlFile, key.."#rowBackgroundProfileAlternate"), self.rowBackgroundProfileAlternate)
152
153 self:addCallback(xmlFile, key.."#onSelectionChanged", "onSelectionChangedCallback")
154 self:addCallback(xmlFile, key.."#onScroll", "onScrollCallback")
155 self:addCallback(xmlFile, key.."#onDoubleClick", "onDoubleClickCallback")
156 self:addCallback(xmlFile, key.."#onClick", "onClickCallback")
157 self:addCallback(xmlFile, key.."#onItemAppear", "onItemAppearCallback")
158 self:addCallback(xmlFile, key.."#onItemDisappear", "onItemDisappearCallback")
159end

loadProfile

Description
Definition
loadProfile()
Code
163function ListElement:loadProfile(profile, applyProfile)
164 ListElement:superClass().loadProfile(self, profile, applyProfile)
165
166 self.doesFocusScrollList = profile:getBool("focusScrollsList", self.doesFocusScrollList)
167 self.isHorizontalList = profile:getBool("isHorizontalList", self.isHorizontalList)
168 self.updateSelectionOnOpen = profile:getBool("updateSelectionOnOpen", self.updateSelectionOnOpen)
169 self.useSelectionOnLeave = profile:getBool("useSelectionOnLeave", self.useSelectionOnLeave)
170 self.selectOnScroll = profile:getBool("selectOnScroll", self.selectOnScroll)
171 self.supportsMouseScrolling = profile:getBool("supportsMouseScrolling", self.supportsMouseScrolling)
172 self.maxNumItems = profile:getNumber("maxNumItems", self.maxNumItems)
173 self.itemsPerRow = profile:getNumber("itemsPerRow", self.itemsPerRow)
174 self.itemsPerCol = profile:getNumber("itemsPerCol", self.itemsPerCol)
175 self.doubleClickInterval = profile:getNumber("doubleClickInterval", self.doubleClickInterval)
176 self.selectOnClick = profile:getBool("selectOnClick", self.selectOnClick)
177 self.ignoreMouse = profile:getBool("ignoreMouse", self.ignoreMouse)
178 self.keepSelectedInView = profile:getBool("keepSelectedInView", self.keepSelectedInView)
179 self.isPaginated = profile:getBool("isPaginated", self.isPaginated)
180
181 self.rowBackgroundProfile = profile:getValue("rowBackgroundProfile", self.rowBackgroundProfile)
182 self.rowBackgroundProfileAlternate = profile:getValue("rowBackgroundProfileAlternate", self.rowBackgroundProfileAlternate)
183
184 self.listItemStartXOffset = unpack(GuiUtils.getNormalizedValues(profile:getValue("listItemStartXOffset"), {self.outputSize[1]}, {self.listItemStartXOffset}))
185 self.listItemStartYOffset = unpack(GuiUtils.getNormalizedValues(profile:getValue("listItemStartYOffset"), {self.outputSize[2]}, {self.listItemStartYOffset}))
186 self.listItemWidth = unpack(GuiUtils.getNormalizedValues(profile:getValue("listItemWidth"), {self.outputSize[1]}, {self.listItemWidth}))
187 self.listItemHeight = unpack(GuiUtils.getNormalizedValues(profile:getValue("listItemHeight"), {self.outputSize[2]}, {self.listItemHeight}))
188 self.listItemPadding = unpack(GuiUtils.getNormalizedValues(profile:getValue("listItemPadding"), {self.outputSize[1]}, {self.listItemPadding}))
189 self.listItemSpacing = unpack(GuiUtils.getNormalizedValues(profile:getValue("listItemSpacing"), {self.outputSize[2]}, {self.listItemSpacing}))
190 self.listItemAutoSize = profile:getBool("listItemAutoSize", self.listItemAutoSize)
191
192 if applyProfile then
193 self:applyListAspectScale()
194 end
195end

mouseEvent

Description
Definition
mouseEvent()
Code
654function ListElement:mouseEvent(posX, posY, isDown, isUp, button, eventUsed)
655 if self:getIsActive() and not self.ignoreMouse then
656 if ListElement:superClass().mouseEvent(self, posX, posY, isDown, isUp, button, eventUsed) then
657 eventUsed = true
658 end
659
660 self.mouseRow = 0
661 self.mouseCol = 0
662 if not eventUsed and GuiUtils.checkOverlayOverlap(posX, posY, self.absPosition[1], self.absPosition[2], self.absSize[1], self.absSize[2]) then
663 self.mouseRow, self.mouseCol = self:getRowColumnForScreenPosition(posX, posY)
664
665 if isDown then
666 if button == Input.MOUSE_BUTTON_LEFT then
667 self:onMouseDown()
668 eventUsed = true
669 end
670
671 if self.supportsMouseScrolling then
672 local deltaIndex = 0
673 if Input.isMouseButtonPressed(Input.MOUSE_BUTTON_WHEEL_UP) then
674 deltaIndex = -1
675 elseif Input.isMouseButtonPressed(Input.MOUSE_BUTTON_WHEEL_DOWN) then
676 deltaIndex = 1
677 end
678
679 if deltaIndex ~= 0 then
680 eventUsed = true
681
682 if self.selectOnScroll then
683 -- clamp the new index to an always valid range for scrolling, setSelectedIndex would also
684 -- allow an index value of 0 meaning "no selection"
685 local newIndex = MathUtil.clamp(self.selectedIndex + deltaIndex, 1, self:getItemCount())
686 self:setSelectedIndex(newIndex, nil, deltaIndex)
687 else
688 self:scrollList(deltaIndex)
689 end
690 end
691 end
692 end
693
694 if isUp and button == Input.MOUSE_BUTTON_LEFT and self.mouseDown then
695 self:onMouseUp()
696 eventUsed = true
697 end
698 end
699 end
700
701 return eventUsed
702end

new

Description
Definition
new()
Code
56function ListElement.new(target, custom_mt)
57 local self = GuiElement.new(target, custom_mt or ListElement_mt)
58 self:include(IndexChangeSubjectMixin) -- add index change subject mixin for index state observers
59
60 self.doesFocusScrollList = true
61 self.isHorizontalList = false
62 self.useSelectionOnLeave = false
63 self.selectOnScroll = false
64 self.updateSelectionOnOpen = true
65 self.supportsMouseScrolling = true
66 self.ignoreMouse = false
67 self.keepSelectedInView = false
68
69 self.maxNumItems = nil
70 self.visibleItems = 5
71 self.doubleClickInterval = 400
72
73 self.listItems = {}
74 self.listItemStartXOffset = 0.00
75 self.listItemStartYOffset = 0.00
76 self.listItemWidth = 0
77 self.listItemHeight = 0
78 self.listItemPadding = 0
79 self.listItemSpacing = 0
80 self.listItemAutoSize = false
81
82 self.firstVisibleItem = 1
83 self.lastFirstVisibleItem = 1
84 self.selectedIndex = 1
85 self.mouseRow = 0
86 self.mouseCol = 0
87 self.lastClickTime = nil
88 self.selectOnClick = false
89
90 self.isPaginated = false
91
92 self.rowBackgroundProfile = "" -- default row background profile, overrides configured profile if specified
93 self.rowBackgroundProfileAlternate = "" -- alternating row background profile
94
95 self.itemsPerRow = 1
96 self.itemsPerCol = 1
97
98 self.currentRow = 1
99 self.currentCol = 1
100
101 self.sliderElement = nil -- sliders register themselves with lists in this field if they point at them via configuration
102
103 return self
104end

notifyClick

Description
Definition
notifyClick()
Code
604function ListElement:notifyClick(clickedElementIndex)
605 self:raiseCallback("onClickCallback", clickedElementIndex, self.listItems[clickedElementIndex])
606end

notifyDoubleClick

Description
Definition
notifyDoubleClick()
Code
598function ListElement:notifyDoubleClick(clickedElementIndex)
599 self:raiseCallback("onDoubleClickCallback", clickedElementIndex, self.listItems[clickedElementIndex])
600end

onFocusActivate

Description
Definition
onFocusActivate()
Code
956function ListElement:onFocusActivate()
957 if self.onClickCallback ~= nil then
958 self:notifyClick(self:getSelectedElementIndex())
959 return
960 end
961
962 if self.onDoubleClickCallback ~= nil then -- when is this triggered in conjunction with focus?
963 self:notifyDoubleClick(self:getSelectedElementIndex())
964 return
965 end
966end

onFocusEnter

Description
Definition
onFocusEnter()
Code
970function ListElement:onFocusEnter()
971 if self.selectedIndex > 0 and #self.listItems > 0 then
972 local index = self:getSelectedElementIndex()
973 local element = self.elements[index]
974
975 if element ~= nil and element.setSelected ~= nil then
976 self.elements[index]:setSelected(true)
977 end
978 end
979end

onFocusLeave

Description
Definition
onFocusLeave()
Code
983function ListElement:onFocusLeave()
984 if self.useSelectionOnLeave and self.selectedIndex ~= nil and self.selectedIndex ~= 0 and self:getItemCount() > self.selectedIndex then
985 -- make sure to get a valid index to update the selection (data may have changed)
986 local clampedIndex = MathUtil.clamp(self:getSelectedElementIndex(), 0, self:getItemCount())
987 if clampedIndex > 0 then
988 self.listItems[clampedIndex]:setSelected(true)
989 end
990 else
991 self:clearElementSelection()
992 end
993
994 ListElement:superClass().onFocusLeave(self)
995end

onGuiSetupFinished

Description
Definition
onGuiSetupFinished()
Code
264function ListElement:onGuiSetupFinished()
265 ListElement:superClass().onGuiSetupFinished(self)
266
267 if self.listItemAutoSize then
268 local firstListItem = self:getFirstDescendant(function(element) return element:isa(ListItemElement) end)
269 if firstListItem ~= nil then
270 self.listItemWidth, self.listItemHeight = unpack(firstListItem.absSize)
271 end
272 end
273end

onMouseDown

Description
Handles mouse button down event
Definition
onMouseDown()
Code
562function ListElement:onMouseDown()
563 self.mouseDown = true
564 FocusManager:setFocus(self)
565end

onMouseUp

Description
Handles mouse button up (after down) event
Definition
onMouseUp()
Code
569function ListElement:onMouseUp()
570 if self.mouseRow ~= 0 and self.mouseCol ~= 0 then
571 local r, c = self:convertVisualRowColumToReal(self.mouseRow, self.mouseCol)
572
573 self:setSelectionByRealRowAndColumn(r, c, 0)
574
575 local clickedIndex = self:getUnclampedIndexByRealRowColumn(r, c)
576
577 if self.lastClickTime ~= nil and self.lastClickTime > self.target.time-self.doubleClickInterval then
578 -- Only activate click if the target was hit
579 if clickedIndex == self.selectedIndex then
580 self:notifyDoubleClick(clickedIndex)
581 end
582 self.lastClickTime = nil
583 else
584 self.lastClickTime = self.target.time
585 end
586
587 if not self.selectOnClick then
588 self:notifyClick(clickedIndex)
589 end
590 else
591 self.lastClickTime = nil
592 end
593 self.mouseDown = false
594end

onOpen

Description
Definition
onOpen()
Code
277function ListElement:onOpen()
278 ListElement:superClass().onOpen(self)
279 if self.updateSelectionOnOpen then
280 self:setSelectedIndex(self.selectedIndex)
281 end
282end

onSliderValueChanged

Description
Definition
onSliderValueChanged()
Code
286function ListElement:onSliderValueChanged(slider, newValue)
287 self:scrollTo(math.floor(newValue + 0.001)*self:getItemFactor(), false)
288end

raiseSliderUpdateEvent

Description
Definition
raiseSliderUpdateEvent()
Code
292function ListElement:raiseSliderUpdateEvent()
293 if self.sliderElement ~= nil then
294 self.sliderElement:onBindUpdate(self)
295 end
296end

removeElement

Description
Remove an element
Definition
removeElement()
Code
514function ListElement:removeElement(element)
515 -- Do not do fancy selection stuff when we are destroying this list
516 if not self.deletingAllListItems then
517 for i = 1, #self.listItems do
518 local v = self.listItems[i]
519 if v == element then
520 table.remove(self.listItems, i)
521 FocusManager:removeElement(element)
522 self:setDisabled(self.disabled)
523
524 if self.selectedIndex >= #self.listItems then
525 self:setSelectedIndex(self.selectedIndex - 1)
526 end
527
528 self:raiseSliderUpdateEvent()
529 break
530 end
531 end
532
533 -- shift visible part of list if possible and needed
534 if (self.firstVisibleItem > 1 and (self.firstVisibleItem > (#self.listItems - self.visibleItems))) then
535 if self.selectedIndex > #self.listItems then
536 self:setSelectedIndex(#self.listItems)
537 else
538 self:scrollTo(#self.listItems)
539 end
540 end
541 end
542
543 ListElement:superClass().removeElement(self, element)
544end

scrollList

Description
Definition
scrollList()
Code
379function ListElement:scrollList(delta)
380 if delta ~= 0 then
381 local index = self.firstVisibleItem
382 if self.isHorizontalList then
383 index = index + self.itemsPerCol * delta
384 else
385 index = index + self.itemsPerRow * delta
386 end
387
388 self:scrollTo(index)
389 end
390end

scrollTo

Description
Definition
scrollTo()
Code
300function ListElement:scrollTo(index, updateSlider)
301 local itemFactor = self:getItemFactor()
302
303 -- convert to valid firstVisibleItem (always has to be: n*itemFactor + 1 )
304 index = math.ceil(index / itemFactor) * itemFactor - (itemFactor - 1)
305
306 if not self.isPaginated then
307 -- clamp index to valid range
308 index = math.max(math.min(index, math.ceil(self:getItemCount() / itemFactor) * itemFactor - self.visibleItems + 1), 1)
309 end
310
311 if index ~= self.firstVisibleItem then
312 self.firstVisibleItem = index
313 self:updateItemPositions()
314
315 if self.keepSelectedInView then
316 -- Check if visible
317 if self.selectedIndex < self.firstVisibleItem or self.selectedIndex > self.firstVisibleItem + self.visibleItems - 1 then
318 local direction = MathUtil.sign(index - self.selectedIndex)
319
320 -- Find if at top or bottom
321 if self.selectedIndex < self.firstVisibleItem then
322 self:setSelectedIndex(self.firstVisibleItem, nil, direction)
323 else
324 self:setSelectedIndex(self.firstVisibleItem + self.visibleItems - 1, nil, direction)
325 end
326 end
327 end
328
329 -- update scrolling
330 if updateSlider == nil or updateSlider then
331 if self.sliderElement ~= nil then
332 self.sliderElement:setValue(math.ceil(index / itemFactor), true)
333 end
334 end
335
336 self:raiseCallback("onScrollCallback")
337 end
338end

setSelectedIndex

Description
Definition
setSelectedIndex()
Code
394function ListElement:setSelectedIndex(index, force, direction)
395 local numItems = #self.listItems
396 local newIndex = MathUtil.clamp(index, 0, numItems)
397
398 if newIndex ~= self.selectedIndex then
399 self.lastClickTime = nil
400 end
401
402 -- Try to scroll over disabled items
403 if self.listItems[newIndex] ~= nil and self.listItems[newIndex].disabled then
404 newIndex = newIndex + (direction or 1)
405
406 -- If we can't, stay where we are
407 if newIndex > #self.listItems or newIndex < 1 then
408 if newIndex == 0 then
409 -- make sure we are scrolled to the top
410 self:scrollTo(1)
411 end
412
413 return
414 end
415
416 -- Force no change when direction is explicitly absent (mouse clicks on an item)
417 if direction == 0 then
418 return
419 end
420
421 return self:setSelectedIndex(newIndex, force, direction or 1)
422 end
423
424 local hasChanged = self.selectedIndex ~= newIndex
425 self.selectedIndex = newIndex
426
427 local newFirstVisibleItem = self:calculateFirstVisibleItem(newIndex)
428
429 -- do we need to scroll?
430 if hasChanged or newFirstVisibleItem ~= self.firstVisibleItem then
431 self:scrollTo(newFirstVisibleItem)
432 end
433
434 if hasChanged or force then
435 self:notifyIndexChange(newIndex, numItems)
436 self:raiseCallback("onSelectionChangedCallback", newIndex)
437 end
438
439 -- update selection state
440 if self.firstVisibleItem > 0 then
441 for i = 1, self.visibleItems do
442 index = self.firstVisibleItem + i - 1
443 if index > numItems then
444 break
445 end
446 local listItem = self.listItems[index]
447 if listItem.setSelected ~= nil then
448 listItem:setSelected(newIndex == index)
449 end
450 end
451 end
452end

setSelectionByRealRowAndColumn

Description
Definition
setSelectionByRealRowAndColumn()
Code
858function ListElement:setSelectionByRealRowAndColumn(realRow, realCol, direction)
859 local index = self:getItemIndexByRealRowColumn(realRow, realCol)
860 self:setSelectedIndex(index, nil, direction)
861end

updateAbsolutePosition

Description
Definition
updateAbsolutePosition()
Code
470function ListElement:updateAbsolutePosition()
471 ListElement:superClass().updateAbsolutePosition(self)
472 self:updateItemPositions()
473end

updateAlternatingBackground

Description
Update alternating item background profiles.
Definition
updateAlternatingBackground(bool forceProfile)
Arguments
boolforceProfileIf true, forces a full application of the profile including aspect ratio scaling. Required for some cloned lists.
Code
611function ListElement:updateAlternatingBackground(forceProfile)
612 if not self.rowBackgroundProfile or self.rowBackgroundProfile == "" or not self.rowBackgroundProfileAlternate or self.rowBackgroundProfileAlternate == "" then
613 return
614 end
615
616 for k = 1, #self.listItems do
617 local item = self.listItems[k]
618 if not item.doNotAlternate then
619 if k % 2 == 0 then
620 item:applyProfile(self.rowBackgroundProfile, forceProfile)
621 else
622 item:applyProfile(self.rowBackgroundProfileAlternate, forceProfile)
623 end
624 end
625 end
626end

updateItemPositions

Description
Definition
updateItemPositions()
Code
747function ListElement:updateItemPositions()
748 if self.ignoreUpdate == nil or not self.ignoreUpdate then
749 if #self.listItems > 0 and self.selectedIndex == 0 then
750 self.selectedIndex = 1
751 end
752
753 if self.firstVisibleItem > 0 then
754 local scrollDiff = math.abs(self.lastFirstVisibleItem - self.firstVisibleItem)
755 -- update range of items affected by last scrolling movement:
756 self:updateItemPositionsInRange(math.max(1, self.firstVisibleItem - scrollDiff),
757 math.min(self:getItemCount(), self.firstVisibleItem + self.visibleItems + scrollDiff))
758 end
759
760 self.lastFirstVisibleItem = self.firstVisibleItem
761 end
762end

updateItemPositionsInRange

Description
Update item positions for elements within a given item list range. The caller is responsible for index validity.
Definition
updateItemPositionsInRange(startIndex Starting, endIndex End)
Arguments
startIndexStartingindex in self.listItems
endIndexEndindex in self.listItems
Code
708function ListElement:updateItemPositionsInRange(startIndex, endIndex)
709 local topPos = self.absSize[2] - self.listItemStartYOffset - self.listItemHeight
710 local leftPos = self.listItemStartXOffset
711
712 for i = startIndex, endIndex do
713 local elem = self.listItems[i]
714 local index = i - self.firstVisibleItem
715
716 --#debug assertWithCallstack(elem ~= nil)
717 local wasVisible = elem:getIsVisible()
718
719 local xPos, yPos = self:getItemPosition(leftPos, topPos, index, elem)
720 elem:setPosition(xPos, yPos)
721
722 if i >= self.firstVisibleItem and i < self.firstVisibleItem + self.visibleItems then
723 -- make items visible in the designated range
724 elem:fadeIn()
725
726 if not wasVisible then
727 self:raiseCallback("onItemAppearCallback", elem)
728 end
729 else
730 -- make all others invisible
731 elem:fadeOut()
732
733 if wasVisible then
734 self:raiseCallback("onItemDisappearCallback", elem)
735 end
736 end
737
738 elem:reset()
739 if elem.setSelected ~= nil then
740 elem:setSelected(i == self.selectedIndex)
741 end
742 end
743end

verifyConfiguration

Description
Definition
verifyConfiguration()
Code
1024function ListElement:verifyConfiguration()
1025 ListElement:superClass().verifyConfiguration(self)
1026
1027 self:verifyListItemConfiguration()
1028end