User:Thraxis Epsilon/control ui
Purpose
This script replaces all the button scripts for controlling the LSL Test Harness it requires a modified controller.controller script.
Even though this is a test harness I felt it should follow a "best practice" of reducing unnecessary script usage when possible.
Usage
Create a root prim and place the controller_ui and controller.controller scripts inside it.
Add 17 "button" prims and name them as follows:
TestSelectedButton::unit
TestSelectedButton::group
SetTestSelected::ALL
SetReportType::STATS
SetReportType::VERBOSE
SetReportType::QUIET
SetReportType::NORMAL
ReportMethodButton::HTTP
ReportMethodButton::EMAIL
ReportMethodButton::CHAT
system::ActivateTest
system::ActivateReport
system::ActivateRegistration
system::BigRed
config::reset
config::controlChannelButton
config::broadcastChannelButton
SetReportType, ReportMethod and the SetTestSelected,TestSelectedButton tagged buttons work as radio groups. Only one item can be active at a time in the set. All others act as single buttons.
What next?
Add texture support for the buttons for readable labels. Ensure 100% functionality as a replacement for buttons. Allow for expandability with custom buttons.
<lsl> //******************************************************************** // Script Name: controller_ui.lsl // Purpose: // This is the User Interface control script for the LSL // TestHarness //******************************************************************** // GLOBAL VARIABLES //********************************************************************
integer toAllChannel = -255; // general channel - linked message integer fromAllChannel = -254;
// Lists list btnReportMethod; list btnReportType; list btnTestSelected; list btnAll;
string btnRegister; string btnReport; string btnTest; string btnBigRed;
//****************************************************************** // Build List of Buttons and Button Groups //****************************************************************** button_init() {
integer x=1; integer max = llGetNumberOfPrims(); for (;x<max+1;++x) { btnAll = (btnAll = []) + btnAll + llGetLinkName(x); if(llSubStringIndex(llGetLinkName(x), "ReportMethodButton::") != -1) { btnReportMethod = (btnReportMethod= []) + btnReportMethod + [x]; } else if(llSubStringIndex(llGetLinkName(x), "SetReportType::") != -1) { btnReportType = (btnReportType= []) + btnReportType + [x]; } else if ((llSubStringIndex(llGetLinkName(x), "SetTestSelected::") != -1) || (llSubStringIndex(llGetLinkName(x), "TestSelectedButton::") != -1)) { btnTestSelected = (btnTestSelected= []) + btnTestSelected + [x]; } else if(llSubStringIndex(llGetLinkName(x), "system::") != -1) { string button = llDeleteSubString( llGetLinkName(x) , 0, llSubStringIndex(llGetLinkName(x) , "::") + 1); if (button == "ActivateRegistration") { btnRegister = "1::"+(string)x; llSetLinkAlpha(x, 1.0, ALL_SIDES); } else if (button == "ActivateReport") { btnReport = "0::"+(string)x; llSetLinkAlpha(x, 0.0, ALL_SIDES); } else if (button == "ActivateTest") { btnTest = "0::"+(string)x; llSetLinkAlpha(x, 0.0, ALL_SIDES); } else if (button == "BigRed") { btnBigRed = "0::"+(string)x; llSetLinkAlpha(x, 1.0, ALL_SIDES); llSetLinkColor(x, <255,0,0>, ALL_SIDES); } } }
}
//********************************************************************
// DEFAULT STATE
//********************************************************************
default
{
state_entry() { button_init(); } link_message(integer sender_number, integer number, string message, key id) { //if link message is on the correct channel if(number == fromAllChannel) { if(llSubStringIndex( message, "ActivateRegistration") != -1) { //Big Red Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),1), 0.0, ALL_SIDES); } if(llSubStringIndex( message, "RegistrationComplete") != -1) { //Big Red Button if((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),0)== 1) { llMessageLinked(LINK_THIS, toAllChannel, "ActivateTest", NULL_KEY); } //Register Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnRegister,["::"],[]),1), 0.0, ALL_SIDES); btnRegister= "0::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnRegister, "::") + 1); } if(llSubStringIndex( message, "TestComplete") != -1) { //Big Red Button if((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),0)== 1) { llMessageLinked(LINK_THIS, toAllChannel, "ActivateReport", NULL_KEY); } //Register Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnRegister,["::"],[]),1), 0.0, ALL_SIDES); btnRegister= "0::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnRegister, "::") + 1); } if(llSubStringIndex( message, "ReportComplete") != -1) { //Big Red Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),1), 1.0, ALL_SIDES); llSetLinkColor((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),1), <255,0,0>, ALL_SIDES); //Register Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnRegister,["::"],[]),1), 1.0, ALL_SIDES); btnRegister= "1::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnRegister, "::") + 1); } if(llSubStringIndex( message, "ActivateReport") != -1) { //Register Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnRegister,["::"],[]),1), 0.0, ALL_SIDES); btnRegister= "0::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnRegister, "::") + 1); } if(llSubStringIndex( message, "ActivateTest") != -1) { //Register Button llSetLinkAlpha((integer)llList2String(llParseString2List(btnRegister,["::"],[]),1), 0.0, ALL_SIDES); btnRegister= "0::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnRegister, "::") + 1); } if( message == "reset" ) { llResetScript(); } } } //end of link message
touch_start(integer total_number) { integer link = llDetectedLinkNumber(0); string button = llGetLinkName(link); string cmdGroup = llDeleteSubString( button , llSubStringIndex(button , "::"), llStringLength(button) - 1); if (cmdGroup == "ReportMethodButton") { integer x = 0; for(;x<llGetListLength(btnReportMethod);++x) { llSetLinkColor((integer)llList2String(btnReportMethod,x),<0,0,0>,ALL_SIDES); } llSetLinkColor(link,<255,255,255>,ALL_SIDES); llMessageLinked(LINK_THIS, toAllChannel, button, NULL_KEY); } else if (cmdGroup == "SetReportType") { integer x = 0; for(;x<llGetListLength(btnReportType);++x) { llSetLinkColor((integer)llList2String(btnReportType ,x),<0,0,0>,ALL_SIDES); } llSetLinkColor(link,<255,255,255>,ALL_SIDES); llMessageLinked(LINK_THIS, toAllChannel, button, NULL_KEY); } else if ((cmdGroup == "SetTestSelected") || (cmdGroup == "TestSelectedButton")) { integer x = 0; for(;x<llGetListLength(btnTestSelected);++x) { llSetLinkColor((integer)llList2String(btnTestSelected,x),<0,0,0>,ALL_SIDES); } llSetLinkColor(link,<255,255,255>,ALL_SIDES); llMessageLinked(LINK_THIS, toAllChannel, button, NULL_KEY); } else if (cmdGroup == "config") { llMessageLinked(LINK_THIS, toAllChannel, llDeleteSubString( button, 0, llSubStringIndex(button, "::") + 1), NULL_KEY); } else if (cmdGroup == "system") { string btnSystem = llDeleteSubString( button , 0, llSubStringIndex(button , "::") + 1); if (btnSystem == "ActivateRegistration") { if((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),0)== 1) { llMessageLinked(LINK_THIS, toAllChannel, btnSystem, NULL_KEY); btnRegister= "0::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnRegister, "::") + 1); llSetLinkColor((integer)llList2String(llParseString2List(btnRegister,["::"],[]),1), <255,255,255>, ALL_SIDES); } } else if (btnSystem == "ActivateReport") { if((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),0)== 1) { llMessageLinked(LINK_THIS, toAllChannel, btnSystem, NULL_KEY); btnReport = "0::" + llDeleteSubString( btnReport , 0, llSubStringIndex(btnReport , "::") + 1); llSetLinkColor((integer)llList2String(llParseString2List(btnReport ,["::"],[]),1), <255,255,255>, ALL_SIDES); } } else if (btnSystem == "ActivateTest") { if((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),0)== 1) { llMessageLinked(LINK_THIS, toAllChannel, btnSystem, NULL_KEY); btnTest = "0::" + llDeleteSubString( btnRegister, 0, llSubStringIndex(btnTest , "::") + 1); llSetLinkColor((integer)llList2String(llParseString2List(btnTest ,["::"],[]),1), <255,255,255>, ALL_SIDES); } } else if (btnSystem == "BigRed") { llMessageLinked(LINK_THIS, toAllChannel, "ActivateRegistration", NULL_KEY); btnBigRed = "1::" + llDeleteSubString( btnBigRed , 0, llSubStringIndex(btnBigRed, "::") + 1); llSetLinkColor((integer)llList2String(llParseString2List(btnBigRed,["::"],[]),1), <255,255,255>, ALL_SIDES); } } }
} </lsl>