// Responabile for how scroll buttons look to the user. // triggers menuScrollUp and menuScrollDown when // scroll up button or scroll down button is pressed. // Copyright (C) 2005-2006 Francisco V. Saldana // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // Francisco V. Saldana can be contacted using his email account // username: dressedinblue, at domain: gmail.com // and in Second Life by IMming Christopher Omega // ========== For method invocation ========== string randomStr(string chars, integer len) { integer numChars = llStringLength(chars); string ret; integer i; for (i = 0; i < len; i++) { integer randIndex = llFloor(llFrand(numChars)); ret += llGetSubString(chars, randIndex, randIndex); } return ret; } string SEPERATOR_CHARS = "`~!@#$%^&*()-_+[]{}\|'\";/?.>,<"; integer SEPERATOR_LEN = 3; string dumpList2String(list src) { // Generate a seperator not present in any of the // elements in the list. string chars = (string) src; // Squashes all elements together. string seperator; do { seperator = randomStr(SEPERATOR_CHARS, SEPERATOR_LEN); } while (llSubStringIndex(chars, seperator) != -1); return seperator + llDumpList2String(src, seperator); } list parseStringKeepNulls(string src) { // The seperator should be the first SEPERATOR_LEN // characters in the string. return llParseStringKeepNulls(llDeleteSubString(src, 0, SEPERATOR_LEN - 1), [llGetSubString(src, 0, SEPERATOR_LEN - 1)], []); } callMethod(integer callId, string methodName, list parameters) { llMessageLinked(LINK_THIS, callId, dumpList2String(parameters), methodName); } returnValue(string methodName, integer methodIdentifyer, list value) { llMessageLinked(LINK_THIS, methodIdentifyer, dumpList2String(value), methodName + "_ret"); } // ============================================= // This method is triggered to register the scroll buttons with the Button Abstraction Layer // so buttonPressed events are called when prims matching the buttonNamePattern // are touched. trigger_addButtonListener(string buttonNamePattern) { callMethod(0, "addButtonListener", [buttonNamePattern]); } integer linkName2Number(string linkName) { integer linkNumber; for (linkNumber = 1; llGetLinkKey(linkNumber) != NULL_KEY; linkNumber++) { if (llGetLinkName(linkNumber) == linkName) { return linkNumber; } } return -1; } // This method is triggered to deregister the scroll buttons, so buttonPressed // is no longer triggered when prims are touched whose names match the pattern // specified by buttonNamePattern. // NOTE: buttonNamePattern must be identical to the buttonNamePattern passed to // addButtonListener(). trigger_removeButtonListener(string buttonNamePattern) { callMethod(0, "removeButtonListener", [buttonNamePattern]); } trigger_menuScrollUp() { callMethod(0, "menuScrollUp", []); } trigger_menuScrollDown() { callMethod(0, "menuScrollDown", []); } trigger_pong(string moduleName) { callMethod(0, "pong", [moduleName]); } // Color button changes to when its pressed. vector COLOR_PRESSED = <0.2, 0.2, 1>; // Color button changes to when its released, the button // stays this color after the press->release process. vector COLOR_RELEASED = <0.88235, 0.54902, 0.54902>; // Color button changes to when its disabled, // the button is COLOR_RELEASED when its enabled. vector COLOR_DISABLED = <0.16078, 0.12941, 0.14118>; string BUTTON_SCROLL_UP_NAME = "Scroll:Up"; string BUTTON_SCROLL_DOWN_NAME = "Scroll:Down"; integer scrollUpLinkNumber; integer scrollDownLinkNumber; integer scrollUpEnabled = TRUE; integer scrollDownEnabled = TRUE; disableScrollUp() { if (scrollUpEnabled) { scrollUpEnabled = FALSE; llSetLinkColor(scrollUpLinkNumber, COLOR_DISABLED, ALL_SIDES); } } enableScrollUp() { if (!scrollUpEnabled) { scrollUpEnabled = TRUE; llSetLinkColor(scrollUpLinkNumber, COLOR_RELEASED, ALL_SIDES); } } disableScrollDown() { if (scrollDownEnabled) { scrollDownEnabled = FALSE; llSetLinkColor(scrollDownLinkNumber, COLOR_DISABLED, ALL_SIDES); } } enableScrollDown() { if (!scrollDownEnabled) { scrollDownEnabled = TRUE; llSetLinkColor(scrollDownLinkNumber, COLOR_RELEASED, ALL_SIDES); } } initScrollButtons() { trigger_addButtonListener(BUTTON_SCROLL_UP_NAME); trigger_addButtonListener(BUTTON_SCROLL_DOWN_NAME); scrollUpLinkNumber = linkName2Number(BUTTON_SCROLL_UP_NAME); scrollDownLinkNumber = linkName2Number(BUTTON_SCROLL_DOWN_NAME); disableScrollUp(); disableScrollDown(); } string this; default { state_entry() { this = llGetScriptName(); initScrollButtons(); state main; } } state main { link_message(integer sender, integer num, string parameters, key methodName) { if (methodName == "buttonPressed") { list paramList = parseStringKeepNulls(parameters); // Method signature: // buttonPressed(string buttonName, list detectedData) string buttonName = llList2String(paramList, 0); list detectedData = parseStringKeepNulls(llList2String(paramList, 1)); if (buttonName == BUTTON_SCROLL_UP_NAME && scrollUpEnabled) { trigger_menuScrollUp(); llSetLinkColor(scrollUpLinkNumber, COLOR_PRESSED, ALL_SIDES); } else if (buttonName == BUTTON_SCROLL_DOWN_NAME && scrollDownEnabled) { trigger_menuScrollDown(); llSetLinkColor(scrollDownLinkNumber, COLOR_PRESSED, ALL_SIDES); } } else if (methodName == "buttonReleased") { list paramList = parseStringKeepNulls(parameters); // Method signature: // buttonReleased(string buttonName, list detectedData) string buttonName = llList2String(paramList, 0); list detectedData = parseStringKeepNulls(llList2String(paramList, 1)); if (buttonName == BUTTON_SCROLL_UP_NAME && scrollUpEnabled) { llSetLinkColor(scrollUpLinkNumber, COLOR_RELEASED, ALL_SIDES); } else if (buttonName == BUTTON_SCROLL_DOWN_NAME && scrollDownEnabled) { llSetLinkColor(scrollDownLinkNumber, COLOR_RELEASED, ALL_SIDES); } } else if (methodName == "disableMenuScrollUp") { disableScrollUp(); } else if (methodName == "disableMenuScrollDown") { disableScrollDown(); } else if (methodName == "enableMenuScrollUp") { enableScrollUp(); } else if (methodName == "enableMenuScrollDown") { enableScrollDown(); } else if (methodName == "reregisterButtons") { // Method signature: // reregisterButtons() // Called when the ButtonAbstractionLayer is reset. state default; } else if (methodName == "ping") { list paramList = parseStringKeepNulls(parameters); // Method signature: // ping(string moduleName) string moduleName = llList2String(paramList, 0); if (moduleName == this) trigger_pong(this); } } }