enderalse/scripts/source/_test_listmenuscript.psc

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