User:ANSI Soderstrom/Extended Dialog Example
Leave a comment
Extended Dialog Example
Some People in SL are asking me, how to realize extended dialog menus (with timeout, dynamic content, sort-option, ...) Before i invent the wheel every week new, i will post my "best" code here, so ibn future i can simply refer to this page.
<lsl> // Extended Dialog Example for your Items // (C) 09/2010 ANSI Soderstrom
list TEST_DIALOG_CHOICES = ["A","B","C","1","2","3","a","b","c","test1","test3","test2"];
float TimeOut = 30; // seconds float maxButtons = 12; // How many Buttons
integer Sort = TRUE; // Should i Sort the List ?
// Have only Effect if Sort == TRUE; integer ReverseUp2Down = FALSE;
integer CHANNEL; integer PAGE;
key LastMenuUser;
list CreateNavigation(integer PAGES) {
list navi = ["No Clue"];
if((PAGE < 1 || PAGE == PAGES) && PAGES != 1) {
PAGE = PAGES;
navi += ["<<<","FIRST"];
} else if((PAGE > PAGES || PAGE == 1) && PAGES != 1) {
PAGE = 1;
navi += ["LAST",">>>"];
} else if (PAGES != 1) {
navi += ["<<<",">>>"];
}
if(PAGES==1) {
navi += [" "," "];
}
return navi;
}
list Padding(integer FillUp) {
list PlaceHolder;
if(FillUp<0) {
do {
PlaceHolder += ["~"]; // Nr# 126 in ASCII Table (Highest one, will be ever the last Letter in List?)
++FillUp;
} while(FillUp!=0);
}
return PlaceHolder;
}
CreateMenu(key id, list menu) {
integer PAGES = llCeil(llGetListLength(menu)/(maxButtons-3)); list NAVIGATION = CreateNavigation(PAGES); integer length = (integer)maxButtons-llGetListLength(NAVIGATION); list NEW_MENU = llList2List(menu,(PAGE*length-length),(PAGE*length-1)) + Padding(llGetListLength(menu)-(PAGE*length)); llDialog(id, "(Page " + (string)PAGE + "/" + (string)PAGES + ")\n \nSelect your Height",NAVIGATION + NEW_MENU, CHANNEL);
}
default {
state_entry() {
llSetText("",<1,1,1>,1);
}
touch_start(integer i) {
PAGE = 1;
CHANNEL = -llRound(llFrand(1000000));
LastMenuUser = llDetectedKey(0);
CreateMenu(LastMenuUser,TEST_DIALOG_CHOICES);
llResetTime();
state Dialog;
}
}
state Dialog {
state_entry() {
llListen(CHANNEL,"",NULL_KEY,"");
llSetTimerEvent(1);
}
listen(integer channel, string name, key id, string message) {
if(~llListFindList(TEST_DIALOG_CHOICES,[message])) {
llSay(0, "Your Choice : " + message);
state default;
} else {
if(message == "<<<" || message == "BACK") {
--PAGE;
} else if(message == ">>>") {
++PAGE;
} else if(message == "FIRST") {
PAGE = 1;
} else if(message == "LAST") {
PAGE = llCeil(llGetListLength(TEST_DIALOG_CHOICES)/(maxButtons-3));
} else {
state default;
}
llResetTime();
CreateMenu(id,TEST_DIALOG_CHOICES);
}
}
touch_start(integer i) {
if(llDetectedKey(0) == LastMenuUser) {
CreateMenu(llDetectedKey(0),TEST_DIALOG_CHOICES);
}
}
timer() {
llSetText((string)(llRound(TimeOut - llGetTime())) + " seconds left",<1,1,1>,1);
if(llGetTime() > TimeOut) {
llSay(0,"Dialog expired");
state default;
}
}
} </lsl>