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 :
//------------------------------------------------
// 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 :
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.