diff --git a/ElvUI/Libraries/Ace3/AceLocale-3.0/AceLocale-3.0.lua b/ElvUI/Libraries/Ace3/AceLocale-3.0/AceLocale-3.0.lua index 162b08a..bb0438d 100644 --- a/ElvUI/Libraries/Ace3/AceLocale-3.0/AceLocale-3.0.lua +++ b/ElvUI/Libraries/Ace3/AceLocale-3.0/AceLocale-3.0.lua @@ -2,7 +2,7 @@ -- @class file -- @name AceLocale-3.0 -- @release $Id$ -local MAJOR,MINOR = "AceLocale-3.0-ElvUI", 6 +local MAJOR,MINOR = "AceLocale-3.0", 6 local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -12,10 +12,6 @@ if not AceLocale then return end -- no upgrade needed local assert, tostring, error = assert, tostring, error local getmetatable, setmetatable, rawset, rawget = getmetatable, setmetatable, rawset, rawget --- Global vars/functions that we don't upvalue since they might get hooked, or upgraded --- List them here for Mikk's FindGlobals script --- GLOBALS: GAME_LOCALE, geterrorhandler - local gameLocale = GetLocale() if gameLocale == "enGB" then gameLocale = "enUS" @@ -91,6 +87,10 @@ local writedefaultproxy = setmetatable({}, { -- L["string1"] = "Zeichenkette1" -- @return Locale Table to add localizations to, or nil if the current locale is not required. function AceLocale:NewLocale(application, locale, isDefault, silent) + + -- GAME_LOCALE allows translators to test translations of addons without having that wow client installed + local activeGameLocale = GAME_LOCALE or gameLocale + local app = AceLocale.apps[application] if silent and app and getmetatable(app) ~= readmetasilent then @@ -107,14 +107,11 @@ function AceLocale:NewLocale(application, locale, isDefault, silent) AceLocale.appnames[app] = application end - -- ElvUI block - if (not app[locale]) or (app[locale] and type(app[locale]) ~= 'table') then - -- app[locale] = setmetatable({}, silent and readmetasilent or readmeta) -- To find missing keys - app[locale] = setmetatable({}, readmetasilent) + if locale ~= activeGameLocale and not isDefault then + return -- nop, we don't need these translations end - registering = app[locale] -- remember globally for writeproxy and writedefaultproxy - -- end block + registering = app -- remember globally for writeproxy and writedefaultproxy if isDefault then return writedefaultproxy @@ -128,16 +125,9 @@ end -- @param application Unique name of addon / module -- @param silent If true, the locale is optional, silently return nil if it's not found (defaults to false, optional) -- @return The locale table for the current language. ---- Modified by ElvUI to add `locale` as second arg -function AceLocale:GetLocale(application, locale, silent) - if type(locale) == "boolean" then - silent = locale - locale = gameLocale - end - +function AceLocale:GetLocale(application, silent) if not silent and not AceLocale.apps[application] then - error("Usage: GetLocale(application[,locale[, silent]]): 'application' - No locales registered for '"..tostring(application).."'", 2) + error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2) end - - return AceLocale.apps[application][locale] or AceLocale.apps[application][gameLocale] -- Just in case the table doesn't exist it reverts to default + return AceLocale.apps[application] end diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfig-3.0.lua b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfig-3.0.lua index c5fcfd2..1c9454a 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfig-3.0.lua +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfig-3.0.lua @@ -12,10 +12,10 @@ Very light wrapper library that combines all the AceConfig subcomponents into on ]] -local cfgreg = LibStub("AceConfigRegistry-3.0-ElvUI") -local cfgcmd = LibStub("AceConfigCmd-3.0-ElvUI") +local cfgreg = LibStub("AceConfigRegistry-3.0") +local cfgcmd = LibStub("AceConfigCmd-3.0") -local MAJOR, MINOR = "AceConfig-3.0-ElvUI", 3 +local MAJOR, MINOR = "AceConfig-3.0", 3 local AceConfig = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfig then return end @@ -27,7 +27,7 @@ if not AceConfig then return end local pcall, error, type, pairs = pcall, error, type, pairs -- ------------------------------------------------------------------- --- :RegisterOptionsTable(appName, options, slashcmd, persist) +-- :RegisterOptionsTable(appName, options, slashcmd) -- -- - appName - (string) application name -- - options - table or function ref, see AceConfigRegistry diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua index 63cc489..9e883a2 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua @@ -14,9 +14,9 @@ REQUIRES: AceConsole-3.0 for command registration (loaded on demand) -- TODO: plugin args -local cfgreg = LibStub("AceConfigRegistry-3.0-ElvUI") +local cfgreg = LibStub("AceConfigRegistry-3.0") -local MAJOR, MINOR = "AceConfigCmd-3.0-ElvUI", 14 +local MAJOR, MINOR = "AceConfigCmd-3.0", 14 local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigCmd then return end @@ -37,17 +37,10 @@ local error, assert = error, assert -- WoW APIs local _G = _G --- Global vars/functions that we don't upvalue since they might get hooked, or upgraded --- List them here for Mikk's FindGlobals script --- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME - - local L = setmetatable({}, { -- TODO: replace with proper locale __index = function(self,k) return k end }) - - local function print(msg) (SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg) end @@ -401,7 +394,7 @@ local function handle(info, inputpos, tab, depth, retfalse) return end - local str = strsub(info.input,inputpos); + local strInput = strsub(info.input,inputpos); if tab.type=="execute" then ------------ execute -------------------------------------------- @@ -414,21 +407,21 @@ local function handle(info, inputpos, tab, depth, retfalse) local res = true if tab.pattern then - if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end - if not strmatch(str, tab.pattern) then - usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"]) + if type(tab.pattern)~="string" then err(info, inputpos, "'pattern' - expected a string") end + if not strmatch(strInput, tab.pattern) then + usererr(info, inputpos, "'"..strInput.."' - " .. L["invalid input"]) return end end - do_final(info, inputpos, tab, "set", str) + do_final(info, inputpos, tab, "set", strInput) elseif tab.type=="toggle" then ------------ toggle -------------------------------------------- local b - local str = strtrim(strlower(str)) + local str = strtrim(strlower(strInput)) if str=="" then b = callmethod(info, inputpos, tab, "get") @@ -465,9 +458,9 @@ local function handle(info, inputpos, tab, depth, retfalse) elseif tab.type=="range" then ------------ range -------------------------------------------- - local val = tonumber(str) + local val = tonumber(strInput) if not val then - usererr(info, inputpos, "'"..str.."' - "..L["expected number"]) + usererr(info, inputpos, "'"..strInput.."' - "..L["expected number"]) return end if type(info.step)=="number" then @@ -487,7 +480,7 @@ local function handle(info, inputpos, tab, depth, retfalse) elseif tab.type=="select" then ------------ select ------------------------------------ - local str = strtrim(strlower(str)) + local str = strtrim(strlower(strInput)) local values = tab.values if type(values) == "function" or type(values) == "string" then @@ -528,7 +521,7 @@ local function handle(info, inputpos, tab, depth, retfalse) elseif tab.type=="multiselect" then ------------ multiselect ------------------------------------------- - local str = strtrim(strlower(str)) + local str = strtrim(strlower(strInput)) local values = tab.values if type(values) == "function" or type(values) == "string" then @@ -565,7 +558,7 @@ local function handle(info, inputpos, tab, depth, retfalse) --check that the opt is valid local ok - for k,v in pairs(values) do + for k in pairs(values) do if strlower(k)==opt then opt = k -- overwrite with key (in case of case mismatches) ok = true @@ -634,7 +627,7 @@ local function handle(info, inputpos, tab, depth, retfalse) elseif tab.type=="color" then ------------ color -------------------------------------------- - local str = strtrim(strlower(str)) + local str = strtrim(strlower(strInput)) if str == "" then --TODO: Show current value return @@ -706,7 +699,7 @@ local function handle(info, inputpos, tab, depth, retfalse) elseif tab.type=="keybinding" then ------------ keybinding -------------------------------------------- - local str = strtrim(strlower(str)) + local str = strtrim(strlower(strInput)) if str == "" then --TODO: Show current value return diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua index 1de0275..19772f0 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua @@ -5,9 +5,9 @@ local LibStub = LibStub local gui = LibStub("AceGUI-3.0") -local reg = LibStub("AceConfigRegistry-3.0-ElvUI") +local reg = LibStub("AceConfigRegistry-3.0") -local MAJOR, MINOR = "AceConfigDialog-3.0-ElvUI", 79 +local MAJOR, MINOR = "AceConfigDialog-3.0", 92 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigDialog then return end @@ -15,25 +15,20 @@ if not AceConfigDialog then return end AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {} AceConfigDialog.Status = AceConfigDialog.Status or {} AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame") +AceConfigDialog.tooltip = AceConfigDialog.tooltip or CreateFrame("GameTooltip", "AceConfigDialogTooltip", UIParent, "GameTooltipTemplate") AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {} AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {} AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} -- Lua APIs -local tconcat, tinsert, tsort, tremove = table.concat, table.insert, table.sort, table.remove +local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe local strmatch, format = string.match, string.format -local assert, loadstring, error = assert, loadstring, error -local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs -local rawset, tostring, tonumber = rawset, tostring, tonumber +local error = error +local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs +local tostring, tonumber = tostring, tonumber local math_min, math_max, math_floor = math.min, math.max, math.floor --- Global vars/functions that we don't upvalue since they might get hooked, or upgraded --- List them here for Mikk's FindGlobals script --- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show --- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge --- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler - local emptyTbl = {} --[[ @@ -45,39 +40,10 @@ local function errorhandler(err) return geterrorhandler()(err) end -local function CreateDispatcher(argCount) - local code = [[ - local xpcall, eh = ... - local method, ARGS - local function call() return method(ARGS) end - - local function dispatch(func, ...) - method = func - if not method then return end - ARGS = ... - return xpcall(call, eh) - end - - return dispatch - ]] - - local ARGS = {} - for i = 1, argCount do ARGS[i] = "arg"..i end - code = code:gsub("ARGS", tconcat(ARGS, ", ")) - return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler) -end - -local Dispatchers = setmetatable({}, {__index=function(self, argCount) - local dispatcher = CreateDispatcher(argCount) - rawset(self, argCount, dispatcher) - return dispatcher -end}) -Dispatchers[0] = function(func) - return xpcall(func, errorhandler) -end - local function safecall(func, ...) - return Dispatchers[select("#", ...)](func, ...) + if func then + return xpcall(func, errorhandler, ...) + end end local width_multiplier = 170 @@ -181,6 +147,7 @@ local stringIsLiteral = { width = true, image = true, fontSize = true, + tooltipHyperlink = true } --Is Never a function or method @@ -222,9 +189,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, --We have a function to call local info = new() --traverse the options table, picking up the handler and filling the info with the path - local handler local group = options - handler = group.handler or handler + local handler = group.handler for i = 1, #path do group = GetSubOption(group, path[i]) @@ -242,21 +208,21 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, info.uiType = "dialog" info.uiName = MAJOR - local a, b, c, d, e, f, g, h -- ElvUI adds e,f,g,h for default color + local a, b, c ,d --using 4 returns for the get of a color type, increase if a type needs more if type(member) == "function" then --Call the function - a,b,c,d,e,f,g,h = member(info, ...) + a,b,c,d = member(info, ...) else --Call the method if handler and handler[member] then - a,b,c,d,e,f,g,h = handler[member](handler, info, ...) + a,b,c,d = handler[member](handler, info, ...) else error(format("Method %s doesn't exist in handler for type %s", member, membername)) end end del(info) - return a,b,c,d,e,f,g,h + return a,b,c,d else --The value isnt a function to call, return it return member @@ -533,137 +499,163 @@ local function OptionOnMouseOver(widget, event) local options = user.options local path = user.path local appName = user.appName + local tooltip = AceConfigDialog.tooltip - -- modified by ElvUI - if opt.descStyle and opt.descStyle ~= "tooltip" then return end + tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") + + local tooltipHyperlink = GetOptionsMemberValue("tooltipHyperlink", opt, options, path, appName) + if tooltipHyperlink then + tooltip:SetHyperlink(tooltipHyperlink) + tooltip:Show() + return + end local name = GetOptionsMemberValue("name", opt, options, path, appName) local desc = GetOptionsMemberValue("desc", opt, options, path, appName) local usage = GetOptionsMemberValue("usage", opt, options, path, appName) + local descStyle = opt.descStyle - local descText = type(desc) == "string" - local usageText = type(usage) == "string" - local userText = opt.type == "multiselect" - local softText = opt.softMin or opt.softMax - local bigText = opt.bigStep - local Min, Max, Step + if descStyle and descStyle ~= "tooltip" then return end - if softText then - Min = (opt.min and "|cFFCCCCCCMin:|r "..(opt.isPercent and (opt.min*100).."%" or opt.min)) or "" - Max = (opt.max and "|cFFCCCCCCMax:|r "..(opt.isPercent and (opt.max*100).."%" or opt.max)) or "" - softText = Min ~= "" or Max ~= "" + tooltip:SetText(name, 1, .82, 0, 1, true) + + if opt.type == "multiselect" then + tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) end - if bigText then - local dec = opt.step and format("%f", opt.step):gsub('%.?0-$','') - local num = dec and tonumber(dec) - Step = (num and num > 0 and "|cFFCCCCCCStep:|r "..dec) or "" - bigText = Step ~= "" + if type(desc) == "string" then + tooltip:AddLine(desc, 1, 1, 1, true) + end + if type(usage) == "string" then + tooltip:AddLine(usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) end - if descText or usageText or userText or softText or bigText then - GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") - GameTooltip:SetText(name, 1, .82, 0, true) - - if userText then - GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) - end - if descText then - GameTooltip:AddLine(desc, 1, 1, 1, true) - end - if usageText then - GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) - end - if bigText or softText then - GameTooltip:AddLine(" ") - end - if bigText then - GameTooltip:AddLine(Step, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) - end - if softText then - GameTooltip:AddDoubleLine(Min, Max) - end - - GameTooltip:Show() - end + tooltip:Show() end local function OptionOnMouseLeave(widget, event) - GameTooltip:Hide() + AceConfigDialog.tooltip:Hide() end local function GetFuncName(option) - local type = option.type - if type == "execute" then + if option.type == "execute" then return "func" else return "set" end end -local function confirmPopup(appName, rootframe, basepath, info, message, func, ...) - if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then - StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {} - end - local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] - for k in pairs(t) do - t[k] = nil - end - t.text = message - t.button1 = ACCEPT - t.button2 = CANCEL - t.preferredIndex = STATICPOPUP_NUMDIALOGS - local dialog, oldstrata - t.OnAccept = function() - safecall(func, unpack(t)) - if dialog and oldstrata then - dialog:SetFrameStrata(oldstrata) - end - AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) - del(info) - end - t.OnCancel = function() - if dialog and oldstrata then - dialog:SetFrameStrata(oldstrata) - end - AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) - del(info) - end - for i = 1, select("#", ...) do - t[i] = select(i, ...) or false - end - t.timeout = 0 - t.whileDead = 1 - t.hideOnEscape = 1 +do + local InCombatLockdown = InCombatLockdown + local frame = AceConfigDialog.popup + if not frame or oldminor < 81 then + frame = CreateFrame("Frame", nil, UIParent) + AceConfigDialog.popup = frame + frame:Hide() + frame:SetPoint("CENTER", UIParent, "CENTER") + frame:SetSize(320, 72) + frame:EnableMouse(true) -- Do not allow click-through on the frame + frame:SetFrameStrata("TOOLTIP") + frame:SetFrameLevel(100) -- Lots of room to draw under it + frame:SetScript("OnKeyDown", function(self, key) + if key == "ESCAPE" then + if not InCombatLockdown() then + self:SetPropagateKeyboardInput(false) + end + if self.cancel:IsShown() then + self.cancel:Click() + else -- Showing a validation error + self:Hide() + end + elseif not InCombatLockdown() then + self:SetPropagateKeyboardInput(true) + end + end) - dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG") - if dialog then - oldstrata = dialog:GetFrameStrata() - dialog:SetFrameStrata("TOOLTIP") + local border = CreateFrame("Frame", nil, frame, "DialogBorderOpaqueTemplate") + border:SetAllPoints(frame) + frame:SetFixedFrameStrata(true) + frame:SetFixedFrameLevel(true) + + local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight") + text:SetSize(290, 0) + text:SetPoint("TOP", 0, -16) + frame.text = text + + local function newButton(newText) + local button = CreateFrame("Button", nil, frame) + button:SetSize(128, 21) + button:SetNormalFontObject(GameFontNormal) + button:SetHighlightFontObject(GameFontHighlight) + button:SetNormalTexture("Interface\\Buttons\\UI-DialogBox-Button-Up") + button:GetNormalTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) + button:SetPushedTexture("Interface\\Buttons\\UI-DialogBox-Button-Down") + button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) + button:SetHighlightTexture("Interface\\Buttons\\UI-DialogBox-Button-Highlight") + button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) + button:SetText(newText) + return button + end + + local accept = newButton(ACCEPT) + accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16) + frame.accept = accept + + local cancel = newButton(CANCEL) + cancel:SetPoint("LEFT", accept, "RIGHT", 13, 0) + frame.cancel = cancel end end +local function confirmPopup(appName, rootframe, basepath, info, message, func, ...) + local frame = AceConfigDialog.popup + frame:Show() + frame.text:SetText(message) + -- From StaticPopup.lua + -- local height = 32 + text:GetHeight() + 2; + -- height = height + 6 + accept:GetHeight() + -- We add 32 + 2 + 6 + 21 (button height) == 61 + local height = 61 + frame.text:GetHeight() + frame:SetHeight(height) + + frame.accept:ClearAllPoints() + frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16) + frame.cancel:Show() + + local t = {...} + local tCount = select("#", ...) + frame.accept:SetScript("OnClick", function(self) + safecall(func, unpack(t, 1, tCount)) -- Manually set count as unpack() stops on nil (bug with #table) + AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) + frame:Hide() + self:SetScript("OnClick", nil) + frame.cancel:SetScript("OnClick", nil) + del(info) + end) + frame.cancel:SetScript("OnClick", function(self) + AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) + frame:Hide() + self:SetScript("OnClick", nil) + frame.accept:SetScript("OnClick", nil) + del(info) + end) +end local function validationErrorPopup(message) - if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then - StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {} - end - local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] - t.text = message - t.button1 = OKAY - t.preferredIndex = STATICPOPUP_NUMDIALOGS - local dialog, oldstrata - t.OnAccept = function() - if dialog and oldstrata then - dialog:SetFrameStrata(oldstrata) - end - end - t.timeout = 0 - t.whileDead = 1 - t.hideOnEscape = 1 + local frame = AceConfigDialog.popup + frame:Show() + frame.text:SetText(message) + -- From StaticPopup.lua + -- local height = 32 + text:GetHeight() + 2; + -- height = height + 6 + accept:GetHeight() + -- We add 32 + 2 + 6 + 21 (button height) == 61 + local height = 61 + frame.text:GetHeight() + frame:SetHeight(height) - dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG") - if dialog then - oldstrata = dialog:GetFrameStrata() - dialog:SetFrameStrata("TOOLTIP") - end + frame.accept:ClearAllPoints() + frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16) + frame.cancel:Hide() + + frame.accept:SetScript("OnClick", function() + frame:Hide() + end) end local function ActivateControl(widget, event, ...) @@ -686,7 +678,7 @@ local function ActivateControl(widget, event, ...) if group[funcname] ~= nil then func = group[funcname] end - handler = group.handler or handler + handler = group.handler confirm = group.confirm validate = group.validate for i = 1, #path do @@ -750,7 +742,6 @@ local function ActivateControl(widget, event, ...) end end - local rootframe = user.rootframe if not validated or type(validated) == "string" then if not validated then if usage then @@ -765,12 +756,12 @@ local function ActivateControl(widget, event, ...) end -- show validate message - if not group.validatePopup and rootframe.SetStatusText then - rootframe:SetStatusText(validated) + if user.rootframe.SetStatusText then + user.rootframe:SetStatusText(validated) else validationErrorPopup(validated) end - PlaySound("igPlayerInviteDecline") + PlaySound(882) -- SOUNDKIT.IG_PLAYER_INVITE_DECLINE || _DECLINE is actually missing from the table del(info) return true else @@ -803,14 +794,14 @@ local function ActivateControl(widget, event, ...) if type(confirm) == "boolean" then if confirm then if not confirmText then - local name, desc = option.name, option.desc - if type(name) == "function" then - name = name(info) + local option_name, desc = option.name, option.desc + if type(option_name) == "function" then + option_name = option_name(info) end if type(desc) == "function" then desc = desc(info) end - confirmText = name + confirmText = option_name if desc then confirmText = confirmText.." - "..desc end @@ -888,11 +879,6 @@ end local function ActivateSlider(widget, event, value) local option = widget:GetUserData("option") local min, max, step = option.min or (not option.softMin and 0 or nil), option.max or (not option.softMax and 100 or nil), option.step - - -- checks added by elvui - if type(min) == 'function' then min = min() end - if type(max) == 'function' then max = max() end - if min then if step then value = math_floor((value - min) / step + 0.5) * step + min @@ -1097,6 +1083,11 @@ local function InjectInfo(control, options, option, path, rootframe, appName) control:SetCallback("OnRelease", CleanUserData) control:SetCallback("OnLeave", OptionOnMouseLeave) control:SetCallback("OnEnter", OptionOnMouseOver) + + -- forward custom arg data directly + if control.SetCustomData and option.arg then + safecall(control.SetCustomData, control, option.arg) + end end local function CreateControl(userControlType, fallbackControlType) @@ -1117,11 +1108,6 @@ local function sortTblAsStrings(x,y) return tostring(x) < tostring(y) -- Support numbers as keys end --- added by ElvUI -local function sortTblByValue(x,y) - return x[2] < y[2] -end - --[[ options - root of the options table being fed container - widget that controls will be placed in @@ -1162,15 +1148,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin --Control to feed local control - local name = GetOptionsMemberValue("name", v, options, path, appName) - if v.type == "execute" then local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) local iconControl = type(image) == "string" or type(image) == "number" - control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button-ElvUI") + control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button") if iconControl then if not width then width = GetOptionsMemberValue("imageWidth",v, options, path, appName) @@ -1213,11 +1197,6 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin elseif v.type == "toggle" then control = CreateControl(v.dialogControl or v.control, "CheckBox") control:SetLabel(name) - control.textWidth = GetOptionsMemberValue("textWidth",v,options,path,appName) - if control.textWidth and control.frame and control.text then - local textWidth = control.text:GetWidth()+30 - control.customWidth = (textWidth>=width_multiplier and textWidth<=width_multiplier*1.5) and textWidth - end control:SetTriState(v.tristate) local value = GetOptionsMemberValue("get",v, options, path, appName) control:SetValue(value) @@ -1231,7 +1210,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin local image = GetOptionsMemberValue("image", v, options, path, appName) local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName) - if type(image) == "string" then + if type(image) == "string" or type(image) == "number" then if type(imageCoords) == "table" then control:SetImage(image, unpack(imageCoords)) else @@ -1271,7 +1250,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin end tsort(sorting, sortTblAsStrings) end - for k, value in ipairs(sorting) do + for _, value in ipairs(sorting) do local text = values[value] local radio = gui:Create("CheckBox") radio:SetLabel(text) @@ -1299,15 +1278,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin control:DoLayout() else control = CreateControl(v.dialogControl or v.control, "Dropdown") - local sortByValue = GetOptionsMemberValue("sortByValue",v,options,path,appName) - local itemType = v.itemControl if itemType and not gui:GetWidgetVersion(itemType) then geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType))) itemType = nil end control:SetLabel(name) - control:SetList(values, sorting, itemType, sortByValue) + control:SetList(values, sorting, itemType) local value = GetOptionsMemberValue("get",v, options, path, appName) if not values[value] then value = nil @@ -1319,20 +1296,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin elseif v.type == "multiselect" then local values = GetOptionsMemberValue("values", v, options, path, appName) local disabled = CheckOptionDisabled(v, options, path, appName) - local sortByValue = GetOptionsMemberValue("sortByValue", v, options, path, appName) local valuesort = new() if values then for value, text in pairs(values) do - tinsert(valuesort, (sortByValue and {value, text}) or value) + tinsert(valuesort, value) end end - - if sortByValue then - tsort(valuesort, sortTblByValue) - else - tsort(valuesort) - end + tsort(valuesort) local controlType = v.dialogControl or v.control if controlType then @@ -1361,76 +1332,42 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin control:SetWidth(width_multiplier) end --check:SetTriState(v.tristate) - for i = 1, #valuesort do - local key = (sortByValue and valuesort[i][1]) or valuesort[i] + for s = 1, #valuesort do + local key = valuesort[s] local value = GetOptionsMemberValue("get",v, options, path, appName, key) control:SetItemValue(key,value) end else - local width = GetOptionsMemberValue("width",v,options,path,appName) - local dragdrop = GetOptionsMemberValue("dragdrop",v,options,path,appName) - control = gui:Create("InlineGroup") control:SetLayout("Flow") control:SetTitle(name) control.width = "fill" control:PauseLayout() - - for i = 1, #valuesort do - local value = (sortByValue and valuesort[i][1]) or valuesort[i] + local width = GetOptionsMemberValue("width",v,options,path,appName) + for s = 1, #valuesort do + local value = valuesort[s] local text = values[value] - if dragdrop then - local button = gui:Create("Button-ElvUI") - button:SetDisabled(disabled) - button:SetUserData("value", value) - button:SetUserData("text", text) - local state = v.stateSwitchGetText and v.stateSwitchGetText(button, text, value) - button:SetText(format("|cFF888888%d|r %s", i, state or text)) - button.stateSwitchOnClick = v.stateSwitchOnClick - button.dragOnMouseDown = v.dragOnMouseDown - button.dragOnMouseUp = v.dragOnMouseUp - button.dragOnEnter = v.dragOnEnter - button.dragOnLeave = v.dragOnLeave - button.dragOnClick = v.dragOnClick - button.dragdrop = true - button.ActivateMultiControl = ActivateMultiControl - button.value = GetOptionsMemberValue("get",v, options, path, appName, value) - InjectInfo(button, options, v, path, rootframe, appName) - control:AddChild(button) - if width == "double" then - button:SetWidth(width_multiplier * 2) - elseif width == "half" then - button:SetWidth(width_multiplier / 2) - elseif (type(width) == "number") then - control:SetWidth(width_multiplier * width) - elseif width == "full" then - button.width = "fill" - else - button:SetWidth(width_multiplier) - end + local check = gui:Create("CheckBox") + check:SetLabel(text) + check:SetUserData("value", value) + check:SetUserData("text", text) + check:SetDisabled(disabled) + check:SetTriState(v.tristate) + check:SetValue(GetOptionsMemberValue("get",v, options, path, appName, value)) + check:SetCallback("OnValueChanged",ActivateMultiControl) + InjectInfo(check, options, v, path, rootframe, appName) + control:AddChild(check) + if width == "double" then + check:SetWidth(width_multiplier * 2) + elseif width == "half" then + check:SetWidth(width_multiplier / 2) + elseif (type(width) == "number") then + check:SetWidth(width_multiplier * width) + elseif width == "full" then + check.width = "fill" else - local check = gui:Create("CheckBox") - check:SetLabel(text) - check:SetUserData("value", value) - check:SetUserData("text", text) - check:SetDisabled(disabled) - check:SetTriState(v.tristate) - check:SetValue(GetOptionsMemberValue("get",v, options, path, appName, value)) - check:SetCallback("OnValueChanged",ActivateMultiControl) - InjectInfo(check, options, v, path, rootframe, appName) - control:AddChild(check) - if width == "double" then - check:SetWidth(width_multiplier * 2) - elseif width == "half" then - check:SetWidth(width_multiplier / 2) - elseif (type(width) == "number") then - control:SetWidth(width_multiplier * width) - elseif width == "full" then - check.width = "fill" - else - check:SetWidth(width_multiplier) - end + check:SetWidth(width_multiplier) end end control:ResumeLayout() @@ -1442,7 +1379,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin del(valuesort) elseif v.type == "color" then - control = CreateControl(v.dialogControl or v.control, "ColorPicker-ElvUI") + control = CreateControl(v.dialogControl or v.control, "ColorPicker") control:SetLabel(name) control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName)) control:SetColor(GetOptionsMemberValue("get",v, options, path, appName)) @@ -1476,7 +1413,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) - if type(image) == "string" then + if type(image) == "string" or type(image) == "number" then if not width then width = GetOptionsMemberValue("imageWidth",v, options, path, appName) end @@ -1496,29 +1433,27 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin end control:SetImageSize(width, height) end - local width = GetOptionsMemberValue("width",v,options,path,appName) - control.width = not width and "fill" + local controlWidth = GetOptionsMemberValue("width",v,options,path,appName) + control.width = not controlWidth and "fill" end --Common Init if control then - local customWidth = control.customWidth or GetOptionsMemberValue("customWidth",v,options,path,appName) - if control.width ~= "fill" or customWidth then - if customWidth then - control:SetWidth(customWidth) + if control.width ~= "fill" then + local width = GetOptionsMemberValue("width",v,options,path,appName) + local relWidth = GetOptionsMemberValue("relWidth",v,options,path,appName) + if width == "double" then + control:SetWidth(width_multiplier * 2) + elseif width == "half" then + control:SetWidth(width_multiplier / 2) + elseif (type(width) == "number") then + control:SetWidth(width_multiplier * width) + elseif width == "relative" and relWidth then + control:SetRelativeWidth(relWidth) + elseif width == "full" then + control.width = "fill" else - local width = GetOptionsMemberValue("width",v,options,path,appName) - if width == "double" then - control:SetWidth(width_multiplier * 2) - elseif width == "half" then - control:SetWidth(width_multiplier / 2) - elseif (type(width) == "number") then - control:SetWidth(width_multiplier * width) - elseif width == "full" then - control.width = "fill" - else - control:SetWidth(width_multiplier) - end + control:SetWidth(width_multiplier) end end if control.SetDisabled then @@ -1554,6 +1489,7 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) local option = user.option local path = user.path local appName = user.appName + local tooltip = AceConfigDialog.tooltip local feedpath = new() for i = 1, #path do @@ -1570,24 +1506,25 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) local name = GetOptionsMemberValue("name", group, options, feedpath, appName) local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName) - if type(desc) == "string" then - GameTooltip:SetOwner(button, "ANCHOR_CURSOR") - if widget.type == "TabGroup" then - GameTooltip:SetPoint("BOTTOM",button,"TOP") - else - GameTooltip:SetPoint("LEFT",button,"RIGHT") - end - - GameTooltip:SetText(name, 1, .82, 0, 1) - - GameTooltip:AddLine(desc, 1, 1, 1, 1) - - GameTooltip:Show() + tooltip:SetOwner(button, "ANCHOR_NONE") + tooltip:ClearAllPoints() + if widget.type == "TabGroup" then + tooltip:SetPoint("BOTTOM",button,"TOP") + else + tooltip:SetPoint("LEFT",button,"RIGHT") end + + tooltip:SetText(name, 1, .82, 0, 1, true) + + if type(desc) == "string" then + tooltip:AddLine(desc, 1, 1, 1, true) + end + + tooltip:Show() end local function TreeOnButtonLeave(widget, event, value, button) - GameTooltip:Hide() + AceConfigDialog.tooltip:Hide() end @@ -1755,29 +1692,29 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR elseif grouptype == "select" then - local select = gui:Create("DropdownGroup") - select:SetTitle(name) - InjectInfo(select, options, group, path, rootframe, appName) - select:SetCallback("OnGroupSelected", GroupSelected) + local selectGroup = gui:Create("DropdownGroup") + selectGroup:SetTitle(name) + InjectInfo(selectGroup, options, group, path, rootframe, appName) + selectGroup:SetCallback("OnGroupSelected", GroupSelected) local status = AceConfigDialog:GetStatusTable(appName, path) if not status.groups then status.groups = {} end - select:SetStatusTable(status.groups) + selectGroup:SetStatusTable(status.groups) local grouplist, orderlist = BuildSelect(group, options, path, appName) - select:SetGroupList(grouplist, orderlist) - select:SetUserData("grouplist", grouplist) - select:SetUserData("orderlist", orderlist) + selectGroup:SetGroupList(grouplist, orderlist) + selectGroup:SetUserData("grouplist", grouplist) + selectGroup:SetUserData("orderlist", orderlist) local firstgroup = orderlist[1] if firstgroup then - select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup) + selectGroup:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup) end - select.width = "fill" - select.height = "fill" + selectGroup.width = "fill" + selectGroup.height = "fill" - container:AddChild(select) + container:AddChild(selectGroup) --assume tree group by default --if parenttype is tree then this group is already a node on that tree @@ -2005,17 +1942,19 @@ end -- convert pre-39 BlizOptions structure to the new format if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then local old = AceConfigDialog.BlizOptions - local new = {} + local newOpt = {} for key, widget in pairs(old) do local appName = widget:GetUserData("appName") - if not new[appName] then new[appName] = {} end - new[appName][key] = widget + if not newOpt[appName] then newOpt[appName] = {} end + newOpt[appName][key] = widget end - AceConfigDialog.BlizOptions = new + AceConfigDialog.BlizOptions = newOpt else AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {} end +AceConfigDialog.BlizOptionsIDMap = AceConfigDialog.BlizOptionsIDMap or {} + local function FeedToBlizPanel(widget, event) local path = widget:GetUserData("path") AceConfigDialog:Open(widget:GetUserData("appName"), widget, unpack(path or emptyTbl)) @@ -2037,15 +1976,17 @@ end -- has to be a head-level note. -- -- This function returns a reference to the container frame registered with the Interface --- Options. You can use this reference to open the options with the API function --- `InterfaceOptionsFrame_OpenToCategory`. +-- Options, as well as the registered ID. You can use the ID to open the options with +-- the API function `Settings.OpenToCategory`. -- @param appName The application name as given to `:RegisterOptionsTable()` -- @param name A descriptive name to display in the options tree (defaults to appName) -- @param parent The parent to use in the interface options tree. -- @param ... The path in the options table to feed into the interface options panel. -- @return The reference to the frame registered into the Interface Options. +-- @return The category ID to pass to Settings.OpenToCategory function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...) local BlizOptions = AceConfigDialog.BlizOptions + local BlizOptionsIDMap = AceConfigDialog.BlizOptionsIDMap local key = appName for n = 1, select("#", ...) do @@ -2059,7 +2000,6 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...) if not BlizOptions[appName][key] then local group = gui:Create("BlizOptionsGroup") BlizOptions[appName][key] = group - group:SetName(name or appName, parent) group:SetTitle(name or appName) group:SetUserData("appName", appName) @@ -2072,8 +2012,42 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...) end group:SetCallback("OnShow", FeedToBlizPanel) group:SetCallback("OnHide", ClearBlizPanel) - InterfaceOptions_AddCategory(group.frame) - return group.frame + + local categoryName = name or appName + -- CoA-compat: the Settings.* API (GetCategory / RegisterCanvasLayoutCategory / + -- RegisterCanvasLayoutSubcategory / RegisterAddOnCategory) is a retail-only + -- (Dragonflight+) replacement for the WotLK-era InterfaceOptions_AddCategory. + -- On the 3.3.5-based CoA client Settings is nil, so fall back to the legacy API. + if Settings and Settings.GetCategory then + if parent then + local parentID = BlizOptionsIDMap[parent] or parent + local category = Settings.GetCategory(parentID) + if not category then + error(("The parent category '%s' was not found"):format(parent), 2) + end + local subcategory = Settings.RegisterCanvasLayoutSubcategory(category, group.frame, categoryName) + group:SetName(subcategory.ID, parentID) + else + if BlizOptionsIDMap[categoryName] then + error(("%s has already been added to the Blizzard Options Window with the given name: %s"):format(appName, categoryName), 2) + end + + local category = Settings.RegisterCanvasLayoutCategory(group.frame, categoryName) + if not (C_SettingsUtil and C_SettingsUtil.OpenSettingsPanel) then + -- override the ID so the name can be used in Settings.OpenToCategory + -- unfortunately with incoming API changes in 12.0 (and likely classic at some point) this override is no longer possible + category.ID = categoryName + end + group:SetName(category.ID) + BlizOptionsIDMap[categoryName] = category.ID + Settings.RegisterAddOnCategory(category) + end + else + group:SetName(name or appName, parent) + InterfaceOptions_AddCategory(group.frame) + end + + return group.frame, group.frame.name else error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2) end diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua index 2ea2220..72e9c60 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua @@ -11,7 +11,7 @@ -- @release $Id$ local CallbackHandler = LibStub("CallbackHandler-1.0") -local MAJOR, MINOR = "AceConfigRegistry-3.0-ElvUI", 20 +local MAJOR, MINOR = "AceConfigRegistry-3.0", 22 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigRegistry then return end @@ -57,8 +57,8 @@ local istable={["table"]=true, _="table"} local ismethodtable={["table"]=true,["string"]=true,["function"]=true, _="methodname, funcref or table"} local optstring={["nil"]=true,["string"]=true, _="string"} local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"} +local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"} local optnumber={["nil"]=true,["number"]=true, _="number"} -local optnumberfunc={["nil"]=true,["number"]=true,["function"]=true,_="number"} -- added by ElvUI for range local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true}, _="methodname, funcref or false"} local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true, _="methodname, funcref or number"} local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true, _="methodname, funcref or table"} @@ -75,7 +75,6 @@ local basekeys={ descStyle=optstring, order=optmethodnumber, validate=optmethodfalse, - validatePopup=optbool, --ElvUI confirm=optmethodbool, confirmText=optstring, disabled=optmethodbool, @@ -84,7 +83,8 @@ local basekeys={ dialogHidden=optmethodbool, dropdownHidden=optmethodbool, cmdHidden=optmethodbool, - icon=optstringfunc, + tooltipHyperlink=optstringfunc, + icon=optstringnumberfunc, iconCoords=optmethodtable, handler=opttable, get=optmethodfalse, @@ -92,18 +92,7 @@ local basekeys={ func=optmethodfalse, arg={["*"]=true}, width=optstringnumber, - -- below here were created by ElvUI -- - customWidth=optnumber, - textWidth=optmethodbool, - sortByValue=optmethodbool, - dragdrop=optmethodbool, - dragOnEnter=optmethodfalse, - dragOnLeave=optmethodfalse, - dragOnClick=optmethodfalse, - dragOnMouseUp=optmethodfalse, - dragOnMouseDown=optmethodfalse, - stateSwitchOnClick=optmethodfalse, - stateSwitchGetText=optmethodfalse, + relWidth=optnumber, } local typedkeys={ @@ -113,7 +102,7 @@ local typedkeys={ dropdownControl=optstring, }, description={ - image=optstringfunc, + image=optstringnumberfunc, imageCoords=optmethodtable, imageHeight=optnumber, imageWidth=optnumber, @@ -133,7 +122,7 @@ local typedkeys={ childGroups=optstring, }, execute={ - image=optstringfunc, + image=optstringnumberfunc, imageCoords=optmethodtable, imageHeight=optnumber, imageWidth=optnumber, @@ -151,7 +140,7 @@ local typedkeys={ }, toggle={ tristate=optbool, - image=optstringfunc, + image=optstringnumberfunc, imageCoords=optmethodtable, control=optstring, dialogControl=optstring, @@ -160,12 +149,12 @@ local typedkeys={ tristate={ }, range={ - min=optnumberfunc, --ElvUI - softMin=optnumberfunc, --ElvUI - max=optnumberfunc, --ElvUI - softMax=optnumberfunc, --ElvUI + min=optnumber, + softMin=optnumber, + max=optnumber, + softMax=optnumber, step=optnumber, - bigStep=optnumberfunc, --ElvUI + bigStep=optnumber, isPercent=optbool, control=optstring, dialogControl=optstring, diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceDBOptions-3.0/AceDBOptions-3.0.lua b/ElvUI_OptionsUI/Libraries/Ace3/AceDBOptions-3.0/AceDBOptions-3.0.lua index 3c23951..b91082b 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceDBOptions-3.0/AceDBOptions-3.0.lua +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceDBOptions-3.0/AceDBOptions-3.0.lua @@ -13,10 +13,6 @@ local pairs, next = pairs, next -- WoW APIs local UnitClass = UnitClass --- Global vars/functions that we don't upvalue since they might get hooked, or upgraded --- List them here for Mikk's FindGlobals script --- GLOBALS: NORMAL_FONT_COLOR_CODE, FONT_COLOR_CODE_CLOSE - AceDBOptions.optionTables = AceDBOptions.optionTables or {} AceDBOptions.handlers = AceDBOptions.handlers or {} @@ -88,25 +84,25 @@ elseif LOCALE == "frFR" then L["reset_desc"] = "Réinitialise le profil actuel au cas où votre configuration est corrompue ou si vous voulez tout simplement faire table rase." L["reset_sub"] = "Réinitialise le profil actuel avec les paramètres par défaut." elseif LOCALE == "koKR" then - L["choose"] = "저장 중인 프로필" - L["choose_desc"] = "입력창에 새로운 이름을 입력하거나 저장 중인 프로필 중 하나를 선택하여 새로운 프로필을 만들 수 있습니다." + L["choose"] = "기존 프로필" + L["choose_desc"] = "편집 상자에 이름을 입력하여 새로운 프로필을 만들거나 이미 존재하는 프로필 중 하나를 선택할 수 있습니다." L["choose_sub"] = "현재 이용할 수 있는 프로필 중 하나를 선택합니다." - L["copy"] = "복사해오기" - L["copy_desc"] = "현재 사용 중인 프로필에 선택한 프로필의 설정을 복사합니다." + L["copy"] = "복사해 올 프로필" + L["copy_desc"] = "기존 프로필의 설정을 현재 활성화된 프로필로 복사합니다." L["current"] = "현재 프로필:" L["default"] = "기본값" L["delete"] = "프로필 삭제" - L["delete_confirm"] = "정말로 선택한 프로필을 삭제할까요?" - L["delete_desc"] = "저장 공간 절약과 SavedVariables 파일의 정리를 위해 데이터베이스에서 사용하지 않는 프로필을 삭제하세요." - L["delete_sub"] = "데이터베이스의 프로필을 삭제합니다." - L["intro"] = "활성 데이터베이스 프로필을 변경할 수 있고, 각 캐릭터 별로 다른 설정을 할 수 있습니다." + L["delete_confirm"] = "선택한 프로필을 삭제하시겠습니까?" + L["delete_desc"] = "데이터베이스에서 기존 프로필과 사용하지 않는 프로필을 삭제하여 공간을 절약하고 SavedVariables 파일을 정리합니다." + L["delete_sub"] = "데이터베이스에서 프로필을 삭제합니다." + L["intro"] = "활성 데이터베이스 프로필을 변경할 수 있으며, 모든 캐릭터마다 서로 다른 설정을 지정할 수 있습니다." L["new"] = "새로운 프로필" - L["new_sub"] = "새로운 프로필을 만듭니다." + L["new_sub"] = "비어 있는 프로필을 새로 만듭니다." L["profiles"] = "프로필" L["profiles_sub"] = "프로필 관리" - L["reset"] = "프로필 초기화" - L["reset_desc"] = "설정이 깨졌거나 처음부터 다시 설정을 원하는 경우, 현재 프로필을 기본값으로 초기화하세요." - L["reset_sub"] = "현재 프로필을 기본값으로 초기화합니다" + L["reset"] = "프로필 재설정" + L["reset_desc"] = "구성이 손상되었거나 처음부터 다시 시작하고 싶은 경우 현재 프로필을 기본값으로 재설정하세요." + L["reset_sub"] = "현재 프로필을 기본값으로 재설정합니다" elseif LOCALE == "esES" or LOCALE == "esMX" then L["choose"] = "Perfiles existentes" L["choose_desc"] = "Puedes crear un nuevo perfil introduciendo un nombre en el recuadro o puedes seleccionar un perfil de los ya existentes." @@ -170,31 +166,31 @@ elseif LOCALE == "zhCN" then elseif LOCALE == "ruRU" then L["choose"] = "Существующие профили" L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей." - L["choose_sub"] = "Выбор одиного из уже доступных профилей" + L["choose_sub"] = "Выбор одного из уже доступных профилей." L["copy"] = "Скопировать из" - L["copy_desc"] = "Скопировать настройки из выбранного профиля в активный." + L["copy_desc"] = "Копирование настроек из выбранного профиля в активный." L["current"] = "Текущий профиль:" L["default"] = "По умолчанию" L["delete"] = "Удалить профиль" - L["delete_confirm"] = "Вы уверены, что вы хотите удалить выбранный профиль?" - L["delete_desc"] = "Удалить существующий и неиспользуемый профиль из БД для сохранения места, и очистить SavedVariables файл." - L["delete_sub"] = "Удаление профиля из БД" - L["intro"] = "Изменяя активный профиль, вы можете задать различные настройки модификаций для каждого персонажа." + L["delete_confirm"] = "Вы уверены, что хотите удалить выбранный профиль?" + L["delete_desc"] = "Удаление существующего и неиспользуемого профиля из базы данных для сохранения места, и очистка файла SavedVariables." + L["delete_sub"] = "Удаление профиля из базы данных." + L["intro"] = "Изменяя активный профиль, Вы можете задать разные настройки для каждого персонажа." L["new"] = "Новый" - L["new_sub"] = "Создать новый чистый профиль" + L["new_sub"] = "Создание нового чистого профиля." L["profiles"] = "Профили" L["profiles_sub"] = "Управление профилями" - L["reset"] = "Сброс профиля" - L["reset_desc"] = "Сбросить текущий профиль к стандартным настройкам, если ваша конфигурация испорчена или вы хотите настроить всё заново." + L["reset"] = "Сбросить профиль" + L["reset_desc"] = "Сброс текущего профиля к стандартным настройкам, если Ваша конфигурация испорчена или Вы хотите настроить все заново." L["reset_sub"] = "Сброс текущего профиля на стандартный" elseif LOCALE == "itIT" then L["choose"] = "Profili Esistenti" L["choose_desc"] = "Puoi creare un nuovo profilo digitando il nome della casella di testo, oppure scegliendone uno tra i profili già esistenti." L["choose_sub"] = "Seleziona uno dei profili attualmente disponibili." L["copy"] = "Copia Da" - L["copy_desc"] = "Copia le impostazioni da un profilo esistente, nel profilo attivo in questo momento." + L["copy_desc"] = "Copia le impostazioni da un profilo esistente nel profilo attivo in questo momento." L["current"] = "Profilo Attivo:" - L["default"] = "Standard" + L["default"] = "Predefinito" L["delete"] = "Cancella un Profilo" L["delete_confirm"] = "Sei sicuro di voler cancellare il profilo selezionato?" L["delete_desc"] = "Cancella i profili non utilizzati dal database per risparmiare spazio e mantenere puliti i file di configurazione SavedVariables." diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.lua b/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.lua index 07b5217..35b176e 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.lua +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.lua @@ -31,26 +31,21 @@ local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) if not AceGUI then return end -- No upgrade needed -- Lua APIs -local tconcat, tinsert = table.concat, table.insert +local tinsert, wipe = table.insert, table.wipe local select, pairs, next, type = select, pairs, next, type -local error, assert, loadstring = error, assert, loadstring -local setmetatable, rawget, rawset = setmetatable, rawget, rawset -local math_max = math.max +local error, assert = error, assert +local setmetatable, rawget = setmetatable, rawget +local math_max, math_min, math_ceil = math.max, math.min, math.ceil -- WoW APIs local UIParent = UIParent --- Global vars/functions that we don't upvalue since they might get hooked, or upgraded --- List them here for Mikk's FindGlobals script --- GLOBALS: geterrorhandler, LibStub - ---local con = LibStub("AceConsole-3.0",true) - AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {} AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {} AceGUI.WidgetBase = AceGUI.WidgetBase or {} AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {} AceGUI.WidgetVersions = AceGUI.WidgetVersions or {} +AceGUI.tooltip = AceGUI.tooltip or CreateFrame("GameTooltip", "AceGUITooltip", UIParent, "GameTooltipTemplate") -- local upvalues local WidgetRegistry = AceGUI.WidgetRegistry @@ -66,39 +61,10 @@ local function errorhandler(err) return geterrorhandler()(err) end -local function CreateDispatcher(argCount) - local code = [[ - local xpcall, eh = ... - local method, ARGS - local function call() return method(ARGS) end - - local function dispatch(func, ...) - method = func - if not method then return end - ARGS = ... - return xpcall(call, eh) - end - - return dispatch - ]] - - local ARGS = {} - for i = 1, argCount do ARGS[i] = "arg"..i end - code = code:gsub("ARGS", tconcat(ARGS, ", ")) - return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler) -end - -local Dispatchers = setmetatable({}, {__index=function(self, argCount) - local dispatcher = CreateDispatcher(argCount) - rawset(self, argCount, dispatcher) - return dispatcher -end}) -Dispatchers[0] = function(func) - return xpcall(func, errorhandler) -end - local function safecall(func, ...) - return Dispatchers[select("#", ...)](func, ...) + if func then + return xpcall(func, errorhandler, ...) + end end -- Recycling functions @@ -122,38 +88,38 @@ do AceGUI.objPools = AceGUI.objPools or {} local objPools = AceGUI.objPools --Returns a new instance, if none are available either returns a new table or calls the given contructor - function newWidget(type) - if not WidgetRegistry[type] then + function newWidget(widgetType) + if not WidgetRegistry[widgetType] then error("Attempt to instantiate unknown widget type", 2) end - if not objPools[type] then - objPools[type] = {} + if not objPools[widgetType] then + objPools[widgetType] = {} end - local newObj = next(objPools[type]) + local newObj = next(objPools[widgetType]) if not newObj then - newObj = WidgetRegistry[type]() - newObj.AceGUIWidgetVersion = WidgetVersions[type] + newObj = WidgetRegistry[widgetType]() + newObj.AceGUIWidgetVersion = WidgetVersions[widgetType] else - objPools[type][newObj] = nil + objPools[widgetType][newObj] = nil -- if the widget is older then the latest, don't even try to reuse it -- just forget about it, and grab a new one. - if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then - return newWidget(type) + if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[widgetType] then + return newWidget(widgetType) end end return newObj end -- Releases an instance to the Pool - function delWidget(obj,type) - if not objPools[type] then - objPools[type] = {} + function delWidget(obj,widgetType) + if not objPools[widgetType] then + objPools[widgetType] = {} end - if objPools[type][obj] then + if objPools[widgetType][obj] then error("Attempt to Release Widget that is already released", 2) end - objPools[type][obj] = true + objPools[widgetType][obj] = true end end @@ -169,9 +135,9 @@ end -- OnAcquire function on it, before returning. -- @param type The type of the widget. -- @return The newly created widget. -function AceGUI:Create(type) - if WidgetRegistry[type] then - local widget = newWidget(type) +function AceGUI:Create(widgetType) + if WidgetRegistry[widgetType] then + local widget = newWidget(widgetType) if rawget(widget, "Acquire") then widget.OnAcquire = widget.Acquire @@ -189,7 +155,7 @@ function AceGUI:Create(type) if widget.OnAcquire then widget:OnAcquire() else - error(("Widget type %s doesn't supply an OnAcquire Function"):format(type)) + error(("Widget type %s doesn't supply an OnAcquire Function"):format(widgetType)) end -- Set the default Layout ("List") safecall(widget.SetLayout, widget, "List") @@ -617,25 +583,25 @@ AceGUI.counts = AceGUI.counts or {} -- This is used by widgets that require a named frame, e.g. when a Blizzard -- Template requires it. -- @param type The widget type -function AceGUI:GetNextWidgetNum(type) - if not self.counts[type] then - self.counts[type] = 0 +function AceGUI:GetNextWidgetNum(widgetType) + if not self.counts[widgetType] then + self.counts[widgetType] = 0 end - self.counts[type] = self.counts[type] + 1 - return self.counts[type] + self.counts[widgetType] = self.counts[widgetType] + 1 + return self.counts[widgetType] end --- Return the number of created widgets for this type. -- In contrast to GetNextWidgetNum, the number is not incremented. --- @param type The widget type -function AceGUI:GetWidgetCount(type) - return self.counts[type] or 0 +-- @param widgetType The widget type +function AceGUI:GetWidgetCount(widgetType) + return self.counts[widgetType] or 0 end --- Return the version of the currently registered widget type. --- @param type The widget type -function AceGUI:GetWidgetVersion(type) - return WidgetVersions[type] +-- @param widgetType The widget type +function AceGUI:GetWidgetVersion(widgetType) + return WidgetVersions[widgetType] end ------------- @@ -798,7 +764,6 @@ AceGUI:RegisterLayout("Flow", usedwidth = 0 rowstart = frame - rowstartoffset = frameoffset if child.DoLayout then child:DoLayout() @@ -841,7 +806,8 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child) or colObj and (colObj["align" .. dir] or colObj.align) or tableObj["align" .. dir] or tableObj.align or "CENTERLEFT" - local child, cell, val = child or 0, cell or 0, nil + local val + child, cell = child or 0, cell or 0 if type(fn) == "string" then fn = fn:lower() @@ -855,7 +821,7 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child) val = fn end - return fn, max(0, min(val, cell)) + return fn, math_max(0, math_min(val, cell)) end -- Get width or height for multiple cells combined @@ -864,7 +830,7 @@ local GetCellDimension = function (dir, laneDim, from, to, space) for cell=from,to do dim = dim + (laneDim[cell] or 0) end - return dim + max(0, to - from) * (space or 0) + return dim + math_max(0, to - from) * (space or 0) end --[[ Options @@ -910,7 +876,7 @@ AceGUI:RegisterLayout("Table", repeat n = n + 1 local col = (n - 1) % #cols + 1 - local row = ceil(n / #cols) + local row = math_ceil(n / #cols) local rowspan = rowspans[col] local cell = rowspan and rowspan.child or child local cellObj = cell:GetUserData("cell") @@ -926,7 +892,7 @@ AceGUI:RegisterLayout("Table", end -- Colspan - local colspan = max(0, min((cellObj and cellObj.colspan or 1) - 1, #cols - col)) + local colspan = math_max(0, math_min((cellObj and cellObj.colspan or 1) - 1, #cols - col)) n = n + colspan -- Place the cell @@ -943,7 +909,7 @@ AceGUI:RegisterLayout("Table", end end - local rows = ceil(n / #cols) + local rows = math_ceil(n / #cols) -- Determine fixed size cols and collect weights local extantH, totalWeight = totalH, 0 @@ -968,16 +934,16 @@ AceGUI:RegisterLayout("Table", f:ClearAllPoints() local childH = f:GetWidth() or 0 - laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH)) + laneH[col] = math_max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH)) end end - laneH[col] = max(colObj.min or colObj[1] or 0, min(laneH[col], colObj.max or colObj[2] or laneH[col])) + laneH[col] = math_max(colObj.min or colObj[1] or 0, math_min(laneH[col], colObj.max or colObj[2] or laneH[col])) else -- Rel./Abs. width laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width end - extantH = max(0, extantH - laneH[col]) + extantH = math_max(0, extantH - laneH[col]) end end @@ -1016,7 +982,7 @@ AceGUI:RegisterLayout("Table", child:DoLayout() end - rowV = max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV)) + rowV = math_max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV)) end end diff --git a/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.xml b/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.xml index 843a3dc..b515077 100644 --- a/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.xml +++ b/ElvUI_OptionsUI/Libraries/Ace3/AceGUI-3.0/AceGUI-3.0.xml @@ -13,7 +13,6 @@