Menu Manager

Répondre
Partager Rechercher
Il arrive fréquemment qu'un menu dépasse la quantité fatidique des 12 boutons, il faut alors se lancer dans une gestion de plusieurs menus avec des boutons spécialisés pour naviguer. Comme je suis souvent confronté à ce cas j'ai systématisé ça dans un petit script qui gère ça comme un grand :

Code:
//------------------------------------------------
//                               Menu Manager V 1.0
// -----------------------------------------------
//                    Variables de paramétrage
// -----------------------------------------------
float timeOut=60.0;
integer canal=60258;
string PREVIOUS="<< Previous";
string NEXT="Next >>";
// -----------------------------------------------
//                    Variables de travail
// -----------------------------------------------
integer ecouteMenu=0;
integer canalMenu=0;
integer index=0;
list listeGlobale=[];
string texte="";
// -----------------------------------------------
//                    Gestion de l'écoute du menu
// -----------------------------------------------
updateEcoute(keyid){
cancelEcoute();
ecouteMenu=llListen(canalMenu,"",id,"");
llSetTimerEvent(timeOut);}
// -----------------------------------------------
cancelEcoute(){
if(ecouteMenu>0){
llListenRemove(ecouteMenu);
ecouteMenu=0;
llSetTimerEvent(.0);}
}
// -----------------------------------------------
//                    Canal aléatoire
// -----------------------------------------------
integer genCanal(){returnllFloor(llFrand(2000000.0));}
// -----------------------------------------------
//                    Gestion premier menu
// -----------------------------------------------
gestPremierMenu(keyid){
llDialog(id,texte,llListInsertList(llList2List(listeGlobale,0,10),[NEXT],2),canalMenu);}
// -----------------------------------------------
//                    Gestion menus autres que le premier
// -----------------------------------------------
gestMenu(keyid){
list l=llDeleteSubList(listeGlobale,0,index-1);
if(llGetListLength(l)>11)
l=llListInsertList(llDeleteSubList(l,10,-1),[NEXT],1);
llDialog(id,texte,[PREVIOUS]+l,canalMenu);}
// -----------------------------------------------
//                    Etat par défaut
// -----------------------------------------------
default{
link_message(integersender_number,integernumber,stringmessage,keyid){
if(number==canal){
index=0;
canalMenu=genCanal();
listeGlobale=llCSV2List(message);
texte=llList2String(listeGlobale,0);
listeGlobale=llDeleteSubList(listeGlobale,0,0);
updateEcoute(id);
if(llGetListLength(listeGlobale)<13)
llDialog(id,texte,listeGlobale,canalMenu);
else
gestPremierMenu(id);}
}
 
listen(integerchannel,stringname,keyid,stringmessage){
if(channel==canalMenu){
if(message==NEXT){
if(index==0)index+=11;
elseindex+=10;
gestMenu(id);}
elseif(message==PREVIOUS){
if(index==11){
index=0;
gestPremierMenu(id);}
else{
index-=10;
gestMenu(id);}
}
else{
cancelEcoute();
llMessageLinked(LINK_THIS,canal+1,message,id);}
}
}
 
timer(){cancelEcoute();}
}
Pour la façon de l'utiliser rien de mieux qu'un script d'exemple :

Code:
integer canal = 60258;
appelMenu(string texte, list menu) {
         llMessageLinked(LINK_THIS, canal, texte + "," + llList2CSV(menu), llDetectedKey(0));}
default {
         touch_start(integer total_number) {
                    integer c;
                    list l;
                    for(c = 1; c < 50; c++) l += (string)c;
                    appelMenu("Choisissez : ", l);}
 
         link_message(integer sender_number, integer number, string message, key id) {
                    if(number == canal + 1) llOwnerSay("Vous avez choisi " + message);}
}
Le script sait évidemment gérer également les menus qui ont moins de 12 boutons à afficher, à ce moment là il vous libère seulement du souci du canal et de l'écoute.
Pas mal

j'ai décompacté ton script car la définition des variables étaient collées au nom des variables....

Code PHP:

//------------------------------------------------
//                               Menu Manager V 1.0
// -----------------------------------------------
//                    Variables de paramétrage
// -----------------------------------------------
float     timeOut=60.0;
integer canal=60258;
string     PREVIOUS="<< Previous";
string     NEXT="Next >>";
// -----------------------------------------------
//                    Variables de travail
// -----------------------------------------------
integer ecouteMenu=0;
integer canalMenu=0;
integer index=0;
list     
listeGlobale=[];
string     texte="";
// -----------------------------------------------
//                    Gestion de l'écoute du menu
// -----------------------------------------------
updateEcoute (key id)
{
    
cancelEcoute();
    
ecouteMenu=llListen(canalMenu,"",id,"");
    
llSetTimerEvent(timeOut);
}
// -----------------------------------------------
cancelEcoute()
{
    if(
ecouteMenu>0)
    {
        
llListenRemove(ecouteMenu);
        
ecouteMenu=0;
        
llSetTimerEvent(.0);
    }
}
// -----------------------------------------------
//                    Canal aléatoire
// -----------------------------------------------
integer genCanal()
{
    return 
llFloor(llFrand(2000000.0));
}
// -----------------------------------------------
//                    Gestion premier menu
// -----------------------------------------------
gestPremierMenu(key id)
{
    
llDialog(id,texte,llListInsertList(llList2List(listeGlobale,0,10),[NEXT],2),canalMenu);
}
// -----------------------------------------------
//                    Gestion menus autres que le premier
// -----------------------------------------------
gestMenu(key id)
{
    list 
l=llDeleteSubList(listeGlobale,0,index-1);
    if(
llGetListLength(l)>11)
    
l=llListInsertList(llDeleteSubList(l,10,-1),[NEXT],1);
    
llDialog(id,texte,[PREVIOUS]+l,canalMenu);
}
// -----------------------------------------------
//                    Etat par défaut
// -----------------------------------------------
default
{
    
link_message(integer sender_number,integer number,string message,key id)
    {
        if(
number==canal)
        {
            
index=0;
            
canalMenu=genCanal();
            
listeGlobale=llCSV2List(message);
            
texte=llList2String(listeGlobale,0);
            
listeGlobale=llDeleteSubList(listeGlobale,0,0);
            
updateEcoute(id);
            if(
llGetListLength(listeGlobale)<13)
                
llDialog(id,texte,listeGlobale,canalMenu);
            else
                
gestPremierMenu(id);
        }
    }
         
    
listen(integer channel,string name,key id,string message)
    {
        if(
channel==canalMenu)
        {
            if(
message==NEXT)
            {
                if(
index==0)
                    
index+=11;
                else
                    
index+=10;
                
                
gestMenu(id);
            }
            else if(
message==PREVIOUS)
            {
                if(
index==11)
                {
                    
index=0;
                    
gestPremierMenu(id);
                }
                else
                {
                    
index-=10;
                    
gestMenu(id);
                }
        }
        else
        {
        
cancelEcoute();
        
llMessageLinked(LINK_THIS,canal+1,message,id);}
        }
    }
     
    
timer()
    {
        
cancelEcoute();
    }

Code PHP:

integer canal 60258;
appelMenu(string texte, list menu
{
               
llMessageLinked(LINK_THIScanaltexte "," llList2CSV(menu),         llDetectedKey(0);
}



default 
{
    
touch_start(integer total_number
    {
        
integer c;
        list 
l;
        for(
150c++) += (string)c;
        
appelMenu("Choisissez : "l);
    }
 
    
link_message(integer sender_numberinteger numberstring messagekey id
    {
        if(
number == canal 1
            
llOwnerSay("Vous avez choisi " message);
    }

Miniatures attachées
Cliquez sur l'image pour la voir en taille réelle

Nom : Boite.png
Taille : 383x245
Poids : 31,4 Ko
ID : 59824  
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés