Version 1.1.3
- bumped version for all versions of WoW (Classic Era, Season of Mastery, BCC, Retail) - error on missing options at first start - updated Ace3.0 libraries for latest Shadowlands patch
This commit is contained in:
parent
68da0b15bb
commit
551744a2eb
@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## Version 1.1.3 - 2021-10-06
|
||||
### Changed
|
||||
- bumped version for all versions of WoW (Classic Era, Season of Mastery, BCC, Retail)
|
||||
### Fixed
|
||||
- error on missing options at first start
|
||||
- updated Ace3.0 libraries for latest Shadowlands patch
|
||||
|
||||
## Version 1.1.2 - 2021-05-23
|
||||
### Changed
|
||||
- adopted to BigWigs release script to better support different game packages
|
||||
|
@ -1,13 +1,13 @@
|
||||
## Interface: 11307
|
||||
## Interface-Classic: 11307
|
||||
## Interface-BCC: 20501
|
||||
## Interface-Retail: 90005
|
||||
## Interface: 11401
|
||||
## Interface-Classic: 11401
|
||||
## Interface-BCC: 20502
|
||||
## Interface-Retail: 90100
|
||||
|
||||
## Title: Grichelde
|
||||
## Notes: Replaces characters of your chat input line before sending.
|
||||
## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile vor dem Versenden.
|
||||
#@debug@
|
||||
## Version: 1.1.2
|
||||
## Version: 1.1.3
|
||||
#@end-debug@
|
||||
#@non-debug@
|
||||
# ## Version: @project-version@
|
||||
@ -17,19 +17,19 @@
|
||||
|
||||
#@version-classic@
|
||||
## X-Build: Classic
|
||||
## X-Compatible: 20501
|
||||
## X-Compatible: 90005
|
||||
## X-Compatible: 20502
|
||||
## X-Compatible: 90100
|
||||
#@end-version-classic@
|
||||
#@non-version-classic@
|
||||
#@version-bcc@
|
||||
# ## X-Build: BCC
|
||||
# ## X-Compatible: 11307
|
||||
# ## X-Compatible: 90005
|
||||
# ## X-Compatible: 11401
|
||||
# ## X-Compatible: 90100
|
||||
#@end-version-bcc@
|
||||
#@version-retail@
|
||||
# ## X-Build: Retail
|
||||
# ## X-Compatible: 11307
|
||||
# ## X-Compatible: 20501
|
||||
# ## X-Compatible: 11401
|
||||
# ## X-Compatible: 20502
|
||||
#@end-version-retail@
|
||||
#@end-non-version-classic@
|
||||
|
||||
|
@ -254,7 +254,7 @@ function Grichelde:CreateOptionsUI()
|
||||
name = self.L.Options_Help_Examples_Import_Name,
|
||||
-- desc = self.L.Options_Help_Examples_Import_Desc,
|
||||
desc = function() return format(self.L.Options_Help_Examples_Import_Desc, cPrefix(self.L.Options_Help_Examples[selectedExample].name)) end,
|
||||
func = function(info) self:ImportExample(selectedExample) end,
|
||||
func = function(_) self:ImportExample(selectedExample) end,
|
||||
},
|
||||
|
||||
spacer4 = {
|
||||
@ -617,17 +617,19 @@ function Grichelde:RefreshOptions(replacementsTable)
|
||||
self:TracePrint("RefreshOptions : DB table:")
|
||||
self:TracePrint(replacementsTable)
|
||||
|
||||
-- remove all previous replacements from options (not DB), except header and buttons
|
||||
local replacements = self.options.args.replacements.args or {}
|
||||
for k, _ in pairs(replacements) do
|
||||
if (k and (find(k, "^replacement_") ~= nil)) then
|
||||
replacements[k] = nil
|
||||
if (self.options ~= nil) then
|
||||
-- remove all previous replacements from options (not DB), except header and buttons
|
||||
local replacements = self.options.args.replacements.args or {}
|
||||
for k, _ in pairs(replacements) do
|
||||
if (k and (find(k, "^replacement_") ~= nil)) then
|
||||
replacements[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for replName, _ in pairs(replacementsTable or {}) do
|
||||
local _, replNumber = self:SplitOnFirstMatch(replName, "_")
|
||||
replacements[replName] = self:CreateMapping(toNumber(replNumber))
|
||||
for replName, _ in pairs(replacementsTable or {}) do
|
||||
local _, replNumber = self:SplitOnFirstMatch(replName, "_")
|
||||
replacements[replName] = self:CreateMapping(toNumber(replNumber))
|
||||
end
|
||||
end
|
||||
|
||||
-- self:TracePrint("RefreshOptions : UI options:")
|
||||
@ -635,7 +637,9 @@ function Grichelde:RefreshOptions(replacementsTable)
|
||||
end
|
||||
|
||||
function Grichelde:RefreshDialog()
|
||||
self.dialog:ConfigTableChanged(nil, self.name)
|
||||
if (self.dialog ~= nil) then
|
||||
self.dialog:ConfigTableChanged(nil, self.name)
|
||||
end
|
||||
end
|
||||
|
||||
function Grichelde:AddEmptyMapping()
|
||||
|
@ -28,9 +28,9 @@
|
||||
-- end
|
||||
-- @class file
|
||||
-- @name AceAddon-3.0.lua
|
||||
-- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
|
||||
-- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $
|
||||
|
||||
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.
|
||||
@ -601,10 +601,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)
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceAddon-3.0.lua"/>
|
||||
</Ui>
|
||||
</Ui>
|
||||
|
@ -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 1161 2017-08-12 14:30:16Z funkydude $
|
||||
-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
|
||||
|
||||
--[[
|
||||
AceConfig-3.0
|
||||
@ -45,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
|
||||
|
@ -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 1161 2017-08-12 14:30:16Z funkydude $
|
||||
-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
|
||||
|
||||
--[[
|
||||
AceConfigCmd-3.0
|
||||
@ -63,7 +63,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 +120,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 +131,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 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
|
||||
end
|
||||
end
|
||||
-- console ignores .confirm
|
||||
|
||||
|
||||
callmethod(info,inputpos,tab,methodtype, ...)
|
||||
end
|
||||
|
||||
@ -152,8 +152,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 +166,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 +206,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 +240,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
|
||||
if o1==o2 then return tostring(one)<tostring(two) end -- compare names
|
||||
return o1<o2
|
||||
end)
|
||||
|
||||
|
||||
for i = 1, #sortTbl do
|
||||
local k = sortTbl[i]
|
||||
local v = refTbl[k]
|
||||
@ -327,7 +327,7 @@ local function keybindingValidateFunc(text)
|
||||
return s
|
||||
end
|
||||
|
||||
-- handle() - selfrecursing function that processes input->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 +346,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 +363,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 +383,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,23 +395,23 @@ 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);
|
||||
|
||||
|
||||
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
|
||||
@ -420,11 +420,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
do_final(info, inputpos, tab, "set", str)
|
||||
|
||||
|
||||
|
||||
do_final(info, inputpos, tab, "set", str)
|
||||
|
||||
|
||||
|
||||
elseif tab.type=="toggle" then
|
||||
------------ toggle --------------------------------------------
|
||||
local b
|
||||
@ -444,7 +444,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,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
do_final(info, inputpos, tab, "set", b)
|
||||
|
||||
|
||||
|
||||
elseif tab.type=="range" then
|
||||
------------ range --------------------------------------------
|
||||
@ -481,21 +481,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 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 +512,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 +523,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 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 +550,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 +559,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,v 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 +596,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,11 +627,11 @@ 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))
|
||||
@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
|
||||
--TODO: Show current value
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
local r, g, b, a
|
||||
|
||||
|
||||
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
|
||||
@ -662,7 +662,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
|
||||
@ -701,7 +701,7 @@ 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
|
||||
@ -737,7 +737,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
|
||||
@ -754,7 +754,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,
|
||||
@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
|
||||
uiType = "cmd",
|
||||
uiName = MAJOR,
|
||||
}
|
||||
|
||||
|
||||
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
|
||||
end
|
||||
|
||||
|
@ -1,13 +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 1169 2018-02-27 16:18:28Z nevcairiel $
|
||||
-- @release $Id: AceConfigDialog-3.0.lua 1248 2021-02-05 14:27:49Z funkehdude $
|
||||
|
||||
local LibStub = LibStub
|
||||
local gui = LibStub("AceGUI-3.0")
|
||||
local reg = LibStub("AceConfigRegistry-3.0")
|
||||
|
||||
local MAJOR, MINOR = "AceConfigDialog-3.0", 66
|
||||
local MAJOR, MINOR = "AceConfigDialog-3.0", 81
|
||||
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not AceConfigDialog then return end
|
||||
@ -15,22 +15,23 @@ if not AceConfigDialog then return end
|
||||
AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {}
|
||||
AceConfigDialog.Status = AceConfigDialog.Status or {}
|
||||
AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame")
|
||||
AceConfigDialog.tooltip = AceConfigDialog.tooltip or CreateFrame("GameTooltip", "AceConfigDialogTooltip", UIParent, "GameTooltipTemplate")
|
||||
|
||||
AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {}
|
||||
AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
|
||||
AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {}
|
||||
|
||||
-- Lua APIs
|
||||
local tconcat, tinsert, tsort, tremove, tsort = table.concat, table.insert, table.sort, table.remove, table.sort
|
||||
local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe
|
||||
local strmatch, format = string.match, string.format
|
||||
local assert, loadstring, error = assert, loadstring, error
|
||||
local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs
|
||||
local rawset, tostring, tonumber = rawset, tostring, tonumber
|
||||
local error = error
|
||||
local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs
|
||||
local tostring, tonumber = tostring, tonumber
|
||||
local math_min, math_max, math_floor = math.min, math.max, math.floor
|
||||
|
||||
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||
-- List them here for Mikk's FindGlobals script
|
||||
-- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show
|
||||
-- GLOBALS: NORMAL_FONT_COLOR, ACCEPT, CANCEL
|
||||
-- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
|
||||
-- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
|
||||
|
||||
@ -45,39 +46,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 +57,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
|
||||
|
||||
]]
|
||||
|
||||
@ -197,11 +169,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
|
||||
@ -216,7 +188,7 @@ 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
|
||||
@ -225,13 +197,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
|
||||
local handler
|
||||
local group = options
|
||||
handler = group.handler or 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
|
||||
@ -241,8 +213,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
|
||||
@ -259,8 +231,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
|
||||
@ -325,7 +297,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
|
||||
@ -344,7 +316,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
|
||||
@ -360,7 +332,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)
|
||||
@ -391,7 +363,7 @@ local function DelTree(tree)
|
||||
end
|
||||
|
||||
local function CleanUserData(widget, event)
|
||||
|
||||
|
||||
local user = widget:GetUserDataTable()
|
||||
|
||||
if user.path then
|
||||
@ -431,7 +403,7 @@ 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
|
||||
|
||||
@ -465,7 +437,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)
|
||||
@ -477,9 +449,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, ...)
|
||||
|
||||
@ -506,12 +478,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)
|
||||
@ -521,10 +493,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
|
||||
@ -533,32 +505,33 @@ local function OptionOnMouseOver(widget, event)
|
||||
local options = user.options
|
||||
local path = user.path
|
||||
local appName = user.appName
|
||||
local tooltip = AceConfigDialog.tooltip
|
||||
|
||||
GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
|
||||
tooltip: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, true)
|
||||
|
||||
|
||||
tooltip:SetText(name, 1, .82, 0, true)
|
||||
|
||||
if opt.type == "multiselect" then
|
||||
GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
|
||||
end
|
||||
tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
|
||||
end
|
||||
if type(desc) == "string" then
|
||||
GameTooltip:AddLine(desc, 1, 1, 1, true)
|
||||
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, true)
|
||||
tooltip:AddLine("Usage: "..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)
|
||||
@ -569,71 +542,127 @@ local function GetFuncName(option)
|
||||
return "set"
|
||||
end
|
||||
end
|
||||
local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
|
||||
if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then
|
||||
StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {}
|
||||
end
|
||||
local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"]
|
||||
for k in pairs(t) do
|
||||
t[k] = nil
|
||||
end
|
||||
t.text = message
|
||||
t.button1 = ACCEPT
|
||||
t.button2 = CANCEL
|
||||
t.preferredIndex = STATICPOPUP_NUMDIALOGS
|
||||
local dialog, oldstrata
|
||||
t.OnAccept = function()
|
||||
safecall(func, unpack(t))
|
||||
if dialog and oldstrata then
|
||||
dialog:SetFrameStrata(oldstrata)
|
||||
end
|
||||
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
|
||||
del(info)
|
||||
end
|
||||
t.OnCancel = function()
|
||||
if dialog and oldstrata then
|
||||
dialog:SetFrameStrata(oldstrata)
|
||||
end
|
||||
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
|
||||
del(info)
|
||||
end
|
||||
for i = 1, select("#", ...) do
|
||||
t[i] = select(i, ...) or false
|
||||
end
|
||||
t.timeout = 0
|
||||
t.whileDead = 1
|
||||
t.hideOnEscape = 1
|
||||
do
|
||||
local 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
|
||||
self:SetPropagateKeyboardInput(false)
|
||||
if self.cancel:IsShown() then
|
||||
self.cancel:Click()
|
||||
else -- Showing a validation error
|
||||
self:Hide()
|
||||
end
|
||||
else
|
||||
self:SetPropagateKeyboardInput(true)
|
||||
end
|
||||
end)
|
||||
|
||||
dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
|
||||
if dialog then
|
||||
oldstrata = dialog:GetFrameStrata()
|
||||
dialog:SetFrameStrata("TOOLTIP")
|
||||
if not frame.SetFixedFrameStrata then -- API capability check (classic check)
|
||||
frame:SetBackdrop({
|
||||
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
|
||||
edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
|
||||
tile = true,
|
||||
tileSize = 32,
|
||||
edgeSize = 32,
|
||||
insets = { left = 11, right = 11, top = 11, bottom = 11 },
|
||||
})
|
||||
else
|
||||
local border = CreateFrame("Frame", nil, frame, "DialogBorderOpaqueTemplate")
|
||||
border:SetAllPoints(frame)
|
||||
frame:SetFixedFrameStrata(true)
|
||||
frame:SetFixedFrameLevel(true)
|
||||
end
|
||||
|
||||
local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
|
||||
text:SetSize(290, 0)
|
||||
text:SetPoint("TOP", 0, -16)
|
||||
frame.text = text
|
||||
|
||||
local function newButton(text)
|
||||
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(text)
|
||||
return button
|
||||
end
|
||||
|
||||
local accept = newButton(ACCEPT)
|
||||
accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
|
||||
frame.accept = accept
|
||||
|
||||
local cancel = newButton(CANCEL)
|
||||
cancel:SetPoint("LEFT", accept, "RIGHT", 13, 0)
|
||||
frame.cancel = cancel
|
||||
end
|
||||
end
|
||||
local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
|
||||
local frame = AceConfigDialog.popup
|
||||
frame:Show()
|
||||
frame.text:SetText(message)
|
||||
-- From StaticPopup.lua
|
||||
-- local height = 32 + text:GetHeight() + 2;
|
||||
-- height = height + 6 + accept:GetHeight()
|
||||
-- We add 32 + 2 + 6 + 21 (button height) == 61
|
||||
local height = 61 + frame.text:GetHeight()
|
||||
frame:SetHeight(height)
|
||||
|
||||
frame.accept:ClearAllPoints()
|
||||
frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
|
||||
frame.cancel:Show()
|
||||
|
||||
local t = {...}
|
||||
local tCount = select("#", ...)
|
||||
frame.accept:SetScript("OnClick", function(self)
|
||||
safecall(func, unpack(t, 1, tCount)) -- Manually set count as unpack() stops on nil (bug with #table)
|
||||
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
|
||||
frame:Hide()
|
||||
self:SetScript("OnClick", nil)
|
||||
frame.cancel:SetScript("OnClick", nil)
|
||||
del(info)
|
||||
end)
|
||||
frame.cancel:SetScript("OnClick", function(self)
|
||||
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
|
||||
frame:Hide()
|
||||
self:SetScript("OnClick", nil)
|
||||
frame.accept:SetScript("OnClick", nil)
|
||||
del(info)
|
||||
end)
|
||||
end
|
||||
|
||||
local function validationErrorPopup(message)
|
||||
if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then
|
||||
StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {}
|
||||
end
|
||||
local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"]
|
||||
t.text = message
|
||||
t.button1 = OKAY
|
||||
t.preferredIndex = STATICPOPUP_NUMDIALOGS
|
||||
local dialog, oldstrata
|
||||
t.OnAccept = function()
|
||||
if dialog and oldstrata then
|
||||
dialog:SetFrameStrata(oldstrata)
|
||||
end
|
||||
end
|
||||
t.timeout = 0
|
||||
t.whileDead = 1
|
||||
t.hideOnEscape = 1
|
||||
local frame = AceConfigDialog.popup
|
||||
frame:Show()
|
||||
frame.text:SetText(message)
|
||||
-- From StaticPopup.lua
|
||||
-- local height = 32 + text:GetHeight() + 2;
|
||||
-- height = height + 6 + accept:GetHeight()
|
||||
-- We add 32 + 2 + 6 + 21 (button height) == 61
|
||||
local height = 61 + frame.text:GetHeight()
|
||||
frame:SetHeight(height)
|
||||
|
||||
dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG")
|
||||
if dialog then
|
||||
oldstrata = dialog:GetFrameStrata()
|
||||
dialog:SetFrameStrata("TOOLTIP")
|
||||
end
|
||||
frame.accept:ClearAllPoints()
|
||||
frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16)
|
||||
frame.cancel:Hide()
|
||||
|
||||
frame.accept:SetScript("OnClick", function()
|
||||
frame:Hide()
|
||||
end)
|
||||
end
|
||||
|
||||
local function ActivateControl(widget, event, ...)
|
||||
@ -704,7 +733,7 @@ local function ActivateControl(widget, event, ...)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local success
|
||||
if validated and option.type ~= "execute" then
|
||||
if type(validate) == "string" then
|
||||
@ -719,7 +748,7 @@ local function ActivateControl(widget, event, ...)
|
||||
if not success then validated = false end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local rootframe = user.rootframe
|
||||
if not validated or type(validated) == "string" then
|
||||
if not validated then
|
||||
@ -744,7 +773,7 @@ local function ActivateControl(widget, event, ...)
|
||||
del(info)
|
||||
return true
|
||||
else
|
||||
|
||||
|
||||
local confirmText = option.confirmText
|
||||
--call confirm func/method
|
||||
if type(confirm) == "string" then
|
||||
@ -785,10 +814,10 @@ local function ActivateControl(widget, event, ...)
|
||||
confirmText = confirmText.." - "..desc
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local iscustom = user.rootframe:GetUserData("iscustom")
|
||||
local rootframe
|
||||
|
||||
|
||||
if iscustom then
|
||||
rootframe = user.rootframe
|
||||
end
|
||||
@ -825,7 +854,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
|
||||
@ -886,7 +915,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
|
||||
@ -1064,6 +1093,23 @@ local function InjectInfo(control, options, option, path, rootframe, appName)
|
||||
control:SetCallback("OnEnter", OptionOnMouseOver)
|
||||
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
|
||||
@ -1095,7 +1141,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)
|
||||
@ -1104,16 +1150,17 @@ 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" or type(image) == "number" 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
|
||||
@ -1134,19 +1181,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
|
||||
@ -1159,21 +1200,21 @@ 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" or type(image) == "number" then
|
||||
if type(imageCoords) == "table" then
|
||||
control:SetImage(image, unpack(imageCoords))
|
||||
@ -1182,7 +1223,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)
|
||||
@ -1196,6 +1237,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
|
||||
|
||||
elseif v.type == "select" then
|
||||
local values = GetOptionsMemberValue("values", v, options, path, appName)
|
||||
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)
|
||||
@ -1206,12 +1248,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
|
||||
|
||||
control:PauseLayout()
|
||||
local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
|
||||
local t = {}
|
||||
for value, text in pairs(values) do
|
||||
t[#t+1]=value
|
||||
if not sorting then
|
||||
sorting = {}
|
||||
for value, text in pairs(values) do
|
||||
sorting[#sorting+1]=value
|
||||
end
|
||||
tsort(sorting, sortTblAsStrings)
|
||||
end
|
||||
tsort(t)
|
||||
for k, value in ipairs(t) do
|
||||
for k, value in ipairs(sorting) do
|
||||
local text = values[value]
|
||||
local radio = gui:Create("CheckBox")
|
||||
radio:SetLabel(text)
|
||||
@ -1238,19 +1282,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
|
||||
control:ResumeLayout()
|
||||
control:DoLayout()
|
||||
else
|
||||
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")
|
||||
end
|
||||
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, nil, itemType)
|
||||
control:SetList(values, sorting, itemType)
|
||||
local value = GetOptionsMemberValue("get",v, options, path, appName)
|
||||
if not values[value] then
|
||||
value = nil
|
||||
@ -1262,9 +1301,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
|
||||
elseif v.type == "multiselect" then
|
||||
local values = GetOptionsMemberValue("values", v, options, path, appName)
|
||||
local disabled = CheckOptionDisabled(v, options, path, appName)
|
||||
|
||||
local controlType = v.dialogControl or v.control
|
||||
|
||||
|
||||
local valuesort = new()
|
||||
if values then
|
||||
for value, text in pairs(values) do
|
||||
@ -1272,7 +1309,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
|
||||
@ -1340,13 +1378,13 @@ 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(GetOptionsMemberValue("hasAlpha",v, options, path, appName))
|
||||
control:SetColor(GetOptionsMemberValue("get",v, options, path, appName))
|
||||
@ -1354,20 +1392,20 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
|
||||
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)
|
||||
@ -1376,10 +1414,10 @@ 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" or type(image) == "number" then
|
||||
if not width then
|
||||
width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
|
||||
@ -1428,7 +1466,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)
|
||||
@ -1453,7 +1491,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]
|
||||
@ -1468,49 +1507,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, true)
|
||||
|
||||
tooltip:SetText(name, 1, .82, 0, true)
|
||||
|
||||
if type(desc) == "string" then
|
||||
GameTooltip:AddLine(desc, 1, 1, 1, true)
|
||||
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)
|
||||
@ -1533,10 +1573,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)
|
||||
|
||||
@ -1633,7 +1669,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 = {}
|
||||
@ -1653,7 +1689,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
container:AddChild(tab)
|
||||
|
||||
elseif grouptype == "select" then
|
||||
@ -1676,7 +1712,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
|
||||
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"
|
||||
|
||||
@ -1688,14 +1724,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 = {}
|
||||
@ -1736,7 +1772,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
|
||||
@ -1746,7 +1782,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()
|
||||
@ -1831,10 +1867,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
|
||||
@ -1844,7 +1880,7 @@ 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
|
||||
@ -1852,7 +1888,7 @@ function AceConfigDialog:Open(appName, container, ...)
|
||||
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
|
||||
@ -1946,19 +1982,19 @@ end
|
||||
-- @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.
|
||||
function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
|
||||
local BlizOptions = AceConfigDialog.BlizOptions
|
||||
|
||||
|
||||
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
|
||||
|
@ -4,14 +4,14 @@
|
||||
-- * 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 1169 2018-02-27 16:18:28Z nevcairiel $
|
||||
-- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $
|
||||
local CallbackHandler = LibStub("CallbackHandler-1.0")
|
||||
|
||||
local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
|
||||
local MAJOR, MINOR = "AceConfigRegistry-3.0", 20
|
||||
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
if not AceConfigRegistry then return 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 = {},
|
||||
@ -59,7 +59,6 @@ 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"}
|
||||
@ -95,13 +94,20 @@ local basekeys={
|
||||
}
|
||||
|
||||
local typedkeys={
|
||||
header={},
|
||||
header={
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
description={
|
||||
image=optstringnumberfunc,
|
||||
imageCoords=optmethodtable,
|
||||
imageHeight=optnumber,
|
||||
imageWidth=optnumber,
|
||||
fontSize=optstringfunc,
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
group={
|
||||
args=istable,
|
||||
@ -118,6 +124,9 @@ local typedkeys={
|
||||
imageCoords=optmethodtable,
|
||||
imageHeight=optnumber,
|
||||
imageWidth=optnumber,
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
input={
|
||||
pattern=optstring,
|
||||
@ -131,6 +140,9 @@ local typedkeys={
|
||||
tristate=optbool,
|
||||
image=optstringnumberfunc,
|
||||
imageCoords=optmethodtable,
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
tristate={
|
||||
},
|
||||
@ -142,12 +154,16 @@ 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,
|
||||
@ -165,9 +181,14 @@ local typedkeys={
|
||||
},
|
||||
color={
|
||||
hasAlpha=optmethodbool,
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
keybinding={
|
||||
-- TODO
|
||||
control=optstring,
|
||||
dialogControl=optstring,
|
||||
dropdownControl=optstring,
|
||||
},
|
||||
}
|
||||
|
||||
@ -204,13 +225,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
|
||||
@ -303,7 +324,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation
|
||||
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)
|
||||
@ -341,7 +362,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
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceConsole-3.0.lua"/>
|
||||
</Ui>
|
||||
</Ui>
|
||||
|
@ -40,15 +40,15 @@
|
||||
-- end
|
||||
-- @class file
|
||||
-- @name AceDB-3.0.lua
|
||||
-- @release $Id: AceDB-3.0.lua 1142 2016-07-11 08:36:19Z nevcairiel $
|
||||
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26
|
||||
local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
|
||||
-- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $
|
||||
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27
|
||||
local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
|
||||
|
||||
if not AceDB then return end -- No upgrade needed
|
||||
|
||||
-- Lua APIs
|
||||
local type, pairs, next, error = type, pairs, next, error
|
||||
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
|
||||
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
|
||||
|
||||
-- WoW APIs
|
||||
local _G = _G
|
||||
@ -397,7 +397,7 @@ AceDB.frame:SetScript("OnEvent", logoutHandler)
|
||||
-- @param defaults A table of defaults for this database
|
||||
function DBObjectLib:RegisterDefaults(defaults)
|
||||
if defaults and type(defaults) ~= "table" then
|
||||
error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
|
||||
error(("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected, got %q."):format(type(defaults)), 2)
|
||||
end
|
||||
|
||||
validateDefaults(defaults, self.keys)
|
||||
@ -429,7 +429,7 @@ end
|
||||
-- @param name The name of the profile to set as the current profile
|
||||
function DBObjectLib:SetProfile(name)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
|
||||
error(("Usage: AceDBObject:SetProfile(name): 'name' - string expected, got %q."):format(type(name)), 2)
|
||||
end
|
||||
|
||||
-- changing to the same profile, dont do anything
|
||||
@ -471,7 +471,7 @@ end
|
||||
-- @param tbl A table to store the profile names in (optional)
|
||||
function DBObjectLib:GetProfiles(tbl)
|
||||
if tbl and type(tbl) ~= "table" then
|
||||
error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
|
||||
error(("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected, got %q."):format(type(tbl)), 2)
|
||||
end
|
||||
|
||||
-- Clear the container table
|
||||
@ -509,15 +509,15 @@ end
|
||||
-- @param silent If true, do not raise an error when the profile does not exist
|
||||
function DBObjectLib:DeleteProfile(name, silent)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
|
||||
error(("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected, got %q."):format(type(name)), 2)
|
||||
end
|
||||
|
||||
if self.keys.profile == name then
|
||||
error("Cannot delete the active profile in an AceDBObject.", 2)
|
||||
error(("Cannot delete the active profile (%q) in an AceDBObject."):format(name), 2)
|
||||
end
|
||||
|
||||
if not rawget(self.profiles, name) and not silent then
|
||||
error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
|
||||
error(("Cannot delete profile %q as it does not exist."):format(name), 2)
|
||||
end
|
||||
|
||||
self.profiles[name] = nil
|
||||
@ -548,15 +548,15 @@ end
|
||||
-- @param silent If true, do not raise an error when the profile does not exist
|
||||
function DBObjectLib:CopyProfile(name, silent)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
|
||||
error(("Usage: AceDBObject:CopyProfile(name): 'name' - string expected, got %q."):format(type(name)), 2)
|
||||
end
|
||||
|
||||
if name == self.keys.profile then
|
||||
error("Cannot have the same source and destination profiles.", 2)
|
||||
error(("Cannot have the same source and destination profiles (%q)."):format(name), 2)
|
||||
end
|
||||
|
||||
if not rawget(self.profiles, name) and not silent then
|
||||
error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
|
||||
error(("Cannot copy profile %q as it does not exist."):format(name), 2)
|
||||
end
|
||||
|
||||
-- Reset the profile before copying
|
||||
@ -611,7 +611,7 @@ end
|
||||
-- @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.", 2)
|
||||
error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected, got %q."):format(type(defaultProfile)), 2)
|
||||
end
|
||||
|
||||
local sv = self.sv
|
||||
@ -619,8 +619,6 @@ function DBObjectLib:ResetDB(defaultProfile)
|
||||
sv[k] = nil
|
||||
end
|
||||
|
||||
local parent = self.parent
|
||||
|
||||
initdb(sv, self.defaults, defaultProfile, self)
|
||||
|
||||
-- fix the child namespaces
|
||||
@ -647,13 +645,13 @@ end
|
||||
-- @param defaults A table of values to use as defaults
|
||||
function DBObjectLib:RegisterNamespace(name, defaults)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
|
||||
error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected, got %q."):format(type(name)), 2)
|
||||
end
|
||||
if defaults and type(defaults) ~= "table" then
|
||||
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
|
||||
error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected, got %q."):format(type(defaults)), 2)
|
||||
end
|
||||
if self.children and self.children[name] then
|
||||
error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
|
||||
error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace called %q already exists."):format(name), 2)
|
||||
end
|
||||
|
||||
local sv = self.sv
|
||||
@ -677,10 +675,10 @@ end
|
||||
-- @return the namespace object if found
|
||||
function DBObjectLib:GetNamespace(name, silent)
|
||||
if type(name) ~= "string" then
|
||||
error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
|
||||
error(("Usage: AceDBObject:GetNamespace(name): 'name' - string expected, got %q."):format(type(name)), 2)
|
||||
end
|
||||
if not silent and not (self.children and self.children[name]) then
|
||||
error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
|
||||
error(("Usage: AceDBObject:GetNamespace(name): 'name' - namespace %q does not exist."):format(name), 2)
|
||||
end
|
||||
if not self.children then self.children = {} end
|
||||
return self.children[name]
|
||||
@ -719,15 +717,15 @@ function AceDB:New(tbl, defaults, defaultProfile)
|
||||
end
|
||||
|
||||
if type(tbl) ~= "table" then
|
||||
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
|
||||
error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected, got %q."):format(type(tbl)), 2)
|
||||
end
|
||||
|
||||
if defaults and type(defaults) ~= "table" then
|
||||
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
|
||||
error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected, got %q."):format(type(defaults)), 2)
|
||||
end
|
||||
|
||||
if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
|
||||
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
|
||||
error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected, got %q."):format(type(defaultProfile)), 2)
|
||||
end
|
||||
|
||||
return initdb(tbl, defaults, defaultProfile)
|
||||
|
@ -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 1140 2016-07-03 07:53:29Z nevcairiel $
|
||||
-- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
|
||||
local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
|
||||
local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
|
||||
local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
|
||||
|
||||
if not AceDBOptions then return end -- No upgrade needed
|
||||
|
||||
@ -240,22 +240,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
|
||||
|
||||
@ -280,11 +280,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")
|
||||
@ -302,7 +302,7 @@ function OptionsHandlerPrototype:ListProfiles(info)
|
||||
else
|
||||
profiles = getProfileList(self.db)
|
||||
end
|
||||
|
||||
|
||||
return profiles
|
||||
end
|
||||
|
||||
@ -336,19 +336,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 = {
|
||||
@ -436,7 +436,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)
|
||||
@ -445,7 +445,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
|
||||
name = L["profiles"],
|
||||
desc = L["profiles_sub"],
|
||||
}
|
||||
|
||||
|
||||
tbl.handler = getOptionsHandler(db, noDefaultProfiles)
|
||||
tbl.args = optionsTable
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceEvent-3.0.lua"/>
|
||||
</Ui>
|
||||
</Ui>
|
||||
|
@ -24,14 +24,14 @@
|
||||
-- f:AddChild(btn)
|
||||
-- @class file
|
||||
-- @name AceGUI-3.0
|
||||
-- @release $Id: AceGUI-3.0.lua 1228 2019-09-06 08:51:17Z nevcairiel $
|
||||
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 40
|
||||
-- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $
|
||||
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 tinsert = table.insert
|
||||
local tinsert, wipe = table.insert, table.wipe
|
||||
local select, pairs, next, type = select, pairs, next, type
|
||||
local error, assert = error, assert
|
||||
local setmetatable, rawget = setmetatable, rawget
|
||||
@ -212,6 +212,22 @@ function AceGUI:Release(widget)
|
||||
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 --
|
||||
-----------
|
||||
@ -338,6 +354,10 @@ do
|
||||
AceGUI:Release(self)
|
||||
end
|
||||
|
||||
WidgetBase.IsReleasing = function(self)
|
||||
return AceGUI:IsReleasing(self)
|
||||
end
|
||||
|
||||
WidgetBase.SetPoint = function(self, ...)
|
||||
return self.frame:SetPoint(...)
|
||||
end
|
||||
|
@ -2,7 +2,7 @@
|
||||
BlizOptionsGroup Container
|
||||
Simple container widget for the integration of AceGUI into the Blizzard Interface Options
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "BlizOptionsGroup", 21
|
||||
local Type, Version = "BlizOptionsGroup", 22
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
@ -99,7 +99,7 @@ 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
|
||||
|
@ -2,7 +2,7 @@
|
||||
DropdownGroup Container
|
||||
Container controlled by a dropdown on the top.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "DropdownGroup", 21
|
||||
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
|
||||
|
||||
@ -125,7 +125,7 @@ local function Constructor()
|
||||
dropdown.frame:Show()
|
||||
dropdown:SetLabel("")
|
||||
|
||||
local border = CreateFrame("Frame", nil, frame)
|
||||
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
border:SetPoint("TOPLEFT", 0, -26)
|
||||
border:SetPoint("BOTTOMRIGHT", 0, 3)
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
|
@ -1,7 +1,7 @@
|
||||
--[[-----------------------------------------------------------------------------
|
||||
Frame Container
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Frame", 26
|
||||
local Type, Version = "Frame", 28
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
@ -83,6 +83,7 @@ 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()
|
||||
@ -179,13 +180,14 @@ local PaneBackdrop = {
|
||||
}
|
||||
|
||||
local function Constructor()
|
||||
local frame = CreateFrame("Frame", nil, UIParent)
|
||||
local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
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)
|
||||
@ -201,7 +203,7 @@ local function Constructor()
|
||||
closebutton:SetWidth(100)
|
||||
closebutton:SetText(CLOSE)
|
||||
|
||||
local statusbg = CreateFrame("Button", nil, frame)
|
||||
local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
statusbg:SetPoint("BOTTOMLEFT", 15, 15)
|
||||
statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
|
||||
statusbg:SetHeight(24)
|
||||
|
@ -2,7 +2,7 @@
|
||||
InlineGroup Container
|
||||
Simple container widget that creates a visible "box" with an optional title.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "InlineGroup", 21
|
||||
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
|
||||
|
||||
@ -75,7 +75,7 @@ local function Constructor()
|
||||
titletext:SetJustifyH("LEFT")
|
||||
titletext:SetHeight(18)
|
||||
|
||||
local border = CreateFrame("Frame", nil, frame)
|
||||
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
border:SetPoint("TOPLEFT", 0, -17)
|
||||
border:SetPoint("BOTTOMRIGHT", -1, 3)
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
|
@ -2,12 +2,12 @@
|
||||
TabGroup Container
|
||||
Container that uses tabs on top to switch between groups.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "TabGroup", 36
|
||||
local Type, Version = "TabGroup", 37
|
||||
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
|
||||
@ -316,7 +316,7 @@ local function Constructor()
|
||||
titletext:SetHeight(18)
|
||||
titletext:SetText("")
|
||||
|
||||
local border = CreateFrame("Frame", nil, frame)
|
||||
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
border:SetPoint("TOPLEFT", 1, -27)
|
||||
border:SetPoint("BOTTOMRIGHT", -1, 3)
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
|
@ -2,12 +2,10 @@
|
||||
TreeGroup Container
|
||||
Container that uses a tree control to switch between groups.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "TreeGroup", 44
|
||||
local Type, Version = "TreeGroup", 45
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
local WoW80 = select(4, GetBuildInfo()) >= 80000
|
||||
|
||||
-- Lua APIs
|
||||
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
|
||||
local math_min, math_max, floor = math.min, math.max, floor
|
||||
@ -422,8 +420,7 @@ local methods = {
|
||||
local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
|
||||
if maxlines <= 0 then return end
|
||||
|
||||
-- workaround for lag spikes on WoW 8.0
|
||||
if WoW80 and self.frame:GetParent() == UIParent and not fromOnUpdate then
|
||||
if self.frame:GetParent() == UIParent and not fromOnUpdate then
|
||||
self.frame:SetScript("OnUpdate", FirstFrameUpdate)
|
||||
return
|
||||
end
|
||||
@ -632,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 }
|
||||
}
|
||||
|
||||
@ -640,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, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
treeframe:SetPoint("TOPLEFT")
|
||||
treeframe:SetPoint("BOTTOMLEFT")
|
||||
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
|
||||
@ -655,7 +652,7 @@ local function Constructor()
|
||||
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
|
||||
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
|
||||
|
||||
local dragger = CreateFrame("Frame", nil, treeframe)
|
||||
local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
dragger:SetWidth(8)
|
||||
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
|
||||
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
|
||||
@ -680,7 +677,7 @@ local function Constructor()
|
||||
scrollbg:SetAllPoints(scrollbar)
|
||||
scrollbg:SetColorTexture(0,0,0,0.4)
|
||||
|
||||
local border = CreateFrame("Frame",nil,frame)
|
||||
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
|
||||
border:SetPoint("BOTTOMRIGHT")
|
||||
border:SetBackdrop(PaneBackdrop)
|
||||
|
@ -1,4 +1,4 @@
|
||||
--[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]--
|
||||
--[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]--
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
-- Lua APIs
|
||||
@ -39,7 +39,7 @@ end
|
||||
|
||||
do
|
||||
local widgetType = "Dropdown-Pullout"
|
||||
local widgetVersion = 3
|
||||
local widgetVersion = 5
|
||||
|
||||
--[[ Static data ]]--
|
||||
|
||||
@ -193,12 +193,7 @@ do
|
||||
|
||||
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
|
||||
@ -258,7 +253,7 @@ do
|
||||
|
||||
local function Constructor()
|
||||
local count = AceGUI:GetNextWidgetNum(widgetType)
|
||||
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
|
||||
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
local self = {}
|
||||
self.count = count
|
||||
self.type = widgetType
|
||||
@ -309,7 +304,7 @@ do
|
||||
scrollFrame.obj = self
|
||||
itemFrame.obj = self
|
||||
|
||||
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
|
||||
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
slider:SetOrientation("VERTICAL")
|
||||
slider:SetHitRectInsets(0, 0, -10, 0)
|
||||
slider:SetBackdrop(sliderBackdrop)
|
||||
@ -356,7 +351,7 @@ end
|
||||
|
||||
do
|
||||
local widgetType = "Dropdown"
|
||||
local widgetVersion = 34
|
||||
local widgetVersion = 35
|
||||
|
||||
--[[ Static data ]]--
|
||||
|
||||
@ -465,6 +460,7 @@ do
|
||||
self:SetWidth(200)
|
||||
self:SetLabel()
|
||||
self:SetPulloutWidth(nil)
|
||||
self.list = {}
|
||||
end
|
||||
|
||||
-- exported, AceGUI callback
|
||||
@ -535,9 +531,7 @@ do
|
||||
|
||||
-- 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
|
||||
|
||||
@ -601,7 +595,7 @@ do
|
||||
end
|
||||
end
|
||||
local function SetList(self, list, order, itemType)
|
||||
self.list = list
|
||||
self.list = list or {}
|
||||
self.pullout:Clear()
|
||||
self.hasClose = nil
|
||||
if not list then return end
|
||||
@ -629,10 +623,8 @@ do
|
||||
|
||||
-- exported
|
||||
local function AddItem(self, value, text, itemType)
|
||||
if self.list then
|
||||
self.list[value] = text
|
||||
AddListItem(self, value, text, itemType)
|
||||
end
|
||||
self.list[value] = text
|
||||
AddListItem(self, value, text, itemType)
|
||||
end
|
||||
|
||||
-- exported
|
||||
|
@ -2,7 +2,7 @@
|
||||
Keybinding Widget
|
||||
Set Keybindings in the Config UI.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Keybinding", 25
|
||||
local Type, Version = "Keybinding", 26
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
@ -214,7 +214,7 @@ local function Constructor()
|
||||
label:SetJustifyH("CENTER")
|
||||
label:SetHeight(18)
|
||||
|
||||
local msgframe = CreateFrame("Frame", nil, UIParent)
|
||||
local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
msgframe:SetHeight(30)
|
||||
msgframe:SetBackdrop(ControlBackdrop)
|
||||
msgframe:SetBackdropColor(0,0,0)
|
||||
|
@ -2,7 +2,7 @@
|
||||
Label Widget
|
||||
Displays text and optionally an icon.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Label", 26
|
||||
local Type, Version = "Label", 27
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
@ -130,6 +130,7 @@ local methods = {
|
||||
|
||||
["SetFont"] = function(self, font, height, flags)
|
||||
self.label:SetFont(font, height, flags)
|
||||
UpdateImageAnchor(self)
|
||||
end,
|
||||
|
||||
["SetFontObject"] = function(self, font)
|
||||
|
@ -1,4 +1,4 @@
|
||||
local Type, Version = "MultiLineEditBox", 28
|
||||
local Type, Version = "MultiLineEditBox", 29
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
@ -297,7 +297,7 @@ local function Constructor()
|
||||
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
|
||||
text:SetJustifyV("MIDDLE")
|
||||
|
||||
local scrollBG = CreateFrame("Frame", nil, frame)
|
||||
local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
scrollBG:SetBackdrop(backdrop)
|
||||
scrollBG:SetBackdropColor(0, 0, 0)
|
||||
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||
|
@ -2,7 +2,7 @@
|
||||
Slider Widget
|
||||
Graphical Slider, like, for Range values.
|
||||
-------------------------------------------------------------------------------]]
|
||||
local Type, Version = "Slider", 22
|
||||
local Type, Version = "Slider", 23
|
||||
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||
|
||||
@ -225,7 +225,7 @@ local function Constructor()
|
||||
label:SetJustifyH("CENTER")
|
||||
label:SetHeight(15)
|
||||
|
||||
local slider = CreateFrame("Slider", nil, frame)
|
||||
local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
slider:SetOrientation("HORIZONTAL")
|
||||
slider:SetHeight(15)
|
||||
slider:SetHitRectInsets(0, 0, -10, 0)
|
||||
@ -247,7 +247,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, BackdropTemplateMixin and "BackdropTemplate" or nil)
|
||||
editbox:SetAutoFocus(false)
|
||||
editbox:SetFontObject(GameFontHighlightSmall)
|
||||
editbox:SetPoint("TOP", slider, "BOTTOM")
|
||||
|
@ -9,8 +9,8 @@
|
||||
-- make into AceHook.
|
||||
-- @class file
|
||||
-- @name AceHook-3.0
|
||||
-- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
|
||||
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8
|
||||
-- @release $Id: AceHook-3.0.lua 1243 2020-10-18 00:00:19Z nevcairiel $
|
||||
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9
|
||||
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)
|
||||
|
||||
if not AceHook then return end -- No upgrade needed
|
||||
@ -478,10 +478,10 @@ function AceHook:UnhookAll()
|
||||
for key, value in pairs(registry[self]) do
|
||||
if type(key) == "table" then
|
||||
for method in pairs(value) do
|
||||
self:Unhook(key, method)
|
||||
AceHook.Unhook(self, key, method)
|
||||
end
|
||||
else
|
||||
self:Unhook(key)
|
||||
AceHook.Unhook(self, key)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceHook-3.0.lua"/>
|
||||
</Ui>
|
||||
</Ui>
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="AceLocale-3.0.lua"/>
|
||||
</Ui>
|
||||
</Ui>
|
||||
|
@ -1,4 +1,4 @@
|
||||
--[[ $Id: CallbackHandler-1.0.lua 22 2018-07-21 14:17:22Z nevcairiel $ ]]
|
||||
--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
|
||||
local MAJOR, MINOR = "CallbackHandler-1.0", 7
|
||||
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||
..\FrameXML\UI.xsd">
|
||||
<Script file="CallbackHandler-1.0.lua"/>
|
||||
</Ui>
|
||||
</Ui>
|
||||
|
@ -6,7 +6,7 @@
|
||||
--
|
||||
|
||||
local DBICON10 = "LibDBIcon-1.0"
|
||||
local DBICON10_MINOR = 43 -- Bump on changes
|
||||
local DBICON10_MINOR = 44 -- Bump on changes
|
||||
if not LibStub then error(DBICON10 .. " requires LibStub.") end
|
||||
local ldb = LibStub("LibDataBroker-1.1", true)
|
||||
if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end
|
||||
@ -18,8 +18,8 @@ lib.callbackRegistered = lib.callbackRegistered or nil
|
||||
lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib)
|
||||
lib.notCreated = lib.notCreated or {}
|
||||
lib.radius = lib.radius or 5
|
||||
local next, Minimap, CreateFrame = next, Minimap, CreateFrame
|
||||
lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate")
|
||||
local next, Minimap = next, Minimap
|
||||
local isDraggingButton = false
|
||||
|
||||
function lib:IconCallback(event, name, key, value)
|
||||
@ -218,8 +218,14 @@ local function createButton(name, object, db)
|
||||
button.dataObject = object
|
||||
button.db = db
|
||||
button:SetFrameStrata("MEDIUM")
|
||||
button:SetSize(31, 31)
|
||||
if button.SetFixedFrameStrata then -- Classic support
|
||||
button:SetFixedFrameStrata(true)
|
||||
end
|
||||
button:SetFrameLevel(8)
|
||||
if button.SetFixedFrameLevel then -- Classic support
|
||||
button:SetFixedFrameLevel(true)
|
||||
end
|
||||
button:SetSize(31, 31)
|
||||
button:RegisterForClicks("anyUp")
|
||||
button:RegisterForDrag("LeftButton")
|
||||
button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight"
|
||||
|
@ -1,13 +1,22 @@
|
||||
-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $
|
||||
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
|
||||
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
-- LibStub is hereby placed in the Public Domain
|
||||
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
|
||||
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
|
||||
local LibStub = _G[LIBSTUB_MAJOR]
|
||||
|
||||
-- Check to see is this version of the stub is obsolete
|
||||
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
LibStub = LibStub or {libs = {}, minors = {} }
|
||||
_G[LIBSTUB_MAJOR] = LibStub
|
||||
LibStub.minor = LIBSTUB_MINOR
|
||||
|
||||
-- LibStub:NewLibrary(major, minor)
|
||||
-- major (string) - the major version of the library
|
||||
-- minor (string or number ) - the minor version of the library
|
||||
--
|
||||
-- returns nil if a newer or same version of the lib is already present
|
||||
-- returns empty library object or old library object if upgrade is needed
|
||||
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.")
|
||||
@ -18,6 +27,12 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
return self.libs[major], oldminor
|
||||
end
|
||||
|
||||
-- LibStub:GetLibrary(major, [silent])
|
||||
-- major (string) - the major version of the library
|
||||
-- silent (boolean) - if true, library is optional, silently return nil if its not found
|
||||
--
|
||||
-- throws an error if the library can not be found (except silent is set)
|
||||
-- returns the library object if found
|
||||
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)
|
||||
@ -25,6 +40,12 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
|
||||
return self.libs[major], self.minors[major]
|
||||
end
|
||||
|
||||
function LibStub:IterateLibraries() return pairs(self.libs) end
|
||||
-- LibStub:IterateLibraries()
|
||||
--
|
||||
-- Returns an iterator for the currently registered libraries
|
||||
function LibStub:IterateLibraries()
|
||||
return pairs(self.libs)
|
||||
end
|
||||
|
||||
setmetatable(LibStub, { __call = LibStub.GetLibrary })
|
||||
end
|
||||
|
@ -1,9 +0,0 @@
|
||||
## Interface: 20400
|
||||
## Title: Lib: LibStub
|
||||
## Notes: Universal Library Stub
|
||||
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
|
||||
## X-Website: http://jira.wowace.com/browse/LS
|
||||
## X-Category: Library
|
||||
## X-License: Public Domain
|
||||
|
||||
LibStub.lua
|
Loading…
x
Reference in New Issue
Block a user