10.08.2010, 12:50
Mal auf die Schnelle mein Standardmenü, was ich auch im OSgrid nutze.
Als Demo wird die Liste DlgItems inm state_entry mit sinnlosen Zahlen gefüllt, da muss dann was anderes rein.
LG Reb
Als Demo wird die Liste DlgItems inm state_entry mit sinnlosen Zahlen gefüllt, da muss dann was anderes rein.
LG Reb
Code:
// Menu 1
// Ein Menü mit beliebig vielen Schaltflächen
// diese stehen in der Liste DlgItems
string NEXT = ">>>"; // Schaltflächen für vor und zurück
string PREV = "<<<";
string DLGTITLE = "Drücke eine Taste.."; // Dialog-Text
integer DLGCHANNEL; // Chatkanal
integer TIME = 30; // Zeit nach der abgebrochen wird, wenn TIMEOUT = TRUE ist
integer TIMEOUT = TRUE; // soll ein Abbruch nach der Zeit TIME erfolgen?
integer MenuOn = FALSE; // kein neues Menu wenn schon eins da ist
list DlgItems = []; // die Schaltflächen des Dialogs
integer DlgPage = 0; // aktuelle Seite - wird vom Skript verwendet
integer Listener;
list DlgNice(list Dlg) // "schöneres" Aussehen
{
list l = [];
integer len = llGetListLength(Dlg);
integer i;
while(llGetListLength(Dlg) < 12) Dlg += [" "];
integer ip = llListFindList(Dlg, [PREV]);
integer in = llListFindList(Dlg, [NEXT]);
if(in != -1)
{
Dlg = llDeleteSubList(Dlg, in, in);
Dlg += [NEXT];
}
if(ip != -1)
{
Dlg = llDeleteSubList(Dlg, ip, ip);
Dlg = llListInsertList(Dlg, [PREV], 9);
}
for(i = 0; i< 3; i++) l += llList2List(Dlg, i + 9, i + 9);
for(i = 3; i< 6; i++) l += llList2List(Dlg, i + 3, i + 3);
for(i = 6; i< 9; i++) l += llList2List(Dlg, i - 3, i - 3);
for(i = 9; i< 12; i++) l += llList2List(Dlg, i - 9, i - 9);
return l;
}
DlgShow(string msg, integer channel) // die eigentliche Dialogprozedur
{
if(MenuOn) return;
MenuOn = TRUE;
list Dlg = [];
integer Count = llGetListLength(DlgItems);
integer Start = (DlgPage - 1) * 10 + 11;
if(DlgPage == 0)
{
Start = 0;
if(Count < 13) Dlg = DlgItems;
else Dlg = llList2List(DlgItems, 0, 1) + [NEXT] + llList2List(DlgItems, 2, 10);
} else
{
if(Count < Start + 12) Dlg = [PREV] + llList2List(DlgItems, Start, Start + 11);
else Dlg = [PREV] + llList2List(DlgItems, Start, Start) + [NEXT] + llList2List(DlgItems, Start + 1, Start + 9);
}
integer i;
for(i = llGetListLength(Dlg) - 1; i >= 0; i--) Dlg = llListReplaceList(Dlg, [llGetSubString(llList2String(Dlg, i), 0, 23)], i, i);
if(TIMEOUT) llSetTimerEvent(TIME);
llListenRemove(Listener);
llListen(channel, "", llGetOwner(), "");
// der Standard-Dialog, den ich nicht mag
// llDialog(llGetOwner(), msg, Dlg, channel);
// wenns schöner aussehen soll:
llDialog(llGetOwner(), msg, DlgNice(Dlg), channel);
}
integer DlgMain(string msg)
{
MenuOn = FALSE;
llSetTimerEvent(0);
llListenRemove(Listener);
if(msg == PREV)
{
DlgPage--;
DlgShow(DLGTITLE, DLGCHANNEL);
return TRUE;
} else if(msg == NEXT)
{
DlgPage++;
DlgShow(DLGTITLE, DLGCHANNEL);
return TRUE;
} else if(msg == " ")
{
DlgShow(DLGTITLE, DLGCHANNEL);
return TRUE;
}
else return FALSE;
}
default
{
state_entry()
{
integer i;
DLGCHANNEL = (integer)llFrand(10000) + 999;
DlgItems = [];
// nur zum Test
for(i = 0; i < 35; i++) DlgItems += (string)i;
}
touch_start(integer total_number)
{
if(!MenuOn && llDetectedKey(0) == llGetOwner())
{
DlgPage = 0;
DlgShow(DLGTITLE, DLGCHANNEL);
}
}
listen(integer channel, string name, key id, string message)
{
if(DlgMain(message)) return;
// hier werden die Schaltflächen ausgewertet
// Wenn das Menü erneut aufgerufen werden soll, dann die nächste Zeile verwenden
// DlgShow(DLGTITLE, DLGCHANNEL);
}
timer()
{
llSetTimerEvent(0);
llListenRemove(Listener);
MenuOn = FALSE;
llOwnerSay("Die Zeit für das Menü ist abgelaufen. Bitte nochmals aufrufen.");
}
}
Leider ist meine Signatur ausserhalb Sachsens nicht verfügbar.