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 local positions = { [0] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_TOP"), [1] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_SIDE"), } for k, position in pairs(positions) do S.Dropdown.AddEntry(position, OnClick, k) end end, ["GetTextFromValue"] = function(self, value) local positions = { [0] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_TOP"), [1] = S.Localize("CONFIG_SKIN_CATEGORIES_POSITION_SIDE"), } 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_BEHAVIOR_EXTENDED_TOOLTIPS"), ["type"] = "CHECKBOX", ["setting"] = "tooltipInfo" }, { ["name"] = S.Localize("CONFIG_BEHAVIOR_COMBINE_STACKS"), ["type"] = "CHECKBOX", ["setting"] = "combineStacks" }, }, ["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) print(math.floor(value * 10^numPlaces) / 10^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 self.valueString:SetText(string.format("%."..self.precision.."f", self:GetValue())) 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 S.Settings.Set(self.setting, self:GetValue()) end local function CreateSlider(parent, name, setting, min, max, precision, values) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 64) local slider = CreateFrame("SLIDER", nil, f) slider.setting = setting slider.precision = precision 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", function(self) self:SetValue(S.Settings.Get(self.setting)) end) 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.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) 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) 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 local function CreateColor(parent, name, setting) local f = CreateFrame("FRAME", nil, parent) f:SetSize(224, 64) f.colorButton = CreateFrame("BUTTON", nil, f) 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.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) 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() 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.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.buttonNew:SetPoint("LEFT", f.dropdown.button, "RIGHT", 16, -2) f.buttonCopy:SetPoint("LEFT", f.buttonNew, "RIGHT") 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, -10) 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, -256) 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") 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 over a thousand 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, 80) 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, 79) end) f.paypal:SetScript("OnMouseUp", function(self) self:SetPoint("BOTTOM", 0, 80) 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)