Dialog Control

==Functions List==
===Basic Dialog Functionalities===
# Standard dialog with buttons. If there are more than 12 buttons, BACK/NEXT button will be added automatically! In that case, the last button on the list will be used as Close/Cancel button.
#* dialog(key id, string message, list buttons, list returns);
# Standard dialog with an input box
#* dialogTextbox(key id, string message);
# To recall last dialog (only work if a dialog has been called before):
#* dialogReshow();
# To cancel current dialog; Currently displayed dialog will give no response when clicked.
#* dialogCancel();
===Menus Control===
# Initialize menus control using:
#* llMessageLinked(LINK_THIS, lnkMenuClear, "", NULL_KEY);
# Using "packDialogMessage" function to generate new menu, and add it to menus list:
#* llMessageLinked(LINK_THIS, lnkMenuAdd, packDialogMessage(....), "MenuName");
#* While "MenuName" is the name of this menu, ie: MainMenu
# To make a dialog button show a sub-menu, use following as return value of the button:
#* MENU_<name>
#* Replace "<name>" with the actual name of the added menu (without parenthesis).
# Repeat (2) and (3) for all menus you want
# To show a menu, use:
#* llMessageLinked(LINK_THIS, lnkMenuShow, "MenuName", llGetOwner());
#* Where "MenuName" is the name of menu to show. To show last-used menu, leave this field empty.
# Dialog will return value the same way as usual call to Nargus Dialog Module script.
==Sample Scripts==
# OnTouchSelectTexture (Tiyuk Quellmalz)
If anyone uses this module, please IM Nargus Asturias, I'd love to hear what you think.
==Scripts==
* Dialog Control v1.8 (with built-in Dialog Menus Control)
* Dialog Control (legacy) (Legacy version; do not have built-in menus control)
* Dialog Menus Control (Legacy version; Need Dialog Control (legacy) for the script to work)
===Basic Usage Examples===
====Dialog Usage====
// READ ME:
// To see this sample in action;
// Put "Nargus Dialog Control" along with this script in a prim and touch.
// ********** DIALOG FUNCTIONS **********
// Dialog constants
integer lnkDialog = 14001;
integer lnkDialogTextbox = 14007;
integer lnkDialogResponse = 14002;
integer lnkDialogTimeOut = 14003;
integer lnkDialogReshow = 14011;
integer lnkDialogCancel = 14012;
string seperator = "||";
integer dialogTimeOut = 0;
string packDialogMessage(string message, list buttons, list returns){
 string packed_message = message + seperator + (string)dialogTimeOut;
 
 integer i;
 integer count = llGetListLength(buttons);
 for(i=0; i<count; i++){
 string button = llList2String(buttons, i);
 if(llStringLength(button) > 24) button = llGetSubString(button, 0, 23);
 packed_message += seperator + button + seperator + llList2String(returns, i);
 }
 return packed_message;
}
dialogReshow(){llMessageLinked(LINK_THIS, lnkDialogReshow, "", NULL_KEY);}
dialogCancel(){
 llMessageLinked(LINK_THIS, lnkDialogCancel, "", NULL_KEY);
 llSleep(1);
}
dialog(key id, string message, list buttons, list returns){
 llMessageLinked(LINK_THIS, lnkDialog, packDialogMessage(message, buttons, returns), id);
}
dialogTextbox(key id, string message){
 llMessageLinked(LINK_THIS, lnkDialogTextbox, message + seperator + (string)dialogTimeOut, id);
}
// ********** END DIALOG FUNCTIONS **********
default{
 state_entry(){
 llSetText("Touch me to show dialog", <1,1,1>, 1);
 }
 link_message(integer sender_num, integer num, string str, key id){
 if(num == lnkDialogTimeOut){
 llOwnerSay("Menu time-out. Please try again.");
 state default;
 }else if(num == lnkDialogResponse){
 llWhisper(0, str);
 }
 }
 
 touch_start(integer num_detected){
 dialog(llDetectedKey(0),
 
 // Dialog message here
 "Messages go here",
 
 // List of dialog buttons
 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, "Close" ],
 // List of return value from the buttons, in same order
 // Note that this value do not need to be the same as button texts
 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, "X" ]
 );
 }
}
====Menus Usage====
// READ ME:
// To see this sample in action;
// Put "Nargus Dialog Control v1.80" along with this script
// in a prim and touch.
// Dialog constants
integer lnkDialog = 14001;
integer lnkDialogResponse = 14002;
integer lnkDialogTimeOut = 14003;
integer lnkDialogReshow = 14011;
integer lnkDialogCancel = 14012;
integer lnkMenuClear = 15001;
integer lnkMenuAdd = 15002;
integer lnkMenuShow = 15003;
string seperator = "||";
integer dialogTimeOut = 0;
// ********** DIALOG FUNCTIONS **********
string packDialogMessage(string message, list buttons, list returns){
 string packed_message = message + seperator + (string)dialogTimeOut;
 
 integer i;
 integer count = llGetListLength(buttons);
 for(i=0; i<count; i++) packed_message += seperator + llList2String(buttons, i) + seperator + llList2String(returns, i);
 return packed_message;
}
dialogReshow(){llMessageLinked(LINK_THIS, lnkDialogReshow, "", NULL_KEY);}
dialogCancel(){
 llMessageLinked(LINK_THIS, lnkDialogCancel, "", NULL_KEY);
 llSleep(1);
}
// ********** END DIALOG FUNCTIONS **********
default{
 state_entry(){
 llMessageLinked(LINK_THIS, lnkMenuClear, "", NULL_KEY);
 llMessageLinked(LINK_THIS, lnkMenuAdd, packDialogMessage(
 "[ Main Menu ]\n" +
 "Messages go here",
 [ "BUTTON_1", "BUTTON_2", "BUTTON_3", "BUTTON_X" ],
 [ "MENU_SubMenu1", "MENU_SubMenu2", "MENU_SubMenu3", "EXIT" ]
 ), "MainMenu");
 llMessageLinked(LINK_THIS, lnkMenuAdd, packDialogMessage(
 "[ Sub Menu 1 ]\n" +
 "Messages go here",
 [ "SUB_1_1", "SUB_1_2", "SUB_1_3", "MAIN MENU", "SUB_3", "BUTTON_X" ],
 [ "1.1", "1.2", "1.3", "MENU_MainMenu", "MENU_SubMenu3", "EXIT" ]
 ), "SubMenu1");
 llMessageLinked(LINK_THIS, lnkMenuAdd, packDialogMessage(
 "[ Sub Menu 2 ]\n" +
 "Messages go here",
 [ "SUB_2_1", "SUB_2_2", "SUB_2_3", "MAIN MENU", "SUB_1", "BUTTON_X" ],
 [ "2.1", "2.2", "2.3", "MENU_MainMenu", "MENU_SubMenu1", "EXIT" ]
 ), "SubMenu2");
 llMessageLinked(LINK_THIS, lnkMenuAdd, packDialogMessage(
 "[ Sub Menu 3 ]\n" +
 "Messages go here",
 [ "SUB_3_1", "SUB_3_2", "SUB_3_3", "MAIN MENU", "SUB_2", "BUTTON_X" ],
 [ "3.1", "3.2", "3.3", "MENU_MainMenu", "MENU_SubMenu2", "EXIT" ]
 ), "SubMenu3");
 
 llSetText("Touch me to show menu", <1,1,1>, 1);
 }
 link_message(integer sender_num, integer num, string str, key id){
 if(num == lnkDialogTimeOut){
 llOwnerSay("Menu time-out. Please try again.");
 }else if(num == lnkDialogResponse){
 llWhisper(0, str);
 }
 }
 
 touch_start(integer num_detected){
 llMessageLinked(LINK_THIS, lnkMenuShow, "", llDetectedOwner(0));
 }
}