local _, S = ... local pairs, ipairs, string, type, time = pairs, ipairs, string, type, time -- Settings frame is built using data from this table local settingsTable = { [1] = { ["name"] = S.Localize("CONFIG_APPEARANCE_SKINNING"), ["left"] = { { ["name"] = S.Localize("CONFIG_APPEARANCE_SKINNING"), ["type"] = "RADIO", ["setting"] = "skinning", ["buttons"] = { { ["name"] = S.Localize("CONFIG_APPEARANCE_SKINNING_DEFAULT"), ["value"] = S.Skinning.DEFAULT }, { ["name"] = S.Localize("CONFIG_APPEARANCE_SKINNING_CLEAN"), ["value"] = S.Skinning.CLEAN }, { ["name"] = S.Localize("CONFIG_APPEARANCE_SKINNING_ADDONSKINS"), ["value"] = S.Skinning.ADDONSKINS, ["Enabled"] = function() return S.Skinning.AddOnSkinsAvailable() end } } }, { ["name"] = S.Localize("CONFIG_APPEARANCE_SCALE"), ["type"] = "SLIDER", ["setting"] = "scale", ["min"] = 0.5, ["max"] = 1.5, ["precision"] = 2, }, { ["type"] = "SPACER" }, { ["name"] = S.Localize("CONFIG_APPEARANCE_BACKDROP"), ["type"] = "DROPDOWN", ["setting"] = "backdrop", ["BuildDropdown"] = function() local function OnClick(self) S.Settings.Set("backdrop", self.data1) end local function OnEnter(self) S.FrameTools.UpdateBackdrops(self.data1) end local function OnLeave(self) S.FrameTools.UpdateBackdrops() end local backdrops = S.Utils.GetBackgrounds() for k, backdrop in pairs(backdrops) do S.Dropdown.AddEntry(backdrop, OnClick, backdrop) S.Dropdown.OnEnter(OnEnter) S.Dropdown.OnLeave(OnLeave) end end }, { ["name"] = COLOR, ["type"] = "COLOR", ["setting"] = "backdropColor", }, { ["name"] = S.Localize("CONFIG_CATEGORIES"), ["type"] = "DROPDOWN", ["setting"] = "categoriesPosition", ["BuildDropdown"] = function() local function OnClick(self) S.Settings.Set("categoriesPosition", self.data1) end S.Dropdown.AddEntry(S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_TOP"), OnClick, 0) S.Dropdown.AddEntry(S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_SIDE"), OnClick, 1) S.Dropdown.AddEntry(S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_SIDE").." ("..LOCALE_TEXT_LABEL..")", OnClick, 2) end, ["GetTextFromValue"] = function(self, value) local positions = { [0] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_TOP"), [1] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_SIDE"), [2] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_SIDE").." ("..LOCALE_TEXT_LABEL..")" } return positions[value] end }, { ["name"] = S.Localize("CONFIG_SKIN_DESATURATE_CATEGORIES"), ["type"] = "CHECKBOX", ["setting"] = "desaturateCategories" }, }, ["right"] = { { ["name"] = S.Localize("CONFIG_APPEARANCE_FONT"), ["type"] = "DROPDOWN", ["setting"] = "font", ["BuildDropdown"] = function() local function OnClick(self) S.Settings.Set("font", self.data1) end local fonts = S.Utils.GetFonts() for k, font in pairs(fonts) do S.Dropdown.AddEntry(font, OnClick, font) S.Dropdown.SetFont(font) end end }, { ["name"] = S.Localize("CONFIG_APPEARANCE_FONT_SIZE"), ["type"] = "SLIDER", ["setting"] = "fontSizePts", ["min"] = 6, ["max"] = 18, ["precision"] = 1, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_FONT_OUTLINE"), ["type"] = "SLIDER", ["setting"] = "fontOutline", ["min"] = 0, ["max"] = 2, ["precision"] = 0, ["values"] = { [0] = S.Localize("CONFIG_APPEARANCE_FONT_OUTLINE_1"), [1] = S.Localize("CONFIG_APPEARANCE_FONT_OUTLINE_2"), [2] = S.Localize("CONFIG_APPEARANCE_FONT_OUTLINE_3") } }, { ["name"] = S.Localize("CONFIG_APPEARANCE_FONT_SHADOW"), ["type"] = "SLIDER", ["setting"] = "fontShadow", ["min"] = 0, ["max"] = 4, ["precision"] = 0 }, } }, [2] = { ["name"] = S.Localize("CONFIG_FEATURES"), ["left"] = { { ["name"] = S.Localize("CONFIG_FEATURES_PIN_NEW_ITEMS"), ["type"] = "CHECKBOX", ["setting"] = "newOnTop" }, { ["name"] = S.Localize("CONFIG_FEATURES_PROTECT_FAVORITES"), ["type"] = "CHECKBOX", ["setting"] = "protectFavorites" }, { ["name"] = USE_UBERTOOLTIPS, ["type"] = "CHECKBOX", ["setting"] = "tooltipInfo" }, { ["name"] = S.Localize("CONFIG_BEHAVIOR_COMBINE_STACKS"), ["type"] = "CHECKBOX", ["setting"] = "combineStacks", ["tooltipKey"] = "TOOLTIP_CONFIG_COMBINE_STACKS" }, { ["name"] = S.Localize("CONFIG_BEHAVIOR_SCROLL_WHEEL_SPEED"), ["type"] = "SLIDER", ["setting"] = "scrollSpeed", ["min"] = 1, ["max"] = 20, ["precision"] = 1, ["curve"] = true, ["tooltipKey"] = "TOOLTIP_CONFIG_SCROLL_WHEEL_SPEED" }, { ["name"] = S.Localize("CONFIG_BEHAVIOR_SMOOTH_SCROLLING_POWER"), ["type"] = "SLIDER", ["setting"] = "smoothingAmount", ["min"] = 0, ["max"] = 1, ["precision"] = 2, ["curve"] = true, ["tooltipKey"] = "TOOLTIP_CONFIG_SMOOTH_SCROLLING" }, }, ["right"] = { } }, [3] = { ["name"] = S.Localize("CONFIG_LIST"), ["left"] = { { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_SIZE"), ["type"] = "SLIDER", ["setting"] = "iconSize", ["min"] = 10, ["max"] = 50, ["precision"] = 1, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_PADDING"), ["type"] = "SLIDER", ["setting"] = "padding", ["min"] = 0, ["max"] = 20, ["precision"] = 1, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_BORDERS"), ["type"] = "CHECKBOX", ["setting"] = "iconBorders" }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_BORDER_THICKNESS"), ["type"] = "SLIDER", ["setting"] = "iconBorderThickness", ["min"] = 0, ["max"] = 10, ["precision"] = 2, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_SHAPE"), ["type"] = "CHECKBOX", ["setting"] = "iconShape" }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_ZOOM"), ["type"] = "SLIDER", ["setting"] = "iconZoom", ["min"] = 1, ["max"] = 2, ["precision"] = 2, }, }, ["right"] = { } }, [4] = { ["name"] = S.Localize("CONFIG_GRID"), ["left"] = { { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_SIZE"), ["type"] = "SLIDER", ["setting"] = "iconSizeGrid", ["min"] = 25, ["max"] = 50, ["precision"] = 1, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_PADDING"), ["type"] = "SLIDER", ["setting"] = "paddingGrid", ["min"] = 0, ["max"] = 20, ["precision"] = 1, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_BORDERS"), ["type"] = "CHECKBOX", ["setting"] = "iconBordersGrid" }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_BORDER_THICKNESS"), ["type"] = "SLIDER", ["setting"] = "iconBorderThicknessGrid", ["min"] = 0, ["max"] = 10, ["precision"] = 2, }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_SHAPE"), ["type"] = "CHECKBOX", ["setting"] = "iconShapeGrid" }, { ["name"] = S.Localize("CONFIG_APPEARANCE_ICON_ZOOM"), ["type"] = "SLIDER", ["setting"] = "iconZoomGrid", ["min"] = 1, ["max"] = 2, ["precision"] = 2, }, }, ["right"] = { } }, --[[[5] = { ["name"] = S.Localize("CONFIG_AUTOMATION"), ["left"] = { { ["name"] = "|cffff0522NOT YET IMPLEMENTED", ["type"] = "SPACER" }, }, ["right"] = { } }, [6] = { ["name"] = S.Localize("CONFIG_CATEGORIES"), ["left"] = { { ["name"] = "|cffff0522NOT YET IMPLEMENTED", ["type"] = "SPACER" }, }, ["right"] = { } },]] --[[[7] = { ["name"] = S.Localize("CONFIG_PROFILES"), ["left"] = { }, ["right"] = { } }]] } -- Slider local function RoundToDecimalPlaces(value, numPlaces) return math.floor(value * 10^numPlaces) / 10^numPlaces end local function SetSliderText(self) if self.values then self.valueString:SetText(self.values[self:GetValue()]) else local value = self:GetValue() if self.curve then local min, max = self:GetMinMaxValues() value = (value - min) / (max - min) value = value * value value = value * (max - min) + min end self.valueString:SetText(string.format("%."..self.precision.."f", value)) end end local function SliderOnSettingChanged(self, event, value) SetSliderText(self) end local function OnSliderValueChanged(self) SetSliderText(self) --S.Settings.Set(self.setting, self:GetValue()) end local function OnSliderMouseUp(self) if self.values then self:SetValue(math.floor(self:GetValue() + 0.5)) end local value = self:GetValue() if self.curve then local min, max = self:GetMinMaxValues() value = (value - min) / (max - min) value = value * value value = value * (max - min) + min end S.Settings.Set(self.setting, value) end local function OnSliderShow(self) local value = S.Settings.Get(self.setting) if self.curve then local min, max = self:GetMinMaxValues() value = (value - min) / (max - min) value = math.sqrt(value) value = value * (max - min) + min end self:SetValue(value) end local function CreateSlider(parent, name, setting, min, max, precision, values, curve) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 64) local slider = CreateFrame("SLIDER", nil, f) f.tooltipParent = slider slider.setting = setting slider.precision = precision slider.curve = curve slider:SetValueStep(10^(-precision)) slider:SetObeyStepOnDrag(true) slider:SetSize(208, 56) slider:SetPoint("BOTTOM", -16, -8) slider:SetOrientation("HORIZONTAL") slider:SetScript("OnValueChanged", OnSliderValueChanged) slider:SetScript("OnMouseUp", OnSliderMouseUp) slider:SetMinMaxValues(min, max) S.Utils.RunOnEvent(slider, "SettingChanged-"..setting, SliderOnSettingChanged) if values then slider.values = values end slider:SetThumbTexture("Interface\\Addons\\Sorted\\Textures\\Slider-Thumb") slider:GetThumbTexture():SetSize(40, 40) slider.rail = slider:CreateTexture(nil, "BACKGROUND") slider.rail:SetAllPoints() slider.rail:SetTexture("Interface\\Addons\\Sorted\\Textures\\Slider-Rail") slider.nameString = slider:CreateFontString(nil, "OVERLAY", "SortedFont") slider.nameString:SetTextColor(S.Utils.GetButtonTextColor():GetRGB()) slider.nameString:SetPoint("BOTTOM", slider, "TOP", 16, -16) slider.nameString:SetText(name) slider.nameString:SetTextScale(1.2) slider.valueString = slider:CreateFontString(nil, "OVERLAY", "SortedFont") slider.valueString:SetTextColor(1, 1, 1) slider.valueString:SetPoint("LEFT", slider, "RIGHT", -4, 0) slider:SetScript("OnShow", OnSliderShow) return f end -- Checkbox local function CheckboxOnSettingChanged(self, event, value) self:SetChecked(value == 1) end local function OnCheckboxClicked(self) if self:GetChecked() then S.Settings.Set(self.setting, 1) else S.Settings.Set(self.setting, 0) end end local function CreateCheckbox(parent, name, setting) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 64) local cb = CreateFrame("CheckButton", nil, f) cb.setting = setting cb:SetSize(32, 32) cb:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\Checkbox") cb:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\Checkbox-Highlight") cb:SetPushedTexture("Interface\\Addons\\Sorted\\Textures\\Checkbox") cb:SetCheckedTexture("Interface\\Addons\\Sorted\\Textures\\Checkbox-Tick") cb:SetPoint("LEFT", f, 2, 0) cb:SetScript("OnClick", OnCheckboxClicked) S.Utils.RunOnEvent(cb, "SettingChanged-"..setting, CheckboxOnSettingChanged) f.tooltipParent = cb f.checkButton = cb f.nameString = f:CreateFontString(nil, "OVERLAY", "SortedFont") f.nameString:SetText(name) f.nameString:SetPoint("LEFT", cb, "RIGHT", 8, 0) f.nameString:SetTextColor(1, 1, 1) f.nameString:SetTextScale(1.2) cb:SetScript("OnShow", function(self) cb:SetChecked(S.Settings.Get(self.setting) == 1) end) return f end -- Radio buttons local function RadioButtonOnSettingChanged(self, event, value) self:SetChecked(value == self.value) end local function OnRadioButtonClicked(self) for k,v in pairs(self.parent.buttons) do v:SetChecked(v == self) end S.Settings.Set(self.setting, self.value) end local function CreateRadio(parent, name, setting, buttons) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 24 + 40 * #buttons) f.nameString = f:CreateFontString(nil, "OVERLAY", "SortedFont") f.nameString:SetText(name) f.nameString:SetPoint("TOP", 0, -4) f.nameString:SetTextColor(S.Utils.GetButtonTextColor():GetRGB()) f.nameString:SetTextScale(1.3) f.buttons = {} for i,v in ipairs(buttons) do local cb = CreateFrame("CheckButton", nil, f) cb:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button") cb:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button-Highlight") cb:SetPushedTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button") cb:SetCheckedTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button-Dot") cb:SetPoint("TOPLEFT", f, "TOPLEFT", 0, -24 - 40 * (i - 1)) cb:SetSize(32, 32) cb.parent = f cb.setting = setting cb.value = v.value if v.Enabled then cb.ShouldEnable = v.Enabled cb:SetScript("OnShow", function(self) if self.ShouldEnable() then self.nameString:SetTextColor(1, 1, 1) self:Enable() else self.nameString:SetTextColor(0.5, 0.5, 0.5) self:Disable() end end) end cb:SetScript("OnClick", OnRadioButtonClicked) S.Utils.RunOnEvent(cb, "SettingChanged-"..setting, RadioButtonOnSettingChanged) cb.nameString = f:CreateFontString(nil, "OVERLAY", "SortedFont") cb.nameString:SetText(v.name) cb.nameString:SetPoint("LEFT", cb, "RIGHT", 4, 0) cb.nameString:SetTextColor(1, 1, 1) cb.nameString:SetTextScale(1.2) f.buttons[i] = cb cb:HookScript("OnShow", function(self) self:SetChecked(S.Settings.Get(self.setting) == self.value) end) end return f end -- Dropdown -- Override GetTextFromValue for settings that use values different from the names of the entries local function GetTextFromValue(self, value) return value end local function DropdownOnSettingChanged(self, event, value) self.text:SetText(self:GetTextFromValue(value)) end local function CreateDropdown(parent, name, setting, BuildDropdown, GetTextFromValueOverride) local f = S.FrameTools.CreateDropdown(parent, name, BuildDropdown) f.tooltipParent = f.button if GetTextFromValueOverride then f.button.GetTextFromValue = GetTextFromValueOverride else f.button.GetTextFromValue = GetTextFromValue end f.button.setting = setting f.button:SetScript("OnShow", function(self) self.text:SetText(self:GetTextFromValue(S.Settings.Get(self.setting))) end) S.Utils.RunOnEvent(f.button, "SettingChanged-"..setting, DropdownOnSettingChanged) return f end -- Color local function ColorButtonOnSettingChanged(self, event, value) self:GetNormalTexture():SetVertexColor(unpack(S.Settings.Get(self.setting))) end local function ColorButtonCancelCallback() S.Settings.Set(ColorPickerFrame.setting, ColorPickerFrame.previousColor) end local function ColorButtonCallback(restore) local r,g,b,a if restore then r,g,b,a = unpack(restore) else r,g,b = ColorPickerFrame:GetColorRGB() a = 1 - OpacitySliderFrame:GetValue() end S.Settings.Set(ColorPickerFrame.setting, {r,g,b,a}) end local function OnColorButtonClick(self) local color = S.Settings.Get(self.setting) if ColorPickerFrame.SetupColorPickerAndShow then ColorPickerFrame:SetupColorPickerAndShow({ r = color[1], g = color[2], b = color[3], opacity = color[4], hasOpacity = true, swatchFunc = function() local r,g,b = ColorPickerFrame:GetColorRGB() S.Settings.Set(self.setting, {r,g,b,ColorPickerFrame:GetColorAlpha()}) end, cancelFunc = function() S.Settings.Set(self.setting, {ColorPickerFrame.previousValues.r, ColorPickerFrame.previousValues.g, ColorPickerFrame.previousValues.b, ColorPickerFrame.previousValues.a}) end }) else ColorPickerFrame:SetColorRGB(unpack(color)) ColorPickerFrame.opacity = 1 - color[4] ColorPickerFrame.hasOpacity = true ColorPickerFrame.previousColor = color ColorPickerFrame.func = ColorButtonCallback ColorPickerFrame.opacityFunc = ColorButtonCallback ColorPickerFrame.cancelFunc = ColorButtonCancelCallback ColorPickerFrame.setting = self.setting ColorPickerFrame:Show() end end local function CreateColor(parent, name, setting) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 64) f.colorButton = CreateFrame("BUTTON", nil, f) f.tooltipParent = f.colorButton f.colorButton:SetSize(32, 32) f.colorButton:SetPoint("LEFT", 16, 0) f.colorButton.bg = f.colorButton:CreateTexture(nil, "BACKGROUND") f.colorButton.bg:SetTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button") f.colorButton.bg:SetAllPoints() f.colorButton:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button-Color-Dot") f.colorButton:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\Radio-Button-Highlight") f.colorButton:SetScript("OnClick", OnColorButtonClick) f.colorButton.setting = setting S.Utils.RunOnEvent(f.colorButton, "SettingChanged-"..setting, ColorButtonOnSettingChanged) f.nameString = f:CreateFontString(nil, "OVERLAY", "SortedFont") f.nameString:SetText(name) f.nameString:SetPoint("LEFT", f.colorButton, "RIGHT", 4, 0) f.nameString:SetTextColor(1, 1, 1) f.nameString:SetTextScale(1.2) return f end -- EditBox local function EditBoxOnSettingChanged(self, event, value) self:SetText(value) end local function OnEditBoxTextChanged(self) S.Settings.Set(self.setting, self:GetText()) end local function CreateEditBox(parent, name, setting, instruction) local f = S.FrameTools.CreateEditBox(parent, name, instruction) f.tooltipParent = f.editBox f.editBox.setting = setting f.editBox:HookScript("OnTextChanged", OnEditBoxTextChanged) f.editBox:SetScript("OnEnterPressed", f.editBox.ClearFocus) f.editBox:HookScript("OnShow", function(self) self:SetText(S.Settings.Get(self.setting)) end) S.Utils.RunOnEvent(f.editBox, "SettingChanged-"..setting, EditBoxOnSettingChanged) return f end -- Spacer local function CreateSpacer(parent, name) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 48) if name then f.nameString = f:CreateFontString(nil, "OVERLAY", "SortedFont") f.nameString:SetText(name) f.nameString:SetPoint("CENTER", 0, -16) f.nameString:SetTextColor(S.Utils.GetButtonTextColor():GetRGB()) f.nameString:SetTextScale(1.2) end return f end -- BUILD SETTINGS FROM TABLE local function CreateSettingWidget(parent, widgetData) local widget if not parent.y then parent.y = -16 end if widgetData.type == "SLIDER" then widget = CreateSlider(parent, widgetData.name, widgetData.setting, widgetData.min, widgetData.max, widgetData.precision, widgetData.values, widgetData.curve) elseif widgetData.type == "CHECKBOX" then widget = CreateCheckbox(parent, widgetData.name, widgetData.setting) elseif widgetData.type == "RADIO" then widget = CreateRadio(parent, widgetData.name, widgetData.setting, widgetData.buttons) elseif widgetData.type == "DROPDOWN" then widget = CreateDropdown(parent, widgetData.name, widgetData.setting, widgetData.BuildDropdown, widgetData.GetTextFromValue) elseif widgetData.type == "COLOR" then widget = CreateColor(parent, widgetData.name, widgetData.setting) elseif widgetData.type == "SPACER" then widget = CreateSpacer(parent, widgetData.name) end widget:SetPoint("TOP", parent, "TOP", 0, parent.y) parent.y = parent.y - widget:GetHeight() if widgetData.tooltipKey and widget.tooltipParent then widget.tooltipParent.tooltipKey = widgetData.tooltipKey widget.tooltipParent:HookScript("OnEnter", function(self) S.Tooltip.CreateLocalized(self, "ANCHOR_RIGHT", self.tooltipKey) end) widget.tooltipParent:HookScript("OnLeave", S.Tooltip.Cancel) end end local settingsFrames = {} for k,v in pairs(settingsTable) do local f = CreateFrame("FRAME") settingsFrames[k] = f f.name = settingsTable[k].name f.left = CreateFrame("FRAME", nil, f) f.left:SetPoint("TOPLEFT") f.left:SetPoint("BOTTOMRIGHT", f, "BOTTOM", -16, 0) for i, widget in ipairs(v.left) do CreateSettingWidget(f.left, widget) end f.right = CreateFrame("FRAME", nil, f) f.right:SetPoint("TOPLEFT", f, "TOP", -16, 0) f.right:SetPoint("BOTTOMRIGHT", -32, 0) for i, widget in ipairs(v.right) do CreateSettingWidget(f.right, widget) end end -- CREATE CATEGORIES FRAME (to be built by SettingsFrame_Categories.lua) local f = CreateFrame("FRAME") settingsFrames[#settingsFrames + 1] = f f.name = S.Localize("CONFIG_CATEGORIES") S.categoriesSettingsFrame = f -- BUILD PROFILES FRAME local f = CreateFrame("FRAME") settingsFrames[#settingsFrames + 1] = f f.name = S.Localize("CONFIG_PROFILES") local function ProfileDropdownEntryOnClick(self) S.Settings.SetProfile(self.data1) end f.dropdown = CreateDropdown(f, S.Localize("CONFIG_PROFILES_PROFILE"), "profileName", function() local profile = S.Settings.GetProfile() for k, settingsProfile in pairs(Sorted_SettingsProfiles) do S.Dropdown.AddEntry(settingsProfile.profileName, ProfileDropdownEntryOnClick, k) S.Dropdown.AddRadioButton(profile == k, true) end end) f.dropdown:SetPoint("TOPLEFT", 64, -32) f.dropdown:SetWidth(448) f.buttonNew = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_NEW"), function(self) local profile = S.Settings.CreateNewProfile(S.Localize("CONFIG_PROFILES_DEFAULT_NAME")) end) f.buttonCopy = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_COPY"), S.Settings.CopyProfile) f.buttonDelete = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_DELETE"), function(self) S.Settings.DeleteProfile() if next(Sorted_SettingsProfiles) then S.Settings.SetProfile(next(Sorted_SettingsProfiles)) else S.primaryFrame:Hide() S.settingsFrame:Hide() S.settingsProfilesFrame:Show() S.settingsProfilesFrame.source = "settings" end end) f.buttonCopy:SetPoint("TOP", f.dropdown, "BOTTOM") f.buttonNew:SetPoint("RIGHT", f.buttonCopy, "LEFT") f.buttonDelete:SetPoint("LEFT", f.buttonCopy, "RIGHT") f.editBox = CreateEditBox(f, S.Localize("CONFIG_PROFILES_CHANGE_NAME"), "profileName", S.Localize("CONFIG_PROFILES_CHANGE_NAME_INSTRUCTION")) f.editBox:SetPoint("TOPLEFT", f.dropdown, "BOTTOMLEFT", 0, -32) f.editBox.editBox:SetSize(384, 16) local defaultProfileDropdown local function DefaultProfileDropdownEntryOnClick(self) S.Settings.SetDefaultProfile(self.data1) defaultProfileDropdown:UpdateText() end f.defaultDropdown = S.FrameTools.CreateDropdown(f, S.Localize("CONFIG_PROFILES_DEFAULT_PROFILE"), function() local profile = S.Settings.GetDefaultProfile() S.Dropdown.AddEntry("|cffdddddd"..S.Localize("CONFIG_PROFILES_DEFAULT_PROFILE_UNSET"), DefaultProfileDropdownEntryOnClick, nil) S.Dropdown.AddRadioButton(not profile, true) S.Dropdown.AddEntry(S.Localize("CONFIG_PROFILES_DEFAULT_PROFILE_USE_EXISTING"), nil, nil, nil, S.Color.YELLOW) for k, settingsProfile in pairs(Sorted_SettingsProfiles) do S.Dropdown.AddEntry(settingsProfile.profileName, DefaultProfileDropdownEntryOnClick, k) S.Dropdown.AddRadioButton(profile == k, true) end end) f.defaultDropdown:SetPoint("TOPLEFT", 64, -320) function f.defaultDropdown:UpdateText() local profile = S.Settings.GetDefaultProfile() if not profile then self.button.text:SetText("|cffdddddd"..S.Localize("CONFIG_PROFILES_DEFAULT_PROFILE_UNSET")) else self.button.text:SetText(Sorted_SettingsProfiles[profile].profileName) end end f.defaultDropdown:SetScript("OnShow", f.defaultDropdown.UpdateText) defaultProfileDropdown = f.defaultDropdown -- "Clear all settings" button f.buttonClearData = S.FrameTools.CreateBasicTextButton(f, S.Localize("CONFIG_PROFILES_CLEAR_DATA"), function(self) StaticPopupDialogs["SORTED_CLEAR_DATA"] = { text = S.Localize("CONFIG_PROFILES_CLEAR_DATA_DIALOG"), StartDelay = function() return 3 end, delayText = ACCEPT, button1 = ACCEPT, button2 = CANCEL, OnAccept = function() Sorted_Data = nil Sorted_SettingsProfiles = nil Sorted_DefaultSettingsProfile = nil ReloadUI() end, timeout = 0, whileDead = true, hideOnEscape = true, } StaticPopup_Show("SORTED_CLEAR_DATA") end) f.buttonClearData:SetPoint("BOTTOMLEFT", 64, 32) f.buttonClearData:SetWidth(128) -- BUILD MAIN SETTINGS FRAME f = CreateFrame("FRAME", "SortedSettingsFrame", UIParent) S.settingsFrame = f table.insert(UISpecialFrames, "SortedSettingsFrame") function Sorted_OpenSettings() S.settingsFrame:Show() end f:SetPoint("CENTER") f:SetSize(800, 576) f:SetClampedToScreen(true) f:EnableMouse() f:SetMovable(true) f:SetFrameStrata("HIGH") f:SetFrameLevel(632) S.FrameTools.AddOuterShadow(f, 100) function f:UpdateScale() f:SetScale(S.Settings.Get("scale")) end S.Utils.RunOnEvent(f, "SettingChanged-scale", f.UpdateScale) --S.FrameTools.AddSortedBackdrop(f) f.bg = f:CreateTexture() f.bg:SetTexture("Interface\\Addons\\Sorted\\Textures\\Abstract", "REPEAT", "REPEAT") f.bg:SetVertexColor(0.6, 0.6, 0.6) f.bg:SetDrawLayer("BACKGROUND") f.bg:SetAllPoints() f.bg:SetVertTile(true) f.bg:SetHorizTile(true) f.closeButton = S.FrameTools.CreateCloseButton(f) f.closeButton:SetSize(24, 24) f.closeButton:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\redbutton2x-Clean") f.closeButton:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\redbutton2x-Clean") f.closeButton:GetHighlightTexture():SetTexCoord(0.1484375, 0.296875, 0, 0.3125) f.closeButton:GetHighlightTexture():SetAlpha(0.6) f.closeButton:SetPushedTexture("Interface\\Addons\\Sorted\\Textures\\redbutton2x-Clean") -- Prevent click-through and do dragging f:SetScript("OnMouseDown", function(self) self:StartMoving() end) f:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end) f:Hide() f:SetScript("OnShow", function(self) if not S.Settings.HasProfile() then self:Hide() S.settingsProfilesFrame:Show() S.settingsProfilesFrame.source = "settings" end end) f.left = CreateFrame("FRAME", nil, f) f.left:SetPoint("TOPLEFT") f.left:SetPoint("BOTTOMRIGHT", f, "BOTTOMLEFT", 192, 0) f.left.bg = f.left:CreateTexture(nil, "BACKGROUND") f.left.bg:SetColorTexture(0, 0, 0, 0.4) f.left.bg:SetAllPoints() f.left.title = f.left:CreateTexture(nil, "ARTWORK") f.left.title:SetTexture("Interface\\Addons\\Sorted\\Textures\\Title") f.left.title:SetPoint("TOPLEFT", 8, -8) f.left.title:SetSize(192, 48) f.left.buttons = {} local selectedTab = 1 function f.left.UpdateButtons() for index, b in pairs(f.left.buttons) do if index == selectedTab then b.frame:Show() b.text:SetTextColor(1, 1, 1) b:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\Dropdown-Highlight") b:GetNormalTexture():SetVertexColor(0.9, 0.7, 0.04) b:GetNormalTexture():SetTexCoord(0, 1, 0.02, 0.98) b:GetNormalTexture():SetBlendMode("ADD") else b.frame:Hide() b.text:SetTextColor(S.Utils.GetButtonTextColor():GetRGB()) b:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\Transparent") end end end local function OnButtonClick(self) selectedTab = self:GetID() f.left.UpdateButtons() end function f.left.AddButton(index, name) local b = CreateFrame("BUTTON", nil, f.left) b:SetSize(160, 40) b:SetPoint("TOP", 0, -64 - index * 48) b:SetID(index) b:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\Dropdown-Highlight") b:GetHighlightTexture():SetVertexColor(0.3, 0.5, 0.8) b:GetHighlightTexture():SetTexCoord(0, 1, 0.1, 0.9) b.text = b:CreateFontString(nil, "OVERLAY", "SortedFont") b.text:SetText(name) b.text:SetTextColor(S.Utils.GetButtonTextColor():GetRGB()) b.text:SetTextScale(1.3) b.text:SetPoint("CENTER") b:RegisterForClicks("LeftButtonDown") b:SetScript("OnClick", OnButtonClick) f.left.buttons[index] = b end f.separator = f:CreateTexture(nil, "ARTWORK") f.separator:SetTexture("Interface\\Addons\\Sorted\\Textures\\Settings-Separator") f.separator:SetPoint("TOPLEFT", f.left, "TOPRIGHT") f.separator:SetPoint("BOTTOM") f.separator:SetWidth(2) -- ADD SETTINGS TO FRAME f.right = CreateFrame("FRAME", nil, f) f.right:SetPoint("TOPLEFT", f.left, "TOPRIGHT") f.right:SetPoint("BOTTOMRIGHT") for i,v in ipairs(settingsFrames) do f.left.AddButton(i, v.name) v:SetParent(f.right) v:SetAllPoints() v:SetShown(i == selectedTab) f.left.buttons[i].frame = v end f.left.UpdateButtons() -- Support local urlFrame = CreateFrame("FRAME", nil, UIParent) urlFrame:SetFrameStrata("DIALOG") urlFrame:SetFrameLevel(1000) urlFrame:SetPoint("CENTER") urlFrame:SetSize(500, 220) urlFrame:Hide() urlFrame:SetScript("OnMouseDown", function(self) end) S.FrameTools.AddBorder(urlFrame, "border", "Interface\\Addons\\Sorted\\Textures\\settings-border", 3, 0) S.FrameTools.AddOuterShadow(urlFrame, 128) urlFrame.bg = urlFrame:CreateTexture() urlFrame.bg:SetAllPoints() urlFrame.bg:SetTexture("Interface\\Addons\\Sorted\\Textures\\Abstract", "REPEAT", "REPEAT") urlFrame.bg:SetVertexColor(0.6, 0.6, 0.6) urlFrame.bg:SetDrawLayer("BACKGROUND") urlFrame.bg:SetVertTile(true) urlFrame.bg:SetHorizTile(true) urlFrame.closeButton = S.FrameTools.CreateCloseButton(urlFrame) urlFrame.closeButton:SetSize(24, 24) urlFrame.closeButton:SetNormalTexture("Interface\\Addons\\Sorted\\Textures\\redbutton2x-Clean") urlFrame.closeButton:SetHighlightTexture("Interface\\Addons\\Sorted\\Textures\\redbutton2x-Clean") urlFrame.closeButton:GetHighlightTexture():SetTexCoord(0.1484375, 0.296875, 0, 0.3125) urlFrame.closeButton:GetHighlightTexture():SetAlpha(0.6) urlFrame.closeButton:SetPushedTexture("Interface\\Addons\\Sorted\\Textures\\redbutton2x-Clean") urlFrame.eb = S.FrameTools.CreateEditBox(urlFrame, "Thank you for supporting Sorted!", "") urlFrame.eb:SetPoint("BOTTOM", 0, 40) urlFrame.eb.nameString:ClearAllPoints() urlFrame.eb.nameString:SetTextScale(1.4) urlFrame.eb.nameString:SetPoint("TOP", urlFrame, 0, -20) urlFrame.eb.message = urlFrame.eb:CreateFontString(nil, "OVERLAY", "SortedFont") urlFrame.eb.message:SetPoint("TOP", urlFrame.eb.nameString, "BOTTOM", 0, -10) urlFrame.eb.message:SetTextColor(0.9, 0.88, 0.82) urlFrame.eb.message:SetText( [[Sorted. is a huge addon, created and maintained by one person. It's taken many hours of development to get to this point and continues to take effort to keep it maintained. Your donations mean a lot and allow me to put more time into working on and improving Sorted.]] ) function urlFrame:UpdateSize() local width = urlFrame.eb.message:GetStringWidth() + 32 if width < 450 then width = 450 end local height = urlFrame.eb.nameString:GetHeight() + urlFrame.eb.message:GetHeight() + urlFrame.instruction:GetHeight() + 110 self:SetSize(width, height) end urlFrame:HookScript("OnShow", urlFrame.UpdateSize) S.Utils.RunOnEvent(urlFrame, "SettingChanged-font", urlFrame.UpdateSize) S.Utils.RunOnEvent(urlFrame, "SettingChanged-fontSizePts", urlFrame.UpdateSize) urlFrame.eb.editBox.url = "" urlFrame.eb.editBox:SetAutoFocus(true) urlFrame.eb.editBox:ClearAllPoints() urlFrame.eb.editBox:SetPoint("CENTER", 64, -16) urlFrame.eb.editBox:SetSize(280, 16) urlFrame.icon = urlFrame:CreateTexture() urlFrame.icon:SetPoint("RIGHT", urlFrame.eb.editBox, "LEFT", -25 , 0) urlFrame.icon:SetSize(96, 24) function urlFrame:ShowUrl(url, icon) self.icon:SetTexture(icon) self:Show() self.eb.editBox:SetText(url) self.eb.editBox:HighlightText(0) self.eb.editBox.url = url end urlFrame.eb.editBox:SetScript("OnUpdate", function(self) self:SetText(self.url) self:HighlightText(0) end) urlFrame.eb.editBox:SetScript("OnEscapePressed", function(self) urlFrame:Hide() end) urlFrame.eb.editBox:SetScript("OnEnterPressed", function(self) urlFrame:Hide() end) urlFrame.inputBlocker = CreateFrame("FRAME", nil, urlFrame) urlFrame.inputBlocker:SetFrameLevel(urlFrame:GetFrameLevel() + 10) urlFrame.closeButton:SetFrameLevel(urlFrame:GetFrameLevel() + 20) urlFrame.inputBlocker:SetAllPoints() urlFrame.inputBlocker:SetScript("OnMouseDown", function(self) end) urlFrame.instruction = urlFrame:CreateFontString(nil, "OVERLAY", "SortedFont") urlFrame.instruction:SetText("Copy URL with Ctrl + C and paste into a web browser") urlFrame.instruction:SetPoint("BOTTOM", 0, 20) --[[local patreonIcon = "Interface\\Addons\\Sorted\\Textures\\Patreon" f.patreon = CreateFrame("BUTTON", nil, f.left) f.patreon:SetPoint("BOTTOM", 0, 32) f.patreon:SetSize(96, 24) f.patreon:SetNormalTexture(patreonIcon) f.patreon:SetHighlightTexture(patreonIcon) f.patreon:SetPushedTexture(patreonIcon) f.patreon:SetScript("OnMouseDown", function(self) self:SetPoint("BOTTOM", 1, 31) end) f.patreon:SetScript("OnMouseUp", function(self) self:SetPoint("BOTTOM", 0, 32) end) f.patreon:SetScript("OnClick", function(self) urlFrame:ShowUrl("https://www.patreon.com/sorted", patreonIcon) end) f.patreon:SetScript("OnEnter", function(self) S.Tooltip.CreateText(f.patreon, "LEFT", "Donate to support\n the developer") end) f.patreon:SetScript("OnLeave", function(self) S.Tooltip.Cancel() end)]] local paypalIcon = "Interface\\Addons\\Sorted\\Textures\\Paypal" f.paypal = CreateFrame("BUTTON", nil, f.left) f.paypal:SetPoint("BOTTOM", 0, 32) f.paypal:SetSize(96, 24) f.paypal:SetNormalTexture(paypalIcon) f.paypal:SetHighlightTexture(paypalIcon) f.paypal:SetPushedTexture(paypalIcon) f.paypal:SetScript("OnMouseDown", function(self) self:SetPoint("BOTTOM", 1, 31) end) f.paypal:SetScript("OnMouseUp", function(self) self:SetPoint("BOTTOM", 0, 32) end) f.paypal:SetScript("OnClick", function(self) urlFrame:ShowUrl("https://www.paypal.com/donate/?hosted_button_id=DT3CRNZLMNYFG", paypalIcon) end) f.paypal:SetScript("OnEnter", function(self) S.Tooltip.CreateText(f.paypal, "LEFT", "Donate to support\n the developer") end) f.paypal:SetScript("OnLeave", function(self) S.Tooltip.Cancel() end)