Difference between revisions of "Dialog Menus Control"
Jump to navigation
Jump to search
m (<lsl> tag to <source>) |
|||
Line 32: | Line 32: | ||
==Scripts & Example== | ==Scripts & Example== | ||
< | <source lang="lsl2"> | ||
// READ ME: | // READ ME: | ||
// To see this sample in action; | // To see this sample in action; | ||
Line 125: | Line 125: | ||
} | } | ||
} | } | ||
</ | </source> | ||
Nargus Dialog Menus v1.01 (by Nargus Asturias) | Nargus Dialog Menus v1.01 (by Nargus Asturias) | ||
< | <source lang="lsl2"> | ||
// ********** DIALOG MENUS MODULE ********** // | // ********** DIALOG MENUS MODULE ********** // | ||
// By Nargus Asturias | // By Nargus Asturias | ||
Line 267: | Line 267: | ||
} | } | ||
} | } | ||
</ | </source> | ||
{{LSLC|Library|Dialog Menus Control}} | {{LSLC|Library|Dialog Menus Control}} |
Latest revision as of 09:57, 25 January 2015
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Important: This script is considered obsoleted. Latest version of Dialog Control has this functionality built-in! An obsoleted version of Nargus Dialog Control script is required to work with this script. |
This is example of usage and function library needed in each scripts to use this dialog menus module.
IMPORTANT NOTE: This menus control REQUIRED Nargus Dialog Control script. You MUST have both Nargus Dialog Control and Nargus Dialog Menus in the same prim for it to work.
Menus Usage
- 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 same 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 & Example
// READ ME:
// To see this sample in action;
// Put "Nargus Dialog Control" and "Nargus Dialog Menus" along with this script
// in a prim and touch.
// Dialog constants
integer lnkDialog = 14001;
integer lnkDialogNotify = 14004;
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);
}
dialogNotify(key id, string message){
list rows;
llMessageLinked(LINK_THIS, lnkDialogNotify,
message + seperator + (string)dialogTimeOut + seperator,
id);
}
// ********** 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){
dialogNotify(llGetOwner(), "Menu time-out. Please try again.");
state default;
}else if(num == lnkDialogResponse){
llWhisper(0, str);
}
}
touch_start(integer num_detected){
llMessageLinked(LINK_THIS, lnkMenuShow, "", llDetectedOwner(0));
}
}
Nargus Dialog Menus v1.01 (by Nargus Asturias)
// ********** DIALOG MENUS MODULE ********** //
// By Nargus Asturias
// Version 1.01
//
// Multi-layer menus management module for Nargus Dialog Control.
// Use same packing method as Nargus Dialog Control
//
// HOW TO USE:
// 1) Initialize menu by sending "lnkMenuClear" signal:
// llMessageLinked(LINK_THIS, lnkMenuClear, "", NULL_KEY);
//
// 2) Add menu dialog using provided function (or manually, please referr to Nargus Dialog Control
// manual). Make sure signal is sent with "lnkMenuAdd" and key field is menu's name;
// llMessageLinked(LINK_THIS, lnkMenuAdd, ......, "MainMenu");
//
// To make a button show submenu, use following as return value of the button:
// MENU_<name>
// Replace "<name>" with the actual name of the added menu (without parenthesis).
//
// 3) Repeat (2) for as much menus as needed
//
// 4) To show a menu, use:
// llMessageLinked(LINK_THIS, lnkMenuShow, name, llGetOwner());
// When "name" is name of the menu to show. To show last-used menu, leave this field empty.
//
// 5) Dialog will return value the same way as usual call to Nargus Dialog Module script.
// ******************************************* //
// Dialog constants
integer lnkDialog = 14001;
integer lnkDialogNotify = 14004;
integer lnkDialogResponse = 14002;
integer lnkDialogTimeOut = 14003;
integer lnkDialogReshow = 14011;
integer lnkDialogCancel = 14012;
string seperator = "||";
integer dialogTimeOut = 0;
// ********** DIALOG FUNCTIONS **********
dialogReshow(){llMessageLinked(LINK_THIS, lnkDialogReshow, "", NULL_KEY);}
dialogCancel(){
llSleep(1);
llMessageLinked(LINK_THIS, lnkDialogCancel, "", NULL_KEY);
}
// ********** END DIALOG FUNCTIONS **********
// Constants
integer lnkMenuClear = 15001;
integer lnkMenuAdd = 15002;
integer lnkMenuShow = 15003;
// Menus variables
list menuNames; // List of names of all menus
list menus; // List of packed menus command, in order of menuNames
// Variables
integer lastMenuIndex; // Latest called menu's index
// ********** Menu Functions **********
clearMenusList(){
menuNames = [];
menus = [];
lastMenuIndex = 0;
}
addMenu(string name, string message, list buttons, list returns){
// Reduced menu request time by packing request commands
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);
// Add menu to the menus list
menuNames += [name];
menus += [packed_message];
}
showMenu(string name, key id){
if(llGetListLength(menuNames) <= 0) return;
integer index;
if(name != ""){
index = llListFindList(menuNames, [name]);
if(index < 0) index = lastMenuIndex;
}else index = lastMenuIndex;
lastMenuIndex = index;
// Load menu command and execute
string packed_message = llList2String(menus, index);
llMessageLinked(LINK_THIS, lnkDialog, packed_message, id);
}
// ********** States **********
default{
state_entry(){
clearMenusList();
}
link_message(integer sender_num, integer num, string str, key id){
// Menu response commands
if(num == lnkDialogResponse){
if(llGetSubString(str, 0, 4) == "MENU_"){
str = llDeleteSubString(str, 0, 4);
showMenu(str, id);
}
}
// Menu management commands
else if(num == lnkMenuClear)
clearMenusList();
else if(num == lnkMenuAdd){
list data = llParseString2List(str, [seperator], []);
string message = llList2String(data, 0);
list buttons = [];
list returns = [];
integer i;
integer count = llGetListLength(data);
for(i=2; i<count;){
buttons += [llList2String(data, i++)];
returns += [llList2String(data, i++)];
}
addMenu((string)id, message, buttons, returns);
}else if(num == lnkMenuShow){
dialogCancel();
showMenu(str, id);
}
}
}