You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

998 lines
36 KiB

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)