Difference between revisions of "Dialog Menus Control"
Jump to navigation
Jump to search
m (lsl code tagging) |
m (<lsl> tag to <source>) |
||
(7 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
{{LSL Header}} | {{LSL Header}} | ||
{{KBcaution|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. | This is example of usage and function library needed in each scripts to use this dialog menus module. | ||
'''IMPORTANT NOTE:''' This menus control REQUIRED [[Dialog Control|Nargus Dialog Control script]]. You MUST have both Nargus Dialog Control and Nargus Dialog Menus in the same prim for it to work. | '''IMPORTANT NOTE:''' This menus control REQUIRED [[Dialog Control|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: | # Initialize menus control using: | ||
#* llMessageLinked(LINK_THIS, lnkMenuClear, "", NULL_KEY); | #* llMessageLinked(LINK_THIS, lnkMenuClear, "", NULL_KEY); | ||
Line 23: | Line 25: | ||
# Dialog will return value the same way as usual call to Nargus Dialog Module script. | # 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. | If anyone uses this module, please IM ''Nargus Asturias'', I'd love to hear what you think. | ||
==Scripts & Example== | |||
<source lang="lsl2"> | |||
// 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)); | |||
} | |||
} | |||
</source> | |||
</ | |||
Nargus Dialog Menus v1.01 (by Nargus Asturias) | Nargus Dialog Menus v1.01 (by Nargus Asturias) | ||
< | <source lang="lsl2"> | ||
// ********** 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); | |||
} | |||
} | |||
} | |||
</source> | |||
{{LSLC|Library|Dialog Menus Control}} | {{LSLC|Library|Dialog Menus Control}} |
Latest revision as of 10: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);
}
}
}