vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
function DART_CheckButton_OnClick()
        DART_Update_Setting(this:GetChecked());
        DART_Run_Functions(this:GetChecked());
end

function DART_ColorPicker_OnClick()
        local basecolor = DART_Get_Setting(this.index);
        local color = {};
        color.r = basecolor.r;
        color.g = basecolor.g;
        color.b = basecolor.b;
        ColorPickerFrame.previousValues = color;
        ColorPickerFrame.cancelFunc = DART_ColorPicker_ColorCancelled;
        ColorPickerFrame.opacityFunc = DART_ColorPicker_ColorChanged;
        ColorPickerFrame.func = DART_ColorPicker_ColorChanged;
        ColorPickerFrame.colorBox = this:GetName();
        ColorPickerFrame.index = this.index;
        ColorPickerFrame.subindex = this.subindex;
        ColorPickerFrame:SetColorRGB(color.r, color.g, color.b);
        ColorPickerFrame:ClearAllPoints();
        if (DART_Options:GetRight() < UIParent:GetWidth() / 2) then
                ColorPickerFrame:SetPoint("LEFT", "DART_Options", "RIGHT", 10, 0);
        else
                ColorPickerFrame:SetPoint("RIGHT", "DART_Options", "LEFT", -10, 0);
        end
        ColorPickerFrame:Show();
end

function DART_ColorPicker_ColorCancelled()
        local color = ColorPickerFrame.previousValues;
        DART_Update_Setting(color, ColorPickerFrame.index, ColorPickerFrame.subindex);
        getglobal(ColorPickerFrame.colorBox):SetBackdropColor(color.r, color.g, color.b);
        if (ColorPickerFrame.index ~= "CONDITION") then
                DART_Run_Functions(1, 1, getglobal(ColorPickerFrame.colorBox).updatepreview);
        end
end

function DART_ColorPicker_ColorChanged()
        local r, g, b = ColorPickerFrame:GetColorRGB();
        local color = { r=r, g=g, b=b };
        DART_Update_Setting(color, ColorPickerFrame.index, ColorPickerFrame.subindex);
        getglobal(ColorPickerFrame.colorBox):SetBackdropColor(color.r, color.g, color.b);
        if (ColorPickerFrame.index ~= "CONDITION") then
                DART_Run_Functions(1, 1, getglobal(ColorPickerFrame.colorBox).updatepreview);
        end
end

function DART_ConditionMenu_Update()
        local list, frame, numButtons;
        list = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions;
        if (not list) then list = {}; end
        frame = DART_ControlOptions_ConditionMenu;
        numButtons = 7;

        local numOptions = #list;
        local offset = FauxScrollFrame_GetOffset(frame);
        if (not offset) then offset = 0; end
        local index, button, text;
        
        for i=1, numButtons do
                button = getglobal(frame:GetName().."_Button"..i);
                index = offset + i;
                if ( list[index] ) then
                        button:Disable();
                        button:Show();
                        button.index = index;
                        button.cboxbase = frame:GetName();
                        text = DL_Get_MenuText(DL_CONDITIONS_MENU, list[index].condition);
                        if (not text) then text = ""; end
                        local conditionsIndex;
                        for cindex, value in pairs(DL_CONDITIONS_MENU) do
                                if (value.value == list[index].condition) then
                                        conditionsIndex = cindex;
                                        break;
                                end
                        end
                        local params = DL_CONDITIONS_MENU[conditionsIndex].params;
                        if (params == 1 or params == 2) then
                                text = text..": |cFFFFFFFF"..DL_Get_MenuText(DL_ACTIONS, list[index].action);
                                if (list[index].ignoreGlobal) then
                                        text = text..",|cFFCCCCCC "..DART_TEXT.IgnoreGlobal;
                                end
                        elseif (params == 3) then
                                text = text.." on "..list[index].unit..": |cFFFFFFFF"..list[index].buff;
                        elseif (params == 4) then
                                text = text.." |cFFFFFFFF"..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number;
                        elseif (params == 5) then
                                text = text..": |cFFFFFFFF"..list[index].unit..", "..list[index].text;
                        elseif (params == 6) then
                                text = text.." Applications "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number.." on "..list[index].unit..": |cFFFFFFFF"..list[index].text;
                        elseif (params == 7) then
                                local number = list[index].number;
                                if (number < 1) then
                                        number = (number * 100).."%";
                                end
                                text = text.." "..list[index].unit.." "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..number;
                        elseif (params == 8) then
                                local form = DL_Get_MenuText(DL_FORMS, list[index].form);
                                if (form == "") then
                                        form = list[index].form;
                                end
                                text = text..": |cFFFFFFFF"..form;
                        elseif (params == 9) then
                                text = text..": |cFFFFFFFF"..DL_Get_MenuText(DL_TARGET_PARAMS, list[index].target);
                        elseif (params == 10) then
                                text = text..": |cFFFFFFFF"..list[index].number;
                        elseif (params == 11) then
                                text = text..": |cFFFFFFFF"..DL_Get_MenuText(DL_ACTIONS, list[index].action).." "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number;
                        elseif (params == 12) then
                                text = text..": |cFFFFFFFF"..list[index].text;
                        elseif (params == 13) then
                                text = text..": |cFFFFFFFF"..list[index].unit;
                        elseif (params == 14) then
                                text = text..": |cFFFFFFFF"..list[index].unit.." and "..list[index].unit2;
                        end
                        getglobal(frame:GetName().."_Button"..i.."ConditionText"):SetText(text);

                        text = DART_TEXT.Response.." |cFFFFFF00"..DL_Get_MenuText(DART_RESPONSES, list[index].response);
                        if (list[index].response == 3 or list[index].response == 4) then
                                text = text..": |cFFFFFFFF"..list[index].texture;
                        elseif (list[index].response == 7 or list[index].response == 8 or list[index].response == 9 or list[index].response == 11 or list[index].response == 23 or list[index].response == 15 or list[index].response == 19 or list[index].response == 20 or list[index].response == 28) then
                                text = text..": |cFFFFFFFF"..list[index].amount;
                        elseif (list[index].response == 10) then
                                text = text..": |cFFFFFFFF"..list[index].rx..", "..list[index].ry;
                        elseif (list[index].response == 12 or list[index].response == 13 or list[index].response == 16 or list[index].response == 21 or list[index].response == 24) then
                                text = text.." to "..(list[index].alpha * 100).."%";
                        elseif (list[index].response == 14 or list[index].response == 17 or list[index].response == 18 or list[index].response == 22 or list[index].response == 25) then
                                local hex = DL_Get_HexColor(list[index].color.r, list[index].color.g, list[index].color.b);
                                text = text.." to "..hex.."this color";
                        elseif (list[index].response == 26 or list[index].response == 27) then
                                text = text..": |cFFFFFFFF"..list[index].rtext;
                        end
                        getglobal(frame:GetName().."_Button"..i.."ResponseText"):SetText(text);

                        text = DART_TEXT.Overrides.." |cFFFFFFFF";
                        for i,o in pairs(list[index].overrides) do
                                if (i == #list[index].overrides) then
                                        text = text..o;
                                else
                                        text = text..o..", ";
                                end
                        end
                        getglobal(frame:GetName().."_Button"..i.."OverrideText"):SetText(text);
                        getglobal(frame:GetName().."_Button"..i.."Index"):SetText(index);
                else
                        button:Hide();
                end
        end
        
        FauxScrollFrame_Update(frame, numOptions, numButtons, 40);
        frame:Show();
end

function DART_Add_Condition()
        if (not DART_CONDITION_BUFFER) then return; end
        local baseOptions = "DART_ControlOptions_";

        local option = getglobal(baseOptions.."Buff");
        if (option:IsShown()) then
                DART_CONDITION_BUFFER.buff = option:GetText();
                if (not DART_CONDITION_BUFFER.buff) then DART_CONDITION_BUFFER.buff = ""; end
        end
        option = getglobal(baseOptions.."Text");
        if (option:IsShown()) then
                DART_CONDITION_BUFFER.text = option:GetText();
                if (not DART_CONDITION_BUFFER.text) then DART_CONDITION_BUFFER.text = ""; end
        end
        option = getglobal(baseOptions.."Number");
        if (option:IsShown()) then
                DART_CONDITION_BUFFER.number = option:GetNumber();
                if (not DART_CONDITION_BUFFER.number) then DART_CONDITION_BUFFER.number = 1; end
        end
        option = getglobal(baseOptions.."ResponseText");
        if (option:IsShown()) then
                DART_CONDITION_BUFFER.rtext = option:GetText();
                if (not DART_CONDITION_BUFFER.rtext) then DART_CONDITION_BUFFER.rtext = ""; end
        end
        option = getglobal(baseOptions.."ResponseX");
        if (option and option:IsShown()) then
                DART_CONDITION_BUFFER.rx = option:GetNumber();
                if (not DART_CONDITION_BUFFER.rx) then DART_CONDITION_BUFFER.rx = 0; end
        end
        option = getglobal(baseOptions.."ResponseY");
        if (option and option:IsShown()) then
                DART_CONDITION_BUFFER.ry = option:GetNumber();
                if (not DART_CONDITION_BUFFER.ry) then DART_CONDITION_BUFFER.ry = 0; end
        end

        local orbox = getglobal(baseOptions.."Overrides");
        DART_CONDITION_BUFFER.overrides = orbox:GetText();
        orbox:SetText("");
        orbox:ClearFocus();
        if (DART_CONDITION_BUFFER.overrides and DART_CONDITION_BUFFER.overrides ~= "") then
                local overrides = {};
                local num = "";
                local index = 1;
                local char;
                for i=1, string.len(DART_CONDITION_BUFFER.overrides) do
                        char = string.sub(DART_CONDITION_BUFFER.overrides, i, i);
                        if (char == ",") then
                                num = tonumber(num);
                                if (num) then
                                        overrides[index] = num;
                                        index = index + 1;
                                end
                                num = "";
                        else
                                num = num..char;
                        end
                end
                num = tonumber(num);
                if (num) then
                        overrides[index] = num;
                end
                DART_CONDITION_BUFFER.overrides = {};
                DL_Copy_Table(overrides, DART_CONDITION_BUFFER.overrides);
        else
                DART_CONDITION_BUFFER.overrides = {};
        end
        if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions = {};
        end
        local index = #DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions + 1;
        if (DART_CONDITION_EDITTING) then
                index = DART_CONDITION_EDITTING;
        end
        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions[index] = {};
        DL_Copy_Table(DART_CONDITION_BUFFER, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions[index]);
        DART_ControlOptions_Condition_Setting:SetText("");
        DART_ControlOptions_Response_Setting:SetText("");
        DART_Reset_Parameters("DART_ControlOptions");
        getglobal("DART_Texture_"..DART_TEXTURE_INDEX).activeConditions = {};
        DART_ConditionMenu_Update();
        DART_CONDITION_BUFFER = nil;
        DART_CONDITION_EDITTING = nil;
end

function DART_Select_Condition(condition, menucontrol)
        if (not condition) then
                DART_CONDITION_EDITTING = nil;
                condition = this.value;
                DART_CONDITION_BUFFER = { condition = condition };
        else
                DART_CONDITION_EDITTING = condition;
                DART_CONDITION_BUFFER = {};
                DL_Copy_Table(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions[condition], DART_CONDITION_BUFFER);
                DL_Init_MenuControl(DART_ControlOptions_Condition, DART_CONDITION_BUFFER.condition);
                DART_CONDITION_BUFFER.overrides = "";
                for i,o in pairs(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions[condition].overrides) do
                        if (i == #DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions[condition].overrides) then
                                DART_CONDITION_BUFFER.overrides = DART_CONDITION_BUFFER.overrides..o;
                        else
                                DART_CONDITION_BUFFER.overrides = DART_CONDITION_BUFFER.overrides..o..", ";
                        end
                        DART_ControlOptions_Overrides:SetText(DART_CONDITION_BUFFER.overrides);
                end
                condition = DART_CONDITION_BUFFER.condition;
        end
        if (not menucontrol) then menucontrol = DART_ScrollMenu.cboxbase; end
        local options = getglobal(menucontrol):GetParent():GetName();
        DART_Reset_Parameters(options);
        local conditionsIndex;
        for index, value in pairs(DL_CONDITIONS_MENU) do
                if (value.value == condition) then
                        conditionsIndex = index;
                        break;
                end
        end
        local params = DL_CONDITIONS_MENU[conditionsIndex].params;
        if (params == 1) then
                DART_Show_Parameters({"_ActionID", "_IgnoreGlobal"}, {1, 2}, options);
        elseif (params == 2) then
                DART_Show_Parameters({"_ActionID"}, {1}, options);
        elseif (params == 3) then
                if (not DART_CONDITION_EDITTING) then
                        DART_CONDITION_BUFFER.unit = "player";
                end
                DART_Show_Parameters({"_Unit", "_Buff"}, {1, 3}, options);
        elseif (params == 4) then
                DL_Set_Anchor("_Condition", 0, -15, nil, nil, nil, getglobal(options.."_Comparison"));
                DL_Set_Anchor("_Condition", 0, -40, nil, nil, nil, getglobal(options.."_Number"));
                DART_Show_Parameters({"_Comparison", "_Number"}, {1, 3}, options);
        elseif (params == 5) then
                if (not DART_CONDITION_EDITTING) then
                        DART_CONDITION_BUFFER.unit = "player";
                end
                DART_Show_Parameters({"_Unit", "_Text"}, {1, 3}, options);
        elseif (params == 6) then
                DL_Set_Anchor("_Condition", 0, -65, nil, nil, nil, getglobal(options.."_Comparison"));
                DL_Set_Anchor("_Comparison", 5, 0, "LEFT", "RIGHT", nil, getglobal(options.."_Number"));
                if (not DART_CONDITION_EDITTING) then
                        DART_CONDITION_BUFFER.unit = "player";
                end
                DART_Show_Parameters({"_Unit", "_Text", "_Comparison", "_Number"}, {1, 3, 1, 3}, options);
        elseif (params == 7) then
                DL_Set_Anchor("_Condition", 0, -40, nil, nil, nil, getglobal(options.."_Comparison"));
                DL_Set_Anchor("_Condition", 0, -65, nil, nil, nil, getglobal(options.."_Number"));
                if (not DART_CONDITION_EDITTING) then
                        DART_CONDITION_BUFFER.unit = "player";
                end
                DART_Show_Parameters({"_Unit", "_Comparison", "_Number"}, {1, 1, 3}, options);
        elseif (params == 8) then
                DART_Show_Parameters({"_Forms"}, {1}, options);
        elseif (params == 9) then
                DART_Show_Parameters({"_Targets"}, {1}, options);
        elseif (params == 10) then
                DL_Set_Anchor("_Condition", 0, -15, nil, nil, nil, getglobal(options.."_Number"));
                DART_Show_Parameters({"_Number"}, {3}, options);
        elseif (params == 11) then
                DL_Set_Anchor("_Condition", 0, -40, nil, nil, nil, getglobal(options.."_Comparison"));
                DL_Set_Anchor("_Condition", 0, -65, nil, nil, nil, getglobal(options.."_Number"));
                DART_Show_Parameters({"_ActionID", "_Comparison", "_Number"}, {1, 1, 3}, options);
        elseif (params == 12) then
                DART_Show_Parameters({"_Text"}, {3}, options);
        elseif (params == 13) then
                if (not DART_CONDITION_EDITTING) then
                        DART_CONDITION_BUFFER.unit = "player";
                end
                DART_Show_Parameters({"_Unit"}, {1}, options);
        elseif (params == 14) then
                if (not DART_CONDITION_EDITTING) then
                        DART_CONDITION_BUFFER.unit = "player";
                        DART_CONDITION_BUFFER.unit2 = "player";
                end
                DART_Show_Parameters({"_Unit", "_Unit2"}, {1, 1}, options);
        end
end

function DART_Select_Response(response, menucontrol)
        if (not DART_CONDITION_BUFFER) then return; end
        if (not menucontrol) then menucontrol = DART_ScrollMenu.cboxbase; end
        local options = getglobal(menucontrol):GetParent():GetName();
        if (not response) then
                response = this.value;
                DART_CONDITION_BUFFER.response = response;
        else
                response = DART_CONDITION_BUFFER.response;
                DL_Init_MenuControl(getglobal(options.."_Response"), response);
        end
        DART_Reset_Parameters(options, 1);
        if (response == 3 or response == 4) then
                DART_Show_Parameters({"_ResponseTexture"}, {1}, options);
        elseif (response == 7 or response == 8 or response == 9 or response == 11 or response == 23 or response == 15 or response == 19 or response == 20 or response == 28) then
                DART_Show_Parameters({"_Amount"}, {4}, options);
        elseif (response == 10) then
                DART_Show_Parameters({"_ResponseX","_ResponseY"}, {3,3}, options);
        elseif (response == 12 or response == 13 or response == 16 or response == 21 or response == 24) then
                DART_Show_Parameters({"_Alpha"}, {4}, options);
        elseif (response == 14 or response == 17 or response == 18 or response == 22 or response == 25) then
                DART_Show_Parameters({"_Color"}, {5}, options);
        elseif (response == 26 or response == 27) then
                DART_Show_Parameters({"_ResponseText"}, {3}, options);
        end
end

function DART_Show_Parameters(parameters, types, base)
        for i, param in pairs(parameters) do
                local frame = getglobal(base..param);
                frame:Show();
                if (DART_CONDITION_EDITTING) then
                        if (types[i] == 1) then
                                DL_Init_MenuControl(frame, DART_CONDITION_BUFFER[frame.subindex]);
                        elseif (types[i] == 2) then
                                DL_Init_CheckBox(frame, DART_CONDITION_BUFFER[frame.subindex]);
                        elseif (types[i] == 3) then
                                DL_Init_EditBox(frame, DART_CONDITION_BUFFER[frame.subindex]);
                        elseif (types[i] == 4) then
                                if (not DART_CONDITION_BUFFER[frame.subindex]) then
                                        local min, max = frame:GetMinMaxValues();
                                        if (frame.scale) then
                                                max = max / frame.scale;
                                        end
                                        DART_CONDITION_BUFFER[frame.subindex] = max;
                                end
                                DL_Init_Slider(frame, DART_CONDITION_BUFFER[frame.subindex]);
                        elseif (types[i] == 5) then
                                if (not DART_CONDITION_BUFFER[frame.subindex]) then
                                        DART_CONDITION_BUFFER[frame.subindex] = {r=1, g=1, b=1};
                                end
                                DL_Init_ColorPicker(frame, DART_CONDITION_BUFFER[frame.subindex]);
                        end
                elseif (param == "_Unit" or param == "_Unit2") then
                        DL_Init_MenuControl(frame, "player");
                end
        end
end

function DART_Reset_Parameters(options, toggle)
        if (not toggle) then
                getglobal(options.."_ActionID"):Hide();
                getglobal(options.."_ActionID_Setting"):SetText("");
                getglobal(options.."_IgnoreGlobal"):Hide();
                getglobal(options.."_IgnoreGlobal"):SetChecked(0);
                getglobal(options.."_Unit"):Hide();
                getglobal(options.."_Unit_Setting"):SetText("");
                getglobal(options.."_Unit2"):Hide();
                getglobal(options.."_Unit2_Setting"):SetText("");
                getglobal(options.."_Buff"):Hide();
                getglobal(options.."_Buff"):SetText("");
                getglobal(options.."_Comparison"):Hide();
                getglobal(options.."_Comparison_Setting"):SetText("");
                getglobal(options.."_Number"):Hide();
                getglobal(options.."_Number"):SetText("");
                getglobal(options.."_Text"):Hide();
                getglobal(options.."_Text"):SetText("");
                getglobal(options.."_Forms"):Hide();
                getglobal(options.."_Forms_Setting"):SetText("");
                getglobal(options.."_Targets"):Hide();
                getglobal(options.."_Targets_Setting"):SetText("");
        end
        getglobal(options.."_ResponseTexture"):Hide();
        getglobal(options.."_ResponseTexture_Setting"):SetText("");
        getglobal(options.."_Amount"):Hide();
        getglobal(options.."_Amount_Display"):SetText("");
        getglobal(options.."_Alpha"):Hide();
        getglobal(options.."_Alpha_Display"):SetText("");
        getglobal(options.."_ResponseX"):Hide();
        getglobal(options.."_ResponseX"):SetText("");
        getglobal(options.."_ResponseY"):Hide();
        getglobal(options.."_ResponseY"):SetText("");
        getglobal(options.."_Color"):Hide();
        getglobal(options.."_ResponseText"):Hide();
end

function DART_Condition_Delete()
        local list = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions;
        getglobal("DART_Texture_"..DART_TEXTURE_INDEX).activeConditions = {};

        for i=1, #list do
                if (i > this:GetParent().index and i > 1) then
                        list[i - 1] = {};
                        DL_Copy_Table(list[i], list[i - 1]);
                end
        end
        list[#list] = nil;
        DART_ConditionMenu_Update();
end

function DART_Condition_Edit()
        local ci = this:GetParent().index;
        DART_Select_Condition(ci, this:GetParent().cboxbase);
        DART_Select_Response(DART_CONDITION_BUFFER.response, this:GetParent().cboxbase);
end

function DART_Condition_MoveDown()
        local list;
        local index = this:GetParent().index;
        local newindex = index + 1;

        list = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions;

        if (newindex > #list) then return; end

        local buffer = {};
        DL_Copy_Table(list[index], buffer);
        local buffer2 = {};
        DL_Copy_Table(list[newindex], buffer2);

        DL_Copy_Table(buffer2, list[index]);
        DL_Copy_Table(buffer, list[newindex]);
        DART_ConditionMenu_Update();
end

function DART_Condition_MoveUp()
        local list;
        local index = this:GetParent().index;
        local newindex = index - 1;
        if (newindex == 0) then return; end

        list = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions;

        local buffer = {};
        DL_Copy_Table(list[index], buffer);
        local buffer2 = {};
        DL_Copy_Table(list[newindex], buffer2);

        DL_Copy_Table(buffer2, list[index]);
        DL_Copy_Table(buffer, list[newindex]);
        DART_ConditionMenu_Update();
end

function DART_EditBox_Update()
        local value = this:GetText();
        if (not value) then value = ""; end
        if (this.number) then
                value = this:GetNumber();
                if (not value) then
                        value = 0;
                        this:SetText("0");
                end
        end
        this:ClearFocus();
        if (this.index or this.miscindex) then
                DART_Update_Setting(value);
                DART_Run_Functions();
        end
        if (this.index == "name") then
                DART_BaseOptions_SelectTexture_Setting:SetText(DART_TEXTURE_LIST[DART_TEXTURE_INDEX].text);
        elseif (this.index == "texture") then
                DART_Update_Preview();
        end
end

function DART_Get_Setting()
        if (this.index == "CONDITION") then
                if (DART_CONDITION_BUFFER[this.subindex]) then
                        return DART_CONDITION_BUFFER[this.subindex];
                elseif (this.subindex == "color") then
                        return {r=1, g=1, b=1};
                else
                        return 1;
                end
        elseif (this.miscindex) then
                return DART_Settings[DART_INDEX][this.miscindex];
        elseif (this.subindex) then
                return DART_Settings[DART_INDEX][DART_TEXTURE_INDEX][this.index][this.subindex];
        elseif (this.index) then
                return DART_Settings[DART_INDEX][DART_TEXTURE_INDEX][this.index];
        end
end

function DART_Initialize_MiscOptions()
        DL_Init_Slider(DART_MiscOptions_UpdateSpeed, DART_Settings[DART_INDEX].updatespeed);
        DL_Init_MenuControl(DART_MiscOptions_OptionsScale, DART_Settings[DART_INDEX].optionsscale);
        DL_Init_CheckBox(DART_MiscOptions_AutoLock, DART_Settings[DART_INDEX].AutoLock);
        local aloffset = DART_MiscOptions_AutoLock_Label:GetWidth() / 2;
        DART_MiscOptions_AutoLock:ClearAllPoints();
        DART_MiscOptions_AutoLock:SetPoint("TOP", "DART_MiscOptions", "TOP", -aloffset, -95);
        DART_MiscOptions_CurrentProfile:SetText(DART_TEXT.CurrentProfile..DART_INDEX);
        DART_MiscOptions_MaxTextures_Display:SetText(DART_Get_MaxTextureIndex());
end

function DART_Initialize_ProfileList()
        DART_PROFILE_LIST = {};
        local i = 0;
        for profile in pairs(DART_Settings) do
                if (profile ~= "CustomTextures" and (not string.find(profile, " : "))) then
                        i = i + 1;
                        DART_PROFILE_LIST[i] = { text=profile, value=profile };
                end
        end
end

function DART_Initialize_TextureList()
        DART_TEXTURE_LIST = {};
        local ti = 0;
        for ti = 1, DART_Get_MaxTextureIndex() do
                DART_TEXTURE_LIST[ti] = { text="["..ti.."] "..DART_Settings[DART_INDEX][ti].name, value=ti };
        end
end

function DART_Initialize_TextureOptions()
        local settings = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX];
        DART_Update_Preview();

        DL_Init_EditBox(DART_MainTextureOptions_Name, settings.name);

        DL_Init_CheckBox(DART_TextureOptions_Hide, settings.hide);
        DL_Init_CheckBox(DART_TextureOptions_Highlight, settings.highlight);
        DL_Init_CheckBox(DART_BackdropOptions_HideBackground, settings.hidebg);
        DL_Init_CheckBox(DART_TextOptions_HideText, settings.text.hide);
        DL_Init_CheckBox(DART_TextureOptions_DisableMouse, settings.disablemouse);
        DL_Init_CheckBox(DART_TextureOptions_DisableMousewheel, settings.disableMousewheel);
        DL_Init_Slider(DART_TextureOptions_Height, settings.height);
        DL_Init_Slider(DART_TextureOptions_Width, settings.width);
        DL_Init_Slider(DART_TextureOptions_Scale, settings.scale);
        DL_Init_Slider(DART_TextureOptions_Alpha, settings.alpha);
        DL_Init_Slider(DART_BackdropOptions_BackgroundAlpha, settings.bgalpha);
        DL_Init_Slider(DART_BackdropOptions_BorderAlpha, settings.borderalpha);
        DL_Init_Slider(DART_TextOptions_TextAlpha, settings.text.alpha);
        DL_Init_Slider(DART_TextureOptions_HighlightAlpha, settings.highlightalpha);
        DL_Init_Slider(DART_BackdropOptions_Padding, settings.padding);
        DL_Init_Slider(DART_TextOptions_TextHeight, settings.text.height);
        DL_Init_Slider(DART_TextOptions_TextWidth, settings.text.width);
        DL_Init_Slider(DART_TextOptions_FontSize, settings.text.fontsize);
        DL_Init_EditBox(DART_TextOptions_Text, settings.text.text);
        for i=1,4 do
                DL_Init_EditBox(getglobal("DART_TextureOptions_AttachFrame"..i), settings.attachframe[i]);
                DL_Init_EditBox(getglobal("DART_TextureOptions_XOffset"..i), settings.xoffset[i]);
                DL_Init_EditBox(getglobal("DART_TextureOptions_YOffset"..i), settings.yoffset[i]);
                DL_Init_MenuControl(getglobal("DART_TextureOptions_AttachPoint"..i), settings.attachpoint[i]);
                DL_Init_MenuControl(getglobal("DART_TextureOptions_AttachTo"..i), settings.attachto[i]);
        end
        DL_Init_EditBox(DART_TextureOptions_XOffsetT, settings.text.xoffset);
        DL_Init_EditBox(DART_MainTextureOptions_TextureFile, settings.texture);
        DL_Init_EditBox(DART_MainTextureOptions_X1, settings.coords[1]);
        DL_Init_EditBox(DART_MainTextureOptions_X2, settings.coords[2]);
        DL_Init_EditBox(DART_MainTextureOptions_Y1, settings.coords[3]);
        DL_Init_EditBox(DART_MainTextureOptions_Y2, settings.coords[4]);
        DL_Init_EditBox(DART_TextureOptions_FrameLevel, settings.framelevel);
        DL_Init_EditBox(DART_TextureOptions_YOffsetT, settings.text.yoffset);
        DL_Init_EditBox(DART_TextureOptions_HighlightTexture, settings.highlighttexture);
        DL_Init_EditBox(DART_TextOptions_Font, settings.font);
        DL_Init_EditBox(DART_TextureOptions_Parent, settings.parent);
        DL_Init_MenuControl(DART_TextureOptions_AttachPointT, settings.text.attachpoint);
        DL_Init_MenuControl(DART_TextureOptions_AttachToT, settings.text.attachto);
        DL_Init_MenuControl(DART_TextOptions_JustifyH, settings.text.justifyH);
        DL_Init_MenuControl(DART_TextOptions_JustifyV, settings.text.justifyV);
        DL_Init_MenuControl(DART_TextOptions_DrawLayer, settings.text.drawlayer);
        DL_Init_MenuControl(DART_TextureOptions_FrameStrata, settings.strata);
        DL_Init_MenuControl(DART_TextureOptions_DrawLayer, settings.drawlayer);
        DL_Init_MenuControl(DART_TextureOptions_BlendMode, settings.blendmode);
        DL_Init_ColorPicker(DART_TextureOptions_Color, settings.color);
        DL_Init_ColorPicker(DART_BackdropOptions_BGColor, settings.bgcolor);
        DL_Init_ColorPicker(DART_BackdropOptions_BorderColor, settings.bordercolor);
        DL_Init_ColorPicker(DART_TextureOptions_HighlightColor, settings.highlightcolor);
        DL_Init_ColorPicker(DART_TextOptions_TextColor, settings.text.color);

        DL_Init_EditBox(DART_BackdropOptions_BackgroundTexture, settings.bgtexture);
        DL_Init_EditBox(DART_BackdropOptions_BorderTexture, settings.bordertexture);
        DL_Init_CheckBox(DART_BackdropOptions_Tile, settings.Backdrop.tile);
        DL_Init_EditBox(DART_BackdropOptions_InsetLeft, settings.Backdrop.left);
        DL_Init_EditBox(DART_BackdropOptions_InsetRight, settings.Backdrop.right);
        DL_Init_EditBox(DART_BackdropOptions_InsetTop, settings.Backdrop.top);
        DL_Init_EditBox(DART_BackdropOptions_InsetBottom, settings.Backdrop.bottom);
        DL_Init_EditBox(DART_BackdropOptions_EdgeSize, settings.Backdrop.edgeSize);
        DL_Init_EditBox(DART_BackdropOptions_TileSize, settings.Backdrop.tileSize);

        for i=1,14 do
                if (settings.scripts[i] and settings.scripts[i] ~= "") then
                        getglobal("DART_ScriptOptions_"..DART_SCRIPT_LABEL[i]):SetText(DART_SCRIPT_LABEL[i].." *");
                else
                        getglobal("DART_ScriptOptions_"..DART_SCRIPT_LABEL[i]):SetText(DART_SCRIPT_LABEL[i]);
                end
        end
        if (DART_SCRIPT_INDEX and settings.scripts[DART_SCRIPT_INDEX]) then
                DART_ScriptOptions_ScrollFrame_Text:SetText(settings.scripts[DART_SCRIPT_INDEX]);
        elseif (DART_SCRIPT_INDEX) then
                DART_ScriptOptions_ScrollFrame_Text:SetText("");
        end

        if (DART_ControlOptions:IsShown()) then
                DART_ConditionMenu_Update();
        end
end

function DART_Copy_ControlSettings()
        DART_CONTROL_BUFFER = {};
        DL_Copy_Table(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions, DART_CONTROL_BUFFER);
end

function DART_Paste_ControlSettings()
        if (not DART_CONTROL_BUFFER) then return; end
        if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions = {};
        end
        DL_Copy_Table(DART_CONTROL_BUFFER, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Conditions);
        DART_ConditionMenu_Update();
end

function DART_Menu_OnClick()
        getglobal(DART_DropMenu.controlbox):SetText(getglobal(this:GetName().."_Text"):GetText());
        DART_DropMenu:Hide();
        if (DART_DropMenu.index) then
                DART_Update_Setting(this.value, DART_DropMenu.index, DART_DropMenu.subindex);
        elseif (DART_DropMenu.miscindex) then
                DART_Settings[DART_INDEX][DART_DropMenu.miscindex] = this.value;
        end
        if (DART_DropMenu.initFunc) then
                DART_DropMenu.initFunc();
        else
                DART_Initialize_Texture(DART_TEXTURE_INDEX);
        end
end

function DART_Nudge_OnClick(button)
        if (DART_NUDGE_INDEX < 5) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].attachframe[DART_NUDGE_INDEX]) then return; end
        end
        local amt = 1;
        if (button == "RightButton") then
                amt = 10;
        elseif (this.moving) then
                amt = 3;
        end
        local id = this:GetID();
        if (id == 1) then
                if (DART_NUDGE_INDEX == 5) then
                        DART_TextMoveLeft(DART_TEXTURE_INDEX, amt);
                else
                        DART_MoveLeft(DART_TEXTURE_INDEX, DART_NUDGE_INDEX, amt);
                end
        elseif (id == 2) then
                if (DART_NUDGE_INDEX == 5) then
                        DART_TextMoveRight(DART_TEXTURE_INDEX, amt);
                else
                        DART_MoveRight(DART_TEXTURE_INDEX, DART_NUDGE_INDEX, amt);
                end
        elseif (id == 3) then
                if (DART_NUDGE_INDEX == 5) then
                        DART_TextMoveUp(DART_TEXTURE_INDEX, amt);
                else
                        DART_MoveUp(DART_TEXTURE_INDEX, DART_NUDGE_INDEX, amt);
                end
        elseif (id == 4) then
                if (DART_NUDGE_INDEX == 5) then
                        DART_TextMoveDown(DART_TEXTURE_INDEX, amt);
                else
                        DART_MoveDown(DART_TEXTURE_INDEX, DART_NUDGE_INDEX, amt);
                end
        end

        if (DART_NUDGE_INDEX < 5) then 
                getglobal("DART_TextureOptions_XOffset"..DART_NUDGE_INDEX):SetText(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].xoffset[DART_NUDGE_INDEX]);
                getglobal("DART_TextureOptions_YOffset"..DART_NUDGE_INDEX):SetText(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].yoffset[DART_NUDGE_INDEX]);
        else
                DART_TextureOptions_XOffsetT:SetText(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].text.xoffset);
                DART_TextureOptions_YOffsetT:SetText(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].text.yoffset);
        end
end

function DART_Nudge_OnUpdate(elapsed)
        if (not this.moving) then return; end
        if (not this.timer) then
                this.timer = .05;
        end
        this.timer = this.timer - elapsed;
        if (this.timer < 0) then
                this.timer = .05;
                DART_Nudge_OnClick();
        end
end

function DART_Options_AddTexture()
        local file = DART_TextureBrowser_File:GetText();
        if ((not file) or file == "") then
                DART_TextureBrowser_File:SetFocus();
                return;
        end
        if (not string.find(file, "\\")) then
                file = "Interface\\AddOns\\DiscordArt\\CustomTextures\\"..file;
        end
        local x1 = tonumber(DART_TextureBrowser_X1:GetText());
        if ((not x1) or x1 == "") then
                DART_TextureBrowser_X1:SetFocus();
                return;
        end
        local x2 = tonumber(DART_TextureBrowser_X2:GetText());
        if ((not x2) or x2 == "") then
                DART_TextureBrowser_X2:SetFocus();
                return;
        end
        local y1 = tonumber(DART_TextureBrowser_Y1:GetText());
        if ((not y1) or y1 == "") then
                DART_TextureBrowser_Y1:SetFocus();
                return;
        end
        local y2 = tonumber(DART_TextureBrowser_Y2:GetText());
        if ((not y2) or y2 == "") then
                DART_TextureBrowser_Y2:SetFocus();
                return;
        end
        local height = tonumber(DART_TextureBrowser_Height:GetText());
        if (not height) then
                DART_TextureBrowser_Height:SetFocus();
                return;
        end
        local width = tonumber(DART_TextureBrowser_Width:GetText());
        if (not width) then
                DART_TextureBrowser_Width:SetFocus();
                return;
        end
        local index = #DART_Settings.CustomTextures + 1;
        DART_Settings.CustomTextures[index] = {};
        DART_Settings.CustomTextures[index].file = file;
        DART_Settings.CustomTextures[index].x1 = x1;
        DART_Settings.CustomTextures[index].x2 = x2;
        DART_Settings.CustomTextures[index].y1 = y1;
        DART_Settings.CustomTextures[index].y2 = y2;
        DART_Settings.CustomTextures[index].height = height;
        DART_Settings.CustomTextures[index].width = width;
        local customindex = index;
        index = #DART_TEXTURES + 1;
        DART_TEXTURES[index] = {};
        DART_TEXTURES[index].file = file;
        DART_TEXTURES[index].x1 = x1;
        DART_TEXTURES[index].x2 = x2;
        DART_TEXTURES[index].y1 = y1;
        DART_TEXTURES[index].y2 = y2;
        DART_TEXTURES[index].height = height;
        DART_TEXTURES[index].width = width;
        DART_TEXTURES[index].customindex = customindex;
        DART_TextureBrowser_Update();
        DART_STICKY_TEXTURE = {file="", x1="", x2="", y1="", y2="", height="", width=""};
        DART_TextureBrowser_UpdatePreview();
end

function DART_Options_CopySettings()
        DART_CLIPBOARD = {};
        DL_Copy_Table(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX], DART_CLIPBOARD);
end

function DART_Options_DeleteProfile(index)
        if (not index) then
                index = DART_MiscOptions_SetProfile_Setting:GetText();
        end
        if (index == "" or (not index)) then return; end
        if (index == DART_TEXT.Default) then
                DL_Debug(DART_TEXT.CantDeleteDefault);
                return;
        elseif (index == DART_INDEX) then
                DL_Debug(DART_TEXT.CantDeleteCurrent);
                return;
        end
        DART_Settings[index] = nil;
        for profile in pairs(DART_Settings) do
                if (DART_Settings[profile] == index) then
                        DART_Settings[profile] = DART_TEXT.Default;
                end
        end
        DART_Initialize_ProfileList();
        DART_MiscOptions_SetProfile_Setting:SetText("");
        DL_Debug(DART_TEXT.ProfileDeleted..index);
end

function DART_Options_CreateTexture()
        local ti = DART_Get_MaxTextureIndex() + 1;
        local texture = getglobal("DART_Texture_"..ti);
        DART_Set_DefaultSettings(DART_INDEX, ti);
        if (texture) then
                DART_Initialize_Texture(ti);
        else
                DART_Create_Texture(ti);
        end
        DART_MiscOptions_MaxTextures_Display:SetText(ti);
        DART_Initialize_TextureList();
end

function DART_Options_DeleteTexture()
        local ti = DART_Get_MaxTextureIndex();
        if (ti == 1) then
                DL_Error("You must have at least 1 texture.");
                return;
        end
        local texture = getglobal("DART_Texture_"..ti);
        texture:Hide();
        texture:UnregisterAllEvents();
        for i=1,DART_NUMBER_OF_SCRIPTS do
                RunScript("function DART_Texture"..ti.."_Script_"..DART_SCRIPT_LABEL[i].."()\nend");
        end
        DART_Settings[DART_INDEX][ti] = nil;
        DART_MiscOptions_MaxTextures_Display:SetText(ti - 1);
        DART_Initialize_TextureList();
        if (ti == DART_TEXTURE_INDEX) then
                DART_TEXTURE_INDEX = DART_TEXTURE_INDEX - 1;
                DART_Initialize_TextureOptions();
                DART_BaseOptions_SelectTexture_Setting:SetText(DART_TEXTURE_LIST[DART_TEXTURE_INDEX].text);
        end
end

function DART_Options_FrameLevelMinus()
        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].framelevel = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].framelevel - 1;
        DART_Initialize_Texture(DART_TEXTURE_INDEX);
        DL_Init_EditBox(DART_TextureOptions_FrameLevel, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].framelevel);
end

function DART_Options_FrameLevelPlus()
        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].framelevel = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].framelevel + 1;
        DART_Initialize_Texture(DART_TEXTURE_INDEX);
        DL_Init_EditBox(DART_TextureOptions_FrameLevel, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].framelevel);
end

function DART_Options_LoadPresetBackdrop()
        if (this.value == 1) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bgtexture = "Interface\\AddOns\\DiscordLibrary\\PlainBackdrop";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bordertexture = "Interface\\AddOns\\DiscordLibrary\\PlainBackdrop";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Backdrop = { tile=true, tileSize=8, edgeSize=1, left=1, right=1, top=1, bottom=1};
        elseif (this.value == 2) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bgtexture = "Interface\\AddOns\\DiscordLibrary\\PlainBackdrop";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bordertexture = "Interface\\Tooltips\\UI-Tooltip-Border";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Backdrop = { tile=true, tileSize=16, edgeSize=16, left=5, right=5, top=5, bottom=5};
        elseif (this.value == 3) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bgtexture = "Interface\\AddOns\\DiscordLibrary\\PlainBackdrop";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bordertexture = "Interface\\DialogFrame\\UI-DialogBox-Border";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Backdrop = { tile=true, tileSize=32, edgeSize=32, left=11, right=12, top=12, bottom=11};
        elseif (this.value == 4) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bgtexture = "Interface\\AddOns\\DiscordLibrary\\PlainBackdrop";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bordertexture = "Interface\\Buttons\\UI-SliderBar-Border";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Backdrop = { tile=true, tileSize=8, edgeSize=8, left=3, right=3, top=6, bottom=6};
        elseif (this.value == 5) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bgtexture = "Interface\\Glues\\Common\\Glue-Tooltip-Background";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].bordertexture = "Interface\\Glues\\Common\\Glue-Tooltip-Border";
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].Backdrop = { tile=true, tileSize=16, edgeSize=16, left=10, right=5, top=4, bottom=9};
        end
        DART_Initialize_TextureOptions();
        DART_Initialize_Texture(DART_TEXTURE_INDEX);
end

function DART_Options_NewProfile(index)
        if (not index) then
                index = DART_MiscOptions_NewProfile:GetText();
        end
        if (index == "" or (not index)) then return; end
        if (index == DART_INDEX) then
                DL_Feedback("This is not a save option.  Discord Art saves your changes as you make them.");
                return;
        end
        DART_Settings[index] = {};
        DL_Copy_Table(DART_Settings[DART_INDEX], DART_Settings[index]);
        DART_INDEX = index;
        DART_Settings[DART_PROFILE_INDEX] = index;
        DART_Initialize_ProfileList();
        DART_MiscOptions_CurrentProfile:SetText(DART_TEXT.CurrentProfile..DART_INDEX);
        DL_Feedback(DART_TEXT.NewProfileCreated..DART_INDEX);
end

function DART_Options_OnHide()
        if (DART_Settings[DART_INDEX].autolock and DART_DRAGGING_UNLOCKED) then
                DART_Toggle_Dragging();
        end
end

function DART_Options_OnShow()
        
end

function DART_Options_PasteSettings()
        if (not DART_CLIPBOARD) then return; end
        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX] = {};
        DL_Copy_Table(DART_CLIPBOARD, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX]);
        DART_Initialize_TextureList();
        DART_BaseOptions_SelectTexture_Setting:SetText(DART_TEXTURE_LIST[DART_TEXTURE_INDEX].text);
        DART_Initialize_TextureOptions();
        DART_Initialize_Texture(DART_TEXTURE_INDEX);
end

function DART_Options_SelectTexture()
        this:GetParent():Hide();
        local text = "";
        local list = getglobal(DART_ScrollMenu.table);
        for _, value in pairs(list) do
                if (value.value == this.value) then
                        text = value.text;
                end
        end
        getglobal(DART_ScrollMenu.controlbox):SetText(text);
        if (DART_ScrollMenu.table == "DL_CONDITIONS_MENU") then
                DART_Select_Condition();
        elseif (DART_ScrollMenu.table == "DART_RESPONSES") then
                DART_Select_Response();
        elseif (DART_ScrollMenu.index == "CONDITION") then
                DART_Update_Setting(this.value, DART_ScrollMenu.index, DART_ScrollMenu.subindex);
        else
                DART_TEXTURE_INDEX = this.value;
                DART_Initialize_TextureOptions();
        end
end

function DART_Options_SelectTexture_OnMouseWheel(direction)
        local saved = DART_TEXTURE_INDEX;
        if (direction > 0) then
                DART_TEXTURE_INDEX = DART_TEXTURE_INDEX - 1;
        else
                DART_TEXTURE_INDEX = DART_TEXTURE_INDEX + 1;
        end
        if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX]) then
                DART_TEXTURE_INDEX = saved;
                return;
        end
        DART_BaseOptions_SelectTexture_Setting:SetText(DART_TEXTURE_LIST[DART_TEXTURE_INDEX].text);
        DART_Initialize_TextureOptions();
end

function DART_Options_SelectNudgeIndex()
        DART_NUDGE_INDEX = this.value;
end

function DART_Run_Functions(value, override, preview)
        if (override or (not this.initFunc)) then
                DART_Initialize_Texture(DART_TEXTURE_INDEX);
        else
                this.initFunc(DART_TEXTURE_INDEX, value);
        end
        if (this.updatepreview or preview) then
                DART_Update_Preview();
        end
end

function DART_ScrollMenu_Update()
        local list = getglobal(this:GetParent().table);
        if (not list) then return; end
        local numOptions = #list;
        local offset = FauxScrollFrame_GetOffset(DART_ScrollMenu_ScrollFrame);
        if (not offset) then offset = 0; end
        local index, button;
        
        for i=1, 10 do
                button = getglobal("DART_ScrollMenu_Button"..i);
                buttontext = getglobal("DART_ScrollMenu_Button"..i.."Text");
                index = offset + i;
                if ( list[index] ) then
                        buttontext:SetText(list[index].text);
                        button:Show();
                        button:SetChecked(0);
                        button.value = list[index].value;
                        button.desc = list[index].desc;
                else
                        button:Hide();
                end
        end
        
        FauxScrollFrame_Update(DART_ScrollMenu_ScrollFrame, numOptions, 10, 20 );
end

function DART_Show_Script(script)
        DART_ScriptOptions_Label:SetText(DART_SCRIPT_LABEL[script]);
        DART_SCRIPT_INDEX = script;
        DART_ScriptOptions_ScrollFrame_Text:SetText("");
        if (DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].scripts[DART_SCRIPT_INDEX]) then
                DART_ScriptOptions_ScrollFrame_Text:SetText(DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].scripts[DART_SCRIPT_INDEX]);
        end
        DART_ScriptOptions_ScrollFrame_Text:SetFocus();
end

function DART_Slider_Update()
        if (not DART_INITIALIZED) then return; end
        local setting = DART_Get_Setting();
        if (this.scale) then
                setting = setting * this.scale;
        end
        local min, max = this:GetMinMaxValues();
        if (setting < min or setting > max) then
                return;
        end
        local value = this:GetValue();
        getglobal(this:GetName().."_Display"):SetText(value);
        if (this.scale) then
                value = value / this.scale;
        end
        DART_Update_Setting(value);
        DART_Run_Functions(value);
end

function DART_Slider_UpdateFromEditBox()
        local value = this:GetNumber();
        if (not value) then value = 0; end
        local min, max = this:GetParent():GetMinMaxValues();
        if (this:GetParent().minlocked and value < min) then value = min; end
        if (this:GetParent().maxlocked and value > max) then value = max; end
        this:SetText(value);
        if (value >= min and value <= max) then
                this:GetParent():SetValue(value);
        end
        this:ClearFocus();
        if (this:GetParent().scale) then
                value = value / this:GetParent().scale;
        end
        this.index = this:GetParent().index;
        this.subindex = this:GetParent().subindex;
        DART_Update_Setting(value, this.index, this.subindex);
        DART_Run_Functions(value);
end

function DART_TextureBrowser_AdjustCoord(button)
        local amt = .01;
        if (button == "MiddleButton") then
                amt = .0001;
        elseif (button == "RightButton") then
                amt = .001;
        end
        if (this:GetID() == 1) then
                DART_STICKY_TEXTURE.x1 = DART_STICKY_TEXTURE.x1 - amt;
        elseif (this:GetID() == 2) then
                DART_STICKY_TEXTURE.x1 = DART_STICKY_TEXTURE.x1 + amt;
        elseif (this:GetID() == 3) then
                DART_STICKY_TEXTURE.x2 = DART_STICKY_TEXTURE.x2 - amt;
        elseif (this:GetID() == 4) then
                DART_STICKY_TEXTURE.x2 = DART_STICKY_TEXTURE.x2 + amt;
        elseif (this:GetID() == 5) then
                DART_STICKY_TEXTURE.y1 = DART_STICKY_TEXTURE.y1 - amt;
        elseif (this:GetID() == 6) then
                DART_STICKY_TEXTURE.y1 = DART_STICKY_TEXTURE.y1 + amt;
        elseif (this:GetID() == 7) then
                DART_STICKY_TEXTURE.y2 = DART_STICKY_TEXTURE.y2 - amt;
        elseif (this:GetID() == 8) then
                DART_STICKY_TEXTURE.y2 = DART_STICKY_TEXTURE.y2 + amt;
        end
        DART_TextureBrowser_OnLeave();
        DART_TextureBrowser_UpdatePreview();
end

function DART_TextureBrowser_AdjustCoord2(button)
        local amt = .01;
        if (button == "MiddleButton") then
                amt = .0001;
        elseif (button == "RightButton") then
                amt = .001;
        end
        if (this:GetID() == 1) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1] - amt;
        elseif (this:GetID() == 2) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1] + amt;
        elseif (this:GetID() == 3) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2] - amt;
        elseif (this:GetID() == 4) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2] + amt;
        elseif (this:GetID() == 5) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3] - amt;
        elseif (this:GetID() == 6) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3] + amt;
        elseif (this:GetID() == 7) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4] - amt;
        elseif (this:GetID() == 8) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4] + amt;
        elseif (this:GetID() == 9) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5] - amt;
        elseif (this:GetID() == 10) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5] + amt;
        elseif (this:GetID() == 11) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6] - amt;
        elseif (this:GetID() == 12) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6] + amt;
        elseif (this:GetID() == 13) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7] - amt;
        elseif (this:GetID() == 14) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7] + amt;
        elseif (this:GetID() == 15) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8] - amt;
        elseif (this:GetID() == 16) then
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8] = 0;
                end
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8] = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8] + amt;
        end
        DART_Initialize_Texture(DART_TEXTURE_INDEX);
        DART_Update_Preview();
        DL_Init_EditBox(DART_MainTextureOptions_X1, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1]);
        DL_Init_EditBox(DART_MainTextureOptions_X2, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2]);
        DL_Init_EditBox(DART_MainTextureOptions_Y1, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3]);
        DL_Init_EditBox(DART_MainTextureOptions_Y2, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4]);
        DL_Init_EditBox(DART_MainTextureOptions_URx, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[5]);
        DL_Init_EditBox(DART_MainTextureOptions_URy, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[6]);
        DL_Init_EditBox(DART_MainTextureOptions_LRx, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[7]);
        DL_Init_EditBox(DART_MainTextureOptions_LRy, DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[8]);
end

function DART_TextureBrowser_OnClick(button)
        this:SetChecked(0);
        if (button == "RightButton" and (not IsShiftKeyDown())) then
                DART_STICKY_TEXTURE.file = DART_TEXTURES[this.textureindex].file;
                DART_STICKY_TEXTURE.x1 = DART_TEXTURES[this.textureindex].x1;
                DART_STICKY_TEXTURE.x2 = DART_TEXTURES[this.textureindex].x2;
                DART_STICKY_TEXTURE.y1 = DART_TEXTURES[this.textureindex].y1;
                DART_STICKY_TEXTURE.y2 = DART_TEXTURES[this.textureindex].y2;
                DART_STICKY_TEXTURE.height = DART_TEXTURES[this.textureindex].height;
                DART_STICKY_TEXTURE.width = DART_TEXTURES[this.textureindex].width;
                DART_TextureBrowser_UpdatePreview();
        elseif (button == "MiddleButton" or (button == "RightButton" and IsShiftKeyDown())) then
                if (not DART_TextureBrowser_CustomTab:GetChecked()) then return; end
                if (#DART_Settings.CustomTextures > 1) then
                        local max = #DART_Settings.CustomTextures;
                        DART_Settings.CustomTextures[this.textureindex] = {};
                        for i=this.textureindex + 1, max do
                                DL_Copy_Table(DART_Settings.CustomTextures[i], DART_Settings.CustomTextures[i - 1]);
                                DART_Settings.CustomTextures[i] = {};
                        end
                        DART_Settings.CustomTextures[max] = nil;
                else
                        DART_Settings.CustomTextures = {};
                end
                DART_TEXTURES = {};
                if (not DART_Settings.CustomTextures) then
                        DART_Settings.CustomTextures = {};
                end
                DL_Copy_Table(DART_Settings.CustomTextures, DART_TEXTURES);
                DART_TextureBrowser_Update();
        else
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].texture = DART_TEXTURES[this.textureindex].file;
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1] = DART_TEXTURES[this.textureindex].x1;
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2] = DART_TEXTURES[this.textureindex].x2;
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3] = DART_TEXTURES[this.textureindex].y1;
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4] = DART_TEXTURES[this.textureindex].y2;
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].height = DART_TEXTURES[this.textureindex].height + DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].padding * 2;
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].width = DART_TEXTURES[this.textureindex].width + DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].padding * 2;

                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[1] = 0;
                end
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[2] = 1;
                end
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[3] = 0;
                end
                if (not DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4]) then
                        DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].coords[4] = 1;
                end

                DART_TextureBrowser:Hide();
                DART_Initialize_Texture(DART_TEXTURE_INDEX);
                DART_Initialize_TextureOptions();
                DART_STICKY_TEXTURE = {file="", x1="0", x2="1", y1="0", y2="1", height="256", width="256"};
        end
end

function DART_TextureBrowser_OnEnter()
        DART_TextureBrowser_File:SetText(DART_TEXTURES[this.textureindex].file);
        DART_TextureBrowser_X1:SetText(DART_TEXTURES[this.textureindex].x1);
        DART_TextureBrowser_X2:SetText(DART_TEXTURES[this.textureindex].x2);
        DART_TextureBrowser_Y1:SetText(DART_TEXTURES[this.textureindex].y1);
        DART_TextureBrowser_Y2:SetText(DART_TEXTURES[this.textureindex].y2);
        DART_TextureBrowser_Height:SetText(DART_TEXTURES[this.textureindex].height);
        DART_TextureBrowser_Width:SetText(DART_TEXTURES[this.textureindex].width);
        GameTooltip:SetOwner(DART_TextureBrowser, "ANCHOR_TOPLEFT", 50);
        if (DART_TextureBrowser_CustomTab:GetChecked()) then
                GameTooltip:SetText(DART_TEXT.TextureTip..DART_TEXT.CustomTextureTip, 1, 1, 1, 1, 1);
        else
                GameTooltip:SetText(DART_TEXT.TextureTip, 1, 1, 1, 1, 1);
        end
end

function DART_TextureBrowser_OnLeave()
        DART_TextureBrowser_File:SetText(DART_STICKY_TEXTURE.file);
        DART_TextureBrowser_X1:SetText(DART_STICKY_TEXTURE.x1);
        DART_TextureBrowser_X2:SetText(DART_STICKY_TEXTURE.x2);
        DART_TextureBrowser_Y1:SetText(DART_STICKY_TEXTURE.y1);
        DART_TextureBrowser_Y2:SetText(DART_STICKY_TEXTURE.y2);
        DART_TextureBrowser_Height:SetText(DART_STICKY_TEXTURE.height);
        DART_TextureBrowser_Width:SetText(DART_STICKY_TEXTURE.width);
        GameTooltip:Hide();
end

function DART_TextureBrowser_Update()
        local numMacroIcons = #DART_TEXTURES;
        local macroPopupIcon, macroPopupButton;
        local macroPopupOffset = FauxScrollFrame_GetOffset(DART_TextureBrowser_ScrollFrame);
        if (not macroPopupOffset) then macroPopupOffset = 0; end
        local index;
        
        for i=1, 20 do
                macroPopupIcon = getglobal("DART_TextureBrowser_Button"..i.."Icon");
                macroPopupButton = getglobal("DART_TextureBrowser_Button"..i);
                index = (macroPopupOffset * 5) + i;
                if ( DART_TEXTURES[index] ) then
                        macroPopupIcon:SetTexture(DART_TEXTURES[index].file);
                        macroPopupIcon:SetTexCoord(DART_TEXTURES[index].x1, DART_TEXTURES[index].x2, DART_TEXTURES[index].y1, DART_TEXTURES[index].y2);
                        macroPopupButton:Show();
                        macroPopupButton.textureindex = index;
                else
                        macroPopupIcon:SetTexture("");
                        macroPopupButton:Hide();
                        macroPopupButton.textureindex = nil;
                end
        end
        
        FauxScrollFrame_Update(DART_TextureBrowser_ScrollFrame, ceil(numMacroIcons / 5) , 4, 36 );
end

function DART_TextureBrowser_UpdatePreview()
        local texture = DART_STICKY_TEXTURE.file;
        if (not texture) then texture = ""; end
        if (not string.find(texture, "\\")) then
                texture = "Interface\\AddOns\\DiscordArt\\CustomTextures\\"..texture;
        end
        DART_TextureBrowser_PreviewTexture:SetTexture(texture);
        local height = tonumber(DART_STICKY_TEXTURE.height);
        if ((not height) or height <= 0 or height == "") then
                height = 30;
        end
        local width = tonumber(DART_STICKY_TEXTURE.width);
        if ((not width) or width <= 0 or width == "") then
                width = 30;
        end
        local x1 = tonumber(DART_STICKY_TEXTURE.x1);
        if ((not x1) or x1 == "") then
                x1 = 0;
        end
        local x2 = tonumber(DART_STICKY_TEXTURE.x2);
        if ((not x2) or x2 == "") then
                x2 = 1;
        end
        local y1 = tonumber(DART_STICKY_TEXTURE.y1);
        if ((not y1) or y1 == "") then
                y1 = 0;
        end
        local y2 = tonumber(DART_STICKY_TEXTURE.y2);
        if ((not y2) or y2 == "") then
                y2 = 1;
        end
        DART_TextureBrowser_PreviewTexture:SetTexCoord(x1, x2, y1, y2);
        DART_TextureBrowser_Preview:SetHeight(height + 10);
        DART_TextureBrowser_Preview:SetWidth(width + 10);
        DART_TextureBrowser:SetHeight(400 + height);
end

function DART_Update_FrameFinder()
        local obj = GetMouseFocus();
        local text = DART_TEXT.FrameFinder;
        if (obj and obj ~= WorldFrame and obj:GetName()) then
                text = text..obj:GetName();
                if (obj:GetParent()  and obj:GetParent() ~= WorldFrame and obj:GetParent():GetName() ) then
                        text = text..DART_TEXT.Parent..obj:GetParent():GetName();
                        if (obj:GetParent():GetParent() and obj:GetParent():GetParent() ~= WorldFrame and obj:GetParent():GetParent():GetName()) then
                                text = text..DART_TEXT.ParentsParent..obj:GetParent():GetParent():GetName();
                        end
                end
        end
        if ((not string.find(text, "DART_Options")) and (not string.find(text, "DART_MiscOptions")) and (not string.find(text, "DART_TextureOptions")) and (not string.find(text, "DART_TextOptions")) and (not string.find(text, "DART_TextureBrowser")) and (not string.find(text, "DART_DropMenu")) and (not string.find(text, "DART_ScriptOptions")) and (not string.find(text, "DART_BaseOptions")) and (not string.find(text, "DART_ControlOptions"))) then
                DART_Options_FrameFinder_Text:SetText(text);
        else
                DART_Options_FrameFinder_Text:SetText(DART_TEXT.FrameFinder);
        end
end

function DART_Update_Preview()
        local settings = DART_Settings[DART_INDEX][DART_TEXTURE_INDEX];
        DART_MainTextureOptions_Texture_Texture:SetTexture(settings.texture);
        if (settings.coords[5] and settings.coords[6] and settings.coords[7] and settings.coords[8]) then
                DART_MainTextureOptions_Texture_Texture:SetTexCoord(settings.coords[1], settings.coords[2], settings.coords[3], settings.coords[4], settings.coords[5], settings.coords[6], settings.coords[7], settings.coords[8]);
        else
                DART_MainTextureOptions_Texture_Texture:SetTexCoord(settings.coords[1], settings.coords[2], settings.coords[3], settings.coords[4]);
        end
        DART_MainTextureOptions_Texture:SetBackdrop({bgFile = settings.bgtexture, edgeFile = settings.bordertexture, tile = settings.Backdrop.tile, tileSize = settings.Backdrop.tileSize, edgeSize = settings.Backdrop.edgeSize, insets = { left = settings.Backdrop.left, right = settings.Backdrop.right, top = settings.Backdrop.top, bottom = settings.Backdrop.bottom }});
        DART_MainTextureOptions_Texture:SetBackdropColor(settings.bgcolor.r, settings.bgcolor.g, settings.bgcolor.b, settings.bgalpha);
        DART_MainTextureOptions_Texture:SetBackdropBorderColor(settings.bordercolor.r, settings.bordercolor.g, settings.bordercolor.b, settings.borderalpha);
                DART_MainTextureOptions_Texture_Texture:SetVertexColor(settings.color.r, settings.color.g, settings.color.b);
        DART_MainTextureOptions_Texture_Texture:SetAlpha(settings.alpha);
        DART_MainTextureOptions_Texture_Texture:ClearAllPoints();
        DART_MainTextureOptions_Texture_Texture:SetPoint("TOPLEFT", "DART_MainTextureOptions_Texture", "TOPLEFT", settings.padding, -settings.padding);
        DART_MainTextureOptions_Texture_Texture:SetPoint("BOTTOMRIGHT", "DART_MainTextureOptions_Texture", "BOTTOMRIGHT", -settings.padding, settings.padding);
        if (settings.hidebg) then
                DART_MainTextureOptions_Texture:SetBackdropColor(0, 0, 0, 0);
                DART_MainTextureOptions_Texture:SetBackdropBorderColor(0, 0, 0, 0);
        end
end

function DART_Update_Script()
        local scrollBar = getglobal(this:GetParent():GetName().."ScrollBar")
        this:GetParent():UpdateScrollChildRect();
        local min;
        local max;
        min, max = scrollBar:GetMinMaxValues();
        if ( max > 0 and (this.max ~= max) ) then
                this.max = max;
                scrollBar:SetValue(max);
        end
        if (DART_SCRIPT_INDEX) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX].scripts[DART_SCRIPT_INDEX] = this:GetText();
                if (this:GetText() and this:GetText() ~= "") then
                        getglobal("DART_ScriptOptions_"..DART_SCRIPT_LABEL[DART_SCRIPT_INDEX]):SetText(DART_SCRIPT_LABEL[DART_SCRIPT_INDEX].." *");
                else
                        getglobal("DART_ScriptOptions_"..DART_SCRIPT_LABEL[DART_SCRIPT_INDEX]):SetText(DART_SCRIPT_LABEL[DART_SCRIPT_INDEX]);
                end
        end
end

function DART_Update_Setting(value, index, subindex)
        if (index == "CONDITION") then
                DART_CONDITION_BUFFER[subindex] = value;
        elseif (this.index == "CONDITION") then
                DART_CONDITION_BUFFER[this.subindex] = value;
        elseif (subindex) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX][index][subindex] = value;
        elseif (index) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX][index] = value;
        elseif (this.miscindex) then
                DART_Settings[DART_INDEX][this.miscindex] = value;
        elseif (this.subindex) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX][this.index][this.subindex] = value;
        elseif (this.index) then
                DART_Settings[DART_INDEX][DART_TEXTURE_INDEX][this.index] = value;
        end
end