131 lines
5.3 KiB
Plaintext
131 lines
5.3 KiB
Plaintext
Scriptname _test_ListMenuScript extends ObjectReference
|
|
{Basic example script for UI Extensions list menu. Scripts + .esp of UI Extensions need to be installed.
|
|
If the .esp is merged into a masterfile, UIExtensions.psc GetMenu() function needs to be adjusted.}
|
|
|
|
;importing
|
|
Import UIExtensions
|
|
Import debug
|
|
|
|
Actor Property PlayerREF Auto
|
|
|
|
Event OnActivate(ObjectReference akActionRef)
|
|
;The player interacts with the Object Reference to which this script is attached and we call the function to display the menu.
|
|
If akActionRef == PlayerREF
|
|
ShowMenu()
|
|
EndIf
|
|
|
|
EndEvent
|
|
|
|
Function ShowMenu()
|
|
;We are creating the menu.
|
|
UIListMenu listmenu = GetMenu("UIListMenu") as UIListMenu
|
|
|
|
;We are creating an array that contains all the strings.
|
|
string[] myList = new string[19]
|
|
|
|
;Simple entry.
|
|
myList[0] = "Option 0"
|
|
|
|
;Entries can be parents and children, a children can also be a parent.
|
|
;If a parent entry gets selected by the player, they automatically open up a new list menu containing all their children.
|
|
;Single parent with a single child.
|
|
myList[1] = "Option 1"
|
|
myList[2] = "Option 2, child to 1"
|
|
|
|
;Single parent, multiple children.
|
|
myList[3] = "Option 3"
|
|
myList[4] = "Option 4, child to 3"
|
|
myList[5] = "Option 5, child to 3"
|
|
|
|
;Single parent containing a child that has also a child.
|
|
myList[6] = "Option 6"
|
|
myList[7] = "Option 7, child to 6"
|
|
myList[8] = "Option 8, child to 7"
|
|
|
|
;Multiple parents with a single child that will be added in a loop (see below).
|
|
myList[9] = "Option 9"
|
|
myList[10] = "Option 10"
|
|
myList[11] = "Option 11, child to 9"
|
|
myList[12] = "Option 12, child to 10"
|
|
|
|
;Multiple parents with multiple children added in a loop.
|
|
myList[13] = "Option 13"
|
|
myList[14] = "Option 14"
|
|
myList[15] = "Option 15, child to 13"
|
|
myList[16] = "Option 16, child to 13"
|
|
myList[17] = "Option 17, child to 14"
|
|
myList[18] = "Option 18, child to 14"
|
|
|
|
;For extensive and/or repetetive lists it's easier to use a while statement to add all the entries.
|
|
;Lists that contain only a few entries should be added one by one, especially if the parents have children irregularly attached.
|
|
;AddEntryItem() is the function to add a string to the list. The first parameter is the string grabbed from the array.
|
|
;The second parameter is the integer entryParent which should be -1 if this specific entry should have no parent.
|
|
;The third parameter (integer entryCallback) is used for remembering the parent.
|
|
;The last parameter is the bool entryHasChildren.
|
|
listmenu.AddEntryItem(myList[0], -1, -1, false)
|
|
|
|
;We want to create a parent in Option 1 here, so we need to set entryHasChildren to true.
|
|
;The second line will create Option 2, child to 1, so entryParent needs to be 1 here (1 = the index of the parent in the array).
|
|
listmenu.AddEntryItem(myList[1], -1, -1, true)
|
|
listmenu.AddEntryItem(myList[2], 1, -1, false)
|
|
|
|
;We create two children to Option 3.
|
|
listmenu.AddEntryItem(myList[3], -1, -1, true)
|
|
listmenu.AddEntryItem(myList[4], 3, -1, false)
|
|
listmenu.AddEntryItem(myList[5], 3, -1, false)
|
|
|
|
;We create a parent that has a child which also has its own child.
|
|
listmenu.AddEntryItem(myList[6], -1, -1, true)
|
|
listmenu.AddEntryItem(myList[7], 6, -1, true)
|
|
listmenu.AddEntryItem(myList[8], 7, -1, false)
|
|
|
|
;Variables are needed for this specific case, other cases might need less / need more.
|
|
;iLength helps us to count up, iParent keeps track of the parents and iIteration is needed for the last while (see below).
|
|
;iLength is starting at 9 because this spcific list will have its first loop on array index 9.
|
|
Int iLength = 9
|
|
Int iParent = 0
|
|
Int iIteration = 0
|
|
|
|
;We add the strings from our array above to the list. We need to state from which index we start and where to end.
|
|
While iLength >= 9 && iLength < 13
|
|
;Adding parents in if and children in else in this example
|
|
If iLength < 11
|
|
listmenu.AddEntryItem(myList[iLength], -1, -1, true)
|
|
Else
|
|
iParent = iLength - 2
|
|
;iParent is just used to add the correct parent to its child(ren). How iParent is calculated is up to your entry order in the array.
|
|
;The bool entryHasChildren needs to be set to false if the child itself holds no more child(ren).
|
|
;Every parent only gets one child in this case but of course one parent can hold up to 128 children.
|
|
listmenu.AddEntryItem(myList[iLength], iParent, -1, false)
|
|
EndIf
|
|
;At the end of each loop we count iLength up.
|
|
iLength += 1
|
|
EndWhile
|
|
;This could also have been done in two loops, one counting up from 9 to 10 and the second one from 11 to 12 for this example. Haven't checked which way it would be faster.
|
|
|
|
;This while statement adds multiple parents that have multiple children.
|
|
While iLength >= 13 && iLength < myList.Length
|
|
If iLength < 15
|
|
listmenu.AddEntryItem(myList[iLength], -1, -1, true)
|
|
Else
|
|
iParent = 13 + iIteration
|
|
listmenu.AddEntryItem(myList[iLength], iParent, -1, false)
|
|
iLength += 1
|
|
listmenu.AddEntryItem(myList[iLength], iParent, -1, false)
|
|
iIteration += 1
|
|
EndIf
|
|
iLength += 1
|
|
EndWhile
|
|
|
|
;After everything got injected into the menu, we can finally open it.
|
|
int iListMenu = listmenu.OpenMenu()
|
|
|
|
;The following works similar to regular message boxes:
|
|
int iListButton = listmenu.GetResultInt()
|
|
|
|
If iListButton >= 0
|
|
;GetResultString() returns the exact name of the entry that has been selected
|
|
Notification(listMenu.GetResultString())
|
|
EndIf
|
|
|
|
EndFunction |