--The Options Page functions ------------------------------ --Copy values from table that are nil in another. --Taken from AceDB. Using till AceDB support character to character local function inheritDefaults(t, defaults) for k,v in pairs(defaults) do if type(v) == "table" then if type(t[k]) ~= "table" then t[k] = {} end inheritDefaults(t[k], v) elseif t[k] == nil then t[k] = v end end return t end ------------------------------ --Copy table to table --Taken from AceDB. Using till AceDB support character to character local function copyTable(to, from) setmetatable(to, nil) for k,v in pairs(from) do if type(k) == "table" then k = copyTable({}, k) end if type(v) == "table" then v = copyTable({}, v) end to[k] = v end table.setn(to, table.getn(from)) setmetatable(to, from) return to end ---------------------- --Called when option page loads function SCT:OptionsFrame_OnShow() local option1, option2, option3, option4, option5, string, getvalue; --Misc Options for key, value in SCT.OPTIONS.FrameMisc do string = getglobal("SCTOptionsFrame_Misc"..value.index); if (string) then string:SetText(key); if (value.tooltipText) then string.tooltipText = value.tooltipText; end end end local frame, swatch, sColor; -- Set Options values for key, value in SCT.OPTIONS.FrameEventFrames do option1 = getglobal("SCTOptionsFrame"..value.index.."_CheckButton"); option2 = getglobal("SCTOptionsFrame"..value.index.."_CritCheckButton"); option3 = getglobal("SCTOptionsFrame"..value.index.."_RadioMsgButton"); option4 = getglobal("SCTOptionsFrame"..value.index.."_RadioFrame1Button"); option5 = getglobal("SCTOptionsFrame"..value.index.."_RadioFrame2Button"); string = getglobal("SCTOptionsFrame"..value.index.."_CheckButtonText"); --main check option1.SCTVar = value.SCTVar; option1:SetChecked(self.db.profile[value.SCTVar]); option1.tooltipText = value.tooltipText; string:SetText(key); --crit check option2.SCTVar = value.SCTVar; option2:SetChecked(self.db.profile[self.CRITS_TABLE][value.SCTVar]); option2.tooltipText = SCT.LOCALS.Option_Crit_Tip; --radios option3.tooltipText = SCT.LOCALS.Option_Msg_Tip; option4.tooltipText = SCT.LOCALS.Frame1_Tip; option5.tooltipText = SCT.LOCALS.Frame2_Tip; self:OptionsRadioButtonOnClick(self.db.profile[self.FRAMES_TABLE][value.SCTVar],"SCTOptionsFrame"..value.index) --set vars after setting up radios, so no redundant saving. option3.SCTVar = value.SCTVar; option4.SCTVar = value.SCTVar; option5.SCTVar = value.SCTVar; --Color Swatch frame = getglobal("SCTOptionsFrame"..value.index); swatch = getglobal("SCTOptionsFrame"..value.index.."_ColorSwatchNormalTexture"); sColor = self.db.profile[self.COLORS_TABLE][value.SCTVar]; frame.r = sColor.r; frame.g = sColor.g; frame.b = sColor.b; local index = value.index; local key = value.SCTVar; frame.swatchFunc = function() self:OptionsFrame_SetColor(index, key) end; frame.cancelFunc = function(x) self:OptionsFrame_CancelColor(index, key, x) end; swatch:SetVertexColor(sColor.r,sColor.g,sColor.b); end -- Set CheckButton states for key, value in SCT.OPTIONS.FrameCheckButtons do option1 = getglobal("SCTOptionsFrame_CheckButton"..value.index); string = getglobal("SCTOptionsFrame_CheckButton"..value.index.."Text"); option1.SCTVar = value.SCTVar; option1.SCTTable = value.SCTTable; if (option1.SCTTable) then option1:SetChecked(self.db.profile[SCT.FRAMES_DATA_TABLE][option1.SCTTable][value.SCTVar]); else option1:SetChecked(self.db.profile[value.SCTVar]); end option1.tooltipText = value.tooltipText; string:SetText(key); end --Set Sliders for key, value in SCT.OPTIONS.FrameSliders do option1 = getglobal("SCTOptionsFrame_Slider"..value.index.."Slider"); string = getglobal("SCTOptionsFrame_Slider"..value.index.."SliderText"); option2 = getglobal("SCTOptionsFrame_Slider"..value.index.."SliderLow"); option3 = getglobal("SCTOptionsFrame_Slider"..value.index.."SliderHigh"); option4 = getglobal("SCTOptionsFrame_Slider"..value.index.."EditBox"); option1.SCTVar = value.SCTVar; option1.SCTTable = value.SCTTable; if (option1.SCTTable) then getvalue = self.db.profile[SCT.FRAMES_DATA_TABLE][option1.SCTTable][value.SCTVar]; else getvalue = self.db.profile[value.SCTVar]; end option1.SCTLabel = key; option1:SetMinMaxValues(value.minValue, value.maxValue); option1:SetValueStep(value.valueStep); option1.tooltipText = value.tooltipText; option1:SetValue(getvalue); string:SetText(key); option4:SetText(getvalue) option2:SetText(value.minText); option3:SetText(value.maxText); end --Dropdowns for key, value in SCT.OPTIONS.FrameSelections do option1 = getglobal("SCTOptionsFrame_Selection"..value.index); option2 = getglobal("SCTOptionsFrame_Selection"..value.index.."Label"); option1.SCTVar = value.SCTVar; option1.SCTTable = value.SCTTable; --lookup table cause of WoW's crappy dropdown UI. option1.lookup = value.table; if (option1.SCTTable) then getvalue = self.db.profile[SCT.FRAMES_DATA_TABLE][option1.SCTTable][value.SCTVar]; else getvalue = self.db.profile[value.SCTVar]; end UIDropDownMenu_SetSelectedID(option1, getvalue); --not sure why I have to do this, but only way to make it show correctly cause of WoW's crappy dropdown UI. UIDropDownMenu_SetText(value.table[getvalue], option1); option1.tooltipText = value.tooltipText; option2:SetText(key); end --simulate click on tab1, so its always correct PanelTemplates_SelectTab(SCTOptionsFrame_Misc14); PanelTemplates_DeselectTab(SCTOptionsFrame_Misc15); PanelTemplates_DeselectTab(SCTOptionsFrame_Misc20); SCTOptions_MessageFrame:Hide(); SCTOptions_TextFrame:Show(); self:ChangeFrameTab(1) --set light mode self:ChangeLightMode(SCT.db.profile["LIGHTMODE"]); --set sticky mode self:ChangeStickyMode(SCT.db.profile["STICKYCRIT"]); --Update Profiles self:ScrollBar_Update(); end ---------------------- --Sets the colors of the config from a color swatch function SCT:OptionsFrame_SetColor(index,key) local r,g,b = ColorPickerFrame:GetColorRGB(); local color={}; local swatch = getglobal("SCTOptionsFrame"..index.."_ColorSwatchNormalTexture"); local frame = getglobal("SCTOptionsFrame"..index); swatch:SetVertexColor(r,g,b); frame.r, frame.g, frame.b = r,g,b; color.r, color.g, color.b = r,g,b; --update back to config self.db.profile[SCT.COLORS_TABLE][key] = color; end ---------------------- -- Cancels the color selection function SCT:OptionsFrame_CancelColor(index, key, prev) local r,g,b = prev.r, prev.g, prev.b; local color={}; local swatch = getglobal("SCTOptionsFrame"..index.."_ColorSwatchNormalTexture"); local frame = getglobal("SCTOptionsFrame"..index); swatch:SetVertexColor(r, g, b); frame.r, frame.g, frame.b = r,g,b; color.r, color.g, color.b = r,g,b; -- Update back to config self.db.profile[SCT.COLORS_TABLE][key] = color; end ---------------------- --Sets the silder values in the config function SCT:OptionsSliderOnValueChanged() local string, editbox; string = getglobal(this:GetName().."Text"); editbox = getglobal(this:GetParent():GetName().."EditBox"); string:SetText(this.SCTLabel); editbox:SetText(this:GetValue()) if (this.SCTTable) then self.db.profile[SCT.FRAMES_DATA_TABLE][this.SCTTable][this.SCTVar] = this:GetValue(); else self.db.profile[this.SCTVar] = this:GetValue(); end --update Example self:ShowExample(); end ---------------------- --Sets the silder values in the config function SCT:OptionsEditBoxOnValueChanged() local slider = getglobal(this:GetParent():GetName().."Slider"); local getvalue = tonumber(this:GetText()); if (slider.SCTTable) then self.db.profile[SCT.FRAMES_DATA_TABLE][slider.SCTTable][slider.SCTVar] = getvalue; else self.db.profile[this.SCTVar] = getvalue; end -- disable update change,set slider,setonchance back slider:SetScript("OnValueChanged", nil); slider:SetValue(getvalue); slider:SetScript("OnValueChanged", function() SCT:OptionsSliderOnValueChanged() end); --update Example self:ShowExample(); end ---------------------- --Sets the checkbox values in the config function SCT:OptionsCheckButtonOnClick() if (string.find(this:GetName(), "_CritCheckButton")) then self.db.profile[self.CRITS_TABLE][this.SCTVar] = this:GetChecked() or false; else if (this.SCTTable) then self.db.profile[SCT.FRAMES_DATA_TABLE][this.SCTTable][this.SCTVar] = this:GetChecked() or false; else self.db.profile[this.SCTVar] = this:GetChecked() or false; end end --update Example self:ShowExample(); end ---------------------- --Sets the checkbox values in the config function SCT:OptionsRadioButtonOnClick(id,parent) local frame1 = getglobal(parent.."_RadioFrame1Button"); local frame2 = getglobal(parent.."_RadioFrame2Button"); local msg = getglobal(parent.."_RadioMsgButton"); --set radio button options based on what was clicked. if (id==SCT.FRAME1) then frame1:SetButtonState("NORMAL", true); frame1:SetChecked(true); frame2:SetChecked(nil); frame2:SetButtonState("NORMAL", false); msg:SetChecked(nil); msg:SetButtonState("NORMAL", false); elseif (id==SCT.FRAME2) then frame2:SetButtonState("NORMAL", true); frame2:SetChecked(true); frame1:SetChecked(nil); frame1:SetButtonState("NORMAL", false); msg:SetChecked(nil); msg:SetButtonState("NORMAL", false); elseif (id==SCT.MSG ) then msg:SetButtonState("NORMAL", true); msg:SetChecked(true); frame1:SetChecked(nil); frame1:SetButtonState("NORMAL", false); frame2:SetChecked(nil); frame2:SetButtonState("NORMAL", false); end --if it has a var, save it (some don't) if (this.SCTVar) then self.db.profile[self.FRAMES_TABLE][this.SCTVar] = id; end --update Example self:ShowExample(); end --------------------- --Init a Dropdown function SCT:DropDown_Initialize() local info = {}; for index, value in SCT.OPTIONS.FrameSelections do if (this:GetName() == "SCTOptionsFrame_Selection"..value.index.."Button") then for key, name in value.table do info = {}; info.text = name; info.func = function(x) self:DropDown_OnClick(x) end; info.arg1 = value.index; UIDropDownMenu_AddButton(info); end break; end end end --------------------- -- Dropdown Onclick function SCT:DropDown_OnClick(list) local ddl = getglobal("SCTOptionsFrame_Selection"..list); UIDropDownMenu_SetSelectedID(ddl, this:GetID()); if (ddl.SCTTable) then self.db.profile[SCT.FRAMES_DATA_TABLE][ddl.SCTTable][ddl.SCTVar] = this:GetID(); else self.db.profile[ddl.SCTVar] = this:GetID(); end --update Example self:ShowExample(); end ---------------------- --Open the color selector using show/hide function SCT:SaveList_OnClick() local text = getglobal(this:GetName().."_Name"):GetText(); if (text ~= nil) then getglobal("SCTOptionsProfileEditBox"):SetText(text); SCTOptions_SaveLoadFrame:Hide(); end end ------------------------------ --Copy one profile to another, any type function SCT:CopyProfile(to, from) copyTable(to,inheritDefaults(copyTable({}, from), SCT:GetDefaultConfig())); self:HideMenu(); self:ShowMenu(); end ----------------------- --Load a profile function SCT:LoadProfile() local editbox = getglobal("SCTOptionsProfileEditBox"); local profile = editbox:GetText(); if (profile ~= "" ) then --hack until AceDB gets SetProfile working right on copies. --copyTable(self.db.profile,inheritDefaults(copyTable({}, self.db.raw.profiles[profile]), SCT:GetDefaultConfig())); self:CopyProfile(self.db.profile, self.db.raw.profiles[profile]); editbox:SetText(""); self:Print(SCT.LOCALS.PROFILE..profile); end end ----------------------- --Delete a profile function SCT:DeleteProfile() local editbox = getglobal("SCTOptionsProfileEditBox"); local profile = editbox:GetText(); if (profile ~= "") then if (profile == AceLibrary("AceDB-2.0").CHAR_ID) then SCT:Reset(); else self.db.raw.profiles[profile] = nil; self:Print(SCT.LOCALS.PROFILE_DELETE..profile); end editbox:SetText(""); self:ScrollBar_Update() self:HideMenu(); self:ShowMenu(); end end ---------------------- --Open the color selector using show/hide function SCT:OpenColorPicker(button) CloseMenus(); if ( not button ) then button = this; end ColorPickerFrame.func = button.swatchFunc; ColorPickerFrame:SetColorRGB(button.r, button.g, button.b); ColorPickerFrame.previousValues = {r = button.r, g = button.g, b = button.b, opacity = button.opacity}; ColorPickerFrame.cancelFunc = button.cancelFunc; ColorPickerFrame:Show(); end ---------------------- -- display ddl or chxbox based on type function SCT:UpdateAnimationOptions() --get scroll down checkbox local chkbox = getglobal("SCTOptionsFrame_CheckButton4"); --get anime type dropdown local ddl1 = getglobal("SCTOptionsFrame_Selection1"); --get animside type dropdown local ddl2 = getglobal("SCTOptionsFrame_Selection2"); --get item local id = UIDropDownMenu_GetSelectedID(ddl1) if (id == 1 or id == 6) then chkbox:Show(); ddl2:Hide(); else chkbox:Hide(); ddl2:Show(); end end ---------------------- -- update scroll bar settings function SCT:ScrollBar_Update() local i, idx, item, key, value local offset = FauxScrollFrame_GetOffset(SCTScrollBar) --get table size, getn doesn't work cause not an array local size = 0; local profiles = {} for key, value in SCT:PairsByKeys(SCT.db.raw.profiles) do tinsert(profiles, key); end for key in profiles do size = size + 1; end --get update FauxScrollFrame_Update(SCTScrollBar, size, 10, 20) --loop thru each display item for i=1,10 do item = getglobal("SCTList"..i.."_Name") idx = offset+i if idx<=size then key, value = next(profiles) for j=2,idx do key, value = next(profiles, key) end item:SetText(value); item:Show() else item:Hide() end end end ---------------------- --change which frame is being used function SCT:ChangeFrameTab(frame) local tab = self.db.profile[SCT.FRAMES_DATA_TABLE][frame]; --set label if (frame == SCT.FRAME1) then SCTOptionsFrame_Misc3:SetText(SCT.LOCALS.OPTION_MISC3["name"]); else SCTOptionsFrame_Misc3:SetText(SCT.LOCALS.OPTION_MISC21["name"]); end; --set all tables to selected frame SCTOptionsFrame_CheckButton4.SCTTable = frame; SCTOptionsFrame_Slider2Slider.SCTTable = frame; SCTOptionsFrame_Slider5Slider.SCTTable = frame; SCTOptionsFrame_Slider7Slider.SCTTable = frame; SCTOptionsFrame_Slider8Slider.SCTTable = frame; SCTOptionsFrame_Selection1.SCTTable = frame; SCTOptionsFrame_Selection2.SCTTable = frame; SCTOptionsFrame_Selection3.SCTTable = frame; SCTOptionsFrame_Selection4.SCTTable = frame; --update all frame options SCTOptionsFrame_CheckButton4:SetChecked(tab[SCTOptionsFrame_CheckButton4.SCTVar]); --text slider SCTOptionsFrame_Slider2SliderText:SetText(SCTOptionsFrame_Slider2Slider.SCTLabel); SCTOptionsFrame_Slider2EditBox:SetText(tab[SCTOptionsFrame_Slider2Slider.SCTVar]); SCTOptionsFrame_Slider2Slider:SetValue(tab[SCTOptionsFrame_Slider2Slider.SCTVar]); --alpha slider SCTOptionsFrame_Slider5SliderText:SetText(SCTOptionsFrame_Slider5Slider.SCTLabel); SCTOptionsFrame_Slider5EditBox:SetText(tab[SCTOptionsFrame_Slider5Slider.SCTVar]); SCTOptionsFrame_Slider5Slider:SetValue(tab[SCTOptionsFrame_Slider5Slider.SCTVar]); --x slider SCTOptionsFrame_Slider7SliderText:SetText(SCTOptionsFrame_Slider7Slider.SCTLabel); SCTOptionsFrame_Slider7EditBox:SetText(tab[SCTOptionsFrame_Slider7Slider.SCTVar]); SCTOptionsFrame_Slider7Slider:SetScript("OnValueChanged", nil); SCTOptionsFrame_Slider7Slider:SetValue(tab[SCTOptionsFrame_Slider7Slider.SCTVar]); SCTOptionsFrame_Slider7Slider:SetScript("OnValueChanged", function() SCT:OptionsSliderOnValueChanged() end); --y slider SCTOptionsFrame_Slider8SliderText:SetText(SCTOptionsFrame_Slider8Slider.SCTLabel); SCTOptionsFrame_Slider8EditBox:SetText(tab[SCTOptionsFrame_Slider8Slider.SCTVar]); SCTOptionsFrame_Slider8Slider:SetScript("OnValueChanged", nil); SCTOptionsFrame_Slider8Slider:SetValue(tab[SCTOptionsFrame_Slider8Slider.SCTVar]); SCTOptionsFrame_Slider8Slider:SetScript("OnValueChanged", function() SCT:OptionsSliderOnValueChanged() end); --Selection UIDropDownMenu_SetSelectedID(SCTOptionsFrame_Selection1, tab[SCTOptionsFrame_Selection1.SCTVar]); UIDropDownMenu_SetText(SCTOptionsFrame_Selection1.lookup[tab[SCTOptionsFrame_Selection1.SCTVar]], SCTOptionsFrame_Selection1); UIDropDownMenu_SetSelectedID(SCTOptionsFrame_Selection2, tab[SCTOptionsFrame_Selection2.SCTVar]); UIDropDownMenu_SetText(SCTOptionsFrame_Selection2.lookup[tab[SCTOptionsFrame_Selection2.SCTVar]], SCTOptionsFrame_Selection2); UIDropDownMenu_SetSelectedID(SCTOptionsFrame_Selection3, tab[SCTOptionsFrame_Selection3.SCTVar]); UIDropDownMenu_SetText(SCTOptionsFrame_Selection3.lookup[tab[SCTOptionsFrame_Selection3.SCTVar]], SCTOptionsFrame_Selection3); UIDropDownMenu_SetSelectedID(SCTOptionsFrame_Selection4, tab[SCTOptionsFrame_Selection4.SCTVar]); UIDropDownMenu_SetText(SCTOptionsFrame_Selection4.lookup[tab[SCTOptionsFrame_Selection4.SCTVar]], SCTOptionsFrame_Selection4); --update what is visible self:UpdateAnimationOptions(); end ---------------------- --change Light Mode function SCT:ChangeLightMode(lightOn, reset) if (lightOn) then OptionsFrame_DisableCheckBox(SCTOptionsFrame_CheckButton13); OptionsFrame_DisableCheckBox(SCTOptionsFrame_CheckButton12); OptionsFrame_DisableCheckBox(SCTOptionsFrame_CheckButton6); else OptionsFrame_EnableCheckBox(SCTOptionsFrame_CheckButton13); OptionsFrame_EnableCheckBox(SCTOptionsFrame_CheckButton12); OptionsFrame_EnableCheckBox(SCTOptionsFrame_CheckButton6); end if (reset) then SCT:DisableAll(); SCT:RegisterSelfEvents(); end end ---------------------- --change Sticky Mode function SCT:ChangeStickyMode(stickyOn) if (stickyOn) then OptionsFrame_EnableCheckBox(SCTOptionsFrame_CheckButton15); else OptionsFrame_DisableCheckBox(SCTOptionsFrame_CheckButton15); end end --------------------- --Show SCT Example function SCT:ShowExample() local example; SCT:AniInit(); SCT_EXAMPLETEXT:Show(); --animated example for options that may need it local option = this.SCTVar or "SHOWHIT"; if (string.find(option,"SHOW") == 1) then SCT:Display_Event(option, SCT.LOCALS.EXAMPLE); end --show example FRAME1 --get object example = getglobal("SCTaniExampleData1"); --set text size SCT:SetFontSize(example, SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME1]["FONT"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME1]["TEXTSIZE"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME1]["FONTSHADOW"]); --set the color example:SetTextColor(1, 1, 1); --set alpha example:SetAlpha(SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME1]["ALPHA"]/100); --Position example:SetPoint("CENTER", "UIParent", "CENTER", SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME1]["XOFFSET"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME1]["YOFFSET"]); --Set the text to display example:SetText(SCT.LOCALS.EXAMPLE); --show example FRAME2 --get object example = getglobal("SCTaniExampleData2"); --set text size SCT:SetFontSize(example, SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME2]["FONT"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME2]["TEXTSIZE"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME2]["FONTSHADOW"]); --set the color example:SetTextColor(1, 1, 1); --set alpha example:SetAlpha(SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME2]["ALPHA"]/100); --Position example:SetPoint("CENTER", "UIParent", "CENTER", SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME2]["XOFFSET"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME2]["YOFFSET"]); --Set the text to display example:SetText(SCT.LOCALS.EXAMPLE2); --show msg frame SCT_EXAMPLEMSG:Show(); --get object example = getglobal("SCTMsgExample1"); --set text size SCT:SetMsgFont(example); --set the color example:SetTextColor(1, 1, 1); --set alpha example:SetAlpha(1); --Position example:SetPoint("CENTER", "UIParent", "CENTER", SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.MSG]["MSGXOFFSET"], SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.MSG]["MSGYOFFSET"]-30); --Set the text to display example:SetText(SCT.LOCALS.MSG_EXAMPLE); --update animation options SCT:UpdateAnimationOptions() end