Scriptname UIListMenu extends UIMenuBase

string property		ROOT_MENU		= "CustomMenu" autoReadonly
string Property 	MENU_ROOT		= "_root.listMenu." autoReadonly

float _resultFloat = -1.0
int _resultInt = -1
string _resultString = ""

string[] _entryName = None
int[] _entryId = None
int[] _entryParent = None
int[] _entryCallback = None
bool[] _entryChildren = None
int _entryBuffer = 0
bool _sortEnabled = false

string[] _premadeEntries = None
int _premadeBuffer = 0

int Function GetResultInt()
	return _resultInt
EndFunction

float Function GetResultFloat()
	return _resultFloat
EndFunction

string Function GetResultString()
	return _resultString
EndFunction

Function SetPropertyInt(string propertyName, int value)
	If propertyName == "totalEntries"
		_entryBuffer = value
	Endif
EndFunction

Function SetPropertyBool(string propertyName, bool value)
	If propertyName == "sort"
		_sortEnabled = value
	EndIf
EndFunction

Function SetPropertyStringA(string propertyName, string[] value)
	if propertyName == "appendEntries"
		int i = 0
		If _premadeBuffer >= _premadeEntries.length
			return ; Can't add anymore premade entries
		Endif
		While i < value.length
			_premadeEntries[_premadeBuffer] = value[i]
			_premadeBuffer += 1
			If _premadeBuffer >= _premadeEntries.length ; End the buffer
				i = value.length
			Endif
			i += 1
		EndWhile
	Endif
EndFunction

int Function AddEntryItem(string entryName, int entryParent = -1, int entryCallback = -1, bool entryHasChildren = false)
	_entryName[_entryBuffer] = entryName
	_entryId[_entryBuffer] = _entryBuffer
	_entryParent[_entryBuffer] = entryParent
	_entryCallback[_entryBuffer] = entryCallback
	_entryChildren[_entryBuffer] = entryHasChildren
	int currentEntry = _entryBuffer
	_entryBuffer += 1
	return currentEntry
EndFunction

Function SetPropertyIndexInt(string propertyName, int index, int value)
	If propertyName == "entryId"
		_entryId[index] = value
	Elseif propertyName == "entryParent"
		_entryParent[index] = value
	Elseif propertyName == "entryCallback"
		_entryCallback[index] = value
	Endif
EndFunction

Function SetPropertyIndexBool(string propertyName, int index, bool value)
	If propertyName == "hasChildren"
		_entryChildren[index] = value
	Endif
EndFunction

Function SetPropertyIndexString(string propertyName, int index, string value)
	If propertyName == "entryName"
		_entryName[index] = value
	Endif
EndFunction

int Function GetPropertyInt(string propertyName)
	if propertyName == "currentIndex"
		return _entryBuffer
	Endif
	return -1
EndFunction

Function OnInit()
	_entryName = new string[128]
	_entryId = new int[128]
	_entryParent = new int[128]
	_entryCallback = new int[128]
	_entryChildren = new bool[128]
	_premadeEntries = new string[128]
	ResetMenu()
EndFunction

Function ResetMenu()
	isResetting = true
	int i = 0
	While i < _entryBuffer
		_entryName[i] = ""
		_entryId[i] = -1
		_entryParent[i] = -1
		_entryCallback[i] = -1
		_entryChildren[i] = false
		i += 1
	EndWhile
	i = 0
	While i < _premadeBuffer
		_premadeEntries[i] = ""
		i += 1
	EndWhile
	_premadeBuffer = 0
	_entryBuffer = 0
	isResetting = false
EndFunction

int Function OpenMenu(Form aForm = None, Form aReceiver = None)
	_resultFloat = -1.0
	_resultInt = -1
	_resultString = ""

	If !BlockUntilClosed() || !WaitForReset()
		return 0
	Endif

	RegisterForModEvent("UIListMenu_LoadMenu", "OnLoadMenu")
	RegisterForModEvent("UIListMenu_CloseMenu", "OnUnloadMenu")
	RegisterForModEvent("UIListMenu_SelectItemText", "OnSelectText")
	RegisterForModEvent("UIListMenu_SelectItem", "OnSelect")

	Lock()
	UI.OpenCustomMenu("listmenu")
	If !WaitLock()
		return 0
	Endif
	If _resultFloat == -1.0 ; Back initiated
		return 0
	Endif
	return 1
EndFunction

string Function GetMenuName()
	return "UIListMenu"
EndFunction

Event OnSelect(string eventName, string strArg, float numArg, Form formArg)
	_resultInt = strArg as int
	_resultFloat = numArg
	Unlock()
EndEvent

Event OnSelectText(string eventName, string strArg, float numArg, Form formArg)
	_resultString = strArg
	; Do not unlock on this event, it's part of OnSelect sequence
EndEvent

Event OnLoadMenu(string eventName, string strArg, float numArg, Form formArg)
	string[] entries = new string[128]
	int i = 0
	While i < _entryBuffer
		entries[i] = _entryName[i] + ";;" + _entryParent[i] + ";;" + _entryId[i] + ";;" + _entryCallback[i] + ";;" + (_entryChildren[i] as int)
		i += 1
	EndWhile

	UI.InvokeStringA(ROOT_MENU, MENU_ROOT + "LM_AddTreeEntries", entries)

	If _premadeBuffer > 0
		UI.InvokeStringA(ROOT_MENU, MENU_ROOT + "LM_AddTreeEntries", _premadeEntries)
	Endif

	UI.InvokeBool(ROOT_MENU, MENU_ROOT + "LM_SetSortingEnabled", _sortEnabled)
EndEvent

Event OnUnloadMenu(string eventName, string strArg, float numArg, Form formArg)
	UnregisterForModEvent("UIListMenu_LoadMenu")
	UnregisterForModEvent("UIListMenu_CloseMenu")
	UnregisterForModEvent("UIListMenu_SelectItem")
EndEvent