Don't click here unless you want to be banned.

LSL Wiki : LibraryCBMenuScrollButtonView

HomePage :: PageIndex :: RecentChanges :: RecentlyCommented :: UserSettings :: You are ia360925.us.archive.org
// 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);
        }
    }
}


LibraryContentBrowser
There is no comment on this page. [Display comments/form]