diff --git a/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.lua b/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.lua
index 603ce07..00e4e48 100644
--- a/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -30,7 +30,7 @@
-- @name AceAddon-3.0.lua
-- @release $Id$
-local MAJOR, MINOR = "AceAddon-3.0", 12
+local MAJOR, MINOR = "AceAddon-3.0", 13
local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceAddon then return end -- No Upgrade needed.
@@ -49,10 +49,6 @@ local select, pairs, next, type, unpack = select, pairs, next, type, unpack
local loadstring, assert, error = loadstring, assert, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, 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: LibStub, IsLoggedIn, geterrorhandler
-
--[[
xpcall safecall implementation
]]
@@ -62,43 +58,12 @@ 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, ...)
-- we check to see if the func is passed is actually a function here and don't error when it isn't
-- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
-- present execution should continue without hinderance
if type(func) == "function" then
- return Dispatchers[select('#', ...)](func, ...)
+ return xpcall(func, errorhandler, ...)
end
end
@@ -632,10 +597,20 @@ function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
+-- Blizzard AddOns which can load very early in the loading process and mess with Ace3 addon loading
+local BlizzardEarlyLoadAddons = {
+ Blizzard_DebugTools = true,
+ Blizzard_TimeManager = true,
+ Blizzard_BattlefieldMap = true,
+ Blizzard_MapCanvas = true,
+ Blizzard_SharedMapDataProviders = true,
+ Blizzard_CombatLog = true,
+}
+
-- Event Handling
local function onEvent(this, event, arg1)
- -- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up
- if (event == "ADDON_LOADED" and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then
+ -- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process
+ if (event == "ADDON_LOADED" and (arg1 == nil or not BlizzardEarlyLoadAddons[arg1])) or event == "PLAYER_LOGIN" then
-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
while(#AceAddon.initializequeue > 0) do
local addon = tremove(AceAddon.initializequeue, 1)
@@ -671,4 +646,4 @@ if oldminor and oldminor < 10 then
tinsert(addon.orderedModules, module)
end
end
-end
\ No newline at end of file
+end
diff --git a/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.xml b/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.xml
new file mode 100644
index 0000000..e6ad639
--- /dev/null
+++ b/Kui_Nameplates/Libs/AceAddon-3.0/AceAddon-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfig-3.0.lua b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfig-3.0.lua
index 3bedf8c..1c9454a 100644
--- a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfig-3.0.lua
+++ b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfig-3.0.lua
@@ -3,7 +3,7 @@
-- as well as associate it with a slash command.
-- @class file
-- @name AceConfig-3.0
--- @release $Id: AceConfig-3.0.lua 969 2010-10-07 02:11:48Z shefki $
+-- @release $Id$
--[[
AceConfig-3.0
@@ -12,13 +12,14 @@ Very light wrapper library that combines all the AceConfig subcomponents into on
]]
-local MAJOR, MINOR = "AceConfig-3.0", 2
+local cfgreg = LibStub("AceConfigRegistry-3.0")
+local cfgcmd = LibStub("AceConfigCmd-3.0")
+
+local MAJOR, MINOR = "AceConfig-3.0", 3
local AceConfig = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfig then return end
-local cfgreg = LibStub("AceConfigRegistry-3.0")
-local cfgcmd = LibStub("AceConfigCmd-3.0")
--TODO: local cfgdlg = LibStub("AceConfigDialog-3.0", true)
--TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0", true)
@@ -26,7 +27,7 @@ local cfgcmd = LibStub("AceConfigCmd-3.0")
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
@@ -44,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs
function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
if not ok then error(msg, 2) end
-
+
if slashcmd then
if type(slashcmd) == "table" then
for _,cmd in pairs(slashcmd) do
diff --git a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index e764a99..9e883a2 100644
--- a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
@@ -1,7 +1,7 @@
--- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file
-- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 904 2009-12-13 11:56:37Z nevcairiel $
+-- @release $Id$
--[[
AceConfigCmd-3.0
@@ -14,8 +14,9 @@ REQUIRES: AceConsole-3.0 for command registration (loaded on demand)
-- TODO: plugin args
+local cfgreg = LibStub("AceConfigRegistry-3.0")
-local MAJOR, MINOR = "AceConfigCmd-3.0", 12
+local MAJOR, MINOR = "AceConfigCmd-3.0", 14
local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigCmd then return end
@@ -23,7 +24,6 @@ if not AceConfigCmd then return end
AceConfigCmd.commands = AceConfigCmd.commands or {}
local commands = AceConfigCmd.commands
-local cfgreg = LibStub("AceConfigRegistry-3.0")
local AceConsole -- LoD
local AceConsoleName = "AceConsole-3.0"
@@ -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
@@ -63,7 +56,7 @@ local funcmsg = "expected function or member name"
-- pickfirstset() - picks the first non-nil value and returns it
-local function pickfirstset(...)
+local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
@@ -120,7 +113,7 @@ local function callfunction(info, tab, methodtype, ...)
info.arg = tab.arg
info.option = tab
info.type = tab.type
-
+
if type(method)=="function" then
return method(info, ...)
else
@@ -131,7 +124,7 @@ end
-- do_final() - do the final step (set/execute) along with validation and confirmation
local function do_final(info, inputpos, tab, methodtype, ...)
- if info.validate then
+ if info.validate then
local res = callmethod(info,inputpos,tab,"validate",...)
if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
@@ -139,7 +132,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
end
end
-- console ignores .confirm
-
+
callmethod(info,inputpos,tab,methodtype, ...)
end
@@ -152,8 +145,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
if val~=nil then
if val==false then
val=nil
- elseif not types[type(val)] then
- err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
+ elseif not types[type(val)] then
+ err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end
info[paramname] = val
info[paramname.."_at"] = depth
@@ -166,13 +159,13 @@ end
local dummytable={}
local function iterateargs(tab)
- if not tab.plugins then
- return pairs(tab.args)
+ if not tab.plugins then
+ return pairs(tab.args)
end
-
+
local argtabkey,argtab=next(tab.plugins)
local v
-
+
return function(_, k)
while argtab do
k,v = next(argtab, k)
@@ -206,18 +199,18 @@ local function showhelp(info, inputpos, tab, depth, noHead)
if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end
-
+
local sortTbl = {} -- [1..n]=name
local refTbl = {} -- [name]=tableref
-
+
for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args
tinsert(sortTbl, k)
refTbl[k] = v
end
end
-
- tsort(sortTbl, function(one, two)
+
+ tsort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then
@@ -240,7 +233,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
if o1==o2 then return tostring(one)optiontable
+-- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
@@ -346,16 +339,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
-
+
-------------------------------------------------------------------
-- Act according to .type of this table
-
+
if tab.type=="group" then
------------ group --------------------------------------------
-
+
if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-
+
-- grab next arg from input
local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
if not arg then
@@ -363,11 +356,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
return
end
nextpos=nextpos+1
-
+
-- loop .args and try to find a key with a matching name
for k,v in iterateargs(tab) do
if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-
+
-- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
info[depth+1] = k
@@ -383,8 +376,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
return handle(info,nextpos,v,depth+1)
end
end
-
- -- no match
+
+ -- no match
if retfalse then
-- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at
@@ -395,40 +388,40 @@ local function handle(info, inputpos, tab, depth, retfalse)
--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false
end
-
+
-- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return
end
-
- local str = strsub(info.input,inputpos);
-
+
+ local strInput = strsub(info.input,inputpos);
+
if tab.type=="execute" then
------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func")
-
-
+
+
elseif tab.type=="input" then
------------ input --------------------------------------------
-
+
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")
@@ -444,7 +437,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
else
b = not b
end
-
+
elseif str==L["on"] then
b = true
elseif str==L["off"] then
@@ -459,15 +452,15 @@ local function handle(info, inputpos, tab, depth, retfalse)
end
return
end
-
+
do_final(info, inputpos, tab, "set", b)
-
+
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
@@ -481,21 +474,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
return
end
-
+
do_final(info, inputpos, tab, "set", val)
-
+
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
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
-
+
if str == "" then
local b = callmethod(info, inputpos, tab, "get")
local fmt = "|cffffff78- [%s]|r %s"
@@ -512,7 +505,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
end
local ok
- for k,v in pairs(values) do
+ for k,v in pairs(values) do
if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches)
ok = true
@@ -523,20 +516,20 @@ local function handle(info, inputpos, tab, depth, retfalse)
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return
end
-
+
do_final(info, inputpos, tab, "set", str)
-
+
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
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
-
+
if str == "" then
local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
@@ -550,7 +543,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
end
return
end
-
+
--build a table of the selections, checking that they exist
--parse for =on =off =default in the process
--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
@@ -559,25 +552,25 @@ local function handle(info, inputpos, tab, depth, retfalse)
--parse option=on etc
local opt, val = v:match('(.+)=(.+)')
--get option if toggling
- if not opt then
- opt = v
+ if not opt then
+ opt = v
end
-
+
--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
break
end
end
-
+
if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return
end
-
+
--check that if val was supplied it is valid
if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
@@ -596,14 +589,14 @@ local function handle(info, inputpos, tab, depth, retfalse)
sels[opt] = true
end
end
-
+
for opt, val in pairs(sels) do
local newval
-
+
if (val == true) then
--toggle the option
local b = callmethod(info, inputpos, tab, "get", opt)
-
+
if tab.tristate then
--cycle in true, nil, false order
if b then
@@ -627,22 +620,29 @@ local function handle(info, inputpos, tab, depth, retfalse)
newval = nil
end
end
-
+
do_final(info, inputpos, tab, "set", opt, newval)
end
-
-
+
+
elseif tab.type=="color" then
------------ color --------------------------------------------
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
if str == "" then
--TODO: Show current value
return
end
-
+
local r, g, b, a
-
- if tab.hasAlpha then
+
+ local hasAlpha = tab.hasAlpha
+ if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
+ info.hasAlpha = hasAlpha
+ hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
+ info.hasAlpha = nil
+ end
+
+ if hasAlpha then
if str:len() == 8 and str:find("^%x*$") then
--parse a hex string
r,g,b,a = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255, tonumber(str:sub(7, 8), 16) / 255
@@ -655,7 +655,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return
end
-
+
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
--values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
@@ -694,12 +694,12 @@ local function handle(info, inputpos, tab, depth, retfalse)
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end
end
-
+
do_final(info, inputpos, tab, "set", r,g,b,a)
elseif tab.type=="keybinding" then
------------ keybinding --------------------------------------------
- local str = strtrim(strlower(str))
+ local str = strtrim(strlower(strInput))
if str == "" then
--TODO: Show current value
return
@@ -730,7 +730,7 @@ end
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
-- -- Use AceConsole-3.0 to register a Chat Command
-- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
---
+--
-- -- Show the GUI if no input is supplied, otherwise handle the chat input.
-- function MyAddon:ChatCommand(input)
-- -- Assuming "MyOptions" is the appName of a valid options table
@@ -747,7 +747,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end
local options = assert( optgetter("cmd", MAJOR) )
-
+
local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
[0] = slashcmd,
appName = appName,
@@ -758,7 +758,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
uiType = "cmd",
uiName = MAJOR,
}
-
+
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
end
diff --git a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index 36b0356..1b6c10e 100644
--- a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,10 +1,13 @@
--- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
-- @class file
-- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 967 2010-09-25 08:20:55Z nevcairiel $
+-- @release $Id$
local LibStub = LibStub
-local MAJOR, MINOR = "AceConfigDialog-3.0", 50
+local gui = LibStub("AceGUI-3.0")
+local reg = LibStub("AceConfigRegistry-3.0")
+
+local MAJOR, MINOR = "AceConfigDialog-3.0", 92
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigDialog then return end
@@ -12,28 +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 {}
-local gui = LibStub("AceGUI-3.0")
-local reg = LibStub("AceConfigRegistry-3.0")
-
-- 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 = pairs, next, select, type, unpack, wipe
-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
@@ -85,18 +51,18 @@ local width_multiplier = 170
--[[
Group Types
Tree - All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
- - Descendant Groups with inline=true and thier children will not become nodes
+ - Descendant Groups with inline=true and thier children will not become nodes
Tab - Direct Child Groups will become tabs, direct child options will appear above the tab control
- - Grandchild groups will default to inline unless specified otherwise
+ - Grandchild groups will default to inline unless specified otherwise
Select- Same as Tab but with entries in a dropdown rather than tabs
Inline Groups
- - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
- - If declared on a direct child of a root node of a select group, they will appear above the group container control
- - When a group is displayed inline, all descendants will also be inline members of the group
+ - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
+ - If declared on a direct child of a root node of a select group, they will appear above the group container control
+ - When a group is displayed inline, all descendants will also be inline members of the group
]]
@@ -125,9 +91,7 @@ do
end
function del(t)
--delcount = delcount + 1
- for k in pairs(t) do
- t[k] = nil
- end
+ wipe(t)
pool[t] = true
end
-- function cached()
@@ -183,6 +147,7 @@ local stringIsLiteral = {
width = true,
image = true,
fontSize = true,
+ tooltipHyperlink = true
}
--Is Never a function or method
@@ -199,11 +164,11 @@ local allIsLiteral = {
local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
--get definition for the member
local inherits = isInherited[membername]
-
+
--get the member of the option, traversing the tree if it can be inherited
local member
-
+
if inherits then
local group = options
if group[membername] ~= nil then
@@ -218,22 +183,21 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
else
member = option[membername]
end
-
+
--check if we need to call a functon, or if we have a literal value
if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
--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])
info[i] = path[i]
handler = group.handler or handler
end
-
+
info.options = options
info.appName = appName
info[0] = appName
@@ -243,8 +207,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
info.type = option.type
info.uiType = "dialog"
info.uiName = MAJOR
-
- local a, b, c ,d
+
+ 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
@@ -261,8 +225,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
return a,b,c,d
else
--The value isnt a function to call, return it
- return member
- end
+ return member
+ end
end
--[[calls an options function that could be inherited, method name or function ref
@@ -327,7 +291,7 @@ local function compareOptions(a,b)
return NameA:upper() < NameB:upper()
end
if OrderA < 0 then
- if OrderB > 0 then
+ if OrderB >= 0 then
return false
end
else
@@ -346,7 +310,7 @@ end
local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
tempOrders = new()
tempNames = new()
-
+
if group.plugins then
for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do
@@ -362,7 +326,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN
end
end
end
-
+
for k, v in pairs(group.args) do
if not opts[k] then
tinsert(keySort, k)
@@ -393,7 +357,7 @@ local function DelTree(tree)
end
local function CleanUserData(widget, event)
-
+
local user = widget:GetUserDataTable()
if user.path then
@@ -424,13 +388,16 @@ local function CleanUserData(widget, event)
if user.grouplist then
del(user.grouplist)
end
+ if user.orderlist then
+ del(user.orderlist)
+ end
end
end
-- - Gets a status table for the given appname and options path.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param path The path to the options (a table with all group keys)
--- @return
+-- @return
function AceConfigDialog:GetStatusTable(appName, path)
local status = self.Status
@@ -464,7 +431,7 @@ end
function AceConfigDialog:SelectGroup(appName, ...)
local path = new()
-
+
local app = reg:GetOptionsTable(appName)
if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
@@ -476,9 +443,9 @@ function AceConfigDialog:SelectGroup(appName, ...)
status.groups = {}
end
status = status.groups
- local treevalue
- local treestatus
-
+ local treevalue
+ local treestatus
+
for n = 1, select("#",...) do
local key = select(n, ...)
@@ -505,12 +472,12 @@ function AceConfigDialog:SelectGroup(appName, ...)
--the selected group will be overwritten if a child is the final target but still needs to be open
treestatus.selected = treevalue
treestatus.groups[treevalue] = true
-
+
end
-
+
--move to the next group in the path
group = GetSubOption(group, key)
- if not group then
+ if not group then
break
end
tinsert(path, key)
@@ -520,10 +487,10 @@ function AceConfigDialog:SelectGroup(appName, ...)
end
status = status.groups
end
-
+
del(path)
reg:NotifyChange(appName)
-end
+end
local function OptionOnMouseOver(widget, event)
--show a tooltip/set the status bar to the desc text
@@ -532,82 +499,164 @@ local function OptionOnMouseOver(widget, event)
local options = user.options
local path = user.path
local appName = user.appName
+ local tooltip = AceConfigDialog.tooltip
+
+ tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
+
+ local tooltipHyperlink = GetOptionsMemberValue("tooltipHyperlink", opt, options, path, appName)
+ if tooltipHyperlink then
+ tooltip:SetHyperlink(tooltipHyperlink)
+ tooltip:Show()
+ return
+ end
- GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
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
-
+
if descStyle and descStyle ~= "tooltip" then return end
-
- GameTooltip:SetText(name, 1, .82, 0, 1)
-
+
+ tooltip:SetText(name, 1, .82, 0, 1, true)
+
if opt.type == "multiselect" then
- GameTooltip:AddLine(user.text,0.5, 0.5, 0.8, 1)
- end
+ tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
+ end
if type(desc) == "string" then
- GameTooltip:AddLine(desc, 1, 1, 1, 1)
+ tooltip:AddLine(desc, 1, 1, 1, true)
end
if type(usage) == "string" then
- GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1)
+ tooltip:AddLine(usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true)
end
- GameTooltip:Show()
+ 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
- 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(130763) -- "Interface\\Buttons\\UI-DialogBox-Button-Up"
+ button:GetNormalTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
+ button:SetPushedTexture(130761) -- "Interface\\Buttons\\UI-DialogBox-Button-Down"
+ button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
+ button:SetHighlightTexture(130762) -- "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)
+ 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("BOTTOM", frame, "BOTTOM", 0, 16)
+ frame.cancel:Hide()
+
+ frame.accept:SetScript("OnClick", function()
+ frame:Hide()
+ end)
+end
local function ActivateControl(widget, event, ...)
--This function will call the set / execute handler for the widget
@@ -629,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
@@ -677,7 +726,7 @@ local function ActivateControl(widget, event, ...)
end
end
end
-
+
local success
if validated and option.type ~= "execute" then
if type(validate) == "string" then
@@ -692,38 +741,31 @@ local function ActivateControl(widget, event, ...)
if not success then validated = false end
end
end
-
- local rootframe = user.rootframe
- if type(validated) == "string" then
- --validate function returned a message to display
- if rootframe.SetStatusText then
- rootframe:SetStatusText(validated)
- else
- -- TODO: do something else.
- end
- PlaySound("igPlayerInviteDecline")
- del(info)
- return true
- elseif not validated then
- --validate returned false
- if rootframe.SetStatusText then
+
+ if not validated or type(validated) == "string" then
+ if not validated then
if usage then
- rootframe:SetStatusText(name..": "..usage)
+ validated = name..": "..usage
else
if pattern then
- rootframe:SetStatusText(name..": Expected "..pattern)
+ validated = name..": Expected "..pattern
else
- rootframe:SetStatusText(name..": Invalid Value")
+ validated = name..": Invalid Value"
end
end
- else
- -- TODO: do something else
end
- PlaySound("igPlayerInviteDecline")
+
+ -- show validate message
+ if user.rootframe.SetStatusText then
+ user.rootframe:SetStatusText(validated)
+ else
+ validationErrorPopup(validated)
+ end
+ PlaySound(882) -- SOUNDKIT.IG_PLAYER_INVITE_DECLINE || _DECLINE is actually missing from the table
del(info)
return true
else
-
+
local confirmText = option.confirmText
--call confirm func/method
if type(confirm) == "string" then
@@ -752,22 +794,22 @@ 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
end
-
+
local iscustom = user.rootframe:GetUserData("iscustom")
local rootframe
-
+
if iscustom then
rootframe = user.rootframe
end
@@ -804,7 +846,7 @@ local function ActivateControl(widget, event, ...)
--full refresh of the frame, some controls dont cause this on all events
if option.type == "color" then
if event == "OnValueConfirmed" then
-
+
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
@@ -865,7 +907,7 @@ end
local function MultiControlOnClosed(widget, event, ...)
local user = widget:GetUserDataTable()
- if user.valuechanged then
+ if user.valuechanged and not widget:IsReleasing() then
local iscustom = user.rootframe:GetUserData("iscustom")
local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
if iscustom then
@@ -933,6 +975,7 @@ end
]]
local function BuildSelect(group, options, path, appName)
local groups = new()
+ local order = new()
local keySort = new()
local opts = new()
@@ -947,15 +990,16 @@ local function BuildSelect(group, options, path, appName)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
groups[k] = GetOptionsMemberValue("name", v, options, path, appName)
+ tinsert(order, k)
end
path[#path] = nil
end
end
- del(keySort)
del(opts)
+ del(keySort)
- return groups
+ return groups, order
end
local function BuildSubGroups(group, tree, options, path, appName)
@@ -1011,6 +1055,7 @@ local function BuildGroups(group, options, path, appName, recurse)
entry.value = k
entry.text = GetOptionsMemberValue("name", v, options, path, appName)
entry.icon = GetOptionsMemberValue("icon", v, options, path, appName)
+ entry.iconCoords = GetOptionsMemberValue("iconCoords", v, options, path, appName)
entry.disabled = CheckOptionDisabled(v, options, path, appName)
tinsert(tree,entry)
if recurse and (v.childGroups or "tree") == "tree" then
@@ -1038,8 +1083,30 @@ 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)
+ local control
+ if userControlType then
+ control = gui:Create(userControlType)
+ if not control then
+ geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(userControlType)))
+ end
+ end
+ if not control then
+ control = gui:Create(fallbackControlType)
+ end
+ return control
+end
+
+local function sortTblAsStrings(x,y)
+ return tostring(x) < tostring(y) -- Support numbers as keys
+end
--[[
options - root of the options table being fed
@@ -1071,7 +1138,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
else
GroupContainer = gui:Create("SimpleGroup")
end
-
+
GroupContainer.width = "fill"
GroupContainer:SetLayout("flow")
container:AddChild(GroupContainer)
@@ -1080,16 +1147,15 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
else
--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)
-
- if type(image) == "string" then
- control = gui:Create("Icon")
+
+ local iconControl = type(image) == "string" or type(image) == "number"
+ 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)
end
@@ -1110,19 +1176,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:SetImageSize(width, height)
control:SetLabel(name)
else
- control = gui:Create("Button")
control:SetText(name)
end
control:SetCallback("OnClick",ActivateControl)
elseif v.type == "input" then
- local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox"
- control = gui:Create(controlType)
- if not control then
- geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
- control = gui:Create(v.multiline and "MultiLineEditBox" or "EditBox")
- end
-
+ control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox")
+
if v.multiline and control.SetNumLines then
control:SetNumLines(tonumber(v.multiline) or 4)
end
@@ -1135,22 +1195,22 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:SetText(text)
elseif v.type == "toggle" then
- control = gui:Create("CheckBox")
+ control = CreateControl(v.dialogControl or v.control, "CheckBox")
control:SetLabel(name)
control:SetTriState(v.tristate)
local value = GetOptionsMemberValue("get",v, options, path, appName)
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateControl)
-
+
if v.descStyle == "inline" then
local desc = GetOptionsMemberValue("desc", v, options, path, appName)
control:SetDescription(desc)
end
-
+
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
@@ -1158,7 +1218,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end
end
elseif v.type == "range" then
- control = gui:Create("Slider")
+ control = CreateControl(v.dialogControl or v.control, "Slider")
control:SetLabel(name)
control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0)
control:SetIsPercent(v.isPercent)
@@ -1172,27 +1232,71 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
elseif v.type == "select" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
- local controlType = v.dialogControl or v.control or "Dropdown"
- control = gui:Create(controlType)
- if not control then
- geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
- control = gui:Create("Dropdown")
+ local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
+ if v.style == "radio" then
+ local disabled = CheckOptionDisabled(v, options, path, appName)
+ local width = GetOptionsMemberValue("width",v,options,path,appName)
+ control = gui:Create("InlineGroup")
+ control:SetLayout("Flow")
+ control:SetTitle(name)
+ control.width = "fill"
+
+ control:PauseLayout()
+ local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
+ if not sorting then
+ sorting = {}
+ for value, text in pairs(values) do
+ sorting[#sorting+1]=value
+ end
+ tsort(sorting, sortTblAsStrings)
+ end
+ for _, value in ipairs(sorting) do
+ local text = values[value]
+ local radio = gui:Create("CheckBox")
+ radio:SetLabel(text)
+ radio:SetUserData("value", value)
+ radio:SetUserData("text", text)
+ radio:SetDisabled(disabled)
+ radio:SetType("radio")
+ radio:SetValue(optionValue == value)
+ radio:SetCallback("OnValueChanged", ActivateMultiControl)
+ InjectInfo(radio, options, v, path, rootframe, appName)
+ control:AddChild(radio)
+ if width == "double" then
+ radio:SetWidth(width_multiplier * 2)
+ elseif width == "half" then
+ radio:SetWidth(width_multiplier / 2)
+ elseif (type(width) == "number") then
+ radio:SetWidth(width_multiplier * width)
+ elseif width == "full" then
+ radio.width = "fill"
+ else
+ radio:SetWidth(width_multiplier)
+ end
+ end
+ control:ResumeLayout()
+ control:DoLayout()
+ else
+ control = CreateControl(v.dialogControl or v.control, "Dropdown")
+ 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)
+ local value = GetOptionsMemberValue("get",v, options, path, appName)
+ if not values[value] then
+ value = nil
+ end
+ control:SetValue(value)
+ control:SetCallback("OnValueChanged", ActivateControl)
end
- control:SetLabel(name)
- control:SetList(values)
- local value = GetOptionsMemberValue("get",v, options, path, appName)
- if not values[value] then
- value = nil
- end
- control:SetValue(value)
- control:SetCallback("OnValueChanged",ActivateControl)
elseif v.type == "multiselect" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
local disabled = CheckOptionDisabled(v, options, path, appName)
-
- local controlType = v.dialogControl or v.control
-
+
local valuesort = new()
if values then
for value, text in pairs(values) do
@@ -1200,7 +1304,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end
end
tsort(valuesort)
-
+
+ local controlType = v.dialogControl or v.control
if controlType then
control = gui:Create(controlType)
if not control then
@@ -1219,14 +1324,16 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
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
--check:SetTriState(v.tristate)
- for i = 1, #valuesort do
- local key = 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
@@ -1238,8 +1345,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:PauseLayout()
local width = GetOptionsMemberValue("width",v,options,path,appName)
- for i = 1, #valuesort do
- local value = valuesort[i]
+ for s = 1, #valuesort do
+ local value = valuesort[s]
local text = values[value]
local check = gui:Create("CheckBox")
check:SetLabel(text)
@@ -1255,6 +1362,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
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
@@ -1264,34 +1373,34 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:ResumeLayout()
control:DoLayout()
-
+
end
-
+
del(valuesort)
elseif v.type == "color" then
- control = gui:Create("ColorPicker")
+ control = CreateControl(v.dialogControl or v.control, "ColorPicker")
control:SetLabel(name)
- control:SetHasAlpha(v.hasAlpha)
+ control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName))
control:SetColor(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnValueChanged",ActivateControl)
control:SetCallback("OnValueConfirmed",ActivateControl)
elseif v.type == "keybinding" then
- control = gui:Create("Keybinding")
+ control = CreateControl(v.dialogControl or v.control, "Keybinding")
control:SetLabel(name)
control:SetKey(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnKeyChanged",ActivateControl)
elseif v.type == "header" then
- control = gui:Create("Heading")
+ control = CreateControl(v.dialogControl or v.control, "Heading")
control:SetText(name)
control.width = "fill"
elseif v.type == "description" then
- control = gui:Create("Label")
+ control = CreateControl(v.dialogControl or v.control, "Label")
control:SetText(name)
-
+
local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
if fontSize == "medium" then
control:SetFontObject(GameFontHighlight)
@@ -1300,11 +1409,11 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
else -- small or invalid
control:SetFontObject(GameFontHighlightSmall)
end
-
+
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
@@ -1324,18 +1433,23 @@ 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
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
@@ -1350,7 +1464,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
InjectInfo(control, options, v, path, rootframe, appName)
container:AddChild(control)
end
-
+
end
end
tremove(path)
@@ -1375,7 +1489,8 @@ 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
feedpath[i] = path[i]
@@ -1390,49 +1505,50 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
-
- GameTooltip:SetOwner(button, "ANCHOR_NONE")
+
+ tooltip:SetOwner(button, "ANCHOR_NONE")
+ tooltip:ClearAllPoints()
if widget.type == "TabGroup" then
- GameTooltip:SetPoint("BOTTOM",button,"TOP")
+ tooltip:SetPoint("BOTTOM",button,"TOP")
else
- GameTooltip:SetPoint("LEFT",button,"RIGHT")
+ tooltip:SetPoint("LEFT",button,"RIGHT")
end
- GameTooltip:SetText(name, 1, .82, 0, 1)
-
+ tooltip:SetText(name, 1, .82, 0, 1, true)
+
if type(desc) == "string" then
- GameTooltip:AddLine(desc, 1, 1, 1, 1)
+ tooltip:AddLine(desc, 1, 1, 1, true)
end
-
- GameTooltip:Show()
+
+ tooltip:Show()
end
local function TreeOnButtonLeave(widget, event, value, button)
- GameTooltip:Hide()
+ AceConfigDialog.tooltip:Hide()
end
local function GroupExists(appName, options, path, uniquevalue)
if not uniquevalue then return false end
-
+
local feedpath = new()
local temppath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
-
+
BuildPath(feedpath, ("\001"):split(uniquevalue))
-
+
local group = options
for i = 1, #feedpath do
local v = feedpath[i]
temppath[i] = v
group = GetSubOption(group, v)
-
- if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
+
+ if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
del(feedpath)
del(temppath)
- return false
+ return false
end
end
del(feedpath)
@@ -1455,10 +1571,6 @@ local function GroupSelected(widget, event, uniquevalue)
end
BuildPath(feedpath, ("\001"):split(uniquevalue))
- local group = options
- for i = 1, #feedpath do
- group = GetSubOption(group, feedpath[i])
- end
widget:ReleaseChildren()
AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath)
@@ -1555,7 +1667,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
tab:SetCallback("OnGroupSelected", GroupSelected)
tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
-
+
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
@@ -1575,38 +1687,34 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
break
end
end
-
+
container:AddChild(tab)
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)
- local grouplist = BuildSelect(group, options, path, appName)
- select:SetGroupList(grouplist)
- select:SetUserData("grouplist", grouplist)
- local firstgroup
- for k, v in pairs(grouplist) do
- if not firstgroup or k < firstgroup then
- firstgroup = k
- end
- end
-
- if firstgroup then
- select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
- end
-
- select.width = "fill"
- select.height = "fill"
+ selectGroup:SetStatusTable(status.groups)
+ local grouplist, orderlist = BuildSelect(group, options, path, appName)
+ selectGroup:SetGroupList(grouplist, orderlist)
+ selectGroup:SetUserData("grouplist", grouplist)
+ selectGroup:SetUserData("orderlist", orderlist)
- container:AddChild(select)
+ local firstgroup = orderlist[1]
+ if firstgroup then
+ selectGroup:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
+ end
+
+ selectGroup.width = "fill"
+ selectGroup.height = "fill"
+
+ container:AddChild(selectGroup)
--assume tree group by default
--if parenttype is tree then this group is already a node on that tree
@@ -1614,14 +1722,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
local tree = gui:Create("TreeGroup")
InjectInfo(tree, options, group, path, rootframe, appName)
tree:EnableButtonTooltips(false)
-
+
tree.width = "fill"
tree.height = "fill"
tree:SetCallback("OnGroupSelected", GroupSelected)
tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
-
+
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
@@ -1662,7 +1770,7 @@ local function RefreshOnUpdate(this)
end
this.closing[appName] = nil
end
-
+
if this.closeAll then
for k, v in pairs(AceConfigDialog.OpenFrames) do
if not this.closeAllOverride[k] then
@@ -1672,7 +1780,7 @@ local function RefreshOnUpdate(this)
this.closeAll = nil
wipe(this.closeAllOverride)
end
-
+
for appName in pairs(this.apps) do
if AceConfigDialog.OpenFrames[appName] then
local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
@@ -1757,10 +1865,10 @@ function AceConfigDialog:Open(appName, container, ...)
local options = app("dialog", MAJOR)
local f
-
+
local path = new()
local name = GetOptionsMemberValue("name", options, options, path, appName)
-
+
--If an optional path is specified add it to the path table before feeding the options
--as container is optional as well it may contain the first element of the path
if type(container) == "string" then
@@ -1770,7 +1878,15 @@ function AceConfigDialog:Open(appName, container, ...)
for n = 1, select("#",...) do
tinsert(path, (select(n, ...)))
end
-
+
+ local option = options
+ if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
+ for i = 1, #path do
+ option = options.args[path[i]]
+ end
+ name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
+ end
+
--if a container is given feed into that
if container then
f = container
@@ -1826,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))
@@ -1858,29 +1976,30 @@ 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 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
key = key.."\001"..select(n, ...)
end
-
+
if not BlizOptions[appName] then
BlizOptions[appName] = {}
end
-
+
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)
@@ -1893,8 +2012,33 @@ 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
+ 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
+
+ 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/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index d98c020..72e9c60 100644
--- a/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/Kui_Nameplates/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -4,20 +4,20 @@
-- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
-- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
-- * The **appName** field is the options table name as given at registration time \\
---
+--
-- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
-- @class file
-- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 921 2010-05-09 15:49:14Z nevcairiel $
-local MAJOR, MINOR = "AceConfigRegistry-3.0", 12
+-- @release $Id$
+local CallbackHandler = LibStub("CallbackHandler-1.0")
+
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 22
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigRegistry then return end
AceConfigRegistry.tables = AceConfigRegistry.tables or {}
-local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
-
if not AceConfigRegistry.callbacks then
AceConfigRegistry.callbacks = CallbackHandler:New(AceConfigRegistry)
end
@@ -33,7 +33,7 @@ local error, assert = error, assert
AceConfigRegistry.validated = {
- -- list of options table names ran through :ValidateOptionsTable automatically.
+ -- list of options table names ran through :ValidateOptionsTable automatically.
-- CLEARED ON PURPOSE, since newer versions may have newer validators
cmd = {},
dropdown = {},
@@ -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 optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
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"}
@@ -66,6 +66,7 @@ local optmethodbool={["nil"]=true,["string"]=true,["function"]=true,["boolean"]=
local opttable={["nil"]=true,["table"]=true, _="table"}
local optbool={["nil"]=true,["boolean"]=true, _="boolean"}
local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true, _="boolean or number"}
+local optstringnumber={["nil"]=true,["string"]=true,["number"]=true, _="string or number"}
local basekeys={
type=isstring,
@@ -82,24 +83,33 @@ local basekeys={
dialogHidden=optmethodbool,
dropdownHidden=optmethodbool,
cmdHidden=optmethodbool,
- icon=optstringfunc,
+ tooltipHyperlink=optstringfunc,
+ icon=optstringnumberfunc,
iconCoords=optmethodtable,
handler=opttable,
get=optmethodfalse,
set=optmethodfalse,
func=optmethodfalse,
arg={["*"]=true},
- width=optstring,
+ width=optstringnumber,
+ relWidth=optnumber,
}
local typedkeys={
- header={},
+ header={
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
+ },
description={
- image=optstringfunc,
+ image=optstringnumberfunc,
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
fontSize=optstringfunc,
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
},
group={
args=istable,
@@ -112,10 +122,13 @@ local typedkeys={
childGroups=optstring,
},
execute={
- image=optstringfunc,
+ image=optstringnumberfunc,
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
},
input={
pattern=optstring,
@@ -127,8 +140,11 @@ local typedkeys={
},
toggle={
tristate=optbool,
- image=optstringfunc,
+ image=optstringnumberfunc,
imageCoords=optmethodtable,
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
},
tristate={
},
@@ -140,17 +156,22 @@ local typedkeys={
step=optnumber,
bigStep=optnumber,
isPercent=optbool,
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
},
select={
values=ismethodtable,
+ sorting=optmethodtable,
style={
- ["nil"]=true,
- ["string"]={dropdown=true,radio=true},
+ ["nil"]=true,
+ ["string"]={dropdown=true,radio=true},
_="string: 'dropdown' or 'radio'"
},
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
+ itemControl=optstring,
},
multiselect={
values=ismethodtable,
@@ -161,10 +182,15 @@ local typedkeys={
dropdownControl=optstring,
},
color={
- hasAlpha=optbool,
+ hasAlpha=optmethodbool,
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
},
keybinding={
- -- TODO
+ control=optstring,
+ dialogControl=optstring,
+ dropdownControl=optstring,
},
}
@@ -201,13 +227,13 @@ local function validate(options,errlvl,...)
if type(options.type)~="string" then
err(".type: expected a string, got a "..type(options.type), errlvl,...)
end
-
+
-- get type and 'typedkeys' member
local tk = typedkeys[options.type]
if not tk then
err(".type: unknown type '"..options.type.."'", errlvl,...)
end
-
+
-- make sure that all options[] are known parameters
for k,v in pairs(options) do
if not (tk[k] or basekeys[k]) then
@@ -287,7 +313,8 @@ end
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param options The options table, OR a function reference that generates it on demand. \\
-- See the top of the page for info on arguments passed to such functions.
-function AceConfigRegistry:RegisterOptionsTable(appName, options)
+-- @param skipValidation Skip options table validation (primarily useful for extremely huge options, with a noticeable slowdown)
+function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation)
if type(options)=="table" then
if options.type~="group" then -- quick sanity checker
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - missing type='group' member in root group", 2)
@@ -295,18 +322,18 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options)
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+1
validateGetterArgs(uiType, uiName, errlvl)
- if not AceConfigRegistry.validated[uiType][appName] then
+ if not AceConfigRegistry.validated[uiType][appName] and not skipValidation then
AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true
end
- return options
+ return options
end
elseif type(options)=="function" then
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+1
validateGetterArgs(uiType, uiName, errlvl)
local tab = assert(options(uiType, uiName, appName))
- if not AceConfigRegistry.validated[uiType][appName] then
+ if not AceConfigRegistry.validated[uiType][appName] and not skipValidation then
AceConfigRegistry:ValidateOptionsTable(tab, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true
end
@@ -337,7 +364,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
if not f then
return nil
end
-
+
if uiType then
return f(uiType,uiName,1) -- get the table for us
else
diff --git a/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.lua b/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.lua
index b5275de..231196c 100644
--- a/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.lua
+++ b/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.lua
@@ -41,7 +41,7 @@
-- @class file
-- @name AceDB-3.0.lua
-- @release $Id$
-local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27
+local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 33
local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
if not AceDB then return end -- No upgrade needed
@@ -53,10 +53,6 @@ local setmetatable, rawset, rawget = setmetatable, rawset, rawget
-- 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
-
AceDB.db_registry = AceDB.db_registry or {}
AceDB.frame = AceDB.frame or CreateFrame("Frame")
@@ -98,11 +94,11 @@ local function copyDefaults(dest, src)
-- This is a metatable used for table defaults
local mt = {
-- This handles the lookup and creation of new subtables
- __index = function(t,k)
- if k == nil then return nil end
+ __index = function(t,k2)
+ if k2 == nil then return nil end
local tbl = {}
copyDefaults(tbl, v)
- rawset(t, k, tbl)
+ rawset(t, k2, tbl)
return tbl
end,
}
@@ -115,7 +111,7 @@ local function copyDefaults(dest, src)
end
else
-- Values are not tables, so this is just a simple return
- local mt = {__index = function(t,k) return k~=nil and v or nil end}
+ local mt = {__index = function(t,k2) return k2~=nil and v or nil end}
setmetatable(dest, mt)
end
elseif type(v) == "table" then
@@ -261,9 +257,12 @@ local _, classKey = UnitClass("player")
local _, raceKey = UnitRace("player")
local factionKey = UnitFactionGroup("player")
local factionrealmKey = factionKey .. " - " .. realmKey
-local factionrealmregionKey = factionrealmKey .. " - " .. string.sub(GetCVar("realmList"), 1, 2):upper()
local localeKey = GetLocale():lower()
+local regionTable = { "US", "KR", "EU", "TW", "CN" }
+local regionKey = regionTable[GetCurrentRegion()] or GetCurrentRegionName() or "TR"
+local factionrealmregionKey = factionrealmKey .. " - " .. regionKey
+
-- Actual database initialization function
local function initdb(sv, defaults, defaultProfile, olddb, parent)
-- Generate the database keys for each section
@@ -361,7 +360,7 @@ local function logoutHandler(frame, event)
-- cleanup sections that are empty without defaults
local sv = rawget(db, "sv")
- for section in pairs(db.keys) do
+ for section in pairs(rawget(db, "keys")) do
if rawget(sv, section) then
-- global is special, all other sections have sub-entrys
-- also don't delete empty profiles on main dbs, only on namespaces
@@ -378,6 +377,26 @@ local function logoutHandler(frame, event)
end
end
end
+
+ -- second pass after everything else is cleaned up to remove empty namespaces
+ -- can't be run in-loop above since there is no guaranteed order
+ for db in pairs(AceDB.db_registry) do
+ local sv = rawget(db, "sv")
+ local namespaces = rawget(sv, "namespaces")
+ if namespaces then
+ for name in pairs(namespaces) do
+ -- cleanout empty profiles table, if still present
+ if namespaces[name].profiles and not next(namespaces[name].profiles) then
+ namespaces[name].profiles = nil
+ end
+
+ -- remove entire namespace, if needed
+ if not next(namespaces[name]) then
+ namespaces[name] = nil
+ end
+ end
+ end
+ end
end
end
@@ -526,6 +545,17 @@ function DBObjectLib:DeleteProfile(name, silent)
end
end
+ -- remove from unloaded namespaces
+ if self.sv.namespaces then
+ for nsname, data in pairs(self.sv.namespaces) do
+ if self.children and self.children[nsname] then
+ -- already a mapped namespace
+ elseif data.profiles then
+ data.profiles[name] = nil
+ end
+ end
+ end
+
-- switch all characters that use this profile back to the default
if self.sv.profileKeys then
for key, profile in pairs(self.sv.profileKeys) do
@@ -571,6 +601,20 @@ function DBObjectLib:CopyProfile(name, silent)
end
end
+ -- copy unloaded namespaces
+ if self.sv.namespaces then
+ for nsname, data in pairs(self.sv.namespaces) do
+ if self.children and self.children[nsname] then
+ -- already a mapped namespace
+ elseif data.profiles then
+ -- reset the current profile
+ data.profiles[self.keys.profile] = {}
+ -- copy data
+ copyTable(data.profiles[name], data.profiles[self.keys.profile])
+ end
+ end
+ end
+
-- Callback: OnProfileCopied, database, sourceProfileKey
self.callbacks:Fire("OnProfileCopied", self, name)
end
@@ -597,6 +641,18 @@ function DBObjectLib:ResetProfile(noChildren, noCallbacks)
end
end
+ -- reset unloaded namespaces
+ if self.sv.namespaces and not noChildren then
+ for nsname, data in pairs(self.sv.namespaces) do
+ if self.children and self.children[nsname] then
+ -- already a mapped namespace
+ elseif data.profiles then
+ -- reset the current profile
+ data.profiles[self.keys.profile] = nil
+ end
+ end
+ end
+
-- Callback: OnProfileReset, database
if not noCallbacks then
self.callbacks:Fire("OnProfileReset", self)
@@ -607,8 +663,8 @@ end
-- profile.
-- @param defaultProfile The profile name to use as the default
function DBObjectLib:ResetDB(defaultProfile)
- if defaultProfile and type(defaultProfile) ~= "string" then
- error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected, got %q."):format(type(defaultProfile)), 2)
+ if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
+ error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or true expected, got %q."):format(type(defaultProfile)), 2)
end
local sv = self.sv
@@ -738,4 +794,4 @@ for db in pairs(AceDB.db_registry) do
db.RegisterDefaults = DBObjectLib.RegisterDefaults
db.ResetProfile = DBObjectLib.ResetProfile
end
-end
\ No newline at end of file
+end
diff --git a/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.xml b/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.xml
new file mode 100644
index 0000000..46b20ba
--- /dev/null
+++ b/Kui_Nameplates/Libs/AceDB-3.0/AceDB-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
index bc56106..b91082b 100644
--- a/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
+++ b/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
@@ -1,9 +1,9 @@
--- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
-- @class file
-- @name AceDBOptions-3.0
--- @release $Id: AceDBOptions-3.0.lua 938 2010-06-13 07:21:38Z nevcairiel $
-local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 12
-local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
+-- @release $Id$
+local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
+local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
if not AceDBOptions then return end -- No upgrade needed
@@ -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 {}
@@ -25,168 +21,208 @@ AceDBOptions.handlers = AceDBOptions.handlers or {}
]]
local L = {
- default = "Default",
- intro = "You can change the active database profile, so you can have different settings for every character.",
- reset_desc = "Reset the current profile back to its default values, in case your configuration is broken, or you simply want to start over.",
- reset = "Reset Profile",
- reset_sub = "Reset the current profile to the default",
+ choose = "Existing Profiles",
choose_desc = "You can either create a new profile by entering a name in the editbox, or choose one of the already existing profiles.",
+ choose_sub = "Select one of your currently available profiles.",
+ copy = "Copy From",
+ copy_desc = "Copy the settings from one existing profile into the currently active profile.",
+ current = "Current Profile:",
+ default = "Default",
+ delete = "Delete a Profile",
+ delete_confirm = "Are you sure you want to delete the selected profile?",
+ delete_desc = "Delete existing and unused profiles from the database to save space, and cleanup the SavedVariables file.",
+ delete_sub = "Deletes a profile from the database.",
+ intro = "You can change the active database profile, so you can have different settings for every character.",
new = "New",
new_sub = "Create a new empty profile.",
- choose = "Existing Profiles",
- choose_sub = "Select one of your currently available profiles.",
- copy_desc = "Copy the settings from one existing profile into the currently active profile.",
- copy = "Copy From",
- delete_desc = "Delete existing and unused profiles from the database to save space, and cleanup the SavedVariables file.",
- delete = "Delete a Profile",
- delete_sub = "Deletes a profile from the database.",
- delete_confirm = "Are you sure you want to delete the selected profile?",
profiles = "Profiles",
profiles_sub = "Manage Profiles",
- current = "Current Profile:",
+ reset = "Reset Profile",
+ reset_desc = "Reset the current profile back to its default values, in case your configuration is broken, or you simply want to start over.",
+ reset_sub = "Reset the current profile to the default",
}
local LOCALE = GetLocale()
if LOCALE == "deDE" then
+ L["choose"] = "Vorhandene Profile"
+ L["choose_desc"] = "Du kannst ein neues Profil erstellen, indem du einen neuen Namen in der Eingabebox 'Neu' eingibst, oder wähle eines der vorhandenen Profile aus."
+ L["choose_sub"] = "Wählt ein bereits vorhandenes Profil aus."
+ L["copy"] = "Kopieren von..."
+ L["copy_desc"] = "Kopiere die Einstellungen von einem vorhandenen Profil in das aktive Profil."
+ L["current"] = "Aktuelles Profil:"
L["default"] = "Standard"
- L["intro"] = "Hier kannst du das aktive Datenbankprofile \195\164ndern, damit du verschiedene Einstellungen f\195\188r jeden Charakter erstellen kannst, wodurch eine sehr flexible Konfiguration m\195\182glich wird."
- L["reset_desc"] = "Setzt das momentane Profil auf Standardwerte zur\195\188ck, f\195\188r den Fall das mit der Konfiguration etwas schief lief oder weil du einfach neu starten willst."
- L["reset"] = "Profil zur\195\188cksetzen"
- L["reset_sub"] = "Das aktuelle Profil auf Standard zur\195\188cksetzen."
- L["choose_desc"] = "Du kannst ein neues Profil erstellen, indem du einen neuen Namen in der Eingabebox 'Neu' eingibst, oder w\195\164hle eines der vorhandenen Profile aus."
+ L["delete"] = "Profil löschen"
+ L["delete_confirm"] = "Willst du das ausgewählte Profil wirklich löschen?"
+ L["delete_desc"] = "Lösche vorhandene oder unbenutzte Profile aus der Datenbank, um Platz zu sparen und die SavedVariables-Datei 'sauber' zu halten."
+ L["delete_sub"] = "Löscht ein Profil aus der Datenbank."
+ L["intro"] = "Hier kannst du das aktive Datenbankprofil ändern, damit du verschiedene Einstellungen für jeden Charakter erstellen kannst, wodurch eine sehr flexible Konfiguration möglich wird."
L["new"] = "Neu"
L["new_sub"] = "Ein neues Profil erstellen."
- L["choose"] = "Vorhandene Profile"
- L["choose_sub"] = "W\195\164hlt ein bereits vorhandenes Profil aus."
- L["copy_desc"] = "Kopiere die Einstellungen von einem vorhandenen Profil in das aktive Profil."
- L["copy"] = "Kopieren von..."
- L["delete_desc"] = "L\195\182sche vorhandene oder unbenutzte Profile aus der Datenbank um Platz zu sparen und um die SavedVariables Datei 'sauber' zu halten."
- L["delete"] = "Profil l\195\182schen"
- L["delete_sub"] = "L\195\182scht ein Profil aus der Datenbank."
- L["delete_confirm"] = "Willst du das ausgew\195\164hlte Profil wirklich l\195\182schen?"
L["profiles"] = "Profile"
L["profiles_sub"] = "Profile verwalten"
- --L["current"] = "Current Profile:"
+ L["reset"] = "Profil zurücksetzen"
+ L["reset_desc"] = "Setzt das momentane Profil auf Standardwerte zurück, für den Fall, dass mit der Konfiguration etwas schief lief oder weil du einfach neu starten willst."
+ L["reset_sub"] = "Das aktuelle Profil auf Standard zurücksetzen."
elseif LOCALE == "frFR" then
- L["default"] = "D\195\169faut"
- L["intro"] = "Vous pouvez changer le profil actuel afin d'avoir des param\195\168tres diff\195\169rents pour chaque personnage, permettant ainsi d'avoir une configuration tr\195\168s flexible."
- L["reset_desc"] = "R\195\169initialise le profil actuel au cas o\195\185 votre configuration est corrompue ou si vous voulez tout simplement faire table rase."
- L["reset"] = "R\195\169initialiser le profil"
- L["reset_sub"] = "R\195\169initialise le profil actuel avec les param\195\168tres par d\195\169faut."
- L["choose_desc"] = "Vous pouvez cr\195\169er un nouveau profil en entrant un nouveau nom dans la bo\195\174te de saisie, ou en choississant un des profils d\195\169j\195\160 existants."
- L["new"] = "Nouveau"
- L["new_sub"] = "Cr\195\169\195\169e un nouveau profil vierge."
L["choose"] = "Profils existants"
- L["choose_sub"] = "Permet de choisir un des profils d\195\169j\195\160 disponibles."
- L["copy_desc"] = "Copie les param\195\168tres d'un profil d\195\169j\195\160 existant dans le profil actuellement actif."
- L["copy"] = "Copier \195\160 partir de"
- L["delete_desc"] = "Supprime les profils existants inutilis\195\169s de la base de donn\195\169es afin de gagner de la place et de nettoyer le fichier SavedVariables."
+ L["choose_desc"] = "Vous pouvez créer un nouveau profil en entrant un nouveau nom dans la boîte de saisie, ou en choississant un des profils déjà existants."
+ L["choose_sub"] = "Permet de choisir un des profils déjà disponibles."
+ L["copy"] = "Copier à partir de"
+ L["copy_desc"] = "Copie les paramètres d'un profil déjà existant dans le profil actuellement actif."
+ L["current"] = "Profil actuel :"
+ L["default"] = "Défaut"
L["delete"] = "Supprimer un profil"
- L["delete_sub"] = "Supprime un profil de la base de donn\195\169es."
- L["delete_confirm"] = "Etes-vous s\195\187r de vouloir supprimer le profil s\195\169lectionn\195\169 ?"
+ L["delete_confirm"] = "Etes-vous sûr de vouloir supprimer le profil sélectionné ?"
+ L["delete_desc"] = "Supprime les profils existants inutilisés de la base de données afin de gagner de la place et de nettoyer le fichier SavedVariables."
+ L["delete_sub"] = "Supprime un profil de la base de données."
+ L["intro"] = "Vous pouvez changer le profil actuel afin d'avoir des paramètres différents pour chaque personnage, permettant ainsi d'avoir une configuration très flexible."
+ L["new"] = "Nouveau"
+ L["new_sub"] = "Créée un nouveau profil vierge."
L["profiles"] = "Profils"
L["profiles_sub"] = "Gestion des profils"
- --L["current"] = "Current Profile:"
+ L["reset"] = "Réinitialiser le profil"
+ 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_sub"] = "현재 이용할 수 있는 프로필 중 하나를 선택합니다."
+ L["copy"] = "복사해 올 프로필"
+ L["copy_desc"] = "기존 프로필의 설정을 현재 활성화된 프로필로 복사합니다."
+ L["current"] = "현재 프로필:"
L["default"] = "기본값"
- L["intro"] = "모든 캐릭터의 다양한 설정과 사용중인 데이터베이스 프로필, 어느것이던지 매우 다루기 쉽게 바꿀수 있습니다."
- L["reset_desc"] = "단순히 다시 새롭게 구성을 원하는 경우, 현재 프로필을 기본값으로 초기화 합니다."
- L["reset"] = "프로필 초기화"
- L["reset_sub"] = "현재의 프로필을 기본값으로 초기화 합니다"
- L["choose_desc"] = "새로운 이름을 입력하거나, 이미 있는 프로필중 하나를 선택하여 새로운 프로필을 만들 수 있습니다."
- L["new"] = "새로운 프로필"
- L["new_sub"] = "새로운 프로필을 만듭니다."
- L["choose"] = "프로필 선택"
- L["choose_sub"] = "당신이 현재 이용할수 있는 프로필을 선택합니다."
- L["copy_desc"] = "현재 사용중인 프로필에, 선택한 프로필의 설정을 복사합니다."
- L["copy"] = "복사"
- L["delete_desc"] = "데이터베이스에 사용중이거나 저장된 프로파일 삭제로 SavedVariables 파일의 정리와 공간 절약이 됩니다."
L["delete"] = "프로필 삭제"
- L["delete_sub"] = "데이터베이스의 프로필을 삭제합니다."
- L["delete_confirm"] = "정말로 선택한 프로필의 삭제를 원하십니까?"
+ L["delete_confirm"] = "선택한 프로필을 삭제하시겠습니까?"
+ L["delete_desc"] = "데이터베이스에서 기존 프로필과 사용하지 않는 프로필을 삭제하여 공간을 절약하고 SavedVariables 파일을 정리합니다."
+ L["delete_sub"] = "데이터베이스에서 프로필을 삭제합니다."
+ L["intro"] = "활성 데이터베이스 프로필을 변경할 수 있으며, 모든 캐릭터마다 서로 다른 설정을 지정할 수 있습니다."
+ L["new"] = "새로운 프로필"
+ L["new_sub"] = "비어 있는 프로필을 새로 만듭니다."
L["profiles"] = "프로필"
- L["profiles_sub"] = "프로필 설정"
- --L["current"] = "Current Profile:"
+ L["profiles_sub"] = "프로필 관리"
+ L["reset"] = "프로필 재설정"
+ L["reset_desc"] = "구성이 손상되었거나 처음부터 다시 시작하고 싶은 경우 현재 프로필을 기본값으로 재설정하세요."
+ L["reset_sub"] = "현재 프로필을 기본값으로 재설정합니다"
elseif LOCALE == "esES" or LOCALE == "esMX" then
- L["default"] = "Por defecto"
- L["intro"] = "Puedes cambiar el perfil activo de tal manera que cada personaje tenga diferentes configuraciones."
- L["reset_desc"] = "Reinicia el perfil actual a los valores por defectos, en caso de que se haya estropeado la configuración o quieras volver a empezar de nuevo."
- L["reset"] = "Reiniciar Perfil"
- L["reset_sub"] = "Reinicar el perfil actual al de por defecto"
+ 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."
+ L["choose_sub"] = "Selecciona uno de los perfiles disponibles."
+ L["copy"] = "Copiar de"
+ L["copy_desc"] = "Copia los ajustes de un perfil existente al perfil actual."
+ L["current"] = "Perfil actual:"
+ L["default"] = "Por defecto"
+ L["delete"] = "Borrar un Perfil"
+ L["delete_confirm"] = "¿Estas seguro que quieres borrar el perfil seleccionado?"
+ L["delete_desc"] = "Borra los perfiles existentes y sin uso de la base de datos para ganar espacio y limpiar el archivo SavedVariables."
+ L["delete_sub"] = "Borra un perfil de la base de datos."
+ L["intro"] = "Puedes cambiar el perfil activo de tal manera que cada personaje tenga diferentes configuraciones."
L["new"] = "Nuevo"
L["new_sub"] = "Crear un nuevo perfil vacio."
- L["choose"] = "Perfiles existentes"
- L["choose_sub"] = "Selecciona uno de los perfiles disponibles."
- L["copy_desc"] = "Copia los ajustes de un perfil existente al perfil actual."
- L["copy"] = "Copiar de"
- L["delete_desc"] = "Borra los perfiles existentes y sin uso de la base de datos para ganar espacio y limpiar el archivo SavedVariables."
- L["delete"] = "Borrar un Perfil"
- L["delete_sub"] = "Borra un perfil de la base de datos."
- L["delete_confirm"] = "¿Estas seguro que quieres borrar el perfil seleccionado?"
L["profiles"] = "Perfiles"
L["profiles_sub"] = "Manejar Perfiles"
- --L["current"] = "Current Profile:"
+ L["reset"] = "Reiniciar Perfil"
+ L["reset_desc"] = "Reinicia el perfil actual a los valores por defectos, en caso de que se haya estropeado la configuración o quieras volver a empezar de nuevo."
+ L["reset_sub"] = "Reinicar el perfil actual al de por defecto"
elseif LOCALE == "zhTW" then
+ L["choose"] = "現有的設定檔"
+ L["choose_desc"] = "您可以在文字方塊內輸入名字以建立新的設定檔,或是選擇一個現有的設定檔使用。"
+ L["choose_sub"] = "從當前可用的設定檔裡面選擇一個。"
+ L["copy"] = "複製自"
+ L["copy_desc"] = "從一個現有的設定檔,將設定複製到現在使用中的設定檔。"
+ L["current"] = "目前設定檔:"
L["default"] = "預設"
- L["intro"] = "你可以選擇一個活動的資料設定檔,這樣你的每個角色就可以擁有不同的設定值,可以給你的插件設定帶來極大的靈活性。"
- L["reset_desc"] = "將當前的設定檔恢復到它的預設值,用於你的設定檔損壞,或者你只是想重來的情況。"
- L["reset"] = "重置設定檔"
- L["reset_sub"] = "將當前的設定檔恢復為預設值"
- L["choose_desc"] = "你可以通過在文本框內輸入一個名字創立一個新的設定檔,也可以選擇一個已經存在的設定檔。"
+ L["delete"] = "刪除一個設定檔"
+ L["delete_confirm"] = "確定要刪除所選擇的設定檔嗎?"
+ L["delete_desc"] = "從資料庫裡刪除不再使用的設定檔,以節省空間,並且清理 SavedVariables 檔案。"
+ L["delete_sub"] = "從資料庫裡刪除一個設定檔。"
+ L["intro"] = "您可以從資料庫中選擇一個設定檔來使用,如此就可以讓每個角色使用不同的設定。"
L["new"] = "新建"
L["new_sub"] = "新建一個空的設定檔。"
- L["choose"] = "現有的設定檔"
- L["choose_sub"] = "從當前可用的設定檔裏面選擇一個。"
- L["copy_desc"] = "從當前某個已保存的設定檔複製到當前正使用的設定檔。"
- L["copy"] = "複製自"
- L["delete_desc"] = "從資料庫裏刪除不再使用的設定檔,以節省空間,並且清理SavedVariables檔。"
- L["delete"] = "刪除一個設定檔"
- L["delete_sub"] = "從資料庫裏刪除一個設定檔。"
- L["delete_confirm"] = "你確定要刪除所選擇的設定檔嗎?"
L["profiles"] = "設定檔"
L["profiles_sub"] = "管理設定檔"
- --L["current"] = "Current Profile:"
+ L["reset"] = "重置設定檔"
+ L["reset_desc"] = "將現用的設定檔重置為預設值;用於設定檔損壞,或者單純想要重來的情況。"
+ L["reset_sub"] = "將目前的設定檔重置為預設值"
elseif LOCALE == "zhCN" then
- L["default"] = "默认"
- L["intro"] = "你可以选择一个活动的数据配置文件,这样你的每个角色就可以拥有不同的设置值,可以给你的插件配置带来极大的灵活性。"
- L["reset_desc"] = "将当前的配置文件恢复到它的默认值,用于你的配置文件损坏,或者你只是想重来的情况。"
- L["reset"] = "重置配置文件"
- L["reset_sub"] = "将当前的配置文件恢复为默认值"
+ L["choose"] = "现有的配置文件"
L["choose_desc"] = "你可以通过在文本框内输入一个名字创立一个新的配置文件,也可以选择一个已经存在的配置文件。"
+ L["choose_sub"] = "从当前可用的配置文件里面选择一个。"
+ L["copy"] = "复制自"
+ L["copy_desc"] = "从当前某个已保存的配置文件复制到当前正使用的配置文件。"
+ L["current"] = "当前配置文件:"
+ L["default"] = "默认"
+ L["delete"] = "删除一个配置文件"
+ L["delete_confirm"] = "你确定要删除所选择的配置文件么?"
+ L["delete_desc"] = "从数据库里删除不再使用的配置文件,以节省空间,并且清理SavedVariables文件。"
+ L["delete_sub"] = "从数据库里删除一个配置文件。"
+ L["intro"] = "你可以选择一个活动的数据配置文件,这样你的每个角色就可以拥有不同的设置值,可以给你的插件配置带来极大的灵活性。"
L["new"] = "新建"
L["new_sub"] = "新建一个空的配置文件。"
- L["choose"] = "现有的配置文件"
- L["choose_sub"] = "从当前可用的配置文件里面选择一个。"
- L["copy_desc"] = "从当前某个已保存的配置文件复制到当前正使用的配置文件。"
- L["copy"] = "复制自"
- L["delete_desc"] = "从数据库里删除不再使用的配置文件,以节省空间,并且清理SavedVariables文件。"
- L["delete"] = "删除一个配置文件"
- L["delete_sub"] = "从数据库里删除一个配置文件。"
- L["delete_confirm"] = "你确定要删除所选择的配置文件么?"
L["profiles"] = "配置文件"
L["profiles_sub"] = "管理配置文件"
- --L["current"] = "Current Profile:"
+ L["reset"] = "重置配置文件"
+ L["reset_desc"] = "将当前的配置文件恢复到它的默认值,用于你的配置文件损坏,或者你只是想重来的情况。"
+ L["reset_sub"] = "将当前的配置文件恢复为默认值"
elseif LOCALE == "ruRU" then
- L["default"] = "По умолчанию"
- L["intro"] = "Изменяя активный профиль, вы можете задать различные настройки модификаций для каждого персонажа."
- L["reset_desc"] = "Если ваша конфигурации испорчена или если вы хотите настроить всё заново - сбросьте текущий профиль на стандартные значения."
- L["reset"] = "Сброс профиля"
- L["reset_sub"] = "Сброс текущего профиля на стандартный"
- L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей."
- L["new"] = "Новый"
- L["new_sub"] = "Создать новый чистый профиль"
L["choose"] = "Существующие профили"
- L["choose_sub"] = "Выбор одиного из уже доступных профилей"
- L["copy_desc"] = "Скопировать настройки из выбранного профиля в активный."
+ L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей."
+ L["choose_sub"] = "Выбор одного из уже доступных профилей."
L["copy"] = "Скопировать из"
- L["delete_desc"] = "Удалить существующий и неиспользуемый профиль из БД для сохранения места, и очистить SavedVariables файл."
+ L["copy_desc"] = "Копирование настроек из выбранного профиля в активный."
+ L["current"] = "Текущий профиль:"
+ L["default"] = "По умолчанию"
L["delete"] = "Удалить профиль"
- L["delete_sub"] = "Удаление профиля из БД"
- L["delete_confirm"] = "Вы уверены, что вы хотите удалить выбранный профиль?"
+ L["delete_confirm"] = "Вы уверены, что хотите удалить выбранный профиль?"
+ L["delete_desc"] = "Удаление существующего и неиспользуемого профиля из базы данных для сохранения места, и очистка файла SavedVariables."
+ L["delete_sub"] = "Удаление профиля из базы данных."
+ L["intro"] = "Изменяя активный профиль, Вы можете задать разные настройки для каждого персонажа."
+ L["new"] = "Новый"
+ L["new_sub"] = "Создание нового чистого профиля."
L["profiles"] = "Профили"
L["profiles_sub"] = "Управление профилями"
- --L["current"] = "Current Profile:"
+ 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["current"] = "Profilo Attivo:"
+ 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."
+ L["delete_sub"] = "Cancella un profilo dal Database."
+ L["intro"] = "Puoi cambiare il profilo attivo, in modo da usare impostazioni diverse per ogni personaggio."
+ L["new"] = "Nuovo"
+ L["new_sub"] = "Crea un nuovo profilo vuoto."
+ L["profiles"] = "Profili"
+ L["profiles_sub"] = "Gestisci Profili"
+ L["reset"] = "Reimposta Profilo"
+ L["reset_desc"] = "Riporta il tuo profilo attivo alle sue impostazioni predefinite, nel caso in cui la tua configurazione si sia corrotta, o semplicemente tu voglia re-inizializzarla."
+ L["reset_sub"] = "Reimposta il profilo ai suoi valori predefiniti."
+elseif LOCALE == "ptBR" then
+ L["choose"] = "Perfis Existentes"
+ L["choose_desc"] = "Você pode tanto criar um perfil novo tanto digitando um nome na caixa de texto, quanto escolher um dos perfis já existentes."
+ L["choose_sub"] = "Selecione um de seus perfis atualmente disponíveis."
+ L["copy"] = "Copiar De"
+ L["copy_desc"] = "Copia as definições de um perfil existente no perfil atualmente ativo."
+ L["current"] = "Perfil Autal:"
+ L["default"] = "Padrão"
+ L["delete"] = "Remover um Perfil"
+ L["delete_confirm"] = "Tem certeza que deseja remover o perfil selecionado?"
+ L["delete_desc"] = "Remove perfis existentes e inutilizados do banco de dados para economizar espaço, e limpar o arquivo SavedVariables."
+ L["delete_sub"] = "Remove um perfil do banco de dados."
+ L["intro"] = "Você pode alterar o perfil do banco de dados ativo, para que possa ter definições diferentes para cada personagem."
+ L["new"] = "Novo"
+ L["new_sub"] = "Cria um novo perfil vazio."
+ L["profiles"] = "Perfis"
+ L["profiles_sub"] = "Gerenciar Perfis"
+ L["reset"] = "Resetar Perfil"
+ L["reset_desc"] = "Reseta o perfil atual para os valores padrões, no caso de sua configuração estar quebrada, ou simplesmente se deseja começar novamente."
+ L["reset_sub"] = "Resetar o perfil atual ao padrão"
end
local defaultProfiles
@@ -200,22 +236,22 @@ local tmpprofiles = {}
-- @return Hashtable of all profiles with the internal name as keys and the display name as value.
local function getProfileList(db, common, nocurrent)
local profiles = {}
-
+
-- copy existing profiles into the table
local currentProfile = db:GetCurrentProfile()
- for i,v in pairs(db:GetProfiles(tmpprofiles)) do
- if not (nocurrent and v == currentProfile) then
- profiles[v] = v
- end
+ for i,v in pairs(db:GetProfiles(tmpprofiles)) do
+ if not (nocurrent and v == currentProfile) then
+ profiles[v] = v
+ end
end
-
+
-- add our default profiles to choose from ( or rename existing profiles)
for k,v in pairs(defaultProfiles) do
if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
profiles[k] = v
end
end
-
+
return profiles
end
@@ -240,11 +276,11 @@ function OptionsHandlerPrototype:GetCurrentProfile()
return self.db:GetCurrentProfile()
end
---[[
+--[[
List all active profiles
you can control the output with the .arg variable
currently four modes are supported
-
+
(empty) - return all available profiles
"nocurrent" - returns all available profiles except the currently active profile
"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
@@ -262,7 +298,7 @@ function OptionsHandlerPrototype:ListProfiles(info)
else
profiles = getProfileList(self.db)
end
-
+
return profiles
end
@@ -296,19 +332,19 @@ local function getOptionsHandler(db, noDefaultProfiles)
if not defaultProfiles then
generateDefaultProfiles(db)
end
-
+
local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
-
+
for k,v in pairs(OptionsHandlerPrototype) do
handler[k] = v
end
-
+
AceDBOptions.handlers[db] = handler
return handler
end
--[[
- the real options table
+ the real options table
]]
local optionsTable = {
desc = {
@@ -396,7 +432,7 @@ local optionsTable = {
--- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0.
-- @param db The database object to create the options table for.
-- @return The options table to be used in AceConfig-3.0
--- @usage
+-- @usage
-- -- Assuming `options` is your top-level options table and `self.db` is your database:
-- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
@@ -405,7 +441,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
name = L["profiles"],
desc = L["profiles_sub"],
}
-
+
tbl.handler = getOptionsHandler(db, noDefaultProfiles)
tbl.args = optionsTable
diff --git a/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml b/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
new file mode 100644
index 0000000..2668fb0
--- /dev/null
+++ b/Kui_Nameplates/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.lua b/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.lua
index 10685d7..9f96bf3 100644
--- a/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.lua
+++ b/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.lua
@@ -123,4 +123,4 @@ end)
--- Finally: upgrade our old embeds
for target, v in pairs(AceEvent.embeds) do
AceEvent:Embed(target)
-end
\ No newline at end of file
+end
diff --git a/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.xml b/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.xml
new file mode 100644
index 0000000..313ef4d
--- /dev/null
+++ b/Kui_Nameplates/Libs/AceEvent-3.0/AceEvent-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/AceGUI-3.0.lua b/Kui_Nameplates/Libs/AceGUI-3.0/AceGUI-3.0.lua
index 53295bb..35b176e 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -1,6 +1,6 @@
--- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
-- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
+-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
-- stand-alone distribution.
--
-- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
@@ -24,34 +24,29 @@
-- f:AddChild(btn)
-- @class file
-- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 924 2010-05-13 15:12:20Z nevcairiel $
-local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 33
+-- @release $Id$
+local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
if not AceGUI then return end -- No upgrade needed
-- Lua APIs
-local tconcat, tremove, tinsert = table.concat, table.remove, 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
local LayoutRegistry = AceGUI.LayoutRegistry
@@ -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
@@ -108,7 +74,7 @@ do
-- Internal Storage of the objects changed, from an array table
-- to a hash table, and additionally we introduced versioning on
-- the widgets which would discard all widgets from a pre-29 version
- -- anyway, so we just clear the storage now, and don't try to
+ -- anyway, so we just clear the storage now, and don't try to
-- convert the storage tables to the new format.
-- This should generally not cause *many* widgets to end up in trash,
-- since once dialogs are opened, all addons should be loaded already
@@ -118,42 +84,42 @@ do
if oldminor and oldminor < 29 and AceGUI.objPools then
AceGUI.objPools = nil
end
-
+
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
@@ -180,16 +146,16 @@ function AceGUI:Create(type)
widget.OnAcquire = widget.Aquire
widget.Aquire = nil
end
-
+
if rawget(widget, "Release") then
- widget.OnRelease = rawget(widget, "Release")
+ widget.OnRelease = rawget(widget, "Release")
widget.Release = nil
end
-
+
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")
@@ -204,7 +170,10 @@ end
-- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
-- @param widget The widget to release
function AceGUI:Release(widget)
+ if widget.isQueuedForRelease then return end
+ widget.isQueuedForRelease = true
safecall(widget.PauseLayout, widget)
+ widget.frame:Hide()
widget:Fire("OnRelease")
safecall(widget.ReleaseChildren, widget)
@@ -233,9 +202,26 @@ function AceGUI:Release(widget)
widget.content.width = nil
widget.content.height = nil
end
+ widget.isQueuedForRelease = nil
delWidget(widget, widget.type)
end
+--- Check if a widget is currently in the process of being released
+-- This function check if this widget, or any of its parents (in which case it'll be released shortly as well)
+-- are currently being released. This allows addon to handle any callbacks accordingly.
+-- @param widget The widget to check
+function AceGUI:IsReleasing(widget)
+ if widget.isQueuedForRelease then
+ return true
+ end
+
+ if widget.parent and widget.parent.AceGUIWidgetVersion then
+ return AceGUI:IsReleasing(widget.parent)
+ end
+
+ return false
+end
+
-----------
-- Focus --
-----------
@@ -267,18 +253,18 @@ end
--[[
Widgets must provide the following functions
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
+
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
-
+
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
-
+
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
-
+
The Widget can supply the following Optional Members
:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
:OnWidthSet(width) - Called when the width of the widget is changed
@@ -294,21 +280,21 @@ end
-- Widget Base Template --
--------------------------
do
- local WidgetBase = AceGUI.WidgetBase
-
+ local WidgetBase = AceGUI.WidgetBase
+
WidgetBase.SetParent = function(self, parent)
local frame = self.frame
frame:SetParent(nil)
frame:SetParent(parent.content)
self.parent = parent
end
-
+
WidgetBase.SetCallback = function(self, name, func)
if type(func) == "function" then
self.events[name] = func
end
end
-
+
WidgetBase.Fire = function(self, name, ...)
if self.events[name] then
local success, ret = safecall(self.events[name], self, name, ...)
@@ -317,7 +303,7 @@ do
end
end
end
-
+
WidgetBase.SetWidth = function(self, width)
self.frame:SetWidth(width)
self.frame.width = width
@@ -325,7 +311,7 @@ do
self:OnWidthSet(width)
end
end
-
+
WidgetBase.SetRelativeWidth = function(self, width)
if width <= 0 or width > 1 then
error(":SetRelativeWidth(width): Invalid relative width.", 2)
@@ -333,7 +319,7 @@ do
self.relWidth = width
self.width = "relative"
end
-
+
WidgetBase.SetHeight = function(self, height)
self.frame:SetHeight(height)
self.frame.height = height
@@ -341,7 +327,7 @@ do
self:OnHeightSet(height)
end
end
-
+
--[[ WidgetBase.SetRelativeHeight = function(self, height)
if height <= 0 or height > 1 then
error(":SetRelativeHeight(height): Invalid relative height.", 2)
@@ -353,47 +339,51 @@ do
WidgetBase.IsVisible = function(self)
return self.frame:IsVisible()
end
-
+
WidgetBase.IsShown= function(self)
return self.frame:IsShown()
end
-
+
WidgetBase.Release = function(self)
AceGUI:Release(self)
end
-
+
+ WidgetBase.IsReleasing = function(self)
+ return AceGUI:IsReleasing(self)
+ end
+
WidgetBase.SetPoint = function(self, ...)
return self.frame:SetPoint(...)
end
-
+
WidgetBase.ClearAllPoints = function(self)
return self.frame:ClearAllPoints()
end
-
+
WidgetBase.GetNumPoints = function(self)
return self.frame:GetNumPoints()
end
-
+
WidgetBase.GetPoint = function(self, ...)
return self.frame:GetPoint(...)
- end
-
+ end
+
WidgetBase.GetUserDataTable = function(self)
return self.userdata
end
-
+
WidgetBase.SetUserData = function(self, key, value)
self.userdata[key] = value
end
-
+
WidgetBase.GetUserData = function(self, key)
return self.userdata[key]
end
-
+
WidgetBase.IsFullHeight = function(self)
return self.height == "fill"
end
-
+
WidgetBase.SetFullHeight = function(self, isFull)
if isFull then
self.height = "fill"
@@ -401,11 +391,11 @@ do
self.height = nil
end
end
-
+
WidgetBase.IsFullWidth = function(self)
return self.width == "fill"
end
-
+
WidgetBase.SetFullWidth = function(self, isFull)
if isFull then
self.width = "fill"
@@ -413,29 +403,29 @@ do
self.width = nil
end
end
-
+
-- local function LayoutOnUpdate(this)
-- this:SetScript("OnUpdate",nil)
-- this.obj:PerformLayout()
-- end
-
+
local WidgetContainerBase = AceGUI.WidgetContainerBase
-
+
WidgetContainerBase.PauseLayout = function(self)
self.LayoutPaused = true
end
-
+
WidgetContainerBase.ResumeLayout = function(self)
self.LayoutPaused = nil
end
-
+
WidgetContainerBase.PerformLayout = function(self)
if self.LayoutPaused then
return
end
safecall(self.LayoutFunc, self.content, self.children)
end
-
+
--call this function to layout, makes sure layed out objects get a frame to get sizes etc
WidgetContainerBase.DoLayout = function(self)
self:PerformLayout()
@@ -443,7 +433,7 @@ do
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
-- end
end
-
+
WidgetContainerBase.AddChild = function(self, child, beforeWidget)
if beforeWidget then
local siblingIndex = 1
@@ -451,7 +441,7 @@ do
if widget == beforeWidget then
break
end
- siblingIndex = siblingIndex + 1
+ siblingIndex = siblingIndex + 1
end
tinsert(self.children, siblingIndex, child)
else
@@ -461,7 +451,7 @@ do
child.frame:Show()
self:DoLayout()
end
-
+
WidgetContainerBase.AddChildren = function(self, ...)
for i = 1, select("#", ...) do
local child = select(i, ...)
@@ -471,7 +461,7 @@ do
end
self:DoLayout()
end
-
+
WidgetContainerBase.ReleaseChildren = function(self)
local children = self.children
for i = 1,#children do
@@ -479,7 +469,7 @@ do
children[i] = nil
end
end
-
+
WidgetContainerBase.SetLayout = function(self, Layout)
self.LayoutFunc = AceGUI:GetLayout(Layout)
end
@@ -503,7 +493,7 @@ do
end
end
end
-
+
local function ContentResize(this)
if this:GetWidth() and this:GetHeight() then
this.width = this:GetWidth()
@@ -515,7 +505,7 @@ do
setmetatable(WidgetContainerBase, {__index=WidgetBase})
--One of these function should be called on each Widget Instance as part of its creation process
-
+
--- Register a widget-class as a container for newly created widgets.
-- @param widget The widget class
function AceGUI:RegisterAsContainer(widget)
@@ -531,7 +521,7 @@ do
widget:SetLayout("List")
return widget
end
-
+
--- Register a widget-class as a widget.
-- @param widget The widget class
function AceGUI:RegisterAsWidget(widget)
@@ -558,11 +548,11 @@ end
-- @param Version The version of the widget
function AceGUI:RegisterWidgetType(Name, Constructor, Version)
assert(type(Constructor) == "function")
- assert(type(Version) == "number")
-
+ assert(type(Version) == "number")
+
local oldVersion = WidgetVersions[Name]
if oldVersion and oldVersion >= Version then return end
-
+
WidgetVersions[Name] = Version
WidgetRegistry[Name] = Constructor
end
@@ -593,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
-------------
@@ -631,7 +621,7 @@ AceGUI:RegisterLayout("List",
local width = content.width or content:GetWidth() or 0
for i = 1, #children do
local child = children[i]
-
+
local frame = child.frame
frame:ClearAllPoints()
frame:Show()
@@ -640,22 +630,22 @@ AceGUI:RegisterLayout("List",
else
frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
end
-
+
if child.width == "fill" then
child:SetWidth(width)
frame:SetPoint("RIGHT", content)
-
+
if child.DoLayout then
child:DoLayout()
end
elseif child.width == "relative" then
child:SetWidth(width * child.relWidth)
-
+
if child.DoLayout then
child:DoLayout()
end
end
-
+
height = height + (frame.height or frame:GetHeight() or 0)
end
safecall(content.obj.LayoutFinished, content.obj, nil, height)
@@ -667,14 +657,23 @@ AceGUI:RegisterLayout("Fill",
if children[1] then
children[1]:SetWidth(content:GetWidth() or 0)
children[1]:SetHeight(content:GetHeight() or 0)
+ children[1].frame:ClearAllPoints()
children[1].frame:SetAllPoints(content)
children[1].frame:Show()
safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
end
end)
+local layoutrecursionblock = nil
+local function safelayoutcall(object, func, ...)
+ layoutrecursionblock = true
+ object[func](object, ...)
+ layoutrecursionblock = nil
+end
+
AceGUI:RegisterLayout("Flow",
function(content, children)
+ if layoutrecursionblock then return end
--used height so far
local height = 0
--width used in the current row
@@ -682,19 +681,17 @@ AceGUI:RegisterLayout("Flow",
--height of the current row
local rowheight = 0
local rowoffset = 0
- local lastrowoffset
-
+
local width = content.width or content:GetWidth() or 0
-
+
--control at the start of the row
local rowstart
local rowstartoffset
- local lastrowstart
local isfullheight
-
+
local frameoffset
local lastframeoffset
- local oversize
+ local oversize
for i = 1, #children do
local child = children[i]
oversize = nil
@@ -702,17 +699,17 @@ AceGUI:RegisterLayout("Flow",
local frameheight = frame.height or frame:GetHeight() or 0
local framewidth = frame.width or frame:GetWidth() or 0
lastframeoffset = frameoffset
- -- HACK: Why did we set a frameoffset of (frameheight / 2) ?
+ -- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-- That was moving all widgets half the widgets size down, is that intended?
-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
-- TODO: Investigate moar!
frameoffset = child.alignoffset or (frameheight / 2)
-
+
if child.width == "relative" then
framewidth = width * child.relWidth
end
-
+
frame:Show()
frame:ClearAllPoints()
if i == 1 then
@@ -751,24 +748,23 @@ AceGUI:RegisterLayout("Flow",
else
--handles cases where the new height is higher than either control because of the offsets
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
+
--offset is always the larger of the two offsets
rowoffset = math_max(rowoffset, frameoffset)
rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
+
frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
usedwidth = framewidth + usedwidth
end
end
if child.width == "fill" then
- child:SetWidth(width)
+ safelayoutcall(child, "SetWidth", width)
frame:SetPoint("RIGHT", content)
-
+
usedwidth = 0
rowstart = frame
- rowstartoffset = frameoffset
-
+
if child.DoLayout then
child:DoLayout()
end
@@ -776,8 +772,8 @@ AceGUI:RegisterLayout("Flow",
rowoffset = child.alignoffset or (rowheight / 2)
rowstartoffset = rowoffset
elseif child.width == "relative" then
- child:SetWidth(width * child.relWidth)
-
+ safelayoutcall(child, "SetWidth", width * child.relWidth)
+
if child.DoLayout then
child:DoLayout()
end
@@ -786,20 +782,239 @@ AceGUI:RegisterLayout("Flow",
frame:SetPoint("RIGHT", content)
end
end
-
+
if child.height == "fill" then
frame:SetPoint("BOTTOM", content)
isfullheight = true
end
end
-
+
--anchor the last row, if its full height needs a special case since its height has just been changed by the anchor
if isfullheight then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
elseif rowstart then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
end
-
+
height = height + rowheight + 3
safecall(content.obj.LayoutFinished, content.obj, nil, height)
end)
+
+-- Get alignment method and value. Possible alignment methods are a callback, a number, "start", "middle", "end", "fill" or "TOPLEFT", "BOTTOMRIGHT" etc.
+local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
+ local fn = cellObj and (cellObj["align" .. dir] or cellObj.align)
+ or colObj and (colObj["align" .. dir] or colObj.align)
+ or tableObj["align" .. dir] or tableObj.align
+ or "CENTERLEFT"
+ local val
+ child, cell = child or 0, cell or 0
+
+ if type(fn) == "string" then
+ fn = fn:lower()
+ fn = dir == "V" and (fn:sub(1, 3) == "top" and "start" or fn:sub(1, 6) == "bottom" and "end" or fn:sub(1, 6) == "center" and "middle")
+ or dir == "H" and (fn:sub(-4) == "left" and "start" or fn:sub(-5) == "right" and "end" or fn:sub(-6) == "center" and "middle")
+ or fn
+ val = (fn == "start" or fn == "fill") and 0 or fn == "end" and cell - child or (cell - child) / 2
+ elseif type(fn) == "function" then
+ val = fn(child or 0, cell, dir)
+ else
+ val = fn
+ end
+
+ return fn, math_max(0, math_min(val, cell))
+end
+
+-- Get width or height for multiple cells combined
+local GetCellDimension = function (dir, laneDim, from, to, space)
+ local dim = 0
+ for cell=from,to do
+ dim = dim + (laneDim[cell] or 0)
+ end
+ return dim + math_max(0, to - from) * (space or 0)
+end
+
+--[[ Options
+============
+Container:
+ - columns ({col, col, ...}): Column settings. "col" can be a number (<= 0: content width, <1: rel. width, <10: weight, >=10: abs. width) or a table with column setting.
+ - space, spaceH, spaceV: Overall, horizontal and vertical spacing between cells.
+ - align, alignH, alignV: Overall, horizontal and vertical cell alignment. See GetCellAlign() for possible values.
+Columns:
+ - width: Fixed column width (nil or <=0: content width, <1: rel. width, >=1: abs. width).
+ - min or 1: Min width for content based width
+ - max or 2: Max width for content based width
+ - weight: Flexible column width. The leftover width after accounting for fixed-width columns is distributed to weighted columns according to their weights.
+ - align, alignH, alignV: Overwrites the container setting for alignment.
+Cell:
+ - colspan: Makes a cell span multiple columns.
+ - rowspan: Makes a cell span multiple rows.
+ - align, alignH, alignV: Overwrites the container and column setting for alignment.
+]]
+AceGUI:RegisterLayout("Table",
+ function (content, children)
+ local obj = content.obj
+ obj:PauseLayout()
+
+ local tableObj = obj:GetUserData("table")
+ local cols = tableObj.columns
+ local spaceH = tableObj.spaceH or tableObj.space or 0
+ local spaceV = tableObj.spaceV or tableObj.space or 0
+ local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1)
+
+ -- We need to reuse these because layout events can come in very frequently
+ local layoutCache = obj:GetUserData("layoutCache")
+ if not layoutCache then
+ layoutCache = {{}, {}, {}, {}, {}, {}}
+ obj:SetUserData("layoutCache", layoutCache)
+ end
+ local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache)
+
+ -- Create the grid
+ local n, slotFound = 0
+ for i,child in ipairs(children) do
+ if child:IsShown() then
+ repeat
+ n = n + 1
+ local col = (n - 1) % #cols + 1
+ local row = math_ceil(n / #cols)
+ local rowspan = rowspans[col]
+ local cell = rowspan and rowspan.child or child
+ local cellObj = cell:GetUserData("cell")
+ slotFound = not rowspan
+
+ -- Rowspan
+ if not rowspan and cellObj and cellObj.rowspan then
+ rowspan = {child = child, from = row, to = row + cellObj.rowspan - 1}
+ rowspans[col] = rowspan
+ end
+ if rowspan and i == #children then
+ rowspan.to = row
+ end
+
+ -- Colspan
+ local colspan = math_max(0, math_min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
+ n = n + colspan
+
+ -- Place the cell
+ if not rowspan or rowspan.to == row then
+ t[n] = cell
+ rowStart[cell] = rowspan and rowspan.from or row
+ colStart[cell] = col
+
+ if rowspan then
+ rowspans[col] = nil
+ end
+ end
+ until slotFound
+ end
+ end
+
+ local rows = math_ceil(n / #cols)
+
+ -- Determine fixed size cols and collect weights
+ local extantH, totalWeight = totalH, 0
+ for col,colObj in ipairs(cols) do
+ laneH[col] = 0
+
+ if type(colObj) == "number" then
+ colObj = {[colObj >= 1 and colObj < 10 and "weight" or "width"] = colObj}
+ cols[col] = colObj
+ end
+
+ if colObj.weight then
+ -- Weight
+ totalWeight = totalWeight + (colObj.weight or 1)
+ else
+ if not colObj.width or colObj.width <= 0 then
+ -- Content width
+ for row=1,rows do
+ local child = t[(row - 1) * #cols + col]
+ if child then
+ local f = child.frame
+ f:ClearAllPoints()
+ local childH = f:GetWidth() or 0
+
+ laneH[col] = math_max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
+ end
+ end
+
+ 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 = math_max(0, extantH - laneH[col])
+ end
+ end
+
+ -- Determine sizes based on weight
+ local scale = totalWeight > 0 and extantH / totalWeight or 0
+ for col,colObj in pairs(cols) do
+ if colObj.weight then
+ laneH[col] = scale * colObj.weight
+ end
+ end
+
+ -- Arrange children
+ for row=1,rows do
+ local rowV = 0
+
+ -- Horizontal placement and sizing
+ for col=1,#cols do
+ local child = t[(row - 1) * #cols + col]
+ if child then
+ local colObj = cols[colStart[child]]
+ local cellObj = child:GetUserData("cell")
+ local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH)
+ local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH)
+
+ local f = child.frame
+ f:ClearAllPoints()
+ local childH = f:GetWidth() or 0
+
+ local alignFn, align = GetCellAlign("H", tableObj, colObj, cellObj, cellH, childH)
+ f:SetPoint("LEFT", content, offsetH + align, 0)
+ if child:IsFullWidth() or alignFn == "fill" or childH > cellH then
+ f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0)
+ end
+
+ if child.DoLayout then
+ child:DoLayout()
+ end
+
+ rowV = math_max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
+ end
+ end
+
+ laneV[row] = rowV
+
+ -- Vertical placement and sizing
+ for col=1,#cols do
+ local child = t[(row - 1) * #cols + col]
+ if child then
+ local colObj = cols[colStart[child]]
+ local cellObj = child:GetUserData("cell")
+ local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV)
+ local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV)
+
+ local f = child.frame
+ local childV = f:GetHeight() or 0
+
+ local alignFn, align = GetCellAlign("V", tableObj, colObj, cellObj, cellV, childV)
+ if child:IsFullHeight() or alignFn == "fill" then
+ f:SetHeight(cellV)
+ end
+ f:SetPoint("TOP", content, 0, -(offsetV + align))
+ end
+ end
+ end
+
+ -- Calculate total height
+ local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV)
+
+ -- Cleanup
+ for _,v in pairs(layoutCache) do wipe(v) end
+
+ safecall(obj.LayoutFinished, obj, nil, totalV)
+ obj:ResumeLayout()
+ end)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
index 7f92d82..d95db58 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
@@ -2,7 +2,7 @@
BlizOptionsGroup Container
Simple container widget for the integration of AceGUI into the Blizzard Interface Options
-------------------------------------------------------------------------------]]
-local Type, Version = "BlizOptionsGroup", 20
+local Type, Version = "BlizOptionsGroup", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -36,8 +36,12 @@ local function cancel(frame)
frame.obj:Fire("cancel")
end
-local function defaults(frame)
- frame.obj:Fire("defaults")
+local function default(frame)
+ frame.obj:Fire("default")
+end
+
+local function refresh(frame)
+ frame.obj:Fire("refresh")
end
--[[-----------------------------------------------------------------------------
@@ -95,13 +99,19 @@ local methods = {
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
- local frame = CreateFrame("Frame")
+ local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer)
frame:Hide()
-- support functions for the Blizzard Interface Options
frame.okay = okay
frame.cancel = cancel
- frame.defaults = defaults
+ frame.default = default
+ frame.refresh = refresh
+
+ -- 10.0 support function aliases (cancel has been removed)
+ frame.OnCommit = okay
+ frame.OnDefault = default
+ frame.OnRefresh = refresh
frame:SetScript("OnHide", OnHide)
frame:SetScript("OnShow", OnShow)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
index 083a9f7..cd83755 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -2,7 +2,7 @@
DropdownGroup Container
Container controlled by a dropdown on the top.
-------------------------------------------------------------------------------]]
-local Type, Version = "DropdownGroup", 20
+local Type, Version = "DropdownGroup", 22
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -50,8 +50,8 @@ local methods = {
end
end,
- ["SetGroupList"] = function(self,list)
- self.dropdown:SetList(list)
+ ["SetGroupList"] = function(self,list,order)
+ self.dropdown:SetList(list,order)
end,
["SetStatusTable"] = function(self, status)
@@ -125,7 +125,7 @@ local function Constructor()
dropdown.frame:Show()
dropdown:SetLabel("")
- local border = CreateFrame("Frame", nil, frame)
+ local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
border:SetPoint("TOPLEFT", 0, -26)
border:SetPoint("BOTTOMRIGHT", 0, 3)
border:SetBackdrop(PaneBackdrop)
@@ -150,7 +150,7 @@ local function Constructor()
widget[method] = func
end
dropdown.parentgroup = widget
-
+
return AceGUI:RegisterAsContainer(widget)
end
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
index b35797b..39a1004 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -1,7 +1,7 @@
--[[-----------------------------------------------------------------------------
Frame Container
-------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 21
+local Type, Version = "Frame", 30
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -13,18 +13,18 @@ local wipe = table.wipe
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, 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: CLOSE
-
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Button_OnClick(frame)
- PlaySound("gsTitleOptionExit")
+ PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
frame.obj:Hide()
end
+local function Frame_OnShow(frame)
+ frame.obj:Fire("OnShow")
+end
+
local function Frame_OnClose(frame)
frame.obj:Fire("OnClose")
end
@@ -79,10 +79,12 @@ local methods = {
["OnAcquire"] = function(self)
self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
+ self.frame:SetFrameLevel(100) -- Lots of room to draw under it
self:SetTitle()
self:SetStatusText()
self:ApplyStatus()
self:Show()
+ self:EnableResize(true)
end,
["OnRelease"] = function(self)
@@ -112,6 +114,7 @@ local methods = {
["SetTitle"] = function(self, title)
self.titletext:SetText(title)
+ self.titlebg:SetWidth((self.titletext:GetWidth() or 0) + 10)
end,
["SetStatusText"] = function(self, text)
@@ -126,6 +129,13 @@ local methods = {
self.frame:Show()
end,
+ ["EnableResize"] = function(self, state)
+ local func = state and "Show" or "Hide"
+ self.sizer_se[func](self.sizer_se)
+ self.sizer_s[func](self.sizer_s)
+ self.sizer_e[func](self.sizer_e)
+ end,
+
-- called to set an external table to store status in
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
@@ -166,17 +176,23 @@ local PaneBackdrop = {
}
local function Constructor()
- local frame = CreateFrame("Frame", nil, UIParent)
+ local frame = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
frame:Hide()
frame:EnableMouse(true)
frame:SetMovable(true)
frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
+ frame:SetFrameLevel(100) -- Lots of room to draw under it
frame:SetBackdrop(FrameBackdrop)
frame:SetBackdropColor(0, 0, 0, 1)
- frame:SetMinResize(400, 200)
+ if frame.SetResizeBounds then -- WoW 10.0
+ frame:SetResizeBounds(400, 200)
+ else
+ frame:SetMinResize(400, 200)
+ end
frame:SetToplevel(true)
+ frame:SetScript("OnShow", Frame_OnShow)
frame:SetScript("OnHide", Frame_OnClose)
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
@@ -187,7 +203,7 @@ local function Constructor()
closebutton:SetWidth(100)
closebutton:SetText(CLOSE)
- local statusbg = CreateFrame("Button", nil, frame)
+ local statusbg = CreateFrame("Button", nil, frame, "BackdropTemplate")
statusbg:SetPoint("BOTTOMLEFT", 15, 15)
statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
statusbg:SetHeight(24)
@@ -205,7 +221,7 @@ local function Constructor()
statustext:SetText("")
local titlebg = frame:CreateTexture(nil, "OVERLAY")
- titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+ titlebg:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
titlebg:SetPoint("TOP", 0, 12)
titlebg:SetWidth(100)
@@ -221,14 +237,14 @@ local function Constructor()
titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)
local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
- titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+ titlebg_l:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
titlebg_l:SetWidth(30)
titlebg_l:SetHeight(40)
local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
- titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+ titlebg_r:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
titlebg_r:SetWidth(30)
@@ -246,7 +262,7 @@ local function Constructor()
line1:SetWidth(14)
line1:SetHeight(14)
line1:SetPoint("BOTTOMRIGHT", -8, 8)
- line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+ line1:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
local x = 0.1 * 14/17
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
@@ -254,8 +270,8 @@ local function Constructor()
line2:SetWidth(8)
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
- line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
- local x = 0.1 * 8/17
+ line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
+ x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
local sizer_s = CreateFrame("Frame", nil, frame)
@@ -283,6 +299,10 @@ local function Constructor()
localstatus = {},
titletext = titletext,
statustext = statustext,
+ titlebg = titlebg,
+ sizer_se = sizer_se,
+ sizer_s = sizer_s,
+ sizer_e = sizer_e,
content = content,
frame = frame,
type = Type
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
index 9413611..1676ae4 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
@@ -2,7 +2,7 @@
InlineGroup Container
Simple container widget that creates a visible "box" with an optional title.
-------------------------------------------------------------------------------]]
-local Type, Version = "InlineGroup", 20
+local Type, Version = "InlineGroup", 22
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -19,6 +19,7 @@ local methods = {
["OnAcquire"] = function(self)
self:SetWidth(300)
self:SetHeight(100)
+ self:SetTitle("")
end,
-- ["OnRelease"] = nil,
@@ -74,7 +75,7 @@ local function Constructor()
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
- local border = CreateFrame("Frame", nil, frame)
+ local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
border:SetPoint("TOPLEFT", 0, -17)
border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
index 10a4d58..d110d03 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
@@ -2,13 +2,13 @@
ScrollFrame Container
Plain container that scrolls its content and doesn't grow in height.
-------------------------------------------------------------------------------]]
-local Type, Version = "ScrollFrame", 21
+local Type, Version = "ScrollFrame", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs
local pairs, assert, type = pairs, assert, type
-local min, max, floor, abs = math.min, math.max, math.floor, math.abs
+local min, max, floor = math.min, math.max, math.floor
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
@@ -40,8 +40,9 @@ end
Methods
-------------------------------------------------------------------------------]]
local methods = {
- ["OnAcquire"] = function(self)
+ ["OnAcquire"] = function(self)
self:SetScroll(0)
+ self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
end,
["OnRelease"] = function(self)
@@ -52,7 +53,7 @@ local methods = {
self.scrollframe:SetPoint("BOTTOMRIGHT")
self.scrollbar:Hide()
self.scrollBarShown = nil
- self.content.height, self.content.width = nil, nil
+ self.content.height, self.content.width, self.content.original_width = nil, nil, nil
end,
["SetScroll"] = function(self, value)
@@ -76,7 +77,7 @@ local methods = {
["MoveScroll"] = function(self, value)
local status = self.status or self.localstatus
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
+
if self.scrollBarShown then
local diff = height - viewheight
local delta = 1
@@ -93,7 +94,6 @@ local methods = {
local status = self.status or self.localstatus
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
local offset = status.offset or 0
- local curvalue = self.scrollbar:GetValue()
-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
if viewheight < height + 2 then
@@ -102,6 +102,9 @@ local methods = {
self.scrollbar:Hide()
self.scrollbar:SetValue(0)
self.scrollframe:SetPoint("BOTTOMRIGHT")
+ if self.content.original_width then
+ self.content.width = self.content.original_width
+ end
self:DoLayout()
end
else
@@ -109,6 +112,9 @@ local methods = {
self.scrollBarShown = true
self.scrollbar:Show()
self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
+ if self.content.original_width then
+ self.content.width = self.content.original_width - 20
+ end
self:DoLayout()
end
local value = (offset / (viewheight - height) * 1000)
@@ -127,6 +133,11 @@ local methods = {
["LayoutFinished"] = function(self, width, height)
self.content:SetHeight(height or 0 + 20)
+
+ -- update the scrollframe
+ self:FixScroll()
+
+ -- schedule another update when everything has "settled"
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
end,
@@ -140,7 +151,8 @@ local methods = {
["OnWidthSet"] = function(self, width)
local content = self.content
- content.width = width
+ content.width = width - (self.scrollBarShown and 20 or 0)
+ content.original_width = width
end,
["OnHeightSet"] = function(self, height)
@@ -175,7 +187,7 @@ local function Constructor()
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
scrollbg:SetAllPoints(scrollbar)
- scrollbg:SetTexture(0, 0, 0, 0.4)
+ scrollbg:SetColorTexture(0, 0, 0, 0.4)
--Container Support
local content = CreateFrame("Frame", nil, scrollframe)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index 8287696..8e46876 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -2,22 +2,18 @@
TabGroup Container
Container that uses tabs on top to switch between groups.
-------------------------------------------------------------------------------]]
-local Type, Version = "TabGroup", 30
+local Type, Version = "TabGroup", 38
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs
-local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
+local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, table.wipe
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
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: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
-
-- local upvalue storage used by BuildTabs
local widths = {}
local rowwidths = {}
@@ -26,6 +22,143 @@ local rowends = {}
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
+
+local function PanelTemplates_TabResize(tab, padding, absoluteSize, minWidth, maxWidth, absoluteTextSize)
+ local tabName = tab:GetName();
+
+ local buttonMiddle = tab.Middle or tab.middleTexture or _G[tabName.."Middle"];
+ local buttonMiddleDisabled = tab.MiddleDisabled or (tabName and _G[tabName.."MiddleDisabled"]);
+ local left = tab.Left or tab.leftTexture or _G[tabName.."Left"];
+ local sideWidths = 2 * left:GetWidth();
+ local tabText = tab.Text or _G[tab:GetName().."Text"];
+ local highlightTexture = tab.HighlightTexture or (tabName and _G[tabName.."HighlightTexture"]);
+
+ local width, tabWidth;
+ local textWidth;
+ if ( absoluteTextSize ) then
+ textWidth = absoluteTextSize;
+ else
+ tabText:SetWidth(0);
+ textWidth = tabText:GetWidth();
+ end
+ -- If there's an absolute size specified then use it
+ if ( absoluteSize ) then
+ if ( absoluteSize < sideWidths) then
+ width = 1;
+ tabWidth = sideWidths
+ else
+ width = absoluteSize - sideWidths;
+ tabWidth = absoluteSize
+ end
+ tabText:SetWidth(width);
+ else
+ -- Otherwise try to use padding
+ if ( padding ) then
+ width = textWidth + padding;
+ else
+ width = textWidth + 24;
+ end
+ -- If greater than the maxWidth then cap it
+ if ( maxWidth and width > maxWidth ) then
+ if ( padding ) then
+ width = maxWidth + padding;
+ else
+ width = maxWidth + 24;
+ end
+ tabText:SetWidth(width);
+ else
+ tabText:SetWidth(0);
+ end
+ if (minWidth and width < minWidth) then
+ width = minWidth;
+ end
+ tabWidth = width + sideWidths;
+ end
+
+ if ( buttonMiddle ) then
+ buttonMiddle:SetWidth(width);
+ end
+ if ( buttonMiddleDisabled ) then
+ buttonMiddleDisabled:SetWidth(width);
+ end
+
+ tab:SetWidth(tabWidth);
+
+ if ( highlightTexture ) then
+ highlightTexture:SetWidth(tabWidth);
+ end
+end
+
+local function PanelTemplates_DeselectTab(tab)
+ local name = tab:GetName();
+
+ local left = tab.Left or _G[name.."Left"];
+ local middle = tab.Middle or _G[name.."Middle"];
+ local right = tab.Right or _G[name.."Right"];
+ left:Show();
+ middle:Show();
+ right:Show();
+ --tab:UnlockHighlight();
+ tab:Enable();
+ local text = tab.Text or _G[name.."Text"];
+ text:SetPoint("CENTER", tab, "CENTER", (tab.deselectedTextX or 0), (tab.deselectedTextY or 2));
+
+ local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+ local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+ local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+ leftDisabled:Hide();
+ middleDisabled:Hide();
+ rightDisabled:Hide();
+end
+
+local function PanelTemplates_SelectTab(tab)
+ local name = tab:GetName();
+
+ local left = tab.Left or _G[name.."Left"];
+ local middle = tab.Middle or _G[name.."Middle"];
+ local right = tab.Right or _G[name.."Right"];
+ left:Hide();
+ middle:Hide();
+ right:Hide();
+ --tab:LockHighlight();
+ tab:Disable();
+ tab:SetDisabledFontObject(GameFontHighlightSmall);
+ local text = tab.Text or _G[name.."Text"];
+ text:SetPoint("CENTER", tab, "CENTER", (tab.selectedTextX or 0), (tab.selectedTextY or -3));
+
+ local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+ local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+ local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+ leftDisabled:Show();
+ middleDisabled:Show();
+ rightDisabled:Show();
+
+ if GameTooltip:IsOwned(tab) then
+ GameTooltip:Hide();
+ end
+end
+
+local function PanelTemplates_SetDisabledTabState(tab)
+ local name = tab:GetName();
+ local left = tab.Left or _G[name.."Left"];
+ local middle = tab.Middle or _G[name.."Middle"];
+ local right = tab.Right or _G[name.."Right"];
+ left:Show();
+ middle:Show();
+ right:Show();
+ --tab:UnlockHighlight();
+ tab:Disable();
+ tab.text = tab:GetText();
+ -- Gray out text
+ tab:SetDisabledFontObject(GameFontDisableSmall);
+ local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+ local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+ local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+ leftDisabled:Hide();
+ middleDisabled:Hide();
+ rightDisabled:Hide();
+end
+
local function UpdateTabLook(frame)
if frame.disabled then
PanelTemplates_SetDisabledTabState(frame)
@@ -39,7 +172,7 @@ end
local function Tab_SetText(frame, text)
frame:_SetText(text)
local width = frame.obj.frame.width or frame.obj.frame:GetWidth() or 0
- PanelTemplates_TabResize(frame, 0, nil, width)
+ PanelTemplates_TabResize(frame, 0, nil, nil, width, frame:GetFontString():GetStringWidth())
end
local function Tab_SetSelected(frame, selected)
@@ -63,7 +196,7 @@ Scripts
-------------------------------------------------------------------------------]]
local function Tab_OnClick(frame)
if not (frame.selected or frame.disabled) then
- PlaySound("igCharacterInfoTab")
+ PlaySound(841) -- SOUNDKIT.IG_CHARACTER_INFO_TAB
frame.obj:SelectTab(frame.value)
end
end
@@ -103,11 +236,64 @@ local methods = {
["CreateTab"] = function(self, id)
local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
- local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
+ local tab = CreateFrame("Button", tabname, self.border)
+ tab:SetSize(115, 24)
+ tab.deselectedTextY = -3
+ tab.selectedTextY = -2
+
+ tab.LeftDisabled = tab:CreateTexture(tabname .. "LeftDisabled", "BORDER")
+ tab.LeftDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+ tab.LeftDisabled:SetSize(20, 24)
+ tab.LeftDisabled:SetPoint("BOTTOMLEFT", 0, -3)
+ tab.LeftDisabled:SetTexCoord(0, 0.15625, 0, 1.0)
+
+ tab.MiddleDisabled = tab:CreateTexture(tabname .. "MiddleDisabled", "BORDER")
+ tab.MiddleDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+ tab.MiddleDisabled:SetSize(88, 24)
+ tab.MiddleDisabled:SetPoint("LEFT", tab.LeftDisabled, "RIGHT")
+ tab.MiddleDisabled:SetTexCoord(0.15625, 0.84375, 0, 1.0)
+
+ tab.RightDisabled = tab:CreateTexture(tabname .. "RightDisabled", "BORDER")
+ tab.RightDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+ tab.RightDisabled:SetSize(20, 24)
+ tab.RightDisabled:SetPoint("LEFT", tab.MiddleDisabled, "RIGHT")
+ tab.RightDisabled:SetTexCoord(0.84375, 1.0, 0, 1.0)
+
+ tab.Left = tab:CreateTexture(tabname .. "Left", "BORDER")
+ tab.Left:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+ tab.Left:SetSize(20, 24)
+ tab.Left:SetPoint("TOPLEFT")
+ tab.Left:SetTexCoord(0, 0.15625, 0, 1.0)
+
+ tab.Middle = tab:CreateTexture(tabname .. "Middle", "BORDER")
+ tab.Middle:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+ tab.Middle:SetSize(88, 24)
+ tab.Middle:SetPoint("LEFT", tab.Left, "RIGHT")
+ tab.Middle:SetTexCoord(0.15625, 0.84375, 0, 1.0)
+
+ tab.Right = tab:CreateTexture(tabname .. "Right", "BORDER")
+ tab.Right:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+ tab.Right:SetSize(20, 24)
+ tab.Right:SetPoint("LEFT", tab.Middle, "RIGHT")
+ tab.Right:SetTexCoord(0.84375, 1.0, 0, 1.0)
+
+ tab.Text = tab:CreateFontString(tabname .. "Text")
+ tab:SetFontString(tab.Text)
+
+ tab:SetNormalFontObject(GameFontNormalSmall)
+ tab:SetHighlightFontObject(GameFontHighlightSmall)
+ tab:SetDisabledFontObject(GameFontHighlightSmall)
+ tab:SetHighlightTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight", "ADD")
+ tab.HighlightTexture = tab:GetHighlightTexture()
+ tab.HighlightTexture:ClearAllPoints()
+ tab.HighlightTexture:SetPoint("LEFT", tab, "LEFT", 10, -4)
+ tab.HighlightTexture:SetPoint("RIGHT", tab, "RIGHT", -10, -4)
+ _G[tabname .. "HighlightTexture"] = tab.HighlightTexture
+
tab.obj = self
tab.id = id
- tab.text = _G[tabname .. "Text"]
+ tab.text = tab.Text -- compat
tab.text:ClearAllPoints()
tab.text:SetPoint("LEFT", 14, -3)
tab.text:SetPoint("RIGHT", -12, -3)
@@ -161,22 +347,21 @@ local methods = {
self.tablist = tabs
self:BuildTabs()
end,
-
+
["BuildTabs"] = function(self)
local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
- local status = self.status or self.localstatus
local tablist = self.tablist
local tabs = self.tabs
-
+
if not tablist then return end
-
+
local width = self.frame.width or self.frame:GetWidth() or 0
-
+
wipe(widths)
wipe(rowwidths)
wipe(rowends)
-
+
--Place Text into tabs and get thier initial width
for i, v in ipairs(tablist) do
local tab = tabs[i]
@@ -184,19 +369,19 @@ local methods = {
tab = self:CreateTab(i)
tabs[i] = tab
end
-
+
tab:Show()
tab:SetText(v.text)
tab:SetDisabled(v.disabled)
tab.value = v.value
-
+
widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
end
-
+
for i = (#tablist)+1, #tabs, 1 do
tabs[i]:Hide()
end
-
+
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
local numtabs = #tablist
local numrows = 1
@@ -214,7 +399,7 @@ local methods = {
end
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = #tablist
-
+
--Fix for single tabs being left on the last row, move a tab from the row above if applicable
if numrows > 1 then
--if the last row has only one tab
@@ -245,20 +430,22 @@ local methods = {
tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
end
end
-
+
-- equal padding for each tab to fill the available width,
-- if the used space is above 75% already
+ -- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
+ -- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
local padding = 0
- if not (numrows == 1 and rowwidths[1] < width*0.75) then
+ if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
padding = (width - rowwidths[row]) / (endtab - starttab+1)
end
-
+
for i = starttab, endtab do
- PanelTemplates_TabResize(tabs[i], padding + 4, nil, width)
+ PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
end
starttab = endtab + 1
end
-
+
self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
end,
@@ -284,7 +471,7 @@ local methods = {
content:SetHeight(contentheight)
content.height = contentheight
end,
-
+
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight((height or 0) + (self.borderoffset + 23))
@@ -315,7 +502,7 @@ local function Constructor()
titletext:SetHeight(18)
titletext:SetText("")
- local border = CreateFrame("Frame", nil, frame)
+ local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
border:SetPoint("TOPLEFT", 1, -27)
border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop)
@@ -341,7 +528,7 @@ local function Constructor()
for method, func in pairs(methods) do
widget[method] = func
end
-
+
return AceGUI:RegisterAsContainer(widget)
end
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index a5b7916..fef4557 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,22 +2,18 @@
TreeGroup Container
Container that uses a tree control to switch between groups.
-------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 30
+local Type, Version = "TreeGroup", 49
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
-local math_min, math_max, floor = math.min, math.max, floor
-local select, tremove, unpack = select, table.remove, unpack
+local math_min, math_max, floor = math.min, math.max, math.floor
+local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, 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: GameTooltip, FONT_COLOR_CODE_CLOSE
-
-- Recycling functions
local new, del
do
@@ -34,7 +30,7 @@ do
function del(t)
for k in pairs(t) do
t[k] = nil
- end
+ end
pool[t] = true
end
end
@@ -57,7 +53,6 @@ end
local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
local self = button.obj
local toggle = button.toggle
- local frame = self.frame
local text = treeline.text or ""
local icon = treeline.icon
local iconCoords = treeline.iconCoords
@@ -65,7 +60,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
local value = treeline.value
local uniquevalue = treeline.uniquevalue
local disabled = treeline.disabled
-
+
button.treeline = treeline
button.value = value
button.uniquevalue = uniquevalue
@@ -76,8 +71,6 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
button:UnlockHighlight()
button.selected = false
end
- local normalTexture = button:GetNormalTexture()
- local line = button.line
button.level = level
if ( level == 1 ) then
button:SetNormalFontObject("GameFontNormal")
@@ -88,7 +81,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
button:SetHighlightFontObject("GameFontHighlightSmall")
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
end
-
+
if disabled then
button:EnableMouse(false)
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
@@ -96,27 +89,27 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
button.text:SetText(text)
button:EnableMouse(true)
end
-
+
if icon then
button.icon:SetTexture(icon)
button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
else
button.icon:SetTexture(nil)
end
-
+
if iconCoords then
button.icon:SetTexCoord(unpack(iconCoords))
else
button.icon:SetTexCoord(0, 1, 0, 1)
end
-
+
if canExpand then
if not isExpanded then
- toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
- toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
+ toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP
+ toggle:SetPushedTexture(130836) -- Interface\\Buttons\\UI-PlusButton-DOWN
else
- toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
- toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
+ toggle:SetNormalTexture(130821) -- Interface\\Buttons\\UI-MinusButton-UP
+ toggle:SetPushedTexture(130820) -- Interface\\Buttons\\UI-MinusButton-DOWN
end
toggle:Show()
else
@@ -162,7 +155,7 @@ end
local function FirstFrameUpdate(frame)
local self = frame.obj
frame:SetScript("OnUpdate", nil)
- self:RefreshTree()
+ self:RefreshTree(nil, true)
end
local function BuildUniqueValue(...)
@@ -199,7 +192,6 @@ end
local function Button_OnDoubleClick(button)
local self = button.obj
- local status = self.status or self.localstatus
local status = (self.status or self.localstatus).groups
status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree()
@@ -210,11 +202,13 @@ local function Button_OnEnter(frame)
self:Fire("OnButtonEnter", frame.uniquevalue, frame)
if self.enabletooltips then
- GameTooltip:SetOwner(frame, "ANCHOR_NONE")
- GameTooltip:SetPoint("LEFT",frame,"RIGHT")
- GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, 1)
+ local tooltip = AceGUI.tooltip
+ tooltip:SetOwner(frame, "ANCHOR_NONE")
+ tooltip:ClearAllPoints()
+ tooltip:SetPoint("LEFT",frame,"RIGHT")
+ tooltip:SetText(frame.text:GetText() or "", 1, .82, 0, 1, true)
- GameTooltip:Show()
+ tooltip:Show()
end
end
@@ -223,7 +217,7 @@ local function Button_OnLeave(frame)
self:Fire("OnButtonLeave", frame.uniquevalue, frame)
if self.enabletooltips then
- GameTooltip:Hide()
+ AceGUI.tooltip:Hide()
end
end
@@ -231,7 +225,7 @@ local function OnScrollValueChanged(frame, value)
if frame.obj.noupdate then return end
local self = frame.obj
local status = self.status or self.localstatus
- status.scrollvalue = value
+ status.scrollvalue = floor(value + 0.5)
self:RefreshTree()
AceGUI:ClearFocus()
end
@@ -269,18 +263,19 @@ end
local function Dragger_OnMouseUp(frame)
local treeframe = frame:GetParent()
local self = treeframe.obj
- local frame = treeframe:GetParent()
+ local treeframeParent = treeframe:GetParent()
treeframe:StopMovingOrSizing()
--treeframe:SetScript("OnUpdate", nil)
treeframe:SetUserPlaced(false)
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
treeframe:SetHeight(0)
- treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
- treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
+ treeframe:ClearAllPoints()
+ treeframe:SetPoint("TOPLEFT", treeframeParent, "TOPLEFT",0,0)
+ treeframe:SetPoint("BOTTOMLEFT", treeframeParent, "BOTTOMLEFT",0,0)
+
local status = self.status or self.localstatus
status.treewidth = treeframe:GetWidth()
-
+
treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
-- recalculate the content width
treeframe.obj:OnWidthSet(status.fullwidth)
@@ -295,10 +290,13 @@ local methods = {
["OnAcquire"] = function(self)
self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
self:EnableButtonTooltips(true)
+ self.frame:SetScript("OnUpdate", FirstFrameUpdate)
end,
["OnRelease"] = function(self)
self.status = nil
+ self.tree = nil
+ self.frame:SetScript("OnUpdate", nil)
for k, v in pairs(self.localstatus) do
if k == "groups" then
for k2 in pairs(v) do
@@ -335,6 +333,8 @@ local methods = {
button.toggle.button = button
button.toggle:SetScript("OnClick",Expand_OnClick)
+ button.text:SetHeight(14) -- Prevents text wrapping
+
return button
end,
@@ -350,7 +350,7 @@ local methods = {
if not status.treewidth then
status.treewidth = DEFAULT_TREE_WIDTH
end
- if not status.treesizable then
+ if status.treesizable == nil then
status.treesizable = DEFAULT_TREE_SIZABLE
end
self:SetTreeWidth(status.treewidth,status.treesizable)
@@ -360,8 +360,8 @@ local methods = {
--sets the tree to be displayed
["SetTree"] = function(self, tree, filter)
self.filter = filter
- if tree then
- assert(type(tree) == "table")
+ if tree then
+ assert(type(tree) == "table")
end
self.tree = tree
self:RefreshTree()
@@ -369,8 +369,7 @@ local methods = {
["BuildLevel"] = function(self, tree, level, parent)
local groups = (self.status or self.localstatus).groups
- local hasChildren = self.hasChildren
-
+
for i, v in ipairs(tree) do
if v.children then
if not self.filter or ShouldDisplayLevel(v.children) then
@@ -385,13 +384,9 @@ local methods = {
end
end,
- ["RefreshTree"] = function(self)
- local buttons = self.buttons
+ ["RefreshTree"] = function(self,scrollToSelection,fromOnUpdate)
+ local buttons = self.buttons
local lines = self.lines
-
- for i, v in ipairs(buttons) do
- v:Hide()
- end
while lines[1] do
local t = tremove(lines)
for k in pairs(t) do
@@ -408,14 +403,25 @@ local methods = {
local treeframe = self.treeframe
+ status.scrollToSelection = status.scrollToSelection or scrollToSelection -- needs to be cached in case the control hasn't been drawn yet (code bails out below)
+
self:BuildLevel(tree, 1)
local numlines = #lines
local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
+ if maxlines <= 0 then return end
+
+ if self.frame:GetParent() == UIParent and not fromOnUpdate then
+ self.frame:SetScript("OnUpdate", FirstFrameUpdate)
+ return
+ end
local first, last
+ scrollToSelection = status.scrollToSelection
+ status.scrollToSelection = nil
+
if numlines <= maxlines then
--the whole tree fits in the frame
status.scrollvalue = 0
@@ -429,10 +435,34 @@ local methods = {
--check if we are scrolled down too far
if numlines - status.scrollvalue < maxlines then
status.scrollvalue = numlines - maxlines
- self.scrollbar:SetValue(status.scrollvalue)
end
self.noupdate = nil
first, last = status.scrollvalue+1, status.scrollvalue + maxlines
+ --show selection?
+ if scrollToSelection and status.selected then
+ local show
+ for i,line in ipairs(lines) do -- find the line number
+ if line.uniquevalue==status.selected then
+ show=i
+ end
+ end
+ if not show then
+ -- selection was deleted or something?
+ elseif show>=first and show<=last then
+ -- all good
+ else
+ -- scrolling needed!
+ if show 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable)
end
- treeframe:SetMaxResize(maxtreewidth, 1600)
+ if treeframe.SetResizeBounds then
+ treeframe:SetResizeBounds(100, 1, maxtreewidth, 1600)
+ else
+ treeframe:SetMaxResize(maxtreewidth, 1600)
+ end
end,
["OnHeightSet"] = function(self, height)
@@ -549,22 +589,27 @@ local methods = {
treewidth = DEFAULT_TREE_WIDTH
else
resizable = false
- treewidth = DEFAULT_TREE_WIDTH
+ treewidth = DEFAULT_TREE_WIDTH
end
end
self.treeframe:SetWidth(treewidth)
self.dragger:EnableMouse(resizable)
-
+
local status = self.status or self.localstatus
status.treewidth = treewidth
status.treesizable = resizable
-
+
-- recalculate the content width
if status.fullwidth then
self:OnWidthSet(status.fullwidth)
end
end,
+ ["GetTreeWidth"] = function(self)
+ local status = self.status or self.localstatus
+ return status.treewidth or DEFAULT_TREE_WIDTH
+ end,
+
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight((height or 0) + 20)
@@ -584,7 +629,7 @@ local PaneBackdrop = {
local DraggerBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = nil,
- tile = true, tileSize = 16, edgeSize = 0,
+ tile = true, tileSize = 16, edgeSize = 1,
insets = { left = 3, right = 3, top = 7, bottom = 7 }
}
@@ -592,7 +637,7 @@ local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent)
- local treeframe = CreateFrame("Frame", nil, frame)
+ local treeframe = CreateFrame("Frame", nil, frame, "BackdropTemplate")
treeframe:SetPoint("TOPLEFT")
treeframe:SetPoint("BOTTOMLEFT")
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
@@ -601,13 +646,17 @@ local function Constructor()
treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
treeframe:SetResizable(true)
- treeframe:SetMinResize(100, 1)
- treeframe:SetMaxResize(400, 1600)
+ if treeframe.SetResizeBounds then -- WoW 10.0
+ treeframe:SetResizeBounds(100, 1, 400, 1600)
+ else
+ treeframe:SetMinResize(100, 1)
+ treeframe:SetMaxResize(400, 1600)
+ end
treeframe:SetScript("OnUpdate", FirstFrameUpdate)
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
- local dragger = CreateFrame("Frame", nil, treeframe)
+ local dragger = CreateFrame("Frame", nil, treeframe, "BackdropTemplate")
dragger:SetWidth(8)
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
@@ -630,9 +679,9 @@ local function Constructor()
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
scrollbg:SetAllPoints(scrollbar)
- scrollbg:SetTexture(0,0,0,0.4)
+ scrollbg:SetColorTexture(0,0,0,0.4)
- local border = CreateFrame("Frame",nil,frame)
+ local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
border:SetPoint("BOTTOMRIGHT")
border:SetBackdrop(PaneBackdrop)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
index bb0a2a2..f378d93 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -7,10 +7,6 @@ local pairs, assert, type = pairs, assert, type
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, 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: GameFontNormal
-
----------------
-- Main Frame --
----------------
@@ -21,26 +17,30 @@ local CreateFrame, UIParent = CreateFrame, UIParent
]]
do
local Type = "Window"
- local Version = 4
+ local Version = 8
+
+ local function frameOnShow(this)
+ this.obj:Fire("OnShow")
+ end
local function frameOnClose(this)
this.obj:Fire("OnClose")
end
-
+
local function closeOnClick(this)
- PlaySound("gsTitleOptionExit")
+ PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
this.obj:Hide()
end
-
+
local function frameOnMouseDown(this)
AceGUI:ClearFocus()
end
-
+
local function titleOnMouseDown(this)
this:GetParent():StartMoving()
AceGUI:ClearFocus()
end
-
+
local function frameOnMouseUp(this)
local frame = this:GetParent()
frame:StopMovingOrSizing()
@@ -51,22 +51,22 @@ do
status.top = frame:GetTop()
status.left = frame:GetLeft()
end
-
+
local function sizerseOnMouseDown(this)
this:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus()
end
-
+
local function sizersOnMouseDown(this)
this:GetParent():StartSizing("BOTTOM")
AceGUI:ClearFocus()
end
-
+
local function sizereOnMouseDown(this)
this:GetParent():StartSizing("RIGHT")
AceGUI:ClearFocus()
end
-
+
local function sizerOnMouseUp(this)
this:GetParent():StopMovingOrSizing()
end
@@ -74,19 +74,19 @@ do
local function SetTitle(self,title)
self.titletext:SetText(title)
end
-
+
local function SetStatusText(self,text)
-- self.statustext:SetText(text)
end
-
+
local function Hide(self)
self.frame:Hide()
end
-
+
local function Show(self)
self.frame:Show()
end
-
+
local function OnAcquire(self)
self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -94,21 +94,21 @@ do
self:EnableResize(true)
self:Show()
end
-
+
local function OnRelease(self)
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end
-
+
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
self:ApplyStatus()
end
-
+
local function ApplyStatus(self)
local status = self.status or self.localstatus
local frame = self.frame
@@ -121,7 +121,7 @@ do
frame:SetPoint("CENTER",UIParent,"CENTER")
end
end
-
+
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 34
@@ -131,8 +131,8 @@ do
content:SetWidth(contentwidth)
content.width = contentwidth
end
-
-
+
+
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 57
@@ -142,19 +142,19 @@ do
content:SetHeight(contentheight)
content.height = contentheight
end
-
+
local function EnableResize(self, state)
local func = state and "Show" or "Hide"
self.sizer_se[func](self.sizer_se)
self.sizer_s[func](self.sizer_s)
self.sizer_e[func](self.sizer_e)
end
-
+
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = "Window"
-
+
self.Hide = Hide
self.Show = Show
self.SetTitle = SetTitle
@@ -166,9 +166,9 @@ do
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
self.EnableResize = EnableResize
-
+
self.localstatus = {}
-
+
self.frame = frame
frame.obj = self
frame:SetWidth(700)
@@ -179,90 +179,95 @@ do
frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetScript("OnMouseDown", frameOnMouseDown)
-
+
+ frame:SetScript("OnShow",frameOnShow)
frame:SetScript("OnHide",frameOnClose)
- frame:SetMinResize(240,240)
+ if frame.SetResizeBounds then -- WoW 10.0
+ frame:SetResizeBounds(240,240)
+ else
+ frame:SetMinResize(240,240)
+ end
frame:SetToplevel(true)
local titlebg = frame:CreateTexture(nil, "BACKGROUND")
- titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
+ titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background
titlebg:SetPoint("TOPLEFT", 9, -6)
titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
+
local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
- dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
+ dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background
dialogbg:SetPoint("TOPLEFT", 8, -24)
dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
dialogbg:SetVertexColor(0, 0, 0, .75)
-
+
local topleft = frame:CreateTexture(nil, "BORDER")
- topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
topleft:SetWidth(64)
topleft:SetHeight(64)
topleft:SetPoint("TOPLEFT")
topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
+
local topright = frame:CreateTexture(nil, "BORDER")
- topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
topright:SetWidth(64)
topright:SetHeight(64)
topright:SetPoint("TOPRIGHT")
topright:SetTexCoord(0.625, 0.75, 0, 1)
-
+
local top = frame:CreateTexture(nil, "BORDER")
- top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
top:SetHeight(64)
top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
+
local bottomleft = frame:CreateTexture(nil, "BORDER")
- bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
bottomleft:SetWidth(64)
bottomleft:SetHeight(64)
bottomleft:SetPoint("BOTTOMLEFT")
bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
+
local bottomright = frame:CreateTexture(nil, "BORDER")
- bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
bottomright:SetWidth(64)
bottomright:SetHeight(64)
bottomright:SetPoint("BOTTOMRIGHT")
bottomright:SetTexCoord(0.875, 1, 0, 1)
-
+
local bottom = frame:CreateTexture(nil, "BORDER")
- bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
bottom:SetHeight(64)
bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
+
local left = frame:CreateTexture(nil, "BORDER")
- left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
left:SetWidth(64)
left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
+
local right = frame:CreateTexture(nil, "BORDER")
- right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+ right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
right:SetWidth(64)
right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
+
local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
close:SetPoint("TOPRIGHT", 2, 1)
close:SetScript("OnClick", closeOnClick)
self.closebutton = close
close.obj = self
-
+
local titletext = frame:CreateFontString(nil, "ARTWORK")
titletext:SetFontObject(GameFontNormal)
titletext:SetPoint("TOPLEFT", 12, -8)
titletext:SetPoint("TOPRIGHT", -32, -8)
self.titletext = titletext
-
+
local title = CreateFrame("Button", nil, frame)
title:SetPoint("TOPLEFT", titlebg)
title:SetPoint("BOTTOMRIGHT", titlebg)
@@ -270,7 +275,7 @@ do
title:SetScript("OnMouseDown",titleOnMouseDown)
title:SetScript("OnMouseUp", frameOnMouseUp)
self.title = title
-
+
local sizer_se = CreateFrame("Frame",nil,frame)
sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
sizer_se:SetWidth(25)
@@ -285,7 +290,7 @@ do
line1:SetWidth(14)
line1:SetHeight(14)
line1:SetPoint("BOTTOMRIGHT", -8, 8)
- line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+ line1:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
local x = 0.1 * 14/17
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
@@ -294,8 +299,8 @@ do
line2:SetWidth(8)
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
- line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
- local x = 0.1 * 8/17
+ line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
+ x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
local sizer_s = CreateFrame("Frame",nil,frame)
@@ -306,7 +311,7 @@ do
sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_s = sizer_s
-
+
local sizer_e = CreateFrame("Frame",nil,frame)
sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -315,17 +320,17 @@ do
sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_e = sizer_e
-
+
--Container Support
local content = CreateFrame("Frame",nil,frame)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
+
AceGUI:RegisterAsContainer(self)
- return self
+ return self
end
-
+
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
index 2f49a01..0e286ca 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
@@ -2,7 +2,7 @@
Button Widget
Graphical Button.
-------------------------------------------------------------------------------]]
-local Type, Version = "Button", 20
+local Type, Version = "Button", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -17,9 +17,9 @@ local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
Scripts
-------------------------------------------------------------------------------]]
local function Button_OnClick(frame, ...)
- PlaySound("igMainMenuOption")
- frame.obj:Fire("OnClick", ...)
AceGUI:ClearFocus()
+ PlaySound(852) -- SOUNDKIT.IG_MAINMENU_OPTION
+ frame.obj:Fire("OnClick", ...)
end
local function Control_OnEnter(frame)
@@ -39,6 +39,7 @@ local methods = {
self:SetHeight(24)
self:SetWidth(200)
self:SetDisabled(false)
+ self:SetAutoWidth(false)
self:SetText()
end,
@@ -46,6 +47,16 @@ local methods = {
["SetText"] = function(self, text)
self.text:SetText(text)
+ if self.autoWidth then
+ self:SetWidth(self.text:GetStringWidth() + 30)
+ end
+ end,
+
+ ["SetAutoWidth"] = function(self, autoWidth)
+ self.autoWidth = autoWidth
+ if self.autoWidth then
+ self:SetWidth(self.text:GetStringWidth() + 30)
+ end
end,
["SetDisabled"] = function(self, disabled)
@@ -63,7 +74,7 @@ Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
- local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate2")
+ local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
frame:Hide()
frame:EnableMouse(true)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
index 34a2591..fe17e03 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -1,7 +1,7 @@
--[[-----------------------------------------------------------------------------
Checkbox Widget
-------------------------------------------------------------------------------]]
-local Type, Version = "CheckBox", 21
+local Type, Version = "CheckBox", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -12,10 +12,6 @@ local select, pairs = select, pairs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, 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: SetDesaturation, GameFontHighlight
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
@@ -26,7 +22,7 @@ local function AlignImage(self)
self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
self.text:SetPoint("RIGHT")
else
- self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
+ self.text:SetPoint("LEFT", self.image, "RIGHT", 1, 0)
self.text:SetPoint("RIGHT")
end
end
@@ -60,9 +56,9 @@ local function CheckBox_OnMouseUp(frame)
self:ToggleChecked()
if self.checked then
- PlaySound("igMainMenuOptionCheckBoxOn")
+ PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
else -- for both nil and false (tristate)
- PlaySound("igMainMenuOptionCheckBoxOff")
+ PlaySound(857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
end
self:Fire("OnValueChanged", self.checked)
@@ -91,7 +87,7 @@ local methods = {
if self.desc then
self.desc:SetWidth(width - 30)
if self.desc:GetText() and self.desc:GetText() ~= "" then
- self:SetHeight(28 + self.desc:GetHeight())
+ self:SetHeight(28 + self.desc:GetStringHeight())
end
end
end,
@@ -102,6 +98,9 @@ local methods = {
self.frame:Disable()
self.text:SetTextColor(0.5, 0.5, 0.5)
SetDesaturation(self.check, true)
+ if self.desc then
+ self.desc:SetTextColor(0.5, 0.5, 0.5)
+ end
else
self.frame:Enable()
self.text:SetTextColor(1, 1, 1)
@@ -110,23 +109,26 @@ local methods = {
else
SetDesaturation(self.check, false)
end
+ if self.desc then
+ self.desc:SetTextColor(1, 1, 1)
+ end
end
end,
- ["SetValue"] = function(self,value)
+ ["SetValue"] = function(self, value)
local check = self.check
self.checked = value
if value then
- SetDesaturation(self.check, false)
- self.check:Show()
+ SetDesaturation(check, false)
+ check:Show()
else
--Nil is the unknown tristate value
if self.tristate and value == nil then
- SetDesaturation(self.check, true)
- self.check:Show()
+ SetDesaturation(check, true)
+ check:Show()
else
- SetDesaturation(self.check, false)
- self.check:Hide()
+ SetDesaturation(check, false)
+ check:Hide()
end
end
self:SetDisabled(self.disabled)
@@ -149,21 +151,21 @@ local methods = {
local size
if type == "radio" then
size = 16
- checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
+ checkbg:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
checkbg:SetTexCoord(0, 0.25, 0, 1)
- check:SetTexture("Interface\\Buttons\\UI-RadioButton")
+ check:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
check:SetTexCoord(0.25, 0.5, 0, 1)
check:SetBlendMode("ADD")
- highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
+ highlight:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
highlight:SetTexCoord(0.5, 0.75, 0, 1)
else
size = 24
- checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
+ checkbg:SetTexture(130755) -- Interface\\Buttons\\UI-CheckBox-Up
checkbg:SetTexCoord(0, 1, 0, 1)
- check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+ check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
check:SetTexCoord(0, 1, 0, 1)
check:SetBlendMode("BLEND")
- highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+ highlight:SetTexture(130753) -- Interface\\Buttons\\UI-CheckBox-Highlight
highlight:SetTexCoord(0, 1, 0, 1)
end
checkbg:SetHeight(size)
@@ -193,18 +195,19 @@ local methods = {
["SetDescription"] = function(self, desc)
if desc then
if not self.desc then
- local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
- desc:ClearAllPoints()
- desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
- desc:SetWidth(self.frame.width - 30)
- desc:SetJustifyH("LEFT")
- desc:SetJustifyV("TOP")
- self.desc = desc
+ local f = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
+ f:ClearAllPoints()
+ f:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
+ f:SetWidth(self.frame.width - 30)
+ f:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
+ f:SetJustifyH("LEFT")
+ f:SetJustifyV("TOP")
+ self.desc = f
end
self.desc:Show()
--self.text:SetFontObject(GameFontNormal)
self.desc:SetText(desc)
- self:SetHeight(28 + self.desc:GetHeight())
+ self:SetHeight(28 + self.desc:GetStringHeight())
else
if self.desc then
self.desc:SetText("")
@@ -214,11 +217,11 @@ local methods = {
self:SetHeight(24)
end
end,
-
+
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
-
+
if image:GetTexture() then
local n = select("#", ...)
if n == 4 or n == 8 then
@@ -248,11 +251,11 @@ local function Constructor()
checkbg:SetWidth(24)
checkbg:SetHeight(24)
checkbg:SetPoint("TOPLEFT")
- checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
+ checkbg:SetTexture(130755) -- Interface\\Buttons\\UI-CheckBox-Up
local check = frame:CreateTexture(nil, "OVERLAY")
check:SetAllPoints(checkbg)
- check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+ check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
text:SetJustifyH("LEFT")
@@ -261,7 +264,7 @@ local function Constructor()
text:SetPoint("RIGHT")
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
- highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+ highlight:SetTexture(130753) -- Interface\\Buttons\\UI-CheckBox-Highlight
highlight:SetBlendMode("ADD")
highlight:SetAllPoints(checkbg)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index ba02615..ec811d0 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -1,7 +1,7 @@
--[[-----------------------------------------------------------------------------
ColorPicker Widget
-------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 20
+local Type, Version = "ColorPicker", 28
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -11,17 +11,24 @@ local pairs = pairs
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, 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: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
+-- Unfortunately we have no way to realistically detect if a client uses inverted alpha
+-- as no API will tell you. Wrath uses the old colorpicker, era uses the new one, both are inverted
+local INVERTED_ALPHA = (WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE)
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function ColorCallback(self, r, g, b, a, isAlpha)
+ if INVERTED_ALPHA and a then
+ a = 1 - a
+ end
if not self.HasAlpha then
a = 1
end
+ -- no change, skip update
+ if r == self.r and g == self.g and b == self.b and a == self.a then
+ return
+ end
self:SetColor(r, g, b, a)
if ColorPickerFrame:IsVisible() then
--colorpicker is still open
@@ -47,35 +54,70 @@ local function Control_OnLeave(frame)
end
local function ColorSwatch_OnClick(frame)
- HideUIPanel(ColorPickerFrame)
+ ColorPickerFrame:Hide()
local self = frame.obj
if not self.disabled then
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
+ ColorPickerFrame:SetFrameLevel(frame:GetFrameLevel() + 10)
+ ColorPickerFrame:SetClampedToScreen(true)
- ColorPickerFrame.func = function()
- local r, g, b = ColorPickerFrame:GetColorRGB()
- local a = 1 - OpacitySliderFrame:GetValue()
- ColorCallback(self, r, g, b, a)
+ if ColorPickerFrame.SetupColorPickerAndShow then -- 10.2.5 color picker overhaul
+ local r2, g2, b2, a2 = self.r, self.g, self.b, (self.a or 1)
+ if INVERTED_ALPHA then
+ a2 = 1 - a2
+ end
+
+ local info = {
+ swatchFunc = function()
+ local r, g, b = ColorPickerFrame:GetColorRGB()
+ local a = ColorPickerFrame:GetColorAlpha()
+ ColorCallback(self, r, g, b, a)
+ end,
+
+ hasOpacity = self.HasAlpha,
+ opacityFunc = function()
+ local r, g, b = ColorPickerFrame:GetColorRGB()
+ local a = ColorPickerFrame:GetColorAlpha()
+ ColorCallback(self, r, g, b, a, true)
+ end,
+ opacity = a2,
+
+ cancelFunc = function()
+ ColorCallback(self, r2, g2, b2, a2, true)
+ end,
+
+ r = r2,
+ g = g2,
+ b = b2,
+ }
+
+ ColorPickerFrame:SetupColorPickerAndShow(info)
+ else
+ ColorPickerFrame.func = function()
+ local r, g, b = ColorPickerFrame:GetColorRGB()
+ local a = OpacitySliderFrame:GetValue()
+ ColorCallback(self, r, g, b, a)
+ end
+
+ ColorPickerFrame.hasOpacity = self.HasAlpha
+ ColorPickerFrame.opacityFunc = function()
+ local r, g, b = ColorPickerFrame:GetColorRGB()
+ local a = OpacitySliderFrame:GetValue()
+ ColorCallback(self, r, g, b, a, true)
+ end
+
+ local r, g, b, a = self.r, self.g, self.b, 1 - (self.a or 1)
+ if self.HasAlpha then
+ ColorPickerFrame.opacity = a
+ end
+ ColorPickerFrame:SetColorRGB(r, g, b)
+
+ ColorPickerFrame.cancelFunc = function()
+ ColorCallback(self, r, g, b, a, true)
+ end
+
+ ColorPickerFrame:Show()
end
-
- ColorPickerFrame.hasOpacity = self.HasAlpha
- ColorPickerFrame.opacityFunc = function()
- local r, g, b = ColorPickerFrame:GetColorRGB()
- local a = 1 - OpacitySliderFrame:GetValue()
- ColorCallback(self, r, g, b, a, true)
- end
-
- local r, g, b, a = self.r, self.g, self.b, self.a
- if self.HasAlpha then
- ColorPickerFrame.opacity = 1 - (a or 0)
- end
- ColorPickerFrame:SetColorRGB(r, g, b)
-
- ColorPickerFrame.cancelFunc = function()
- ColorCallback(self, r, g, b, a, true)
- end
-
- ShowUIPanel(ColorPickerFrame)
end
AceGUI:ClearFocus()
end
@@ -138,20 +180,22 @@ local function Constructor()
local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
colorSwatch:SetWidth(19)
colorSwatch:SetHeight(19)
- colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
+ colorSwatch:SetTexture(130939) -- Interface\\ChatFrame\\ChatFrameColorSwatch
colorSwatch:SetPoint("LEFT")
local texture = frame:CreateTexture(nil, "BACKGROUND")
+ colorSwatch.background = texture
texture:SetWidth(16)
texture:SetHeight(16)
- texture:SetTexture(1, 1, 1)
+ texture:SetColorTexture(1, 1, 1)
texture:SetPoint("CENTER", colorSwatch)
texture:Show()
local checkers = frame:CreateTexture(nil, "BACKGROUND")
+ colorSwatch.checkers = checkers
checkers:SetWidth(14)
checkers:SetHeight(14)
- checkers:SetTexture("Tileset\\Generic\\Checkers")
+ checkers:SetTexture(188523) -- Tileset\\Generic\\Checkers
checkers:SetTexCoord(.25, 0, 0.5, .25)
checkers:SetDesaturated(true)
checkers:SetVertexColor(1, 1, 1, 0.75)
@@ -166,7 +210,7 @@ local function Constructor()
text:SetPoint("RIGHT")
--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
- --highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+ --highlight:SetTexture(136810) -- Interface\\QuestFrame\\UI-QuestTitleHighlight
--highlight:SetBlendMode("ADD")
--highlight:SetAllPoints(frame)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index 37baf04..6fe30ea 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 916 2010-03-15 12:24:36Z nevcairiel $ ]]--
+--[[ $Id$ ]]--
local AceGUI = LibStub("AceGUI-3.0")
@@ -33,7 +33,7 @@ end
-- ItemBase is the base "class" for all dropdown items.
-- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
+-- create an initial 'self' value.
-- ItemBase will add common functions and ui event handlers.
-- Be sure to keep basic usage when you override functions.
@@ -41,7 +41,7 @@ local ItemBase = {
-- NOTE: The ItemBase version is added to each item's version number
-- to ensure proper updates on ItemBase changes.
-- Use at least 1000er steps.
- version = 1000,
+ version = 2000,
counter = 0,
}
@@ -52,7 +52,7 @@ function ItemBase.Frame_OnEnter(this)
self.highlight:Show()
end
self:Fire("OnEnter")
-
+
if self.specialOnEnter then
self.specialOnEnter(self)
end
@@ -60,10 +60,10 @@ end
function ItemBase.Frame_OnLeave(this)
local self = this.obj
-
+
self.highlight:Hide()
self:Fire("OnLeave")
-
+
if self.specialOnLeave then
self.specialOnLeave(self)
end
@@ -89,7 +89,7 @@ end
-- Do not call this method directly
function ItemBase.SetPullout(self, pullout)
self.pullout = pullout
-
+
self.frame:SetParent(nil)
self.frame:SetParent(pullout.itemFrame)
self.parent = pullout.itemFrame
@@ -155,12 +155,12 @@ function ItemBase.Create(type)
self.frame = frame
frame.obj = self
self.type = type
-
+
self.useHighlight = true
-
+
frame:SetHeight(17)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
text:SetTextColor(1,1,1)
text:SetJustifyH("LEFT")
@@ -169,7 +169,7 @@ function ItemBase.Create(type)
self.text = text
local highlight = frame:CreateTexture(nil, "OVERLAY")
- highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+ highlight:SetTexture(136810) -- Interface\\QuestFrame\\UI-QuestTitleHighlight
highlight:SetBlendMode("ADD")
highlight:SetHeight(14)
highlight:ClearAllPoints()
@@ -178,59 +178,65 @@ function ItemBase.Create(type)
highlight:Hide()
self.highlight = highlight
- local check = frame:CreateTexture("OVERLAY")
+ local check = frame:CreateTexture(nil, "OVERLAY")
check:SetWidth(16)
check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1)
- check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+ check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
check:Hide()
self.check = check
- local sub = frame:CreateTexture("OVERLAY")
+ local sub = frame:CreateTexture(nil, "OVERLAY")
sub:SetWidth(16)
sub:SetHeight(16)
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
- sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
+ sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow
sub:Hide()
- self.sub = sub
-
+ self.sub = sub
+
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
+
self.OnAcquire = ItemBase.OnAcquire
self.OnRelease = ItemBase.OnRelease
-
+
self.SetPullout = ItemBase.SetPullout
self.GetText = ItemBase.GetText
self.SetText = ItemBase.SetText
self.SetDisabled = ItemBase.SetDisabled
-
+
self.SetPoint = ItemBase.SetPoint
self.Show = ItemBase.Show
self.Hide = ItemBase.Hide
-
+
self.SetOnLeave = ItemBase.SetOnLeave
self.SetOnEnter = ItemBase.SetOnEnter
-
+
return self
end
+-- Register a dummy LibStub library to retrieve the ItemBase, so other addons can use it.
+local IBLib = LibStub:NewLibrary("AceGUI-3.0-DropDown-ItemBase", ItemBase.version)
+if IBLib then
+ IBLib.GetItemBase = function() return ItemBase end
+end
+
--[[
Template for items:
-
+
-- Item:
--
do
local widgetType = "Dropdown-Item-"
local widgetVersion = 1
-
+
local function Constructor()
local self = ItemBase.Create(widgetType)
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
--]]
@@ -241,25 +247,25 @@ end
do
local widgetType = "Dropdown-Item-Header"
local widgetVersion = 1
-
+
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
-
+
if self.specialOnEnter then
self.specialOnEnter(self)
end
end
-
+
local function OnLeave(this)
local self = this.obj
self:Fire("OnLeave")
-
+
if self.specialOnLeave then
self.specialOnLeave(self)
end
end
-
+
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
@@ -267,21 +273,21 @@ do
self.text:SetTextColor(1, 1, 0)
end
end
-
+
local function Constructor()
local self = ItemBase.Create(widgetType)
-
+
self.SetDisabled = SetDisabled
-
+
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnLeave", OnLeave)
-
+
self.text:SetTextColor(1, 1, 0)
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
@@ -290,7 +296,7 @@ end
do
local widgetType = "Dropdown-Item-Execute"
local widgetVersion = 1
-
+
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
@@ -299,16 +305,16 @@ do
self.pullout:Close()
end
end
-
+
local function Constructor()
local self = ItemBase.Create(widgetType)
-
+
self.frame:SetScript("OnClick", Frame_OnClick)
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
@@ -317,8 +323,8 @@ end
-- Does not close the pullout on click.
do
local widgetType = "Dropdown-Item-Toggle"
- local widgetVersion = 3
-
+ local widgetVersion = 4
+
local function UpdateToggle(self)
if self.value then
self.check:Show()
@@ -326,49 +332,49 @@ do
self.check:Hide()
end
end
-
+
local function OnRelease(self)
ItemBase.OnRelease(self)
self:SetValue(nil)
end
-
+
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
self.value = not self.value
if self.value then
- PlaySound("igMainMenuOptionCheckBoxOn")
+ PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
else
- PlaySound("igMainMenuOptionCheckBoxOff")
+ PlaySound(857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
end
UpdateToggle(self)
self:Fire("OnValueChanged", self.value)
end
-
+
-- exported
local function SetValue(self, value)
self.value = value
UpdateToggle(self)
end
-
+
-- exported
local function GetValue(self)
return self.value
end
-
+
local function Constructor()
local self = ItemBase.Create(widgetType)
-
+
self.frame:SetScript("OnClick", Frame_OnClick)
-
+
self.SetValue = SetValue
self.GetValue = GetValue
self.OnRelease = OnRelease
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
@@ -378,55 +384,55 @@ end
do
local widgetType = "Dropdown-Item-Menu"
local widgetVersion = 2
-
+
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
-
+
if self.specialOnEnter then
self.specialOnEnter(self)
end
-
+
self.highlight:Show()
-
+
if not self.disabled and self.submenu then
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
end
end
-
+
local function OnHide(this)
local self = this.obj
if self.submenu then
self.submenu:Close()
end
end
-
+
-- exported
local function SetMenu(self, menu)
assert(menu.type == "Dropdown-Pullout")
self.submenu = menu
end
-
+
-- exported
local function CloseMenu(self)
self.submenu:Close()
end
-
+
local function Constructor()
local self = ItemBase.Create(widgetType)
-
+
self.sub:Show()
-
+
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnHide", OnHide)
-
+
self.SetMenu = SetMenu
self.CloseMenu = CloseMenu
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
@@ -434,32 +440,32 @@ end
-- A single line to separate items
do
local widgetType = "Dropdown-Item-Separator"
- local widgetVersion = 1
-
+ local widgetVersion = 2
+
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
self.useHighlight = false
end
-
+
local function Constructor()
local self = ItemBase.Create(widgetType)
-
+
self.SetDisabled = SetDisabled
-
+
local line = self.frame:CreateTexture(nil, "OVERLAY")
line:SetHeight(1)
- line:SetTexture(.5, .5, .5)
+ line:SetColorTexture(.5, .5, .5)
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
+
self.text:Hide()
-
+
self.useHighlight = false
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index cbbba1a..9fde707 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,9 +1,9 @@
---[[ $Id: AceGUIWidget-DropDown.lua 916 2010-03-15 12:24:36Z nevcairiel $ ]]--
+--[[ $Id$ ]]--
local AceGUI = LibStub("AceGUI-3.0")
-- Lua APIs
local min, max, floor = math.min, math.max, math.floor
-local select, pairs, ipairs = select, pairs, ipairs
+local select, pairs, ipairs, type, tostring = select, pairs, ipairs, type, tostring
local tsort = table.sort
-- WoW APIs
@@ -11,10 +11,6 @@ local PlaySound = PlaySound
local UIParent, CreateFrame = UIParent, CreateFrame
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: CLOSE
-
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
@@ -39,10 +35,10 @@ end
do
local widgetType = "Dropdown-Pullout"
- local widgetVersion = 3
-
+ local widgetVersion = 5
+
--[[ Static data ]]--
-
+
local backdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -60,9 +56,9 @@ do
local defaultWidth = 200
local defaultMaxHeight = 600
-
+
--[[ UI Event Handlers ]]--
-
+
-- HACK: This should be no part of the pullout, but there
-- is no other 'clean' way to response to any item-OnEnter
-- Used to close Submenus when an other item is entered
@@ -74,22 +70,22 @@ do
end
end
end
-
+
-- See the note in Constructor() for each scroll related function
local function OnMouseWheel(this, value)
this.obj:MoveScroll(value)
end
-
+
local function OnScrollValueChanged(this, value)
this.obj:SetScroll(value)
end
-
+
local function OnSizeChanged(this)
this.obj:FixScroll()
end
-
+
--[[ Exported methods ]]--
-
+
-- exported
local function SetScroll(self, value)
local status = self.scrollStatus
@@ -106,9 +102,9 @@ do
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
status.offset = offset
- status.scrollvalue = value
+ status.scrollvalue = value
end
-
+
-- exported
local function MoveScroll(self, value)
local status = self.scrollStatus
@@ -127,7 +123,7 @@ do
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end
end
-
+
-- exported
local function FixScroll(self)
local status = self.scrollStatus
@@ -140,7 +136,7 @@ do
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
self.slider:SetValue(0)
else
- self.slider:Show()
+ self.slider:Show()
local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end
self.slider:SetValue(value)
@@ -153,68 +149,63 @@ do
end
end
end
-
+
-- exported, AceGUI callback
local function OnAcquire(self)
self.frame:SetParent(UIParent)
--self.itemFrame:SetToplevel(true)
end
-
+
-- exported, AceGUI callback
local function OnRelease(self)
self:Clear()
self.frame:ClearAllPoints()
self.frame:Hide()
end
-
+
-- exported
local function AddItem(self, item)
self.items[#self.items + 1] = item
-
+
local h = #self.items * 16
self.itemFrame:SetHeight(h)
self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
+
item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
+
item:SetPullout(self)
item:SetOnEnter(OnEnter)
end
-
+
-- exported
- local function Open(self, point, relFrame, relPoint, x, y)
+ local function Open(self, point, relFrame, relPoint, x, y)
local items = self.items
local frame = self.frame
local itemFrame = self.itemFrame
-
+
frame:SetPoint(point, relFrame, relPoint, x, y)
-
+
local height = 8
for i, item in pairs(items) do
- if i == 1 then
- item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
- else
- item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
- end
-
+ item:SetPoint("TOP", itemFrame, "TOP", 0, -2 + (i - 1) * -16)
item:Show()
-
+
height = height + 16
end
itemFrame:SetHeight(height)
fixstrata("TOOLTIP", frame, frame:GetChildren())
frame:Show()
self:Fire("OnOpen")
- end
-
+ end
+
-- exported
local function Close(self)
self.frame:Hide()
self:Fire("OnClose")
- end
-
+ end
+
-- exported
local function Clear(self)
local items = self.items
@@ -222,18 +213,18 @@ do
AceGUI:Release(item)
items[i] = nil
end
- end
-
+ end
+
-- exported
local function IterateItems(self)
return ipairs(self.items)
end
-
+
-- exported
local function SetHideOnLeave(self, val)
self.hideOnLeave = val
end
-
+
-- exported
local function SetMaxHeight(self, height)
self.maxHeight = height or defaultMaxHeight
@@ -243,28 +234,28 @@ do
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
end
end
-
+
-- exported
local function GetRightBorderWidth(self)
return 6 + (self.slider:IsShown() and 12 or 0)
end
-
+
-- exported
local function GetLeftBorderWidth(self)
return 6
end
-
+
--[[ Constructor ]]--
-
+
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
- local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
+ local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, "BackdropTemplate")
local self = {}
self.count = count
self.type = widgetType
self.frame = frame
frame.obj = self
-
+
self.OnAcquire = OnAcquire
self.OnRelease = OnRelease
@@ -278,38 +269,38 @@ do
self.SetScroll = SetScroll
self.MoveScroll = MoveScroll
self.FixScroll = FixScroll
-
+
self.SetMaxHeight = SetMaxHeight
self.GetRightBorderWidth = GetRightBorderWidth
self.GetLeftBorderWidth = GetLeftBorderWidth
-
+
self.items = {}
-
+
self.scrollStatus = {
scrollvalue = 0,
}
-
+
self.maxHeight = defaultMaxHeight
-
+
frame:SetBackdrop(backdrop)
frame:SetBackdropColor(0, 0, 0)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetClampedToScreen(true)
frame:SetWidth(defaultWidth)
- frame:SetHeight(self.maxHeight)
+ frame:SetHeight(self.maxHeight)
--frame:SetToplevel(true)
-
+
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
+
self.scrollFrame = scrollFrame
self.itemFrame = itemFrame
-
+
scrollFrame.obj = self
itemFrame.obj = self
-
- local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
+
+ local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, "BackdropTemplate")
slider:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(sliderBackdrop)
@@ -318,7 +309,7 @@ do
slider:SetFrameStrata("FULLSCREEN_DIALOG")
self.slider = slider
slider.obj = self
-
+
scrollFrame:SetScrollChild(itemFrame)
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
@@ -327,46 +318,48 @@ do
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:SetToplevel(true)
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
itemFrame:SetHeight(400)
itemFrame:SetToplevel(true)
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
slider:SetScript("OnValueChanged", OnScrollValueChanged)
slider:SetMinMaxValues(0, 1000)
slider:SetValueStep(1)
slider:SetValue(0)
-
+
scrollFrame:Show()
itemFrame:Show()
slider:Hide()
-
+
self:FixScroll()
-
+
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
do
local widgetType = "Dropdown"
- local widgetVersion = 22
-
+ local widgetVersion = 36
+
--[[ Static data ]]--
-
+
--[[ UI event handler ]]--
-
+
local function Control_OnEnter(this)
+ this.obj.button:LockHighlight()
this.obj:Fire("OnEnter")
end
-
+
local function Control_OnLeave(this)
+ this.obj.button:UnlockHighlight()
this.obj:Fire("OnLeave")
end
@@ -376,33 +369,33 @@ do
self.pullout:Close()
end
end
-
+
local function Dropdown_TogglePullout(this)
local self = this.obj
- PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
if self.open then
self.open = nil
self.pullout:Close()
AceGUI:ClearFocus()
else
self.open = true
- self.pullout:SetWidth(self.frame:GetWidth())
+ self.pullout:SetWidth(self.pulloutWidth or self.frame:GetWidth())
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
AceGUI:SetFocus(self)
end
end
-
+
local function OnPulloutOpen(this)
local self = this.userdata.obj
local value = self.value
-
+
if not self.multiselect then
for i, item in this:IterateItems() do
item:SetValue(item.userdata.value == value)
end
end
-
+
self.open = true
+ self:Fire("OnOpened")
end
local function OnPulloutClose(this)
@@ -410,7 +403,7 @@ do
self.open = nil
self:Fire("OnClosed")
end
-
+
local function ShowMultiText(self)
local text
for i, widget in self.pullout:IterateItems() do
@@ -426,10 +419,10 @@ do
end
self:SetText(text)
end
-
+
local function OnItemValueChanged(this, event, checked)
local self = this.userdata.obj
-
+
if self.multiselect then
self:Fire("OnValueChanged", this.userdata.value, checked)
ShowMultiText(self)
@@ -440,14 +433,14 @@ do
else
this:SetValue(true)
end
- if self.open then
+ if self.open then
self.pullout:Close()
end
end
end
-
+
--[[ Exported methods ]]--
-
+
-- exported, AceGUI callback
local function OnAcquire(self)
local pullout = AceGUI:Create("Dropdown-Pullout")
@@ -457,11 +450,14 @@ do
pullout:SetCallback("OnOpen", OnPulloutOpen)
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
+
self:SetHeight(44)
self:SetWidth(200)
+ self:SetLabel()
+ self:SetPulloutWidth(nil)
+ self.list = {}
end
-
+
-- exported, AceGUI callback
local function OnRelease(self)
if self.open then
@@ -469,75 +465,76 @@ do
end
AceGUI:Release(self.pullout)
self.pullout = nil
-
+
self:SetText("")
- self:SetLabel("")
self:SetDisabled(false)
self:SetMultiselect(false)
-
+
self.value = nil
self.list = nil
self.open = nil
self.hasClose = nil
-
+
self.frame:ClearAllPoints()
self.frame:Hide()
end
-
+
-- exported
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.text:SetTextColor(0.5,0.5,0.5)
self.button:Disable()
+ self.button_cover:Disable()
self.label:SetTextColor(0.5,0.5,0.5)
else
self.button:Enable()
+ self.button_cover:Enable()
self.label:SetTextColor(1,.82,0)
self.text:SetTextColor(1,1,1)
end
end
-
+
-- exported
local function ClearFocus(self)
if self.open then
self.pullout:Close()
end
end
-
+
-- exported
local function SetText(self, text)
self.text:SetText(text or "")
end
-
+
-- exported
local function SetLabel(self, text)
if text and text ~= "" then
self.label:SetText(text)
self.label:Show()
- self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-18)
- self.frame:SetHeight(44)
+ self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-14)
+ self:SetHeight(40)
+ self.alignoffset = 26
else
self.label:SetText("")
self.label:Hide()
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
- self.frame:SetHeight(26)
+ self:SetHeight(26)
+ self.alignoffset = 12
end
end
-
+
-- exported
local function SetValue(self, value)
- if self.list then
- self:SetText(self.list[value] or "")
- end
+ self:SetText(self.list[value] or "")
self.value = value
end
-
+
-- exported
local function GetValue(self)
return self.value
end
-
+
-- exported
local function SetItemValue(self, item, value)
if not self.multiselect then return end
@@ -550,7 +547,7 @@ do
end
ShowMultiText(self)
end
-
+
-- exported
local function SetItemDisabled(self, item, disabled)
for i, widget in self.pullout:IterateItems() do
@@ -559,16 +556,20 @@ do
end
end
end
-
- local function AddListItem(self, value, text)
- local item = AceGUI:Create("Dropdown-Item-Toggle")
+
+ local function AddListItem(self, value, text, itemType)
+ if not itemType then itemType = "Dropdown-Item-Toggle" end
+ local exists = AceGUI:GetWidgetVersion(itemType)
+ if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end
+
+ local item = AceGUI:Create(itemType)
item:SetText(text)
item.userdata.obj = self
item.userdata.value = value
item:SetCallback("OnValueChanged", OnItemValueChanged)
self.pullout:AddItem(item)
end
-
+
local function AddCloseButton(self)
if not self.hasClose then
local close = AceGUI:Create("Dropdown-Item-Execute")
@@ -577,38 +578,50 @@ do
self.hasClose = true
end
end
-
+
-- exported
local sortlist = {}
- local function SetList(self, list)
- self.list = list
+ local function sortTbl(x,y)
+ local num1, num2 = tonumber(x), tonumber(y)
+ if num1 and num2 then -- numeric comparison, either two numbers or numeric strings
+ return num1 < num2
+ else -- compare everything else tostring'ed
+ return tostring(x) < tostring(y)
+ end
+ end
+ local function SetList(self, list, order, itemType)
+ self.list = list or {}
self.pullout:Clear()
self.hasClose = nil
if not list then return end
-
- for v in pairs(list) do
- sortlist[#sortlist + 1] = v
- end
- tsort(sortlist)
-
- for i, value in pairs(sortlist) do
- AddListItem(self, value, list[value])
- sortlist[i] = nil
+
+ if type(order) ~= "table" then
+ for v in pairs(list) do
+ sortlist[#sortlist + 1] = v
+ end
+ tsort(sortlist, sortTbl)
+
+ for i, key in ipairs(sortlist) do
+ AddListItem(self, key, list[key], itemType)
+ sortlist[i] = nil
+ end
+ else
+ for i, key in ipairs(order) do
+ AddListItem(self, key, list[key], itemType)
+ end
end
if self.multiselect then
ShowMultiText(self)
AddCloseButton(self)
end
end
-
+
-- exported
- local function AddItem(self, value, text)
- if self.list then
- self.list[value] = text
- AddListItem(self, value, text)
- end
+ local function AddItem(self, value, text, itemType)
+ self.list[value] = text
+ AddListItem(self, value, text, itemType)
end
-
+
-- exported
local function SetMultiselect(self, multi)
self.multiselect = multi
@@ -617,19 +630,23 @@ do
AddCloseButton(self)
end
end
-
+
-- exported
local function GetMultiselect(self)
return self.multiselect
end
-
+
+ local function SetPulloutWidth(self, width)
+ self.pulloutWidth = width
+ end
+
--[[ Constructor ]]--
-
+
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", nil, UIParent)
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
+
local self = {}
self.type = widgetType
self.frame = frame
@@ -637,10 +654,10 @@ do
self.count = count
frame.obj = self
dropdown.obj = self
-
+
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
-
+
self.ClearFocus = ClearFocus
self.SetText = SetText
@@ -654,11 +671,10 @@ do
self.GetMultiselect = GetMultiselect
self.SetItemValue = SetItemValue
self.SetItemDisabled = SetItemDisabled
-
- self.alignoffset = 31
-
- frame:SetHeight(44)
- frame:SetWidth(200)
+ self.SetPulloutWidth = SetPulloutWidth
+
+ self.alignoffset = 26
+
frame:SetScript("OnHide",Dropdown_OnHide)
dropdown:ClearAllPoints()
@@ -669,10 +685,10 @@ do
local left = _G[dropdown:GetName() .. "Left"]
local middle = _G[dropdown:GetName() .. "Middle"]
local right = _G[dropdown:GetName() .. "Right"]
-
+
middle:ClearAllPoints()
right:ClearAllPoints()
-
+
middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
@@ -683,14 +699,23 @@ do
button:SetScript("OnEnter",Control_OnEnter)
button:SetScript("OnLeave",Control_OnLeave)
button:SetScript("OnClick",Dropdown_TogglePullout)
-
+
+ local button_cover = CreateFrame("BUTTON",nil,self.frame)
+ self.button_cover = button_cover
+ button_cover.obj = self
+ button_cover:SetPoint("TOPLEFT",self.frame,"BOTTOMLEFT",0,25)
+ button_cover:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT")
+ button_cover:SetScript("OnEnter",Control_OnEnter)
+ button_cover:SetScript("OnLeave",Control_OnLeave)
+ button_cover:SetScript("OnClick",Dropdown_TogglePullout)
+
local text = _G[dropdown:GetName() .. "Text"]
self.text = text
text.obj = self
text:ClearAllPoints()
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
+
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -702,6 +727,6 @@ do
AceGUI:RegisterAsWidget(self)
return self
end
-
+
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
+end
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
index 34a2958..ae1e969 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
@@ -1,7 +1,7 @@
--[[-----------------------------------------------------------------------------
EditBox Widget
-------------------------------------------------------------------------------]]
-local Type, Version = "EditBox", 22
+local Type, Version = "EditBox", 29
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -10,20 +10,20 @@ local tostring, pairs = tostring, pairs
-- WoW APIs
local PlaySound = PlaySound
-local GetCursorInfo, ClearCursor, GetSpellName = GetCursorInfo, ClearCursor, GetSpellName
+local GetCursorInfo, ClearCursor = GetCursorInfo, ClearCursor
local CreateFrame, UIParent = CreateFrame, UIParent
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: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
if not AceGUIEditBoxInsertLink then
-- upgradeable hook
- hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
+ if ChatFrameUtil and ChatFrameUtil.InsertLink then
+ hooksecurefunc(ChatFrameUtil, "InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
+ elseif ChatEdit_InsertLink then
+ hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
+ end
end
function _G.AceGUIEditBoxInsertLink(text)
@@ -59,6 +59,11 @@ local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
+local function Frame_OnShowFocus(frame)
+ frame.obj.editbox:SetFocus()
+ frame:SetScript("OnShow", nil)
+end
+
local function EditBox_OnEscapePressed(frame)
AceGUI:ClearFocus()
end
@@ -68,29 +73,33 @@ local function EditBox_OnEnterPressed(frame)
local value = frame:GetText()
local cancel = self:Fire("OnEnterPressed", value)
if not cancel then
- PlaySound("igMainMenuOptionCheckBoxOn")
+ PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
HideButton(self)
end
end
local function EditBox_OnReceiveDrag(frame)
local self = frame.obj
- local type, id, info = GetCursorInfo()
+ local type, id, info, extra = GetCursorInfo()
+ local name
if type == "item" then
- self:SetText(info)
- self:Fire("OnEnterPressed", info)
- ClearCursor()
+ name = info
elseif type == "spell" then
- local name, rank = GetSpellName(id, info)
- if rank and rank:match("%d") then
- name = name.."("..rank..")"
+ if C_Spell and C_Spell.GetSpellName then
+ name = C_Spell.GetSpellName(extra)
+ else
+ name = GetSpellInfo(id, info)
end
+ elseif type == "macro" then
+ name = GetMacroInfo(id)
+ end
+ if name then
self:SetText(name)
self:Fire("OnEnterPressed", name)
ClearCursor()
+ HideButton(self)
+ AceGUI:ClearFocus()
end
- HideButton(self)
- AceGUI:ClearFocus()
end
local function EditBox_OnTextChanged(frame)
@@ -103,6 +112,10 @@ local function EditBox_OnTextChanged(frame)
end
end
+local function EditBox_OnFocusGained(frame)
+ AceGUI:SetFocus(frame.obj)
+end
+
local function Button_OnClick(frame)
local editbox = frame.obj.editbox
editbox:ClearFocus()
@@ -123,7 +136,9 @@ local methods = {
self:SetMaxLetters(0)
end,
- -- ["OnRelease"] = nil,
+ ["OnRelease"] = function(self)
+ self:ClearFocus()
+ end,
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
@@ -175,6 +190,22 @@ local methods = {
["SetMaxLetters"] = function (self, num)
self.editbox:SetMaxLetters(num or 0)
+ end,
+
+ ["ClearFocus"] = function(self)
+ self.editbox:ClearFocus()
+ self.frame:SetScript("OnShow", nil)
+ end,
+
+ ["SetFocus"] = function(self)
+ self.editbox:SetFocus()
+ if not self.frame:IsShown() then
+ self.frame:SetScript("OnShow", Frame_OnShowFocus)
+ end
+ end,
+
+ ["HighlightText"] = function(self, from, to)
+ self.editbox:HighlightText(from, to)
end
}
@@ -196,6 +227,7 @@ local function Constructor()
editbox:SetScript("OnTextChanged", EditBox_OnTextChanged)
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
+ editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained)
editbox:SetTextInsets(0, 0, 3, 3)
editbox:SetMaxLetters(256)
editbox:SetPoint("BOTTOMLEFT", 6, 0)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
index 1aaf3f5..862ae88 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
@@ -51,14 +51,14 @@ local function Constructor()
left:SetHeight(8)
left:SetPoint("LEFT", 3, 0)
left:SetPoint("RIGHT", label, "LEFT", -5, 0)
- left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+ left:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
left:SetTexCoord(0.81, 0.94, 0.5, 1)
local right = frame:CreateTexture(nil, "BACKGROUND")
right:SetHeight(8)
right:SetPoint("RIGHT", -3, 0)
right:SetPoint("LEFT", label, "RIGHT", 5, 0)
- right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+ right:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
right:SetTexCoord(0.81, 0.94, 0.5, 1)
local widget = {
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
index f25b586..378e813 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
@@ -1,7 +1,7 @@
--[[-----------------------------------------------------------------------------
Icon Widget
-------------------------------------------------------------------------------]]
-local Type, Version = "Icon", 20
+local Type, Version = "Icon", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -9,7 +9,7 @@ if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local select, pairs, print = select, pairs, print
-- WoW APIs
-local CreateFrame, UIParent, GetBuildInfo = CreateFrame, UIParent, GetBuildInfo
+local CreateFrame, UIParent = CreateFrame, UIParent
--[[-----------------------------------------------------------------------------
Scripts
@@ -56,7 +56,7 @@ local methods = {
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
-
+
if image:GetTexture() then
local n = select("#", ...)
if n == 4 or n == 8 then
@@ -87,7 +87,7 @@ local methods = {
else
self.frame:Enable()
self.label:SetTextColor(1, 1, 1)
- self.image:SetVertexColor(1, 1, 1)
+ self.image:SetVertexColor(1, 1, 1, 1)
end
end
}
@@ -118,7 +118,7 @@ local function Constructor()
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
highlight:SetAllPoints(image)
- highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
+ highlight:SetTexture(136580) -- Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight
highlight:SetTexCoord(0, 1, 0.23, 0.77)
highlight:SetBlendMode("ADD")
@@ -131,12 +131,8 @@ local function Constructor()
for method, func in pairs(methods) do
widget[method] = func
end
- -- SetText is deprecated, but keep it around for a while. (say, to WoW 4.0)
- if (select(4, GetBuildInfo()) < 40000) then
- widget.SetText = widget.SetLabel
- else
- widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end
- end
+
+ widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end
return AceGUI:RegisterAsWidget(widget)
end
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
index 9e06049..255dd97 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
@@ -1,20 +1,13 @@
--[[-----------------------------------------------------------------------------
InteractiveLabel Widget
-------------------------------------------------------------------------------]]
-local Type, Version = "InteractiveLabel", 20
+local Type, Version = "InteractiveLabel", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs
local select, pairs = select, pairs
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, 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: GameFontHighlightSmall
-
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
index f3043ff..ee5a83b 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
@@ -2,7 +2,7 @@
Keybinding Widget
Set Keybindings in the Config UI.
-------------------------------------------------------------------------------]]
-local Type, Version = "Keybinding", 21
+local Type, Version = "Keybinding", 27
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -13,10 +13,6 @@ local pairs = pairs
local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
local CreateFrame, UIParent = CreateFrame, 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: NOT_BOUND
-
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
@@ -34,11 +30,15 @@ local function Keybinding_OnClick(frame, button)
local self = frame.obj
if self.waitingForKey then
frame:EnableKeyboard(false)
+ frame:EnableMouseWheel(false)
+ frame:EnableGamePadButton(false)
self.msgframe:Hide()
frame:UnlockHighlight()
self.waitingForKey = nil
else
frame:EnableKeyboard(true)
+ frame:EnableMouseWheel(true)
+ frame:EnableGamePadButton(true)
self.msgframe:Show()
frame:LockHighlight()
self.waitingForKey = true
@@ -73,6 +73,8 @@ local function Keybinding_OnKeyDown(frame, key)
end
frame:EnableKeyboard(false)
+ frame:EnableMouseWheel(false)
+ frame:EnableGamePadButton(false)
self.msgframe:Hide()
frame:UnlockHighlight()
self.waitingForKey = nil
@@ -97,6 +99,16 @@ local function Keybinding_OnMouseDown(frame, button)
Keybinding_OnKeyDown(frame, button)
end
+local function Keybinding_OnMouseWheel(frame, direction)
+ local button
+ if direction >= 0 then
+ button = "MOUSEWHEELUP"
+ else
+ button = "MOUSEWHEELDOWN"
+ end
+ Keybinding_OnKeyDown(frame, button)
+end
+
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
@@ -108,6 +120,9 @@ local methods = {
self.waitingForKey = nil
self.msgframe:Hide()
self:SetDisabled(false)
+ self.button:EnableKeyboard(false)
+ self.button:EnableMouseWheel(false)
+ self.button:EnableGamePadButton(false)
end,
-- ["OnRelease"] = nil,
@@ -173,18 +188,23 @@ local function Constructor()
local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent)
- local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate2")
+ local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate")
button:EnableMouse(true)
+ button:EnableMouseWheel(false)
button:RegisterForClicks("AnyDown")
button:SetScript("OnEnter", Control_OnEnter)
button:SetScript("OnLeave", Control_OnLeave)
button:SetScript("OnClick", Keybinding_OnClick)
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
+ button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
+ button:SetScript("OnGamePadButtonDown", Keybinding_OnKeyDown)
button:SetPoint("BOTTOMLEFT")
button:SetPoint("BOTTOMRIGHT")
button:SetHeight(24)
+ button:EnableKeyboard(false)
+ button:EnableGamePadButton(false)
local text = button:GetFontString()
text:SetPoint("LEFT", 7, 0)
@@ -196,12 +216,13 @@ local function Constructor()
label:SetJustifyH("CENTER")
label:SetHeight(18)
- local msgframe = CreateFrame("Frame", nil, UIParent)
+ local msgframe = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
msgframe:SetHeight(30)
msgframe:SetBackdrop(ControlBackdrop)
msgframe:SetBackdropColor(0,0,0)
msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
msgframe:SetFrameLevel(1000)
+ msgframe:SetToplevel(true)
local msg = msgframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel.")
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index 7f5f1c5..d0841ef 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -2,7 +2,7 @@
Label Widget
Displays text and optionally an icon.
-------------------------------------------------------------------------------]]
-local Type, Version = "Label", 21
+local Type, Version = "Label", 28
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -12,10 +12,6 @@ local max, select, pairs = math.max, select, pairs
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, 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: GameFontHighlightSmall
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
@@ -39,21 +35,30 @@ local function UpdateImageAnchor(self)
label:SetPoint("TOP", image, "BOTTOM")
label:SetPoint("LEFT")
label:SetWidth(width)
- height = image:GetHeight() + label:GetHeight()
+ height = image:GetHeight() + label:GetStringHeight()
else
-- image on the left
image:SetPoint("TOPLEFT")
- label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
+ if image:GetHeight() > label:GetStringHeight() then
+ label:SetPoint("LEFT", image, "RIGHT", 4, 0)
+ else
+ label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
+ end
label:SetWidth(width - imagewidth - 4)
- height = max(image:GetHeight(), label:GetHeight())
+ height = max(image:GetHeight(), label:GetStringHeight())
end
else
-- no image shown
label:SetPoint("TOPLEFT")
label:SetWidth(width)
- height = label:GetHeight()
+ height = label:GetStringHeight()
end
-
+
+ -- avoid zero-height labels, since they can used as spacers
+ if not height or height == 0 then
+ height = 1
+ end
+
self.resizing = true
frame:SetHeight(height)
frame.height = height
@@ -74,6 +79,8 @@ local methods = {
self:SetImageSize(16, 16)
self:SetColor()
self:SetFontObject()
+ self:SetJustifyH("LEFT")
+ self:SetJustifyV("TOP")
-- reset the flag
self.resizing = nil
@@ -102,7 +109,7 @@ local methods = {
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
-
+
if image:GetTexture() then
self.imageshown = true
local n = select("#", ...)
@@ -118,11 +125,16 @@ local methods = {
end,
["SetFont"] = function(self, font, height, flags)
- self.label:SetFont(font, height, flags)
+ if not self.fontObject then
+ self.fontObject = CreateFont("AceGUI30LabelFont" .. AceGUI:GetNextWidgetNum(Type))
+ end
+ self.fontObject:SetFont(font, height, flags)
+ self:SetFontObject(self.fontObject)
end,
["SetFontObject"] = function(self, font)
- self:SetFont((font or GameFontHighlightSmall):GetFont())
+ self.label:SetFontObject(font or GameFontHighlightSmall)
+ UpdateImageAnchor(self)
end,
["SetImageSize"] = function(self, width, height)
@@ -130,6 +142,14 @@ local methods = {
self.image:SetHeight(height)
UpdateImageAnchor(self)
end,
+
+ ["SetJustifyH"] = function(self, justifyH)
+ self.label:SetJustifyH(justifyH)
+ end,
+
+ ["SetJustifyV"] = function(self, justifyV)
+ self.label:SetJustifyV(justifyV)
+ end,
}
--[[-----------------------------------------------------------------------------
@@ -140,9 +160,6 @@ local function Constructor()
frame:Hide()
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
- label:SetJustifyH("LEFT")
- label:SetJustifyV("TOP")
-
local image = frame:CreateTexture(nil, "BACKGROUND")
-- create widget
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index 64d8dd7..3dcbaca 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -1,4 +1,4 @@
-local Type, Version = "MultiLineEditBox", 23
+local Type, Version = "MultiLineEditBox", 33
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -6,17 +6,34 @@ if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local pairs = pairs
-- WoW APIs
-local GetCursorInfo, GetSpellName, ClearCursor = GetCursorInfo, GetSpellName, ClearCursor
+local GetCursorInfo, ClearCursor = GetCursorInfo, ClearCursor
local CreateFrame, UIParent = CreateFrame, UIParent
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: ACCEPT, ChatFontNormal
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
+
+if not AceGUIMultiLineEditBoxInsertLink then
+ -- upgradeable hook
+ if ChatFrameUtil and ChatFrameUtil.InsertLink then
+ hooksecurefunc(ChatFrameUtil, "InsertLink", function(...) return _G.AceGUIMultiLineEditBoxInsertLink(...) end)
+ elseif ChatEdit_InsertLink then
+ hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIMultiLineEditBoxInsertLink(...) end)
+ end
+end
+
+function _G.AceGUIMultiLineEditBoxInsertLink(text)
+ for i = 1, AceGUI:GetWidgetCount(Type) do
+ local editbox = _G[("MultiLineEditBox%uEdit"):format(i)]
+ if editbox and editbox:IsVisible() and editbox:HasFocus() then
+ editbox:Insert(text)
+ return true
+ end
+ end
+end
+
+
local function Layout(self)
self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
@@ -61,6 +78,7 @@ end
local function OnEditFocusLost(self) -- EditBox
self:HighlightText(0, 0)
+ self.obj:Fire("OnEditFocusLost")
end
local function OnEnter(self) -- EditBox / ScrollFrame
@@ -86,11 +104,12 @@ local function OnMouseUp(self)
end
local function OnReceiveDrag(self) -- EditBox / ScrollFrame
- local type, id, info = GetCursorInfo()
+ local type, id, info, extra = GetCursorInfo()
if type == "spell" then
- info, id = GetSpellName(id, info)
- if id and id:match("%d") then
- info = info .. "(" .. id .. ")"
+ if C_Spell and C_Spell.GetSpellName then
+ info = C_Spell.GetSpellName(extra)
+ else
+ info = GetSpellInfo(id, info)
end
elseif type ~= "item" then
return
@@ -130,6 +149,24 @@ local function OnVerticalScroll(self, offset)
editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
end
+local function OnScrollRangeChanged(self, xrange, yrange)
+ if yrange == 0 then
+ self.obj.editBox:SetHitRectInsets(0, 0, 0, 0)
+ else
+ OnVerticalScroll(self, self:GetVerticalScroll())
+ end
+end
+
+local function OnShowFocus(frame)
+ frame.obj.editBox:SetFocus()
+ frame:SetScript("OnShow", nil)
+end
+
+local function OnEditFocusGained(frame)
+ AceGUI:SetFocus(frame.obj)
+ frame.obj:Fire("OnEditFocusGained")
+end
+
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
@@ -144,7 +181,9 @@ local methods = {
self:SetMaxLetters(0)
end,
- -- ["OnRelease"] = nil,
+ ["OnRelease"] = function(self)
+ self:ClearFocus()
+ end,
["SetDisabled"] = function(self, disabled)
local editBox = self.editBox
@@ -205,7 +244,31 @@ local methods = {
self.button:Show()
end
Layout(self)
- end
+ end,
+
+ ["ClearFocus"] = function(self)
+ self.editBox:ClearFocus()
+ self.frame:SetScript("OnShow", nil)
+ end,
+
+ ["SetFocus"] = function(self)
+ self.editBox:SetFocus()
+ if not self.frame:IsShown() then
+ self.frame:SetScript("OnShow", OnShowFocus)
+ end
+ end,
+
+ ["HighlightText"] = function(self, from, to)
+ self.editBox:HighlightText(from, to)
+ end,
+
+ ["GetCursorPosition"] = function(self)
+ return self.editBox:GetCursorPosition()
+ end,
+
+ ["SetCursorPosition"] = function(self, ...)
+ return self.editBox:SetCursorPosition(...)
+ end,
}
--[[-----------------------------------------------------------------------------
@@ -220,7 +283,7 @@ local backdrop = {
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
-
+
local widgetNum = AceGUI:GetNextWidgetNum(Type)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -230,21 +293,21 @@ local function Constructor()
label:SetText(ACCEPT)
label:SetHeight(10)
- local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate2")
+ local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate")
button:SetPoint("BOTTOMLEFT", 0, 4)
button:SetHeight(22)
button:SetWidth(label:GetStringWidth() + 24)
button:SetText(ACCEPT)
button:SetScript("OnClick", OnClick)
button:Disable()
-
+
local text = button:GetFontString()
text:ClearAllPoints()
text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
text:SetJustifyV("MIDDLE")
- local scrollBG = CreateFrame("Frame", nil, frame)
+ local scrollBG = CreateFrame("Frame", nil, frame, "BackdropTemplate")
scrollBG:SetBackdrop(backdrop)
scrollBG:SetBackdropColor(0, 0, 0)
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
@@ -268,8 +331,9 @@ local function Constructor()
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
+ scrollFrame:HookScript("OnScrollRangeChanged", OnScrollRangeChanged)
- local editBox = CreateFrame("EditBox", nil, scrollFrame)
+ local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
editBox:SetAllPoints()
editBox:SetFontObject(ChatFontNormal)
editBox:SetMultiLine(true)
@@ -285,6 +349,8 @@ local function Constructor()
editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
editBox:SetScript("OnTextChanged", OnTextChanged)
editBox:SetScript("OnTextSet", OnTextSet)
+ editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
+
scrollFrame:SetScrollChild(editBox)
diff --git a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index 7f0bd5f..85b2ddb 100644
--- a/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/Kui_Nameplates/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -2,7 +2,7 @@
Slider Widget
Graphical Slider, like, for Range values.
-------------------------------------------------------------------------------]]
-local Type, Version = "Slider", 20
+local Type, Version = "Slider", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@@ -14,10 +14,6 @@ local tonumber, pairs = tonumber, pairs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, 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: GameFontHighlightSmall
-
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
@@ -31,13 +27,13 @@ local function UpdateText(self)
end
local function UpdateLabels(self)
- local min, max = (self.min or 0), (self.max or 100)
+ local min_value, max_value = (self.min or 0), (self.max or 100)
if self.ispercent then
- self.lowtext:SetFormattedText("%s%%", (min * 100))
- self.hightext:SetFormattedText("%s%%", (max * 100))
+ self.lowtext:SetFormattedText("%s%%", (min_value * 100))
+ self.hightext:SetFormattedText("%s%%", (max_value * 100))
else
- self.lowtext:SetText(min)
- self.hightext:SetText(max)
+ self.lowtext:SetText(min_value)
+ self.hightext:SetText(max_value)
end
end
@@ -57,10 +53,13 @@ local function Frame_OnMouseDown(frame)
AceGUI:ClearFocus()
end
-local function Slider_OnValueChanged(frame)
+local function Slider_OnValueChanged(frame, newvalue)
local self = frame.obj
if not frame.setup then
- local newvalue = frame:GetValue()
+ if self.step and self.step > 0 then
+ local min_value = self.min or 0
+ newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value
+ end
if newvalue ~= self.value and not self.disabled then
self.value = newvalue
self:Fire("OnValueChanged", newvalue)
@@ -102,9 +101,9 @@ local function EditBox_OnEnterPressed(frame)
else
value = tonumber(value)
end
-
+
if value then
- PlaySound("igMainMenuOptionCheckBoxOn")
+ PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
self.slider:SetValue(value)
self:Fire("OnMouseUp", value)
end
@@ -172,13 +171,13 @@ local methods = {
self.label:SetText(text)
end,
- ["SetSliderValues"] = function(self, min, max, step)
+ ["SetSliderValues"] = function(self, min_value, max_value, step)
local frame = self.slider
frame.setup = true
- self.min = min
- self.max = max
+ self.min = min_value
+ self.max = max_value
self.step = step
- frame:SetMinMaxValues(min or 0,max or 100)
+ frame:SetMinMaxValues(min_value or 0,max_value or 100)
UpdateLabels(self)
frame:SetValueStep(step or 1)
if self.value then
@@ -222,7 +221,7 @@ local function Constructor()
label:SetJustifyH("CENTER")
label:SetHeight(15)
- local slider = CreateFrame("Slider", nil, frame)
+ local slider = CreateFrame("Slider", nil, frame, "BackdropTemplate")
slider:SetOrientation("HORIZONTAL")
slider:SetHeight(15)
slider:SetHitRectInsets(0, 0, -10, 0)
@@ -244,7 +243,7 @@ local function Constructor()
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
- local editbox = CreateFrame("EditBox", nil, frame)
+ local editbox = CreateFrame("EditBox", nil, frame, "BackdropTemplate")
editbox:SetAutoFocus(false)
editbox:SetFontObject(GameFontHighlightSmall)
editbox:SetPoint("TOP", slider, "BOTTOM")
@@ -274,6 +273,7 @@ local function Constructor()
widget[method] = func
end
slider.obj, editbox.obj = widget, widget
+ C_Timer.After(0.3, function() editbox:SetText(" ") UpdateText(widget) end) -- Workaround for font loading issue, making the editboxes blank until the text is changed
return AceGUI:RegisterAsWidget(widget)
end
diff --git a/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.lua b/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.lua
index daf0dfc..bb0438d 100644
--- a/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.lua
+++ b/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.lua
@@ -1,8 +1,8 @@
--- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
-- @class file
-- @name AceLocale-3.0
--- @release $Id: AceLocale-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
-local MAJOR,MINOR = "AceLocale-3.0", 2
+-- @release $Id$
+local MAJOR,MINOR = "AceLocale-3.0", 6
local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -10,11 +10,7 @@ if not AceLocale then return end -- no upgrade needed
-- Lua APIs
local assert, tostring, error = assert, tostring, error
-local setmetatable, rawset, rawget = 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 getmetatable, setmetatable, rawset, rawget = getmetatable, setmetatable, rawset, rawget
local gameLocale = GetLocale()
if gameLocale == "enGB" then
@@ -79,7 +75,7 @@ local writedefaultproxy = setmetatable({}, {
-- @param application Unique name of addon / module
-- @param locale Name of the locale to register, e.g. "enUS", "deDE", etc.
-- @param isDefault If this is the default locale being registered (your addon is written in this language, generally enUS)
--- @param silent If true, the locale will not issue warnings for missing keys. Can only be set on the default locale.
+-- @param silent If true, the locale will not issue warnings for missing keys. Must be set on the first locale registered. If set to "raw", nils will be returned for unknown keys (no metatable used).
-- @usage
-- -- enUS.lua
-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "enUS", true)
@@ -92,28 +88,29 @@ local writedefaultproxy = setmetatable({}, {
-- @return Locale Table to add localizations to, or nil if the current locale is not required.
function AceLocale:NewLocale(application, locale, isDefault, silent)
- if silent and not isDefault then
- error("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' can only be specified for the default locale", 2)
- end
-
-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
- -- Ammo: I still think this is a bad idea, for instance an addon that checks for some ingame string will fail, just because some other addon
- -- gives the user the illusion that they can run in a different locale? Ditch this whole thing or allow a setting per 'application'. I'm of the
- -- opinion to remove this.
- local gameLocale = GAME_LOCALE or gameLocale
-
- if locale ~= gameLocale and not isDefault then
- return -- nop, we don't need these translations
- end
+ local activeGameLocale = GAME_LOCALE or gameLocale
local app = AceLocale.apps[application]
+ if silent and app and getmetatable(app) ~= readmetasilent then
+ geterrorhandler()("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' must be specified for the first locale registered")
+ end
+
if not app then
- app = setmetatable({}, silent and readmetasilent or readmeta)
+ if silent=="raw" then
+ app = {}
+ else
+ app = setmetatable({}, silent and readmetasilent or readmeta)
+ end
AceLocale.apps[application] = app
AceLocale.appnames[app] = application
end
+ if locale ~= activeGameLocale and not isDefault then
+ return -- nop, we don't need these translations
+ end
+
registering = app -- remember globally for writeproxy and writedefaultproxy
if isDefault then
@@ -133,4 +130,4 @@ function AceLocale:GetLocale(application, silent)
error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2)
end
return AceLocale.apps[application]
-end
\ No newline at end of file
+end
diff --git a/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.xml b/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.xml
new file mode 100644
index 0000000..e017af0
--- /dev/null
+++ b/Kui_Nameplates/Libs/AceLocale-3.0/AceLocale-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.lua b/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.lua
index fdb2cff..e84d420 100644
--- a/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.lua
+++ b/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.lua
@@ -1,296 +1,124 @@
--- **AceTimer-3.0** provides a central facility for registering timers.
-- AceTimer supports one-shot timers and repeating timers. All timers are stored in an efficient
--- data structure that allows easy dispatching and fast rescheduling. Timers can be registered, rescheduled
+-- data structure that allows easy dispatching and fast rescheduling. Timers can be registered
-- or canceled at any time, even from within a running timer, without conflict or large overhead.\\
--- AceTimer is currently limited to firing timers at a frequency of 0.1s. This constant may change
--- in the future, but for now it seemed like a good compromise in efficiency and accuracy.
+-- AceTimer is currently limited to firing timers at a frequency of 0.01s as this is what the WoW timer API
+-- restricts us to.
--
-- All `:Schedule` functions will return a handle to the current timer, which you will need to store if you
--- need to cancel or reschedule the timer you just registered.
+-- need to cancel the timer you just registered.
--
--- **AceTimer-3.0** can be embeded into your addon, either explicitly by calling AceTimer:Embed(MyAddon) or by
+-- **AceTimer-3.0** can be embeded into your addon, either explicitly by calling AceTimer:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceTimer itself.\\
-- It is recommended to embed AceTimer, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceTimer.
-- @class file
-- @name AceTimer-3.0
--- @release $Id: AceTimer-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
+-- @release $Id$
---[[
- Basic assumptions:
- * In a typical system, we do more re-scheduling per second than there are timer pulses per second
- * Regardless of timer implementation, we cannot guarantee timely delivery due to FPS restriction (may be as low as 10)
-
- This implementation:
- CON: The smallest timer interval is constrained by HZ (currently 1/10s).
- PRO: It will still correctly fire any timer slower than HZ over a length of time, e.g. 0.11s interval -> 90 times over 10 seconds
- PRO: In lag bursts, the system simly skips missed timer intervals to decrease load
- CON: Algorithms depending on a timer firing "N times per minute" will fail
- PRO: (Re-)scheduling is O(1) with a VERY small constant. It's a simple linked list insertion in a hash bucket.
- CAUTION: The BUCKETS constant constrains how many timers can be efficiently handled. With too many hash collisions, performance will decrease.
-
- Major assumptions upheld:
- - ALLOWS scheduling multiple timers with the same funcref/method
- - ALLOWS scheduling more timers during OnUpdate processing
- - ALLOWS unscheduling ANY timer (including the current running one) at any time, including during OnUpdate processing
-]]
-
-local MAJOR, MINOR = "AceTimer-3.0", 5
+local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes
local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceTimer then return end -- No upgrade needed
-
-AceTimer.hash = AceTimer.hash or {} -- Array of [0..BUCKET-1] = linked list of timers (using .next member)
- -- Linked list gets around ACE-88 and ACE-90.
-AceTimer.selfs = AceTimer.selfs or {} -- Array of [self]={[handle]=timerobj, [handle2]=timerobj2, ...}
-AceTimer.frame = AceTimer.frame or CreateFrame("Frame", "AceTimer30Frame")
+AceTimer.activeTimers = AceTimer.activeTimers or {} -- Active timer list
+local activeTimers = AceTimer.activeTimers -- Upvalue our private data
-- Lua APIs
-local assert, error, loadstring = assert, error, loadstring
-local setmetatable, rawset, rawget = setmetatable, rawset, rawget
-local select, pairs, type, next, tostring = select, pairs, type, next, tostring
-local floor, max, min = math.floor, math.max, math.min
-local tconcat = table.concat
-
+local type, unpack, next, error, select = type, unpack, next, error, select
-- WoW APIs
-local GetTime = GetTime
+local GetTime, C_TimerAfter = GetTime, C_Timer.After
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: DEFAULT_CHAT_FRAME, geterrorhandler
-
--- Simple ONE-SHOT timer cache. Much more efficient than a full compost for our purposes.
-local timerCache = nil
-
---[[
- Timers will not be fired more often than HZ-1 times per second.
- Keep at intended speed PLUS ONE or we get bitten by floating point rounding errors (n.5 + 0.1 can be n.599999)
- If this is ever LOWERED, all existing timers need to be enforced to have a delay >= 1/HZ on lib upgrade.
- If this number is ever changed, all entries need to be rehashed on lib upgrade.
- ]]
-local HZ = 11
-
---[[
- Prime for good distribution
- If this number is ever changed, all entries need to be rehashed on lib upgrade.
-]]
-local BUCKETS = 131
-
-local hash = AceTimer.hash
-for i=1,BUCKETS do
- hash[i] = hash[i] or false -- make it an integer-indexed array; it's faster than hashes
-end
-
---[[
- xpcall safecall implementation
-]]
-local xpcall = xpcall
-
-local function errorhandler(err)
- return geterrorhandler()(err)
-end
-
-local function CreateDispatcher(argCount)
- local code = [[
- local xpcall, eh = ... -- our arguments are received as unnamed values in "..." since we don't have a proper function declaration
- 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
+local function new(self, loop, func, delay, ...)
+ if delay < 0.01 then
+ delay = 0.01 -- Restrict to the lowest time that the C_Timer API allows us
end
-})
-Dispatchers[0] = function(func)
- return xpcall(func, errorhandler)
-end
-
-local function safecall(func, ...)
- return Dispatchers[select('#', ...)](func, ...)
-end
-local lastint = floor(GetTime() * HZ)
+ local timer = {
+ object = self,
+ func = func,
+ looping = loop,
+ argsCount = select("#", ...),
+ delay = delay,
+ ends = GetTime() + delay,
+ ...
+ }
--- --------------------------------------------------------------------
--- OnUpdate handler
---
--- traverse buckets, always chasing "now", and fire timers that have expired
+ activeTimers[timer] = timer
-local function OnUpdate()
- local now = GetTime()
- local nowint = floor(now * HZ)
-
- -- Have we passed into a new hash bucket?
- if nowint == lastint then return end
-
- local soon = now + 1 -- +1 is safe as long as 1 < HZ < BUCKETS/2
-
- -- Pass through each bucket at most once
- -- Happens on e.g. instance loads, but COULD happen on high local load situations also
- for curint = (max(lastint, nowint - BUCKETS) + 1), nowint do -- loop until we catch up with "now", usually only 1 iteration
- local curbucket = (curint % BUCKETS)+1
- -- Yank the list of timers out of the bucket and empty it. This allows reinsertion in the currently-processed bucket from callbacks.
- local nexttimer = hash[curbucket]
- hash[curbucket] = false -- false rather than nil to prevent the array from becoming a hash
+ -- Create new timer closure to wrap the "timer" object
+ timer.callback = function()
+ if not timer.cancelled then
+ if type(timer.func) == "string" then
+ -- We manually set the unpack count to prevent issues with an arg set that contains nil and ends with nil
+ -- e.g. local t = {1, 2, nil, 3, nil} print(#t) will result in 2, instead of 5. This fixes said issue.
+ timer.object[timer.func](timer.object, unpack(timer, 1, timer.argsCount))
+ else
+ timer.func(unpack(timer, 1, timer.argsCount))
+ end
- while nexttimer do
- local timer = nexttimer
- nexttimer = timer.next
- local when = timer.when
-
- if when < soon then
- -- Call the timer func, either as a method on given object, or a straight function ref
- local callback = timer.callback
- if type(callback) == "string" then
- safecall(timer.object[callback], timer.object, timer.arg)
- elseif callback then
- safecall(callback, timer.arg)
- else
- -- probably nilled out by CancelTimer
- timer.delay = nil -- don't reschedule it
- end
-
- local delay = timer.delay -- NOW make a local copy, can't do it earlier in case the timer cancelled itself in the callback
-
- if not delay then
- -- single-shot timer (or cancelled)
- AceTimer.selfs[timer.object][tostring(timer)] = nil
- timerCache = timer
- else
- -- repeating timer
- local newtime = when + delay
- if newtime < now then -- Keep lag from making us firing a timer unnecessarily. (Note that this still won't catch too-short-delay timers though.)
- newtime = now + delay
- end
- timer.when = newtime
-
- -- add next timer execution to the correct bucket
- local bucket = (floor(newtime * HZ) % BUCKETS) + 1
- timer.next = hash[bucket]
- hash[bucket] = timer
- end
- else -- if when>=soon
- -- reinsert (yeah, somewhat expensive, but shouldn't be happening too often either due to hash distribution)
- timer.next = hash[curbucket]
- hash[curbucket] = timer
- end -- if whenhandle->timer registry
- local handle = tostring(timer)
-
- local selftimers = AceTimer.selfs[self]
- if not selftimers then
- selftimers = {}
- AceTimer.selfs[self] = selftimers
- end
- selftimers[handle] = timer
- selftimers.__ops = (selftimers.__ops or 0) + 1
-
- return handle
+ C_TimerAfter(delay, timer.callback)
+ return timer
end
--- Schedule a new one-shot timer.
-- The timer will fire once in `delay` seconds, unless canceled before.
--- @param callback Callback function for the timer pulse (funcref or method name).
+-- @param func Callback function for the timer pulse (funcref or method name).
-- @param delay Delay for the timer, in seconds.
--- @param arg An optional argument to be passed to the callback function.
+-- @param ... An optional, unlimited amount of arguments to pass to the callback function.
-- @usage
--- MyAddon = LibStub("AceAddon-3.0"):NewAddon("TimerTest", "AceTimer-3.0")
---
--- function MyAddon:OnEnable()
+-- MyAddOn = LibStub("AceAddon-3.0"):NewAddon("MyAddOn", "AceTimer-3.0")
+--
+-- function MyAddOn:OnEnable()
-- self:ScheduleTimer("TimerFeedback", 5)
-- end
--
--- function MyAddon:TimerFeedback()
+-- function MyAddOn:TimerFeedback()
-- print("5 seconds passed")
-- end
-function AceTimer:ScheduleTimer(callback, delay, arg)
- return Reg(self, callback, delay, arg)
+function AceTimer:ScheduleTimer(func, delay, ...)
+ if not func or not delay then
+ error(MAJOR..": ScheduleTimer(callback, delay, args...): 'callback' and 'delay' must have set values.", 2)
+ end
+ if type(func) == "string" then
+ if type(self) ~= "table" then
+ error(MAJOR..": ScheduleTimer(callback, delay, args...): 'self' - must be a table.", 2)
+ elseif not self[func] then
+ error(MAJOR..": ScheduleTimer(callback, delay, args...): Tried to register '"..func.."' as the callback, but it doesn't exist in the module.", 2)
+ end
+ end
+ return new(self, nil, func, delay, ...)
end
--- Schedule a repeating timer.
-- The timer will fire every `delay` seconds, until canceled.
--- @param callback Callback function for the timer pulse (funcref or method name).
+-- @param func Callback function for the timer pulse (funcref or method name).
-- @param delay Delay for the timer, in seconds.
--- @param arg An optional argument to be passed to the callback function.
+-- @param ... An optional, unlimited amount of arguments to pass to the callback function.
-- @usage
--- MyAddon = LibStub("AceAddon-3.0"):NewAddon("TimerTest", "AceTimer-3.0")
---
--- function MyAddon:OnEnable()
+-- MyAddOn = LibStub("AceAddon-3.0"):NewAddon("MyAddOn", "AceTimer-3.0")
+--
+-- function MyAddOn:OnEnable()
-- self.timerCount = 0
-- self.testTimer = self:ScheduleRepeatingTimer("TimerFeedback", 5)
-- end
--
--- function MyAddon:TimerFeedback()
+-- function MyAddOn:TimerFeedback()
-- self.timerCount = self.timerCount + 1
-- print(("%d seconds passed"):format(5 * self.timerCount))
-- -- run 30 seconds in total
@@ -298,129 +126,124 @@ end
-- self:CancelTimer(self.testTimer)
-- end
-- end
-function AceTimer:ScheduleRepeatingTimer(callback, delay, arg)
- return Reg(self, callback, delay, arg, true)
+function AceTimer:ScheduleRepeatingTimer(func, delay, ...)
+ if not func or not delay then
+ error(MAJOR..": ScheduleRepeatingTimer(callback, delay, args...): 'callback' and 'delay' must have set values.", 2)
+ end
+ if type(func) == "string" then
+ if type(self) ~= "table" then
+ error(MAJOR..": ScheduleRepeatingTimer(callback, delay, args...): 'self' - must be a table.", 2)
+ elseif not self[func] then
+ error(MAJOR..": ScheduleRepeatingTimer(callback, delay, args...): Tried to register '"..func.."' as the callback, but it doesn't exist in the module.", 2)
+ end
+ end
+ return new(self, true, func, delay, ...)
end
---- Cancels a timer with the given handle, registered by the same addon object as used for `:ScheduleTimer`
--- Both one-shot and repeating timers can be canceled with this function, as long as the `handle` is valid
+--- Cancels a timer with the given id, registered by the same addon object as used for `:ScheduleTimer`
+-- Both one-shot and repeating timers can be canceled with this function, as long as the `id` is valid
-- and the timer has not fired yet or was canceled before.
--- @param handle The handle of the timer, as returned by `:ScheduleTimer` or `:ScheduleRepeatingTimer`
--- @param silent If true, no error is raised if the timer handle is invalid (expired or already canceled)
--- @return True if the timer was successfully cancelled.
-function AceTimer:CancelTimer(handle, silent)
- if not handle then return end -- nil handle -> bail out without erroring
- if type(handle) ~= "string" then
- error(MAJOR..": CancelTimer(handle): 'handle' - expected a string", 2) -- for now, anyway
- end
- local selftimers = AceTimer.selfs[self]
- local timer = selftimers and selftimers[handle]
- if silent then
- if timer then
- timer.callback = nil -- don't run it again
- timer.delay = nil -- if this is the currently-executing one: don't even reschedule
- -- The timer object is removed in the OnUpdate loop
- end
- return not not timer -- might return "true" even if we double-cancel. we'll live.
+-- @param id The id of the timer, as returned by `:ScheduleTimer` or `:ScheduleRepeatingTimer`
+function AceTimer:CancelTimer(id)
+ local timer = activeTimers[id]
+
+ if not timer then
+ return false
else
- if not timer then
- geterrorhandler()(MAJOR..": CancelTimer(handle[, silent]): '"..tostring(handle).."' - no such timer registered")
- return false
- end
- if not timer.callback then
- geterrorhandler()(MAJOR..": CancelTimer(handle[, silent]): '"..tostring(handle).."' - timer already cancelled or expired")
- return false
- end
- timer.callback = nil -- don't run it again
- timer.delay = nil -- if this is the currently-executing one: don't even reschedule
+ timer.cancelled = true
+ activeTimers[id] = nil
return true
end
end
--- Cancels all timers registered to the current addon object ('self')
function AceTimer:CancelAllTimers()
- if not(type(self) == "string" or type(self) == "table") then
- error(MAJOR..": CancelAllTimers(): 'self' - must be a string or a table",2)
- end
- if self == AceTimer then
- error(MAJOR..": CancelAllTimers(): supply a meaningful 'self'", 2)
- end
-
- local selftimers = AceTimer.selfs[self]
- if selftimers then
- for handle,v in pairs(selftimers) do
- if type(v) == "table" then -- avoid __ops, etc
- AceTimer.CancelTimer(self, handle, true)
- end
+ for k,v in next, activeTimers do
+ if v.object == self then
+ AceTimer.CancelTimer(self, k)
end
end
end
---- Returns the time left for a timer with the given handle, registered by the current addon object ('self').
--- This function will raise a warning when the handle is invalid, but not stop execution.
--- @param handle The handle of the timer, as returned by `:ScheduleTimer` or `:ScheduleRepeatingTimer`
--- @return The time left on the timer, or false if the handle is invalid.
-function AceTimer:TimeLeft(handle)
- if not handle then return end
- if type(handle) ~= "string" then
- error(MAJOR..": TimeLeft(handle): 'handle' - expected a string", 2) -- for now, anyway
- end
- local selftimers = AceTimer.selfs[self]
- local timer = selftimers and selftimers[handle]
+--- Returns the time left for a timer with the given id, registered by the current addon object ('self').
+-- This function will return 0 when the id is invalid.
+-- @param id The id of the timer, as returned by `:ScheduleTimer` or `:ScheduleRepeatingTimer`
+-- @return The time left on the timer.
+function AceTimer:TimeLeft(id)
+ local timer = activeTimers[id]
if not timer then
- geterrorhandler()(MAJOR..": TimeLeft(handle): '"..tostring(handle).."' - no such timer registered")
- return false
+ return 0
+ else
+ return timer.ends - GetTime()
end
- return timer.when - GetTime()
end
-- ---------------------------------------------------------------------
--- PLAYER_REGEN_ENABLED: Run through our .selfs[] array step by step
--- and clean it out - otherwise the table indices can grow indefinitely
--- if an addon starts and stops a lot of timers. AceBucket does this!
---
--- See ACE-94 and tests/AceTimer-3.0-ACE-94.lua
+-- Upgrading
-local lastCleaned = nil
+-- Upgrade from old hash-bucket based timers to C_Timer.After timers.
+if oldminor and oldminor < 10 then
+ -- disable old timer logic
+ AceTimer.frame:SetScript("OnUpdate", nil)
+ AceTimer.frame:SetScript("OnEvent", nil)
+ AceTimer.frame:UnregisterAllEvents()
+ -- convert timers
+ for object,timers in next, AceTimer.selfs do
+ for handle,timer in next, timers do
+ if type(timer) == "table" and timer.callback then
+ local newTimer
+ if timer.delay then
+ newTimer = AceTimer.ScheduleRepeatingTimer(timer.object, timer.callback, timer.delay, timer.arg)
+ else
+ newTimer = AceTimer.ScheduleTimer(timer.object, timer.callback, timer.when - GetTime(), timer.arg)
+ end
+ -- Use the old handle for old timers
+ activeTimers[newTimer] = nil
+ activeTimers[handle] = newTimer
+ newTimer.handle = handle
+ end
+ end
+ end
+ AceTimer.selfs = nil
+ AceTimer.hash = nil
+ AceTimer.debug = nil
+elseif oldminor and oldminor < 17 then
+ -- Upgrade from old animation based timers to C_Timer.After timers.
+ AceTimer.inactiveTimers = nil
+ AceTimer.frame = nil
+ local oldTimers = AceTimer.activeTimers
+ -- Clear old timer table and update upvalue
+ AceTimer.activeTimers = {}
+ activeTimers = AceTimer.activeTimers
+ for handle, timer in next, oldTimers do
+ local newTimer
+ -- Stop the old timer animation
+ local duration, elapsed = timer:GetDuration(), timer:GetElapsed()
+ timer:GetParent():Stop()
+ if timer.looping then
+ newTimer = AceTimer.ScheduleRepeatingTimer(timer.object, timer.func, duration, unpack(timer.args, 1, timer.argsCount))
+ else
+ newTimer = AceTimer.ScheduleTimer(timer.object, timer.func, duration - elapsed, unpack(timer.args, 1, timer.argsCount))
+ end
+ -- Use the old handle for old timers
+ activeTimers[newTimer] = nil
+ activeTimers[handle] = newTimer
+ newTimer.handle = handle
+ end
-local function OnEvent(this, event)
- if event~="PLAYER_REGEN_ENABLED" then
- return
+ -- Migrate transitional handles
+ if oldminor < 13 and AceTimer.hashCompatTable then
+ for handle, id in next, AceTimer.hashCompatTable do
+ local t = activeTimers[id]
+ if t then
+ activeTimers[id] = nil
+ activeTimers[handle] = t
+ t.handle = handle
+ end
+ end
+ AceTimer.hashCompatTable = nil
end
-
- -- Get the next 'self' to process
- local selfs = AceTimer.selfs
- local self = next(selfs, lastCleaned)
- if not self then
- self = next(selfs)
- end
- lastCleaned = self
- if not self then -- should only happen if .selfs[] is empty
- return
- end
-
- -- Time to clean it out?
- local list = selfs[self]
- if (list.__ops or 0) < 250 then -- 250 slosh indices = ~10KB wasted (max!). For one 'self'.
- return
- end
-
- -- Create a new table and copy all members over
- local newlist = {}
- local n=0
- for k,v in pairs(list) do
- newlist[k] = v
- n=n+1
- end
- newlist.__ops = 0 -- Reset operation count
-
- -- And since we now have a count of the number of live timers, check that it's reasonable. Emit a warning if not.
- if n>BUCKETS then
- DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: The addon/module '"..tostring(self).."' has "..n.." live timers. Surely that's not intended?")
- end
-
- selfs[self] = newlist
end
-- ---------------------------------------------------------------------
@@ -429,45 +252,27 @@ end
AceTimer.embeds = AceTimer.embeds or {}
local mixins = {
- "ScheduleTimer", "ScheduleRepeatingTimer",
+ "ScheduleTimer", "ScheduleRepeatingTimer",
"CancelTimer", "CancelAllTimers",
"TimeLeft"
}
function AceTimer:Embed(target)
AceTimer.embeds[target] = true
- for _,v in pairs(mixins) do
+ for _,v in next, mixins do
target[v] = AceTimer[v]
end
return target
end
--- AceTimer:OnEmbedDisable( target )
+-- AceTimer:OnEmbedDisable(target)
-- target (object) - target object that AceTimer is embedded in.
--
-- cancel all timers registered for the object
-function AceTimer:OnEmbedDisable( target )
+function AceTimer:OnEmbedDisable(target)
target:CancelAllTimers()
end
-
-for addon in pairs(AceTimer.embeds) do
+for addon in next, AceTimer.embeds do
AceTimer:Embed(addon)
end
-
--- ---------------------------------------------------------------------
--- Debug tools (expose copies of internals to test suites)
-AceTimer.debug = AceTimer.debug or {}
-AceTimer.debug.HZ = HZ
-AceTimer.debug.BUCKETS = BUCKETS
-
--- ---------------------------------------------------------------------
--- Finishing touchups
-
-AceTimer.frame:SetScript("OnUpdate", OnUpdate)
-AceTimer.frame:SetScript("OnEvent", OnEvent)
-AceTimer.frame:RegisterEvent("PLAYER_REGEN_ENABLED")
-
--- In theory, we should hide&show the frame based on there being timers or not.
--- However, this job is fairly expensive, and the chance that there will
--- actually be zero timers running is diminuitive to say the lest.
diff --git a/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.xml b/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.xml
new file mode 100644
index 0000000..38e9021
--- /dev/null
+++ b/Kui_Nameplates/Libs/AceTimer-3.0/AceTimer-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
index 2a64013..05fb9d2 100644
--- a/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,5 +1,5 @@
---[[ $Id: CallbackHandler-1.0.lua 18 2014-10-16 02:52:20Z mikk $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 6
+--[[ $Id: CallbackHandler-1.0.lua 25 2022-12-12 15:02:36Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 8
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
if not CallbackHandler then return end -- No upgrade needed
@@ -7,56 +7,20 @@ if not CallbackHandler then return end -- No upgrade needed
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
-- Lua APIs
-local tconcat = table.concat
-local assert, error, loadstring = assert, error, loadstring
-local setmetatable, rawset, rawget = setmetatable, rawset, rawget
+local securecallfunction, error = securecallfunction, error
+local setmetatable, rawget = setmetatable, rawget
local next, select, pairs, type, tostring = next, select, pairs, type, tostring
--- 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
-local xpcall = xpcall
-
-local function errorhandler(err)
- return geterrorhandler()(err)
+local function Dispatch(handlers, ...)
+ local index, method = next(handlers)
+ if not method then return end
+ repeat
+ securecallfunction(method, ...)
+ index, method = next(handlers, index)
+ until not method
end
-local function CreateDispatcher(argCount)
- local code = [[
- local next, xpcall, eh = ...
-
- local method, ARGS
- local function call() method(ARGS) end
-
- local function dispatch(handlers, ...)
- local index
- index, method = next(handlers)
- if not method then return end
- local OLD_ARGS = ARGS
- ARGS = ...
- repeat
- xpcall(call, eh)
- index, method = next(handlers, index)
- until not method
- ARGS = OLD_ARGS
- end
-
- return dispatch
- ]]
-
- local ARGS, OLD_ARGS = {}, {}
- for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
- code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
- return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
- local dispatcher = CreateDispatcher(argCount)
- rawset(self, argCount, dispatcher)
- return dispatcher
-end})
-
--------------------------------------------------------------------------
-- CallbackHandler:New
--
@@ -65,7 +29,7 @@ end})
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
-function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName)
+function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName)
RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback"
@@ -87,19 +51,19 @@ function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAll
local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1
- Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+ Dispatch(events[eventname], eventname, ...)
registry.recurse = oldrecurse
if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued
- for eventname,callbacks in pairs(registry.insertQueue) do
- local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
- for self,func in pairs(callbacks) do
- events[eventname][self] = func
+ for event,callbacks in pairs(registry.insertQueue) do
+ local first = not rawget(events, event) or not next(events[event]) -- test for empty before. not test for one member after. that one member may have been overwritten.
+ for object,func in pairs(callbacks) do
+ events[event][object] = func
-- fire OnUsed callback?
if first and registry.OnUsed then
- registry.OnUsed(registry, target, eventname)
+ registry.OnUsed(registry, target, event)
first = nil
end
end
diff --git a/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
new file mode 100644
index 0000000..876df83
--- /dev/null
+++ b/Kui_Nameplates/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/Kui_Nameplates/Libs/LibStub/LibStub.lua b/Kui_Nameplates/Libs/LibStub/LibStub.lua
index 0a41ac0..d50c267 100644
--- a/Kui_Nameplates/Libs/LibStub/LibStub.lua
+++ b/Kui_Nameplates/Libs/LibStub/LibStub.lua
@@ -7,24 +7,24 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
-
+
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
- minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
-
+ minor = assert(tonumber(string.match(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
-
+
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
-
+
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end