local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB local D = E:GetModule("Distributor"); local AceGUI = LibStub("AceGUI-3.0"); --Cache global variables --Lua functions local pairs = pairs local tsort, tinsert = table.sort, table.insert local format = string.format --WoW API / Variables local GetNumPartyMembers = GetNumPartyMembers local GetNumRaidMembers = GetNumRaidMembers local UnitExists = UnitExists local UnitIsFriend = UnitIsFriend local UnitIsPlayer = UnitIsPlayer local UnitIsUnit = UnitIsUnit local UnitName = UnitName local UnitInParty = UnitInParty local UnitInRaid = UnitInRaid local DEFAULT_WIDTH = 890 local DEFAULT_HEIGHT = 651 local AC = LibStub("AceConfig-3.0") local ACD = LibStub("AceConfigDialog-3.0") local ACR = LibStub("AceConfigRegistry-3.0") AC:RegisterOptionsTable("ElvUI", E.Options) ACD:SetDefaultSize("ElvUI", DEFAULT_WIDTH, DEFAULT_HEIGHT) function E:RefreshGUI() self:RefreshCustomTextsConfigs() ACR:NotifyChange("ElvUI") end E.Options.args = { ElvUI_Header = { order = 1, type = "header", name = L["Version"]..format(": |cff99ff33%s|r", E.version), width = "full" }, LoginMessage = { order = 2, type = "toggle", name = L["Login Message"], get = function(info) return E.db.general.loginmessage end, set = function(info, value) E.db.general.loginmessage = value end }, ToggleTutorial = { order = 3, type = "execute", name = L["Toggle Tutorials"], func = function() E:Tutorials(true) E:ToggleConfig() end }, Install = { order = 4, type = "execute", name = L["Install"], desc = L["Run the installation process."], func = function() E:Install() E:ToggleConfig() end }, ToggleAnchors = { order = 5, type = "execute", name = L["Toggle Anchors"], desc = L["Unlock various elements of the UI to be repositioned."], func = function() E:ToggleConfigMode() end }, ResetAllMovers = { order = 6, type = "execute", name = L["Reset Anchors"], desc = L["Reset all frames to their original positions."], func = function() E:ResetUI() end } } local DONATOR_STRING = "" local DEVELOPER_STRING = "" local TESTER_STRING = "" local LINE_BREAK = "\n" local DONATORS = { "Dandruff", "Tobur/Tarilya", "Netu", "Alluren", "Thorgnir", "Emalal", "Bendmeova", "Curl", "Zarac", "Emmo", "Oz", "Hawké", "Aynya", "Tahira", "Karsten Lumbye Thomsen", "Thomas B. aka Pitschiqüü", "Sea Garnet", "Paul Storry", "Azagar", "Archury", "Donhorn", "Woodson Harmon", "Phoenyx", "Feat", "Konungr", "Leyrin", "Dragonsys", "Tkalec", "Paavi", "Giorgio", "Bearscantank", "Eidolic", "Cosmo", "Adorno", "Domoaligato", "Smorg", "Pyrokee", "Portable", "Ithilyn" } local DEVELOPERS = { "Tukz", "Haste", "Nightcracker", "Omega1970", "Hydrazine", "Blazeflack", "|cffff7d0aMerathilis|r", "|cFF8866ccSimpy|r" } local TESTERS = { "Tukui Community", "|cffF76ADBSarah|r - For Sarahing", "Affinity", "Azilroka", "Modarch", "Bladesdruid", "Tirain", "Phima", "Veiled", "Repooc", "Darth Predator", "Alex", "Nidra", "Kurhyus", "BuG", "Yachanay", "Catok" } tsort(DONATORS, function(a, b) return a < b end) for _, donatorName in pairs(DONATORS) do tinsert(E.CreditsList, donatorName) DONATOR_STRING = DONATOR_STRING .. LINE_BREAK .. donatorName end tsort(DEVELOPERS, function(a,b) return a < b end) for _, devName in pairs(DEVELOPERS) do tinsert(E.CreditsList, devName) DEVELOPER_STRING = DEVELOPER_STRING .. LINE_BREAK .. devName end tsort(TESTERS, function(a, b) return a < b end) for _, testerName in pairs(TESTERS) do tinsert(E.CreditsList, testerName) TESTER_STRING = TESTER_STRING .. LINE_BREAK .. testerName end E.Options.args.credits = { type = "group", name = L["Credits"], order = -1, args = { text = { order = 1, type = "description", name = L["ELVUI_CREDITS"].."\n\n"..L["Coding:"]..DEVELOPER_STRING.."\n\n"..L["Testing:"]..TESTER_STRING.."\n\n"..L["Donations:"]..DONATOR_STRING } } } local profileTypeItems = { ["profile"] = L["Profile"], ["private"] = L["Private (Character Settings)"], ["global"] = L["Global (Account Settings)"], ["filtersNP"] = L["Filters (NamePlates)"], ["filtersUF"] = L["Filters (UnitFrames)"], ["filtersAll"] = L["Filters (All)"] } local profileTypeListOrder = { "profile", "private", "global", "filtersNP", "filtersUF", "filtersAll" } local exportTypeItems = { ["text"] = L["Text"], ["luaTable"] = L["Table"], ["luaPlugin"] = L["Plugin"] } local exportTypeListOrder = { "text", "luaTable", "luaPlugin" } local exportString = "" local function ExportImport_Open(mode) local frame = AceGUI:Create("Frame") frame:SetTitle("") frame:EnableResize(false) frame:SetWidth(800) frame:SetHeight(600) frame.frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetLayout("flow") local box = AceGUI:Create("MultiLineEditBox") box:SetNumLines(30) box:DisableButton(true) box:SetWidth(800) box:SetLabel("") frame:AddChild(box) box.editBox.OnTextChangedOrig = box.editBox:GetScript("OnTextChanged") box.editBox.OnCursorChangedOrig = box.editBox:GetScript("OnCursorChanged") box.editBox:SetScript("OnCursorChanged", nil) local label1 = AceGUI:Create("Label") local font = GameFontHighlightSmall:GetFont() label1:SetFont(font, 14) label1:SetText(" ") label1:SetWidth(800) frame:AddChild(label1) local label2 = AceGUI:Create("Label") local font = GameFontHighlightSmall:GetFont() label2:SetFont(font, 14) label2:SetText(" \n ") label2:SetWidth(800) frame:AddChild(label2) if mode == "export" then frame:SetTitle(L["Export Profile"]) local profileTypeDropdown = AceGUI:Create("Dropdown") profileTypeDropdown:SetMultiselect(false) profileTypeDropdown:SetLabel(L["Choose What To Export"]) profileTypeDropdown:SetList(profileTypeItems, profileTypeListOrder) profileTypeDropdown:SetValue("profile") frame:AddChild(profileTypeDropdown) local exportFormatDropdown = AceGUI:Create("Dropdown") exportFormatDropdown:SetMultiselect(false) exportFormatDropdown:SetLabel(L["Choose Export Format"]) exportFormatDropdown:SetList(exportTypeItems, exportTypeListOrder) exportFormatDropdown:SetValue("text") exportFormatDropdown:SetWidth(150) frame:AddChild(exportFormatDropdown) local exportButton = AceGUI:Create("Button") exportButton:SetText(L["Export Now"]) exportButton:SetAutoWidth(true) local function OnClick() label1:SetText(" ") label2:SetText(" ") local profileType, exportFormat = profileTypeDropdown:GetValue(), exportFormatDropdown:GetValue() local profileKey, profileExport = D:ExportProfile(profileType, exportFormat) if not profileKey or not profileExport then label1:SetText(L["Error exporting profile!"]) else label1:SetText(format("%s: %s%s|r", L["Exported"], E.media.hexvaluecolor, profileTypeItems[profileType])) if profileType == "profile" then label2:SetText(format("%s: %s%s|r", L["Profile Name"], E.media.hexvaluecolor, profileKey)) end end box:SetText(profileExport) box.editBox:HighlightText() box:SetFocus() exportString = profileExport end exportButton:SetCallback("OnClick", OnClick) frame:AddChild(exportButton) box.editBox:SetScript("OnChar", function() box:SetText(exportString) box.editBox:HighlightText() end) box.editBox:SetScript("OnTextChanged", function() box:SetText(exportString) box.editBox:HighlightText() box.scrollFrame:UpdateScrollChildRect() end) elseif mode == "import" then frame:SetTitle(L["Import Profile"]) local importButton = AceGUI:Create("Button-ElvUI") importButton:SetDisabled(true) importButton:SetText(L["Import Now"]) importButton:SetAutoWidth(true) importButton:SetCallback("OnClick", function() label1:SetText(" ") label2:SetText(" ") local text local success = D:ImportProfile(box:GetText()) if success then text = L["Profile imported successfully!"] else text = L["Error decoding data. Import string may be corrupted!"] end label1:SetText(text) end) frame:AddChild(importButton) local decodeButton = AceGUI:Create("Button-ElvUI") decodeButton:SetDisabled(true) decodeButton:SetText(L["Decode Text"]) decodeButton:SetAutoWidth(true) decodeButton:SetCallback("OnClick", function() label1:SetText(" ") label2:SetText(" ") local decodedText local profileType, profileKey, profileData = D:Decode(box:GetText()) if profileData then decodedText = E:TableToLuaString(profileData) end local importText = D:CreateProfileExport(decodedText, profileType, profileKey) box:SetText(importText) end) frame:AddChild(decodeButton) local oldText = "" local function OnTextChanged() local text = box:GetText() if text == "" then label1:SetText(" ") label2:SetText(" ") importButton:SetDisabled(true) decodeButton:SetDisabled(true) elseif oldText ~= text then local stringType = D:GetImportStringType(text) if stringType == "Base64" then decodeButton:SetDisabled(false) else decodeButton:SetDisabled(true) end local profileType, profileKey = D:Decode(text) if not profileType or (profileType and profileType == "profile" and not profileKey) then label1:SetText(L["Error decoding data. Import string may be corrupted!"]) label2:SetText(" ") importButton:SetDisabled(true) decodeButton:SetDisabled(true) else label1:SetText(format("%s: %s%s|r", L["Importing"], E.media.hexvaluecolor, profileTypeItems[profileType] or "")) if profileType == "profile" then label2:SetText(format("%s: %s%s|r", L["Profile Name"], E.media.hexvaluecolor, profileKey)) end importButton:SetDisabled(false) end box.scrollFrame:UpdateScrollChildRect() box.scrollFrame:SetVerticalScroll(box.scrollFrame:GetVerticalScrollRange()) oldText = text end end box.editBox:SetFocus() box.editBox:SetScript("OnChar", nil) box.editBox:SetScript("OnTextChanged", OnTextChanged) end frame:SetCallback("OnClose", function(widget) box.editBox:SetScript("OnChar", nil) box.editBox:SetScript("OnTextChanged", box.editBox.OnTextChangedOrig) box.editBox:SetScript("OnCursorChanged", box.editBox.OnCursorChangedOrig) box.editBox.OnTextChangedOrig = nil box.editBox.OnCursorChangedOrig = nil exportString = "" AceGUI:Release(widget) ACD:Open("ElvUI") end) label1:SetText(" ") label2:SetText(" ") ACD:Close("ElvUI") GameTooltip:Hide() end E.Options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(E.data) AC:RegisterOptionsTable("ElvProfiles", E.Options.args.profiles) E.Options.args.profiles.order = -10 if not E.Options.args.profiles.plugins then E.Options.args.profiles.plugins = {} end E.Options.args.profiles.plugins.ElvUI = { spacer = { order = 89, type = "description", name = "\n\n" }, desc = { order = 90, type = "description", name = L["This feature will allow you to transfer settings to other characters."] }, distributeProfile = { order = 91, type = "execute", name = L["Share Current Profile"], desc = L["Sends your current profile to your target."], func = function() if (GetNumPartyMembers() <= 0 or GetNumPartyMembers() <= 0) then E:Print(L["You must be in a group."]) return end if not (UnitInParty("target") or UnitInRaid("target")) then E:Print(L["You must be targeting a player within your group."]) return end if not UnitExists("target") or not UnitIsPlayer("target") or not UnitIsFriend("player", "target") or UnitIsUnit("player", "target") then E:Print(L["You must be targeting a player."]) return end local name, server = UnitName("target") if name and (not server or server == "") then D:Distribute(name) elseif server then D:Distribute(name, true) end end }, distributeGlobal = { order = 92, type = "execute", name = L["Share Filters"], desc = L["Sends your filter settings to your target."], func = function() if (GetNumPartyMembers() <= 0 or GetNumPartyMembers() <= 0) then E:Print(L["You must be in a group."]) return end if not (UnitInParty("target") or UnitInRaid("target")) then E:Print(L["You must be targeting a player within your group."]) return end if not UnitExists("target") or not UnitIsPlayer("target") or not UnitIsFriend("player", "target") or UnitIsUnit("player", "target") then E:Print(L["You must be targeting a player."]) return end local name, server = UnitName("target") if name and (not server or server == "") then D:Distribute(name, false, true) elseif server then D:Distribute(name, true, true) end end }, spacer2 = { order = 93, type = "description", name = "" }, exportProfile = { order = 94, type = "execute", name = L["Export Profile"], func = function() ExportImport_Open("export") end }, importProfile = { order = 95, type = "execute", name = L["Import Profile"], func = function() ExportImport_Open("import") end } }