User:ANSI Soderstrom/Extended Dialog Example

From Second Life Wiki
< User:ANSI Soderstrom
Revision as of 23:18, 28 September 2010 by ANSI Soderstrom (talk | contribs) (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",...')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Leave a comment

Extended Dialog Example

Text text text

<lsl> 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>