Difference between revisions of "User:ANSI Soderstrom/Extended Dialog Example"

From Second Life Wiki
Jump to navigation Jump to search
(Created page with '== Leave a comment == * [[User_talk:{{PAGENAME}}|My User Talk about this Page]] == Extended Dialog Example == Text text text <lsl> list TEST_DIALOG_CHOICES = ["A","B","C","1",...')
 
m
Line 4: Line 4:
== Extended Dialog Example ==
== Extended Dialog Example ==


Text text text
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>
<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"];
list TEST_DIALOG_CHOICES = ["A","B","C","1","2","3","a","b","c","test1","test3","test2"];



Revision as of 23:25, 28 September 2010

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>