vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-----------------------------------------------------------------------------------------
--                      Nurfed Options Menu
-----------------------------------------------------------------------------------------

local utility = Nurfed_Utility:New();
local framelib = Nurfed_Frames:New();

local menus = {};
local activemenu = nil;

StaticPopupDialogs["NRF_RELOADUI"] = {
        text = "Reload User Interface?",
        button1 = TEXT(ACCEPT),
        button2 = TEXT(CANCEL),
        OnAccept = function()
                ReloadUI();
        end,
        timeout = 10,
        whileDead = 1,
        hideOnEscape = 1,
};

local templates = {
        nrf_menu_button = {
                type = "Button",
                size = { 80, 14 },
                TextFontObject = "GameFontNormalSmall",
                TextColor = { 0.5, 0.5, 0.5 },
                HighlightTextColor = { 1, 1, 1 },
                DisabledTextColor = { 1, 1, 1 },
                PushedTextOffset = { 1, -1 },
                children = {
                        NormalTexture = {
                                type = "Texture",
                                layer = "BACKGROUND",
                                Anchor = "all",
                                Texture = NRF_IMG.."statusbar8",
                                Gradient = { "VERTICAL", 1, 0.5, 0, 0.2, 0, 0 },
                        },
                        DisabledTexture = {
                                type = "Texture",
                                layer = "BACKGROUND",
                                Anchor = "all",
                                Texture = NRF_IMG.."statusbar8",
                                Gradient = { "VERTICAL", 0, 0.75, 1, 0, 0, 0.2 },
                        },
                },
        },
        nrf_options = {
                type = "Frame",
                size = { 411, 271 },
                Anchor = { "TOPRIGHT", "$parentheader", "BOTTOMRIGHT", 1, 0 },
                Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 8, insets = { left = 2, right = 2, top = 2, bottom = 2 }, },
                BackdropColor = { 0, 0, 0, 0.95 },
                Alpha = 0,
                Hide = true,
        },
        nrf_addon_row = {
                type = "Frame",
                size = { 400, 14 },
                children = {
                        check = {
                                type = "CheckButton",
                                size = { 16, 16 },
                                uitemp = "UICheckButtonTemplate",
                                Anchor = { "BOTTOMLEFT", "$parent", "BOTTOMLEFT", 2, 0 },
                                OnClick = function() Nurfed_ToggleAddOn() end,
                        },
                        name = {
                                type = "FontString",
                                layer = "ARTWORK",
                                size = { 190, 14 },
                                Anchor = { "LEFT", "$parentcheck", "RIGHT", 5, 0 },
                                FontObject = "GameFontNormal",
                                JustifyH = "LEFT",
                                TextColor = { 1, 1, 1 },
                        },
                        loaded = {
                                type = "FontString",
                                layer = "ARTWORK",
                                size = { 105, 14 },
                                Anchor = { "LEFT", "$parentname", "RIGHT", 5, 0 },
                                FontObject = "GameFontNormal",
                                JustifyH = "LEFT",
                                TextColor = { 1, 1, 1 },
                        },
                        reload = {
                                type = "FontString",
                                layer = "ARTWORK",
                                size = { 100, 14 },
                                Anchor = { "LEFT", "$parentloaded", "RIGHT", 5, 0 },
                                FontObject = "GameFontNormal",
                                JustifyH = "LEFT",
                                TextColor = { 1, 0, 0 },
                        },
                },
        },
        nrf_button = {
                type = "Button",
                size = { 30, 18 },
                Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 8, insets = { left = 2, right = 2, top = 2, bottom = 2 }, },
                BackdropColor = { 0, 0, 0, 0.75 },
                Font = { "Fonts\\ARIALN.TTF", 10, "NONE" },
                TextColor = { 0.65, 0.65, 0.65 },
                HighlightTextColor = { 1, 1, 1 },
                PushedTextOffset = { 1, -1 },
                OnShow = function() Nurfed_Options_buttonOnShow() end,
        },
        nrf_check = {
                type = "CheckButton",
                size = { 20, 20 },
                uitemp = "UICheckButtonTemplate",
                OnShow = function() Nurfed_Options_OnShow() end,
                OnClick = function() Nurfed_Options_checkOnClick() end,
        },
        nrf_smallcheck = {
                type = "CheckButton",
                size = { 16, 16 },
                uitemp = "UICheckButtonTemplate",
                OnShow = function() Nurfed_Options_OnShow() end,
                OnClick = function() Nurfed_Options_checkOnClick() end,
        },
        nrf_radio = {
                type = "CheckButton",
                size = { 14, 14 },
                uitemp = "UIRadioButtonTemplate",
                OnShow = function() Nurfed_Options_OnShow() end,
                OnClick = function() Nurfed_Options_radioOnClick() end,
        },
        nrf_slider = {
                type = "Slider",
                uitemp = "OptionsSliderTemplate",
                children = {
                        value = {
                                type = "FontString",
                                layer = "ARTWORK",
                                FontObject = "GameFontNormalSmall",
                                JustifyH = "CENTER",
                                TextColor = { 0, 1, 0 },
                        },
                },
                OnShow = function() Nurfed_Options_OnShow() end,
                OnMouseUp = function() Nurfed_Options_sliderOnMouseUp() end,
                OnValueChanged = function() Nurfed_Options_sliderOnValueChanged() end,
        },
        nrf_editbox = {
                type = "EditBox",
                AutoFocus = false,
                Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 8, insets = { left = 2, right = 2, top = 2, bottom = 2 }, },
                BackdropColor = { 0, 0, 0.2, 0.75 },
                FontObject = "GameFontNormalSmall",
                TextColor = { 1, 1, 1 },
                TextInsets = { 3, 9, 0, 0 },
                OnEscapePressed = function() this:ClearFocus() end,
                OnEditFocusLost = function() this:HighlightText(0, 0) end,
                OnEditFocusGained = function() this:HighlightText() end,
        },
        nrf_input = {
                type = "Frame",
                size = { 130, 30 },
                children = {
                        Text = {
                                type = "FontString",
                                layer = "ARTWORK",
                                Anchor = { "TOPLEFT", "$parent", "TOPLEFT", 3, 0 },
                                FontObject = "GameFontNormalSmall",
                                JustifyH = "LEFT",
                        },
                        input = {
                                template = "nrf_editbox",
                                size = { 100, 18 },
                                Anchor = { "BOTTOMLEFT", "$parent", "BOTTOMLEFT", 0, 0 },
                                OnEnterPressed = function() Nurfed_Options_inputOnClick() end,
                        },
                        set = {
                                template = "nrf_button",
                                Anchor = { "LEFT", "$parentinput", "RIGHT", 1, 0 },
                                OnClick = function() Nurfed_Options_inputOnClick() end,
                                vars = { text = "Set" },
                        },
                },
                OnShow = function() Nurfed_Options_inputOnShow() end,
        },
        nrf_color = {
                type = "Button",
                size = { 18, 18 },
                children = {
                        bg = {
                                type = "Texture",
                                Texture = "Interface\\ChatFrame\\ChatFrameColorSwatch",
                                layer = "BACKGROUND",
                                Anchor = "all",
                                VertexColor = { 1, 1, 1 },
                        },
                        Text = {
                                type = "FontString",
                                layer = "ARTWORK",
                                Anchor = { "LEFT", "$parent", "RIGHT", 1, 0 },
                                FontObject = "GameFontNormalSmall",
                                JustifyH = "LEFT",
                        },
                },
                OnShow = function() Nurfed_Options_swatchOnShow() end,
                OnClick = function() Nurfed_Options_swatchOpenColorPicker() end,
        },
        nrf_scroll = {
                type = "ScrollFrame",
                Anchor = "all",
                uitemp = "FauxScrollFrameTemplate",
                OnVerticalScroll = function() FauxScrollFrame_OnVerticalScroll(100, Nurfed_Options_ScrollMenu) end,
                OnShow = function() Nurfed_Options_ScrollMenu() end,
        },
        nrf_optionpane = {
                type = "Frame",
                Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 8, insets = { left = 2, right = 2, top = 2, bottom = 2 }, },
                BackdropColor = { 0, 0, 0, 0.5 },
                BackdropBorderColor = { 0.75, 0.75, 0.75, 1 },
                children = {
                        title = {
                                type = "FontString",
                                layer = "ARTWORK",
                                Anchor = { "BOTTOMLEFT", "$parent", "TOPLEFT", 10, -2 },
                                FontObject = "GameFontNormalSmall",
                                JustifyH = "LEFT",
                        },
                },
                OnShow = function() Nurfed_Options_paneOnShow() end,
        },
        nrf_paneeditbox = {
                type = "EditBox",
                AutoFocus = false,
                Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = nil, tile = true, tileSize = 16, edgeSize = 8, insets = { left = 2, right = 2, top = 2, bottom = 2 }, },
                BackdropColor = { 0.5, 0.5, 0.5, 0.85 },
                FontObject = "GameFontNormalSmall",
                TextColor = { 1, 1, 0 },
                TextInsets = { 3, 9, 0, 0 },
                OnEscapePressed = function() this:ClearFocus() end,
                OnEditFocusLost = function() this:HighlightText(0, 0) end,
                OnEditFocusGained = function() this:HighlightText() end,
                OnEnterPressed = function() Nurfed_Options_paneAddOption() end,
        },
        nrf_panescroll = {
                type = "ScrollFrame",
                Anchor = "all",
                uitemp = "FauxScrollFrameTemplate",
                Scale = 0.75,
                OnVerticalScroll = function() FauxScrollFrame_OnVerticalScroll(13, Nurfed_Options_ScrollPane) end,
                OnShow = function() Nurfed_Options_ScrollPane() end,
        },
        nrf_pane_row = {
                type = "Button",
                children = {
                        text = {
                                type = "FontString",
                                layer = "ARTWORK",
                                Anchor = "all",
                                FontObject = "GameFontNormalSmall",
                                JustifyH = "LEFT",
                                TextColor = { 0, 1, 1 },
                        },
                        HighlightTexture = {
                                type = "Texture",
                                layer = "BACKGROUND",
                                Texture = "Interface\\QuestFrame\\UI-QuestTitleHighlight",
                                BlendMode = "ADD",
                                Anchor = "all",
                        },
                },
                OnClick = function() Nurfed_Options_PaneSelect() end,
        },
};

local layout = {
        type = "Frame",
        size = { 500, 300 },
        FrameStrata = "LOW",
        Anchor = { "CENTER", "$parent", "CENTER", 0, 0 },
        Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 4, top = 5, bottom = 4 }, },
        BackdropColor = { 0, 0, 0, 0.25 },
        children = {
                header = {
                        type = "Frame",
                        size = { 490, 20 },
                        Anchor = { "TOP", "$parent", "TOP", 0, -5 },
                        children = {
                                bg = {
                                        type = "Texture",
                                        layer = "BACKGROUND",
                                        Anchor = "all",
                                        Texture = NRF_IMG.."statusbar8",
                                        Gradient = { "HORIZONTAL", 0, 0.75, 1, 0, 0, 0.2 },
                                },
                                title = {
                                        type = "FontString",
                                        layer = "ARTWORK",
                                        Anchor = "all",
                                        Font = { "Fonts\\FRIZQT__.TTF", 13, "OUTLINE" },
                                        JustifyH = "LEFT",
                                        TextColor = { 1, 1, 1 },
                                },
                                version = {
                                        type = "FontString",
                                        layer = "ARTWORK",
                                        Anchor = "all",
                                        Font = { "Fonts\\MORPHEUS.ttf", 13, "NONE" },
                                        JustifyH = "RIGHT",
                                        TextColor = { 1, 1, 1 },
                                },
                                border = {
                                        type = "Texture",
                                        size = { 490, 3 },
                                        layer = "OVERLAY",
                                        Anchor = { "TOP", "$parent", "BOTTOM", 0, 1 },
                                        Texture = "Interface\\ClassTrainerFrame\\UI-ClassTrainer-HorizontalBar",
                                        TexCoord = { 0.2, 1, 0, 0.25 },
                                },
                        },
                },
                menubg = {
                        type = "Frame",
                        FrameStrata = "BACKGROUND",
                        size = { 85, 278 },
                        Anchor = { "TOPLEFT", "$parentheader", "BOTTOMLEFT", -3, 5 },
                        Backdrop = { bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 8, insets = { left = 3, right = 2, top = 3, bottom = 2 }, },
                        BackdropColor = { 0, 0, 0, 0.95 },
                },
                button1 = {
                        template = "nrf_menu_button",
                        Anchor = { "TOPLEFT", "$parentheader", "BOTTOMLEFT", 0, 0 },
                        Text = "AddOns",
                        OnClick = function() Nurfed_MenuClick(this.id) end,
                        vars = {
                                id = 1,
                        },
                },
                button2 = {
                        template = "nrf_menu_button",
                        Anchor = { "TOPLEFT", "$parentbutton1", "BOTTOMLEFT", 0, -1 },
                        Text = "Profiles",
                        OnClick = function() Nurfed_MenuClick(this.id) end,
                        vars = {
                                id = 2,
                        },
                },
        },
        Hide = true,
};

function Nurfed_OptionsInit()
        for k, v in pairs(templates) do
                framelib:CreateTemplate(k, v);
        end

        local count = GetNumAddOns();
        local add = {};

        for i = 1, count do
                local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(i);
                local loaded = IsAddOnLoaded(i);
                if (string.find(name, "^Nurfed") and loaded) then
                        local text = string.gsub(name, "Nurfed_", "");
                        if (Nurfed_OptionsMenus[text]) then
                                table.insert(add, text);
                        end
                end
        end

        for k, v in pairs(add) do
                layout.children["button"..k + 2] = {
                        template = "nrf_menu_button",
                        Anchor = { "TOPLEFT", "$parentbutton"..k + 1, "BOTTOMLEFT", 0, -1 },
                        OnClick = function() Nurfed_MenuClick(this.id) end,
                        Text = v,
                        vars = {
                                id = k + 2,
                        },
                };
        end

        local last = table.getn(add) + 2;
        layout.children["reloadui"] = {
                template = "nrf_menu_button",
                Anchor = { "TOPLEFT", "$parentbutton"..last, "BOTTOMLEFT", 0, -1 },
                OnClick = function() StaticPopup_Show("NRF_RELOADUI") end,
                Text = "Reload UI",
        };
        layout.children["close"] = {
                template = "nrf_menu_button",
                Anchor = { "TOPLEFT", "$parentreloadui", "BOTTOMLEFT", 0, -1 },
                OnClick = function() HideUIPanel(this:GetParent()) end,
                Text = CLOSE,
        };

        local frame = framelib:ObjectInit("Nurfed_OptionsFrame", layout);
        UIPanelWindows["Nurfed_OptionsFrame"] = { area = "center", pushable = 0, whileDead = 1 };
        Nurfed_OptionsFrameheadertitle:SetText("Nurfed Options Menu");
        Nurfed_OptionsFrameheaderversion:SetText(GetAddOnMetadata("Nurfed_Options", "Version"));

        templates = nil;
        layout = nil;
end

function Nurfed_MenuClick(id)
        this:Disable();
        local i = 1;
        local name = string.gsub(this:GetName(), id, "");
        local button = getglobal(name..i);
        while (button) do
                if (button.id ~= id and button:IsEnabled() == 0) then
                        button:Enable();
                        Nurfed_HideMenu(button:GetText());
                end
                i = i + 1;
                button = getglobal(name..i);
        end
        Nurfed_ShowMenu(this:GetText());
end

function Nurfed_ShowMenu(menu)
        if (not menus[menu]) then
                local opt = framelib:ObjectInit("Nurfed_OptionsFrame"..menu, Nurfed_OptionsMenus[menu], Nurfed_OptionsFrame);
                menus[menu] = opt;
                Nurfed_OptionsMenus[menu] = nil;
                if (menu == "AddOns") then
                        Nurfed_GenerateAddOnsMenu();
                end
                local scroll = getglobal(opt:GetName().."scrollScrollBar");
                if (scroll) then
                        scroll:SetPoint("RIGHT", scroll:GetParent():GetName(), "RIGHT", -25, 0);
                end
        end

        PlaySound("igAbiliityPageTurn");
        activemenu = menu;
        menus[menu]:Show();
        UIFrameFadeIn(menus[menu], 0.25);
end

function Nurfed_HideMenu(menu)
        menus[menu]:SetAlpha(0);
        menus[menu]:Hide();
end

-----------------------------------------------------------------------------------------
--                      Nurfed AddOns Menu
-----------------------------------------------------------------------------------------

function Nurfed_GenerateAddOnsMenu()
        for i = 1, 19 do
                local row = framelib:ObjectInit("Nurfed_AddOnsRow"..i, "nrf_addon_row", Nurfed_OptionsFrameAddOns);
                if (i == 1) then
                        row:SetPoint("TOPLEFT", "Nurfed_OptionsFrameAddOns", "TOPLEFT", 0, -3);
                else
                        row:SetPoint("TOPLEFT", "Nurfed_AddOnsRow"..i - 1, "BOTTOMLEFT", 0, 0);
                end
        end
end

function Nurfed_ToggleAddOn()
        if (this:GetChecked()) then
                EnableAddOn(this:GetID());
                PlaySound("igMainMenuOptionCheckBoxOn");
        else
                DisableAddOn(this:GetID());
                PlaySound("igMainMenuOptionCheckBoxOff");
        end
        local reload = getglobal(this:GetParent():GetName().."reload");
        reload:SetText("(Reload UI)");
end

function Nurfed_ScrollAddOns()
        local line, offset, row;
        local function format_row(row, num)
                local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(num);
                local loaded = IsAddOnLoaded(num);
                local text = name;
                if (title) then
                        text = title;
                end
                local check = getglobal(row.."check");
                local na = getglobal(row.."name");
                local load = getglobal(row.."loaded");

                na:SetText(text);
                if (enabled) then
                        na:SetTextColor(1, 1, 1);
                else
                        na:SetTextColor(0.5, 0.5, 0.5);
                end

                if (name == "Nurfed_Options") then
                        check:Hide();
                else
                        check:Show();
                        check:SetChecked(enabled);
                        check:SetID(num);
                end
                if (loaded) then
                        load:SetText("Loaded");
                        load:SetTextColor(1, 1, 1);
                elseif (loadable) then
                        load:SetText("On Demand");
                        load:SetTextColor(1, 1, 1);
                else
                        local y = getglobal("ADDON_"..reason);
                        load:SetText(y);
                        load:SetTextColor(0.5, 0.5, 0.5);
                end
        end

        local count = GetNumAddOns();
        FauxScrollFrame_Update(this, count, 19, 14);
        for line = 1, 19 do
                offset = line + FauxScrollFrame_GetOffset(this);
                row = getglobal("Nurfed_AddOnsRow"..line);
                if offset < count then
                        format_row("Nurfed_AddOnsRow"..line, offset);
                        row:Show();
                else
                        row:Hide();
                end
        end
end

-----------------------------------------------------------------------------------------
--                      Nurfed Options Functions
-----------------------------------------------------------------------------------------

-- scroll
function Nurfed_Options_ScrollMenu()
        FauxScrollFrame_Update(this, this.pages, 1, 100);
        local page = FauxScrollFrame_GetOffset(this) + 1;
        local children = { this:GetParent():GetChildren() };
        for _, child in ipairs(children) do
                if (not string.find(child:GetName(), "scroll", 1, true)) then
                        if (child.page == page) then
                                child:Show();
                        else
                                child:Hide();
                        end
                end
        end
end

-- display
function Nurfed_Options_OnShow()
        local text = getglobal(this:GetName().."Text");
        text:SetText(this.text);
        if (this.right) then
                text:ClearAllPoints()
                text:SetPoint("RIGHT", this:GetName(), "LEFT", -1, 1);
        end
        if (this.color) then
                text:SetTextColor(unpack(this.color));
        end
        if (this.option) then
                local objtype = this:GetObjectType();
                local option = utility:GetOption(activemenu, this.option);
                if (objtype == "CheckButton") then
                        this:SetChecked(option);
                elseif (objtype == "Slider") then
                        local low = getglobal(this:GetName().."Low");
                        local high = getglobal(this:GetName().."High");
                        low:SetText(this.low);
                        high:SetText(this.high);
                        this:SetMinMaxValues(this.min, this.max);
                        this:SetValueStep(this.step);
                        this:SetValue(option);
                end
        end
        this:SetScript("OnShow", nil);
        
end

local function optionInit()
        local text = getglobal(this:GetName().."Text");
        text:SetText(this.text);
        if (this.right) then
                text:ClearAllPoints()
                text:SetPoint("RIGHT", this:GetName(), "LEFT", -1, 1);
        end
        if (this.color) then
                text:SetTextColor(unpack(this.color));
        end
        if (this.option and not this.id) then
                return utility:GetOption(activemenu, this.option);
        end
end

-- buttons
function Nurfed_Options_buttonOnShow()
        this:SetText(this.text);
        local width = string.len(this.text);
        this:SetWidth(width*6 + 10);
end

-- checks
function Nurfed_Options_checkOnClick()
        local value = 0;
        local func = this.func;
        if (this:GetChecked()) then
                value = 1;
                PlaySound("igMainMenuOptionCheckBoxOn");
        else
                PlaySound("igMainMenuOptionCheckBoxOff");
        end
        if (this.id and not this:GetParent().selected) then
                return;
        end
        utility:SetOption(activemenu, this.option, value, this.id, this:GetParent().selected);
        if (this.id) then
                func = this:GetParent().func;
        end
        if (func) then
                func();
        end
end

-- sliders
function Nurfed_Options_sliderOnMouseUp()
        local value = this:GetValue();
        local func = this.func;
        if (this.id and not this:GetParent().selected) then
                return;
        end
        utility:SetOption(activemenu, this.option, value, this.id, this:GetParent().selected);
        if (this.id) then
                func = this:GetParent().func;
        end
        if (func) then
                func();
        end
end

function Nurfed_Options_sliderOnValueChanged()
        local value = this:GetValue();
        local text = getglobal(this:GetName().."value");

        text:ClearAllPoints();
        if (value > (this.max / 2)) then
                text:SetPoint("LEFT", this:GetName(), "LEFT", 1, 1);
        else
                text:SetPoint("RIGHT", this:GetName(), "RIGHT", -1, 1);
        end
        text:SetText("("..format(this.format, value)..")");
end

-- editbox
function Nurfed_Options_inputOnShow()
        local option = optionInit();
        if (not option) then
                return;
        end
        local inputtext = getglobal(this:GetName().."input");
        inputtext:SetText(option);
end

function Nurfed_Options_inputOnClick()
        local inputtext = getglobal(this:GetParent():GetName().."input");
        if (not inputtext:GetText() or inputtext:GetText() == "") then
                return;
        end
        utility:SetOption(activemenu, this:GetParent().option, inputtext:GetText());
        inputtext:ClearFocus();
        if (this:GetParent().func) then
                this:GetParent().func();
        end
end

-- color swatches
function Nurfed_Options_swatchSetColor(frame)
        local option = frame.option;
        local r,g,b = ColorPickerFrame:GetColorRGB();
        local a = OpacitySliderFrame:GetValue();
        local swatch = getglobal(frame:GetName().."bg");
        swatch:SetVertexColor(r, g, b);
        frame.r = r;
        frame.g = g;
        frame.b = b;
        utility:SetOption(activemenu, frame.option, { r, g, b, a });
        if (frame.func) then
                frame.func();
        end
end

function Nurfed_Options_swatchCancelColor(frame, prev)
        local option = frame.option;
        local r = prev.r;
        local g = prev.g;
        local b = prev.b;
        local a = prev.a;
        local swatch = getglobal(frame:GetName().."bg");
        swatch:SetVertexColor(r, g, b);
        frame.r = r;
        frame.g = g;
        frame.b = b;
        utility:SetOption(activemenu, frame.option, { r, g, b, a });
        if (frame.func) then
                frame.func();
        end
end

function Nurfed_Options_swatchOnShow()
        if (this:IsShown()) then
                local option = optionInit();
                if (not option) then
                        return;
                end
                local frame = this;
                local swatch = getglobal(this:GetName().."bg");
                swatch:SetVertexColor(option[1], option[2], option[3]);

                this.r = option[1];
                this.g = option[2];
                this.b = option[3];
                this.swatchFunc = function() Nurfed_Options_swatchSetColor(frame) end;
                this.cancelFunc = function(x) Nurfed_Options_swatchCancelColor(frame, x) end;
                if (frame.opacity) then
                        this.hasOpacity = frame.opacity;
                        this.opacityFunc = function() Nurfed_Options_swatchSetColor(frame) end;
                        this.opacity = option[4];
                end
        end
end

function Nurfed_Options_swatchOpenColorPicker()
        CloseMenus();
        ColorPickerFrame.func = this.swatchFunc;
        ColorPickerFrame.hasOpacity = this.hasOpacity;
        ColorPickerFrame.opacityFunc = this.opacityFunc;
        ColorPickerFrame.opacity = this.opacity;
        ColorPickerFrame:SetColorRGB(this.r, this.g, this.b);
        ColorPickerFrame.previousValues = {r = this.r, g = this.g, b = this.b, a = this.opacity};
        ColorPickerFrame.cancelFunc = this.cancelFunc;
        ColorPickerFrame:Show();
end

-- radios
function Nurfed_Options_radioOnClick(frame, index, noupdate)
        if (not index) then
                index = this.index;
        end
        if (not frame) then
                frame = this:GetParent();
        end
        local children = { frame:GetChildren() };
        for _, child in ipairs(children) do
                if (child.index == index) then
                        child:SetChecked(1);
                else
                        child:SetChecked(nil);
                end
        end
        PlaySound("igMainMenuOptionCheckBoxOn");

        if (not frame:GetParent().selected or noupdate) then
                return;
        end
        utility:SetOption(activemenu, frame.option, index, frame.id, frame:GetParent().selected);
        local func = frame:GetParent().func;
        if (func) then
                func();
        end
end

function Nurfed_Options_radioGetSelected(frame)
        if (not frame) then
                frame = this:GetParent();
        end
        local children = { frame:GetChildren() };
        for _, child in ipairs(children) do
                if (child:GetChecked()) then
                        return child.index;
                end
        end
end

-- panes
function Nurfed_Options_paneOnShow()
        local title = getglobal(this:GetName().."title");
        if (this.text) then
                title:SetText(this.text);
        end
        local scroll = getglobal(this:GetName().."scrollScrollBar");
        if (scroll) then
                scroll:SetPoint("RIGHT", scroll:GetParent():GetName(), "RIGHT", -26, 0);
        end
        local children = { this:GetChildren() };
        for _, child in ipairs(children) do
                local objtype = child:GetObjectType();
                if (objtype == "CheckButton") then
                        child:SetChecked(child.default);
                elseif (objtype == "Slider") then
                        local low = getglobal(child:GetName().."Low");
                        local high = getglobal(child:GetName().."High");
                        low:SetText(child.low);
                        high:SetText(child.high);
                        child:SetMinMaxValues(child.min, child.max);
                        child:SetValueStep(child.step);
                        child:SetValue(child.default);
                elseif (objtype == "Frame" and child.isradio) then
                        Nurfed_Options_radioOnClick(child, child.default, true);
                end
                child.option = this.option;
        end
        this:SetScript("OnShow", nil);
end

function Nurfed_Options_paneUpdateOptions(frame)
        local option = utility:GetOption(activemenu, frame.option);
        local selected = option[frame.selected];
        local children = { frame:GetChildren() };
        for _, child in ipairs(children) do
                local objtype = child:GetObjectType();
                if (objtype == "CheckButton") then
                        child:SetChecked(selected[child.id]);
                elseif (objtype == "Slider") then
                        child:SetValue(selected[child.id]);
                elseif (objtype == "Frame" and child.isradio) then
                        Nurfed_Options_radioOnClick(child, selected[child.id], true);
                end
        end
end

function Nurfed_Options_paneGetOptions()
        local tbl = {};
        local children = { this:GetParent():GetChildren() };
        for _, child in ipairs(children) do
                if (child.id) then
                        local objtype = child:GetObjectType();
                        if (objtype == "Slider") then
                                tbl[child.id] = child:GetValue();
                        elseif (objtype == "CheckButton") then
                                if (child:GetChecked()) then
                                        tbl[child.id] = 1;
                                else
                                        tbl[child.id] = 0;
                                end
                        elseif (objtype == "Frame" and child.isradio) then
                                tbl[child.id] = Nurfed_Options_radioGetSelected(child);
                        end
                end
        end
        return tbl;
end

function Nurfed_Options_paneAddOption()
        local frame = this:GetParent();
        local objtype = this:GetObjectType();
        if (objtype == "EditBox") then
                if (this:GetText() and this:GetText() ~= "") then
                        if (frame.up) then
                                this:SetText(string.gsub(this:GetText(), "^%l", string.upper));
                        end
                        if (frame.notbl) then
                                utility:SetOption(activemenu, frame.option, true, this:GetText());
                        else
                                local tbl = Nurfed_Options_paneGetOptions();
                                utility:SetOption(activemenu, frame.option, tbl, this:GetText());
                        end
                end
                this:ClearFocus();
                this:SetText("");
        else
                local option = utility:GetOption(activemenu, frame.option);
                local name = table.getn(option) + 1;
                local tbl = Nurfed_Options_paneGetOptions();
                utility:SetOption(activemenu, frame.option, tbl, name);
        end
        Nurfed_Options_ScrollPane(frame);
        if (frame.func) then
                frame.func();
        end
end

function Nurfed_Options_paneRemoveOption()
        local frame = this:GetParent();
        if (frame.selected) then
                utility:SetOption(activemenu, frame.option, nil, frame.selected);
                frame.selected = nil;
        end
        Nurfed_Options_ScrollPane(frame);
        if (frame.func) then
                frame.func();
        end
end

function Nurfed_Options_ScrollPane(frame)
        if (not frame) then
                frame = this:GetParent();
        else
                this = getglobal(frame:GetName().."scroll");
        end
        local rows = frame.rows;
        local selected = frame.selected;
        local line, offset, row, text, count, temp;
        local option = utility:GetOption(activemenu, frame.option);
        
        if (table.getn(option) > 0) then
                count = table.getn(option);
        else
                temp = {};
                for k in pairs(option) do
                        table.insert(temp, k);
                end
                count = table.getn(temp);
        end
        FauxScrollFrame_Update(this, count, rows, 13);
        for line = 1, rows do
                offset = line + FauxScrollFrame_GetOffset(this);
                row = getglobal(frame:GetName().."row"..line);
                text = getglobal(row:GetName().."text");
                if offset <= count then
                        if (temp) then
                                text:SetText(temp[offset]);
                                if (selected == temp[offset]) then
                                        row:LockHighlight();
                                else
                                        row:UnlockHighlight();
                                end
                        else
                                text:SetText(frame.prefix.." "..offset);
                                row.id = offset;
                                if (selected == offset) then
                                        row:LockHighlight();
                                else
                                        row:UnlockHighlight();
                                end
                        end
                        row:Show();
                else
                        row:Hide();
                end
        end
end

function Nurfed_Options_PaneSelect()
        local frame = this:GetParent();
        local selected = frame.selected;
        if (this.id) then
                if (selected == this.id) then
                        frame.selected = nil;
                        this:UnlockHighlight();
                else
                        frame.selected = this.id;
                        this:LockHighlight();
                end
        else
                local text = getglobal(this:GetName().."text"):GetText();
                if (selected == text) then
                        frame.selected = nil;
                        this:UnlockHighlight();
                else
                        frame.selected = text;
                        this:LockHighlight();
                end
        end
        if (frame.selected) then
                Nurfed_Options_paneUpdateOptions(frame);
        end
        Nurfed_Options_ScrollPane(frame);
end

Generated by GNU Enscript 1.6.5.90.