Nui template

From NWN Lexicon
Jump to navigationJump to search

NUI Template

This is a basic template for creating new NUI windows. Some boilerplate code to help you boot strap a new NUI project.

Setup: Create a new file called 'nui_template.nss' and fill in contents with #template below.

In OnNuiEvent call something like this :

#include "nui_template"
void main()
{
	object oPlayer = NuiGetEventPlayer();
	int nToken     = NuiGetEventWindow();
	string sEvent  = NuiGetEventType();
	string sElem   = NuiGetEventElement();
	int nIdx       = NuiGetEventArrayIndex();
	string sWndId  = NuiGetWindowId(oPlayer, nToken);

	if (sWndId == NUI_TEMPLATE_WINDOW_ID)
	{
		NUI_Template_Events();
		return;
	}
}

Then to open the window call this from anywhere you like

#include "nui_template"

void main() 
{ 

// ...

NUI_Template_NewWindow(oPlayer);

// ...

}

Optionally, if you need to update the NUI on external events (like if a player equips or unequips an item), just call the update function:

#include "nui_template"

void main() 
{ 

// ...

NUI_Template_Update(oPlayer);

// ...

}

Or the Update function can be called within the NUI code directly (see the "mouseup" event for element: "buttonUpdate" in #template below).


Template

#include "nw_inc_nui"

const string NUI_TEMPLATE_WINDOW_ID = "nui_template_full";


void NUI_Template_NewWindow(object oPlayer);
void NUI_Template_Update(object oPlayer, int nToken = -1);
void NUI_Template_Events();


void NUI_Template_Events()
{
	object oPlayer	 = NuiGetEventPlayer();
	int nToken		 = NuiGetEventWindow();
	string sEvent	 = NuiGetEventType();
	string sElement	 = NuiGetEventElement();
	int nIndex		 = NuiGetEventArrayIndex();
	string sWindowId = NuiGetWindowId(oPlayer, nToken);

	if (sWindowId != NUI_TEMPLATE_WINDOW_ID)
	{
		return;
	}

	// If events aren't working, log what is going on.
	// LogMessage("NUIExample: sElement: " + sElement + " sEvent: " + sEvent);

	switch (HashString(sEvent))
	{
		case ("blur"):
		{
		}
		break;
		case ("click"):
		{
		}
		break;
		case ("close"):
		{
		}
		break;
		case ("focus"):
		{
		}
		break;
		case ("mousedown"):
		{
		}
		break;
		case ("mousescroll"):
		{
		}
		break;
		case ("mouseup"):
		{
			switch (HashString(sElement))
			{
				case ("buttonUpdate"):
				{
					NUI_Template_Update(oPlayer, nToken);
					return;
				}
				break;
				case ("buttonCancel"):
				{
					NuiDestroy(oPlayer, nToken);
					return;
				}
				break;
			}
		}
		break;
		case ("open"):
		{
		}
		break;
		case ("range"):
		{
		}
		break;
		case ("watch"):
		{
		}
		break;
		default:
		{
			// LogMessage("NUIExample: Unknown event occured: " + sEvent + " Element: " + sElement);
		}
		break;
	}
}


void NUI_Template_Update(object oPlayer, int nToken = -1)
{
	if (nToken == -1)
	{
		nToken = NuiFindWindow(oPlayer, NUI_TEMPLATE_WINDOW_ID);
	}

	if (nToken == 0)
	{
		return;
	}

	NuiSetBind(oPlayer, nToken, "labelMain", JsonString(IntToString(Random(100))));
}

void NUI_Template_NewWindow(object oPlayer)
{
	int nToken = NuiFindWindow(oPlayer, NUI_TEMPLATE_WINDOW_ID);
	if (nToken != 0)
	{
		NuiDestroy(oPlayer, nToken);
	}

	/////////////////////////////////////////
	// Build the main root pane here
	/////////////////////////////////////////
	json jRoot = JsonArray();

	json jRow;
	// Build the first row
	{
		jRow			= JsonArray();
		json jLabelMain = NuiLabel(NuiBind("labelMain"), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE));

		jRow  = JsonArrayInsert(jRow, jLabelMain);
		jRow  = NuiRow(jRow);
		jRoot = JsonArrayInsert(jRoot, jRow);
	}

	// Build the second row
	{
		jRow = JsonArray();

		json jButtonUpdate = NuiId(NuiButton(JsonString("Update")), "buttonUpdate");
		json jButtonCancel = NuiId(NuiButton(JsonString("cancel")), "buttonCancel");

		jRow = JsonArrayInsert(jRow, NuiSpacer());
		jRow = JsonArrayInsert(jRow, jButtonUpdate);
		jRow = JsonArrayInsert(jRow, jButtonCancel);


		jRow  = NuiRow(jRow);
		jRoot = JsonArrayInsert(jRoot, jRow);
	}


	///////////////////////////////////////////
	// Build final group
	///////////////////////////////////////////
	jRoot = NuiCol(jRoot);

	/////////////////////////////////////////
	// Create new window here
	/////////////////////////////////////////

	json jNuiWindow = NuiWindow(jRoot, NuiBind("windowtitle"), NuiBind("geometry"), NuiBind("resizable"), NuiBind("collapsed"), NuiBind("closable"), NuiBind("transparent"), NuiBind("border"), NuiBind("acceptinput"));
	nToken			= NuiCreate(oPlayer, jNuiWindow, NUI_TEMPLATE_WINDOW_ID);

	NuiSetBind(oPlayer, nToken, "windowtitle", JsonString("NUI Template"));
	float fX	  = -1.0f;
	float fY	  = -1.0f;
	float fWidth  = 512.0f;
	float fHeight = 512.0f;

	NuiSetBind(oPlayer, nToken, "geometry", NuiRect(fX, fY, fWidth, fHeight));

	NuiSetBind(oPlayer, nToken, "collapsed", JsonBool(FALSE));
	NuiSetBind(oPlayer, nToken, "resizable", JsonBool(TRUE));
	NuiSetBind(oPlayer, nToken, "closable", JsonBool(TRUE));
	NuiSetBind(oPlayer, nToken, "transparent", JsonBool(FALSE));
	NuiSetBind(oPlayer, nToken, "border", JsonBool(TRUE));
	NuiSetBind(oPlayer, nToken, "acceptinput", JsonBool(TRUE));

	// Update values after window is up
	NUI_Template_Update(oPlayer);
}