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
master 1.1.3
Lothar Buchholz 3 years ago
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/), 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). 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 ## Version 1.1.2 - 2021-05-23
### Changed ### Changed
- adopted to BigWigs release script to better support different game packages - adopted to BigWigs release script to better support different game packages

@ -1,13 +1,13 @@
## Interface: 11307 ## Interface: 11401
## Interface-Classic: 11307 ## Interface-Classic: 11401
## Interface-BCC: 20501 ## Interface-BCC: 20502
## Interface-Retail: 90005 ## Interface-Retail: 90100
## Title: Grichelde ## Title: Grichelde
## Notes: Replaces characters of your chat input line before sending. ## Notes: Replaces characters of your chat input line before sending.
## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile vor dem Versenden. ## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile vor dem Versenden.
#@debug@ #@debug@
## Version: 1.1.2 ## Version: 1.1.3
#@end-debug@ #@end-debug@
#@non-debug@ #@non-debug@
# ## Version: @project-version@ # ## Version: @project-version@
@ -17,19 +17,19 @@
#@version-classic@ #@version-classic@
## X-Build: Classic ## X-Build: Classic
## X-Compatible: 20501 ## X-Compatible: 20502
## X-Compatible: 90005 ## X-Compatible: 90100
#@end-version-classic@ #@end-version-classic@
#@non-version-classic@ #@non-version-classic@
#@version-bcc@ #@version-bcc@
# ## X-Build: BCC # ## X-Build: BCC
# ## X-Compatible: 11307 # ## X-Compatible: 11401
# ## X-Compatible: 90005 # ## X-Compatible: 90100
#@end-version-bcc@ #@end-version-bcc@
#@version-retail@ #@version-retail@
# ## X-Build: Retail # ## X-Build: Retail
# ## X-Compatible: 11307 # ## X-Compatible: 11401
# ## X-Compatible: 20501 # ## X-Compatible: 20502
#@end-version-retail@ #@end-version-retail@
#@end-non-version-classic@ #@end-non-version-classic@

@ -254,7 +254,7 @@ function Grichelde:CreateOptionsUI()
name = self.L.Options_Help_Examples_Import_Name, name = self.L.Options_Help_Examples_Import_Name,
-- desc = self.L.Options_Help_Examples_Import_Desc, -- 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, 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 = { spacer4 = {
@ -617,17 +617,19 @@ function Grichelde:RefreshOptions(replacementsTable)
self:TracePrint("RefreshOptions : DB table:") self:TracePrint("RefreshOptions : DB table:")
self:TracePrint(replacementsTable) self:TracePrint(replacementsTable)
-- remove all previous replacements from options (not DB), except header and buttons if (self.options ~= nil) then
local replacements = self.options.args.replacements.args or {} -- remove all previous replacements from options (not DB), except header and buttons
for k, _ in pairs(replacements) do local replacements = self.options.args.replacements.args or {}
if (k and (find(k, "^replacement_") ~= nil)) then for k, _ in pairs(replacements) do
replacements[k] = nil if (k and (find(k, "^replacement_") ~= nil)) then
replacements[k] = nil
end
end end
end
for replName, _ in pairs(replacementsTable or {}) do for replName, _ in pairs(replacementsTable or {}) do
local _, replNumber = self:SplitOnFirstMatch(replName, "_") local _, replNumber = self:SplitOnFirstMatch(replName, "_")
replacements[replName] = self:CreateMapping(toNumber(replNumber)) replacements[replName] = self:CreateMapping(toNumber(replNumber))
end
end end
-- self:TracePrint("RefreshOptions : UI options:") -- self:TracePrint("RefreshOptions : UI options:")
@ -635,7 +637,9 @@ function Grichelde:RefreshOptions(replacementsTable)
end end
function Grichelde:RefreshDialog() function Grichelde:RefreshDialog()
self.dialog:ConfigTableChanged(nil, self.name) if (self.dialog ~= nil) then
self.dialog:ConfigTableChanged(nil, self.name)
end
end end
function Grichelde:AddEmptyMapping() function Grichelde:AddEmptyMapping()

@ -28,9 +28,9 @@
-- end -- end
-- @class file -- @class file
-- @name AceAddon-3.0.lua -- @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) local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceAddon then return end -- No Upgrade needed. 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:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) 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 -- Event Handling
local function onEvent(this, event, arg1) 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 -- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process
if (event == "ADDON_LOADED" and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then 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 -- 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 while(#AceAddon.initializequeue > 0) do
local addon = tremove(AceAddon.initializequeue, 1) 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/ <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"> ..\FrameXML\UI.xsd">
<Script file="AceAddon-3.0.lua"/> <Script file="AceAddon-3.0.lua"/>
</Ui> </Ui>

@ -3,7 +3,7 @@
-- as well as associate it with a slash command. -- as well as associate it with a slash command.
-- @class file -- @class file
-- @name AceConfig-3.0 -- @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 AceConfig-3.0
@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs
function AceConfig:RegisterOptionsTable(appName, options, slashcmd) function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options) local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
if not ok then error(msg, 2) end if not ok then error(msg, 2) end
if slashcmd then if slashcmd then
if type(slashcmd) == "table" then if type(slashcmd) == "table" then
for _,cmd in pairs(slashcmd) do 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. --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file -- @class file
-- @name AceConfigCmd-3.0 -- @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 AceConfigCmd-3.0
@ -63,7 +63,7 @@ local funcmsg = "expected function or member name"
-- pickfirstset() - picks the first non-nil value and returns it -- pickfirstset() - picks the first non-nil value and returns it
local function pickfirstset(...) local function pickfirstset(...)
for i=1,select("#",...) do for i=1,select("#",...) do
if select(i,...)~=nil then if select(i,...)~=nil then
return select(i,...) return select(i,...)
@ -120,7 +120,7 @@ local function callfunction(info, tab, methodtype, ...)
info.arg = tab.arg info.arg = tab.arg
info.option = tab info.option = tab
info.type = tab.type info.type = tab.type
if type(method)=="function" then if type(method)=="function" then
return method(info, ...) return method(info, ...)
else else
@ -131,7 +131,7 @@ end
-- do_final() - do the final step (set/execute) along with validation and confirmation -- do_final() - do the final step (set/execute) along with validation and confirmation
local function do_final(info, inputpos, tab, methodtype, ...) local function do_final(info, inputpos, tab, methodtype, ...)
if info.validate then if info.validate then
local res = callmethod(info,inputpos,tab,"validate",...) local res = callmethod(info,inputpos,tab,"validate",...)
if type(res)=="string" then if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res) usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
@ -139,7 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
end end
end end
-- console ignores .confirm -- console ignores .confirm
callmethod(info,inputpos,tab,methodtype, ...) callmethod(info,inputpos,tab,methodtype, ...)
end end
@ -152,8 +152,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
if val~=nil then if val~=nil then
if val==false then if val==false then
val=nil val=nil
elseif not types[type(val)] then elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg) err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end end
info[paramname] = val info[paramname] = val
info[paramname.."_at"] = depth info[paramname.."_at"] = depth
@ -166,13 +166,13 @@ end
local dummytable={} local dummytable={}
local function iterateargs(tab) local function iterateargs(tab)
if not tab.plugins then if not tab.plugins then
return pairs(tab.args) return pairs(tab.args)
end end
local argtabkey,argtab=next(tab.plugins) local argtabkey,argtab=next(tab.plugins)
local v local v
return function(_, k) return function(_, k)
while argtab do while argtab do
k,v = next(argtab, k) k,v = next(argtab, k)
@ -206,18 +206,18 @@ local function showhelp(info, inputpos, tab, depth, noHead)
if not noHead then if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":") print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end end
local sortTbl = {} -- [1..n]=name local sortTbl = {} -- [1..n]=name
local refTbl = {} -- [name]=tableref local refTbl = {} -- [name]=tableref
for k,v in iterateargs(tab) do for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args if not refTbl[k] then -- a plugin overriding something in .args
tinsert(sortTbl, k) tinsert(sortTbl, k)
refTbl[k] = v refTbl[k] = v
end end
end end
tsort(sortTbl, function(one, two) tsort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100 local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100 local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then 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 if o1==o2 then return tostring(one)<tostring(two) end -- compare names
return o1<o2 return o1<o2
end) end)
for i = 1, #sortTbl do for i = 1, #sortTbl do
local k = sortTbl[i] local k = sortTbl[i]
local v = refTbl[k] local v = refTbl[k]
@ -327,7 +327,7 @@ local function keybindingValidateFunc(text)
return s return s
end end
-- handle() - selfrecursing function that processes input->optiontable -- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0 -- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups) -- - 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 oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",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) --local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
------------------------------------------------------------------- -------------------------------------------------------------------
-- Act according to .type of this table -- Act according to .type of this table
if tab.type=="group" then if tab.type=="group" then
------------ group -------------------------------------------- ------------ group --------------------------------------------
if type(tab.args)~="table" then err(info, inputpos) end if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-- grab next arg from input -- grab next arg from input
local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos) local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
if not arg then if not arg then
@ -363,11 +363,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
return return
end end
nextpos=nextpos+1 nextpos=nextpos+1
-- loop .args and try to find a key with a matching name -- loop .args and try to find a key with a matching name
for k,v in iterateargs(tab) do 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 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 -- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
info[depth+1] = k info[depth+1] = k
@ -383,8 +383,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
return handle(info,nextpos,v,depth+1) return handle(info,nextpos,v,depth+1)
end end
end end
-- no match -- no match
if retfalse then if retfalse then
-- restore old infotable members and return false to indicate failure -- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at 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 --info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false return false
end end
-- couldn't find the command, display error -- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"]) usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return return
end end
local str = strsub(info.input,inputpos); local str = strsub(info.input,inputpos);
if tab.type=="execute" then if tab.type=="execute" then
------------ execute -------------------------------------------- ------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func") do_final(info, inputpos, tab, "func")
elseif tab.type=="input" then elseif tab.type=="input" then
------------ input -------------------------------------------- ------------ input --------------------------------------------
local res = true local res = true
if tab.pattern then if tab.pattern then
if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end 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 return
end end
end end
do_final(info, inputpos, tab, "set", str) do_final(info, inputpos, tab, "set", str)
elseif tab.type=="toggle" then elseif tab.type=="toggle" then
------------ toggle -------------------------------------------- ------------ toggle --------------------------------------------
local b local b
@ -444,7 +444,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
else else
b = not b b = not b
end end
elseif str==L["on"] then elseif str==L["on"] then
b = true b = true
elseif str==L["off"] then elseif str==L["off"] then
@ -459,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
end end
return return
end end
do_final(info, inputpos, tab, "set", b) do_final(info, inputpos, tab, "set", b)
elseif tab.type=="range" then elseif tab.type=="range" then
------------ range -------------------------------------------- ------------ 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)) ) usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
return return
end end
do_final(info, inputpos, tab, "set", val) do_final(info, inputpos, tab, "set", val)
elseif tab.type=="select" then elseif tab.type=="select" then
------------ select ------------------------------------ ------------ select ------------------------------------
local str = strtrim(strlower(str)) local str = strtrim(strlower(str))
local values = tab.values local values = tab.values
if type(values) == "function" or type(values) == "string" then if type(values) == "function" or type(values) == "string" then
info.values = values info.values = values
values = callmethod(info, inputpos, tab, "values") values = callmethod(info, inputpos, tab, "values")
info.values = nil info.values = nil
end end
if str == "" then if str == "" then
local b = callmethod(info, inputpos, tab, "get") local b = callmethod(info, inputpos, tab, "get")
local fmt = "|cffffff78- [%s]|r %s" local fmt = "|cffffff78- [%s]|r %s"
@ -512,7 +512,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
end end
local ok local ok
for k,v in pairs(values) do for k,v in pairs(values) do
if strlower(k)==str then if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches) str = k -- overwrite with key (in case of case mismatches)
ok = true ok = true
@ -523,20 +523,20 @@ local function handle(info, inputpos, tab, depth, retfalse)
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"]) usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return return
end end
do_final(info, inputpos, tab, "set", str) do_final(info, inputpos, tab, "set", str)
elseif tab.type=="multiselect" then elseif tab.type=="multiselect" then
------------ multiselect ------------------------------------------- ------------ multiselect -------------------------------------------
local str = strtrim(strlower(str)) local str = strtrim(strlower(str))
local values = tab.values local values = tab.values
if type(values) == "function" or type(values) == "string" then if type(values) == "function" or type(values) == "string" then
info.values = values info.values = values
values = callmethod(info, inputpos, tab, "values") values = callmethod(info, inputpos, tab, "values")
info.values = nil info.values = nil
end end
if str == "" then if str == "" then
local fmt = "|cffffff78- [%s]|r %s" local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r" local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
@ -550,7 +550,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
end end
return return
end end
--build a table of the selections, checking that they exist --build a table of the selections, checking that they exist
--parse for =on =off =default in the process --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 --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 --parse option=on etc
local opt, val = v:match('(.+)=(.+)') local opt, val = v:match('(.+)=(.+)')
--get option if toggling --get option if toggling
if not opt then if not opt then
opt = v opt = v
end end
--check that the opt is valid --check that the opt is valid
local ok local ok
for k,v in pairs(values) do for k,v in pairs(values) do
if strlower(k)==opt then if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches) opt = k -- overwrite with key (in case of case mismatches)
ok = true ok = true
break break
end end
end end
if not ok then if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"]) usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return return
end end
--check that if val was supplied it is valid --check that if val was supplied it is valid
if val then if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) 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 sels[opt] = true
end end
end end
for opt, val in pairs(sels) do for opt, val in pairs(sels) do
local newval local newval
if (val == true) then if (val == true) then
--toggle the option --toggle the option
local b = callmethod(info, inputpos, tab, "get", opt) local b = callmethod(info, inputpos, tab, "get", opt)
if tab.tristate then if tab.tristate then
--cycle in true, nil, false order --cycle in true, nil, false order
if b then if b then
@ -627,11 +627,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
newval = nil newval = nil
end end
end end
do_final(info, inputpos, tab, "set", opt, newval) do_final(info, inputpos, tab, "set", opt, newval)
end end
elseif tab.type=="color" then elseif tab.type=="color" then
------------ color -------------------------------------------- ------------ color --------------------------------------------
local str = strtrim(strlower(str)) local str = strtrim(strlower(str))
@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
--TODO: Show current value --TODO: Show current value
return return
end end
local r, g, b, a local r, g, b, a
local hasAlpha = tab.hasAlpha local hasAlpha = tab.hasAlpha
if type(hasAlpha) == "function" or type(hasAlpha) == "string" then if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
info.hasAlpha = hasAlpha info.hasAlpha = hasAlpha
hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha') hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
info.hasAlpha = nil info.hasAlpha = nil
end end
if hasAlpha then if hasAlpha then
if str:len() == 8 and str:find("^%x*$") then if str:len() == 8 and str:find("^%x*$") then
--parse a hex string --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)) usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return return
end 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 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 --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 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)) usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end end
end end
do_final(info, inputpos, tab, "set", r,g,b,a) do_final(info, inputpos, tab, "set", r,g,b,a)
elseif tab.type=="keybinding" then elseif tab.type=="keybinding" then
@ -737,7 +737,7 @@ end
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0") -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
-- -- Use AceConsole-3.0 to register a Chat Command -- -- Use AceConsole-3.0 to register a Chat Command
-- MyAddon:RegisterChatCommand("mychat", "ChatCommand") -- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
-- --
-- -- Show the GUI if no input is supplied, otherwise handle the chat input. -- -- Show the GUI if no input is supplied, otherwise handle the chat input.
-- function MyAddon:ChatCommand(input) -- function MyAddon:ChatCommand(input)
-- -- Assuming "MyOptions" is the appName of a valid options table -- -- 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) error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end end
local options = assert( optgetter("cmd", MAJOR) ) local options = assert( optgetter("cmd", MAJOR) )
local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
[0] = slashcmd, [0] = slashcmd,
appName = appName, appName = appName,
@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
uiType = "cmd", uiType = "cmd",
uiName = MAJOR, uiName = MAJOR,
} }
handle(info, 1, options, 0) -- (info, inputpos, table, depth) handle(info, 1, options, 0) -- (info, inputpos, table, depth)
end end

@ -1,13 +1,13 @@
--- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
-- @class file -- @class file
-- @name AceConfigDialog-3.0 -- @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 LibStub = LibStub
local gui = LibStub("AceGUI-3.0") local gui = LibStub("AceGUI-3.0")
local reg = LibStub("AceConfigRegistry-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) local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigDialog then return end if not AceConfigDialog then return end
@ -15,22 +15,23 @@ if not AceConfigDialog then return end
AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {} AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {}
AceConfigDialog.Status = AceConfigDialog.Status or {} AceConfigDialog.Status = AceConfigDialog.Status or {}
AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame") 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.apps = AceConfigDialog.frame.apps or {}
AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {} AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {}
-- Lua APIs -- 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 strmatch, format = string.match, string.format
local assert, loadstring, error = assert, loadstring, error local error = error
local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs
local rawset, tostring, tonumber = rawset, tostring, tonumber local tostring, tonumber = tostring, tonumber
local math_min, math_max, math_floor = math.min, math.max, math.floor 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 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script -- 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: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
-- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler -- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
@ -45,39 +46,10 @@ local function errorhandler(err)
return geterrorhandler()(err) return geterrorhandler()(err)
end 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, ...) local function safecall(func, ...)
return Dispatchers[select("#", ...)](func, ...) if func then
return xpcall(func, errorhandler, ...)
end
end end
local width_multiplier = 170 local width_multiplier = 170
@ -85,18 +57,18 @@ local width_multiplier = 170
--[[ --[[
Group Types Group Types
Tree - All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree 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 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 Select- Same as Tab but with entries in a dropdown rather than tabs
Inline Groups Inline Groups
- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border - 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 - 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 - 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, ...) local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
--get definition for the member --get definition for the member
local inherits = isInherited[membername] local inherits = isInherited[membername]
--get the member of the option, traversing the tree if it can be inherited --get the member of the option, traversing the tree if it can be inherited
local member local member
if inherits then if inherits then
local group = options local group = options
if group[membername] ~= nil then if group[membername] ~= nil then
@ -216,7 +188,7 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
else else
member = option[membername] member = option[membername]
end end
--check if we need to call a functon, or if we have a literal value --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 if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
--We have a function to call --We have a function to call
@ -225,13 +197,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
local handler local handler
local group = options local group = options
handler = group.handler or handler handler = group.handler or handler
for i = 1, #path do for i = 1, #path do
group = GetSubOption(group, path[i]) group = GetSubOption(group, path[i])
info[i] = path[i] info[i] = path[i]
handler = group.handler or handler handler = group.handler or handler
end end
info.options = options info.options = options
info.appName = appName info.appName = appName
info[0] = appName info[0] = appName
@ -241,8 +213,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
info.type = option.type info.type = option.type
info.uiType = "dialog" info.uiType = "dialog"
info.uiName = MAJOR 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 --using 4 returns for the get of a color type, increase if a type needs more
if type(member) == "function" then if type(member) == "function" then
--Call the function --Call the function
@ -259,8 +231,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
return a,b,c,d return a,b,c,d
else else
--The value isnt a function to call, return it --The value isnt a function to call, return it
return member return member
end end
end end
--[[calls an options function that could be inherited, method name or function ref --[[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() return NameA:upper() < NameB:upper()
end end
if OrderA < 0 then if OrderA < 0 then
if OrderB > 0 then if OrderB >= 0 then
return false return false
end end
else else
@ -344,7 +316,7 @@ end
local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName) local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
tempOrders = new() tempOrders = new()
tempNames = new() tempNames = new()
if group.plugins then if group.plugins then
for plugin, t in pairs(group.plugins) do for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do for k, v in pairs(t) do
@ -360,7 +332,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN
end end
end end
end end
for k, v in pairs(group.args) do for k, v in pairs(group.args) do
if not opts[k] then if not opts[k] then
tinsert(keySort, k) tinsert(keySort, k)
@ -391,7 +363,7 @@ local function DelTree(tree)
end end
local function CleanUserData(widget, event) local function CleanUserData(widget, event)
local user = widget:GetUserDataTable() local user = widget:GetUserDataTable()
if user.path then if user.path then
@ -431,7 +403,7 @@ end
-- - Gets a status table for the given appname and options path. -- - Gets a status table for the given appname and options path.
-- @param appName The application name as given to `:RegisterOptionsTable()` -- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param path The path to the options (a table with all group keys) -- @param path The path to the options (a table with all group keys)
-- @return -- @return
function AceConfigDialog:GetStatusTable(appName, path) function AceConfigDialog:GetStatusTable(appName, path)
local status = self.Status local status = self.Status
@ -465,7 +437,7 @@ end
function AceConfigDialog:SelectGroup(appName, ...) function AceConfigDialog:SelectGroup(appName, ...)
local path = new() local path = new()
local app = reg:GetOptionsTable(appName) local app = reg:GetOptionsTable(appName)
if not app then if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2) error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
@ -477,9 +449,9 @@ function AceConfigDialog:SelectGroup(appName, ...)
status.groups = {} status.groups = {}
end end
status = status.groups status = status.groups
local treevalue local treevalue
local treestatus local treestatus
for n = 1, select("#",...) do for n = 1, select("#",...) do
local key = select(n, ...) 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 --the selected group will be overwritten if a child is the final target but still needs to be open
treestatus.selected = treevalue treestatus.selected = treevalue
treestatus.groups[treevalue] = true treestatus.groups[treevalue] = true
end end
--move to the next group in the path --move to the next group in the path
group = GetSubOption(group, key) group = GetSubOption(group, key)
if not group then if not group then
break break
end end
tinsert(path, key) tinsert(path, key)
@ -521,10 +493,10 @@ function AceConfigDialog:SelectGroup(appName, ...)
end end
status = status.groups status = status.groups
end end
del(path) del(path)
reg:NotifyChange(appName) reg:NotifyChange(appName)
end end
local function OptionOnMouseOver(widget, event) local function OptionOnMouseOver(widget, event)
--show a tooltip/set the status bar to the desc text --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 options = user.options
local path = user.path local path = user.path
local appName = user.appName 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 name = GetOptionsMemberValue("name", opt, options, path, appName)
local desc = GetOptionsMemberValue("desc", opt, options, path, appName) local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
local usage = GetOptionsMemberValue("usage", opt, options, path, appName) local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
local descStyle = opt.descStyle local descStyle = opt.descStyle
if descStyle and descStyle ~= "tooltip" then return end 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 if opt.type == "multiselect" then
GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
end end
if type(desc) == "string" then if type(desc) == "string" then
GameTooltip:AddLine(desc, 1, 1, 1, true) tooltip:AddLine(desc, 1, 1, 1, true)
end end
if type(usage) == "string" then 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 end
GameTooltip:Show() tooltip:Show()
end end
local function OptionOnMouseLeave(widget, event) local function OptionOnMouseLeave(widget, event)
GameTooltip:Hide() AceConfigDialog.tooltip:Hide()
end end
local function GetFuncName(option) local function GetFuncName(option)
@ -569,71 +542,127 @@ local function GetFuncName(option)
return "set" return "set"
end end
end end
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)
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 function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then local frame = AceConfigDialog.popup
StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {} frame:Show()
end frame.text:SetText(message)
local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] -- From StaticPopup.lua
for k in pairs(t) do -- local height = 32 + text:GetHeight() + 2;
t[k] = nil -- height = height + 6 + accept:GetHeight()
end -- We add 32 + 2 + 6 + 21 (button height) == 61
t.text = message local height = 61 + frame.text:GetHeight()
t.button1 = ACCEPT frame:SetHeight(height)
t.button2 = CANCEL
t.preferredIndex = STATICPOPUP_NUMDIALOGS frame.accept:ClearAllPoints()
local dialog, oldstrata frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
t.OnAccept = function() frame.cancel:Show()
safecall(func, unpack(t))
if dialog and oldstrata then local t = {...}
dialog:SetFrameStrata(oldstrata) local tCount = select("#", ...)
end 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)) AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
frame:Hide()
self:SetScript("OnClick", nil)
frame.cancel:SetScript("OnClick", nil)
del(info) del(info)
end end)
t.OnCancel = function() frame.cancel:SetScript("OnClick", function(self)
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
frame:Hide()
self:SetScript("OnClick", nil)
frame.accept:SetScript("OnClick", nil)
del(info) del(info)
end end)
for i = 1, select("#", ...) do
t[i] = select(i, ...) or false
end
t.timeout = 0
t.whileDead = 1
t.hideOnEscape = 1
dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
if dialog then
oldstrata = dialog:GetFrameStrata()
dialog:SetFrameStrata("TOOLTIP")
end
end end
local function validationErrorPopup(message) local function validationErrorPopup(message)
if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then local frame = AceConfigDialog.popup
StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {} frame:Show()
end frame.text:SetText(message)
local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] -- From StaticPopup.lua
t.text = message -- local height = 32 + text:GetHeight() + 2;
t.button1 = OKAY -- height = height + 6 + accept:GetHeight()
t.preferredIndex = STATICPOPUP_NUMDIALOGS -- We add 32 + 2 + 6 + 21 (button height) == 61
local dialog, oldstrata local height = 61 + frame.text:GetHeight()
t.OnAccept = function() frame:SetHeight(height)
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata) frame.accept:ClearAllPoints()
end frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16)
end frame.cancel:Hide()
t.timeout = 0
t.whileDead = 1 frame.accept:SetScript("OnClick", function()
t.hideOnEscape = 1 frame:Hide()
end)
dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG")
if dialog then
oldstrata = dialog:GetFrameStrata()
dialog:SetFrameStrata("TOOLTIP")
end
end end
local function ActivateControl(widget, event, ...) local function ActivateControl(widget, event, ...)
@ -704,7 +733,7 @@ local function ActivateControl(widget, event, ...)
end end
end end
end end
local success local success
if validated and option.type ~= "execute" then if validated and option.type ~= "execute" then
if type(validate) == "string" then if type(validate) == "string" then
@ -719,7 +748,7 @@ local function ActivateControl(widget, event, ...)
if not success then validated = false end if not success then validated = false end
end end
end end
local rootframe = user.rootframe local rootframe = user.rootframe
if not validated or type(validated) == "string" then if not validated or type(validated) == "string" then
if not validated then if not validated then
@ -744,7 +773,7 @@ local function ActivateControl(widget, event, ...)
del(info) del(info)
return true return true
else else
local confirmText = option.confirmText local confirmText = option.confirmText
--call confirm func/method --call confirm func/method
if type(confirm) == "string" then if type(confirm) == "string" then
@ -785,10 +814,10 @@ local function ActivateControl(widget, event, ...)
confirmText = confirmText.." - "..desc confirmText = confirmText.." - "..desc
end end
end end
local iscustom = user.rootframe:GetUserData("iscustom") local iscustom = user.rootframe:GetUserData("iscustom")
local rootframe local rootframe
if iscustom then if iscustom then
rootframe = user.rootframe rootframe = user.rootframe
end end
@ -825,7 +854,7 @@ local function ActivateControl(widget, event, ...)
--full refresh of the frame, some controls dont cause this on all events --full refresh of the frame, some controls dont cause this on all events
if option.type == "color" then if option.type == "color" then
if event == "OnValueConfirmed" then if event == "OnValueConfirmed" then
if iscustom then if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath)) AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else else
@ -886,7 +915,7 @@ end
local function MultiControlOnClosed(widget, event, ...) local function MultiControlOnClosed(widget, event, ...)
local user = widget:GetUserDataTable() local user = widget:GetUserDataTable()
if user.valuechanged then if user.valuechanged and not widget:IsReleasing() then
local iscustom = user.rootframe:GetUserData("iscustom") local iscustom = user.rootframe:GetUserData("iscustom")
local basepath = user.rootframe:GetUserData("basepath") or emptyTbl local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
if iscustom then if iscustom then
@ -1064,6 +1093,23 @@ local function InjectInfo(control, options, option, path, rootframe, appName)
control:SetCallback("OnEnter", OptionOnMouseOver) control:SetCallback("OnEnter", OptionOnMouseOver)
end end
local function CreateControl(userControlType, fallbackControlType)
local control
if userControlType then
control = gui:Create(userControlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(userControlType)))
end
end
if not control then
control = gui:Create(fallbackControlType)
end
return control
end
local function sortTblAsStrings(x,y)
return tostring(x) < tostring(y) -- Support numbers as keys
end
--[[ --[[
options - root of the options table being fed options - root of the options table being fed
@ -1095,7 +1141,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
else else
GroupContainer = gui:Create("SimpleGroup") GroupContainer = gui:Create("SimpleGroup")
end end
GroupContainer.width = "fill" GroupContainer.width = "fill"
GroupContainer:SetLayout("flow") GroupContainer:SetLayout("flow")
container:AddChild(GroupContainer) container:AddChild(GroupContainer)
@ -1104,16 +1150,17 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
else else
--Control to feed --Control to feed
local control local control
local name = GetOptionsMemberValue("name", v, options, path, appName) local name = GetOptionsMemberValue("name", v, options, path, appName)
if v.type == "execute" then if v.type == "execute" then
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
if type(image) == "string" or type(image) == "number" then local iconControl = type(image) == "string" or type(image) == "number"
control = gui:Create("Icon") control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button")
if iconControl then
if not width then if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName) width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
end end
@ -1134,19 +1181,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:SetImageSize(width, height) control:SetImageSize(width, height)
control:SetLabel(name) control:SetLabel(name)
else else
control = gui:Create("Button")
control:SetText(name) control:SetText(name)
end end
control:SetCallback("OnClick",ActivateControl) control:SetCallback("OnClick",ActivateControl)
elseif v.type == "input" then elseif v.type == "input" then
local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox" control = CreateControl(v.dialogControl or v.control, 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
if v.multiline and control.SetNumLines then if v.multiline and control.SetNumLines then
control:SetNumLines(tonumber(v.multiline) or 4) control:SetNumLines(tonumber(v.multiline) or 4)
end end
@ -1159,21 +1200,21 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:SetText(text) control:SetText(text)
elseif v.type == "toggle" then elseif v.type == "toggle" then
control = gui:Create("CheckBox") control = CreateControl(v.dialogControl or v.control, "CheckBox")
control:SetLabel(name) control:SetLabel(name)
control:SetTriState(v.tristate) control:SetTriState(v.tristate)
local value = GetOptionsMemberValue("get",v, options, path, appName) local value = GetOptionsMemberValue("get",v, options, path, appName)
control:SetValue(value) control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateControl) control:SetCallback("OnValueChanged",ActivateControl)
if v.descStyle == "inline" then if v.descStyle == "inline" then
local desc = GetOptionsMemberValue("desc", v, options, path, appName) local desc = GetOptionsMemberValue("desc", v, options, path, appName)
control:SetDescription(desc) control:SetDescription(desc)
end end
local image = GetOptionsMemberValue("image", v, options, path, appName) local image = GetOptionsMemberValue("image", v, options, path, appName)
local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName) local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
if type(image) == "string" or type(image) == "number" then if type(image) == "string" or type(image) == "number" then
if type(imageCoords) == "table" then if type(imageCoords) == "table" then
control:SetImage(image, unpack(imageCoords)) control:SetImage(image, unpack(imageCoords))
@ -1182,7 +1223,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end end
end end
elseif v.type == "range" then elseif v.type == "range" then
control = gui:Create("Slider") control = CreateControl(v.dialogControl or v.control, "Slider")
control:SetLabel(name) 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: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) control:SetIsPercent(v.isPercent)
@ -1196,6 +1237,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
elseif v.type == "select" then elseif v.type == "select" then
local values = GetOptionsMemberValue("values", v, options, path, appName) local values = GetOptionsMemberValue("values", v, options, path, appName)
local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
if v.style == "radio" then if v.style == "radio" then
local disabled = CheckOptionDisabled(v, options, path, appName) local disabled = CheckOptionDisabled(v, options, path, appName)
local width = GetOptionsMemberValue("width",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() control:PauseLayout()
local optionValue = GetOptionsMemberValue("get",v, options, path, appName) local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
local t = {} if not sorting then
for value, text in pairs(values) do sorting = {}
t[#t+1]=value for value, text in pairs(values) do
sorting[#sorting+1]=value
end
tsort(sorting, sortTblAsStrings)
end end
tsort(t) for k, value in ipairs(sorting) do
for k, value in ipairs(t) do
local text = values[value] local text = values[value]
local radio = gui:Create("CheckBox") local radio = gui:Create("CheckBox")
radio:SetLabel(text) radio:SetLabel(text)
@ -1238,19 +1282,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:ResumeLayout() control:ResumeLayout()
control:DoLayout() control:DoLayout()
else else
local controlType = v.dialogControl or v.control or "Dropdown" control = CreateControl(v.dialogControl or v.control, "Dropdown")
control = gui:Create(controlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
control = gui:Create("Dropdown")
end
local itemType = v.itemControl local itemType = v.itemControl
if itemType and not gui:GetWidgetVersion(itemType) then if itemType and not gui:GetWidgetVersion(itemType) then
geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType))) geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType)))
itemType = nil itemType = nil
end end
control:SetLabel(name) control:SetLabel(name)
control:SetList(values, nil, itemType) control:SetList(values, sorting, itemType)
local value = GetOptionsMemberValue("get",v, options, path, appName) local value = GetOptionsMemberValue("get",v, options, path, appName)
if not values[value] then if not values[value] then
value = nil value = nil
@ -1262,9 +1301,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
elseif v.type == "multiselect" then elseif v.type == "multiselect" then
local values = GetOptionsMemberValue("values", v, options, path, appName) local values = GetOptionsMemberValue("values", v, options, path, appName)
local disabled = CheckOptionDisabled(v, options, path, appName) local disabled = CheckOptionDisabled(v, options, path, appName)
local controlType = v.dialogControl or v.control
local valuesort = new() local valuesort = new()
if values then if values then
for value, text in pairs(values) do for value, text in pairs(values) do
@ -1272,7 +1309,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
end end
end end
tsort(valuesort) tsort(valuesort)
local controlType = v.dialogControl or v.control
if controlType then if controlType then
control = gui:Create(controlType) control = gui:Create(controlType)
if not control then if not control then
@ -1340,13 +1378,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
control:ResumeLayout() control:ResumeLayout()
control:DoLayout() control:DoLayout()
end end
del(valuesort) del(valuesort)
elseif v.type == "color" then elseif v.type == "color" then
control = gui:Create("ColorPicker") control = CreateControl(v.dialogControl or v.control, "ColorPicker")
control:SetLabel(name) control:SetLabel(name)
control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName)) control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName))
control:SetColor(GetOptionsMemberValue("get",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) control:SetCallback("OnValueConfirmed",ActivateControl)
elseif v.type == "keybinding" then elseif v.type == "keybinding" then
control = gui:Create("Keybinding") control = CreateControl(v.dialogControl or v.control, "Keybinding")
control:SetLabel(name) control:SetLabel(name)
control:SetKey(GetOptionsMemberValue("get",v, options, path, appName)) control:SetKey(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnKeyChanged",ActivateControl) control:SetCallback("OnKeyChanged",ActivateControl)
elseif v.type == "header" then elseif v.type == "header" then
control = gui:Create("Heading") control = CreateControl(v.dialogControl or v.control, "Heading")
control:SetText(name) control:SetText(name)
control.width = "fill" control.width = "fill"
elseif v.type == "description" then elseif v.type == "description" then
control = gui:Create("Label") control = CreateControl(v.dialogControl or v.control, "Label")
control:SetText(name) control:SetText(name)
local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName) local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
if fontSize == "medium" then if fontSize == "medium" then
control:SetFontObject(GameFontHighlight) control:SetFontObject(GameFontHighlight)
@ -1376,10 +1414,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
else -- small or invalid else -- small or invalid
control:SetFontObject(GameFontHighlightSmall) control:SetFontObject(GameFontHighlightSmall)
end end
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
if type(image) == "string" or type(image) == "number" then if type(image) == "string" or type(image) == "number" then
if not width then if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName) 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) InjectInfo(control, options, v, path, rootframe, appName)
container:AddChild(control) container:AddChild(control)
end end
end end
end end
tremove(path) tremove(path)
@ -1453,7 +1491,8 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
local option = user.option local option = user.option
local path = user.path local path = user.path
local appName = user.appName local appName = user.appName
local tooltip = AceConfigDialog.tooltip
local feedpath = new() local feedpath = new()
for i = 1, #path do for i = 1, #path do
feedpath[i] = path[i] feedpath[i] = path[i]
@ -1468,49 +1507,50 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
local name = GetOptionsMemberValue("name", group, options, feedpath, appName) local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
local desc = GetOptionsMemberValue("desc", 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 if widget.type == "TabGroup" then
GameTooltip:SetPoint("BOTTOM",button,"TOP") tooltip:SetPoint("BOTTOM",button,"TOP")
else else
GameTooltip:SetPoint("LEFT",button,"RIGHT") tooltip:SetPoint("LEFT",button,"RIGHT")
end end
GameTooltip:SetText(name, 1, .82, 0, true) tooltip:SetText(name, 1, .82, 0, true)
if type(desc) == "string" then if type(desc) == "string" then
GameTooltip:AddLine(desc, 1, 1, 1, true) tooltip:AddLine(desc, 1, 1, 1, true)
end end
GameTooltip:Show() tooltip:Show()
end end
local function TreeOnButtonLeave(widget, event, value, button) local function TreeOnButtonLeave(widget, event, value, button)
GameTooltip:Hide() AceConfigDialog.tooltip:Hide()
end end
local function GroupExists(appName, options, path, uniquevalue) local function GroupExists(appName, options, path, uniquevalue)
if not uniquevalue then return false end if not uniquevalue then return false end
local feedpath = new() local feedpath = new()
local temppath = new() local temppath = new()
for i = 1, #path do for i = 1, #path do
feedpath[i] = path[i] feedpath[i] = path[i]
end end
BuildPath(feedpath, ("\001"):split(uniquevalue)) BuildPath(feedpath, ("\001"):split(uniquevalue))
local group = options local group = options
for i = 1, #feedpath do for i = 1, #feedpath do
local v = feedpath[i] local v = feedpath[i]
temppath[i] = v temppath[i] = v
group = GetSubOption(group, 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(feedpath)
del(temppath) del(temppath)
return false return false
end end
end end
del(feedpath) del(feedpath)
@ -1533,10 +1573,6 @@ local function GroupSelected(widget, event, uniquevalue)
end end
BuildPath(feedpath, ("\001"):split(uniquevalue)) BuildPath(feedpath, ("\001"):split(uniquevalue))
local group = options
for i = 1, #feedpath do
group = GetSubOption(group, feedpath[i])
end
widget:ReleaseChildren() widget:ReleaseChildren()
AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath) 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("OnGroupSelected", GroupSelected)
tab:SetCallback("OnTabEnter", TreeOnButtonEnter) tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
tab:SetCallback("OnTabLeave", TreeOnButtonLeave) tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
local status = AceConfigDialog:GetStatusTable(appName, path) local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then if not status.groups then
status.groups = {} status.groups = {}
@ -1653,7 +1689,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
break break
end end
end end
container:AddChild(tab) container:AddChild(tab)
elseif grouptype == "select" then elseif grouptype == "select" then
@ -1676,7 +1712,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
if firstgroup then if firstgroup then
select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup) select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
end end
select.width = "fill" select.width = "fill"
select.height = "fill" select.height = "fill"
@ -1688,14 +1724,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
local tree = gui:Create("TreeGroup") local tree = gui:Create("TreeGroup")
InjectInfo(tree, options, group, path, rootframe, appName) InjectInfo(tree, options, group, path, rootframe, appName)
tree:EnableButtonTooltips(false) tree:EnableButtonTooltips(false)
tree.width = "fill" tree.width = "fill"
tree.height = "fill" tree.height = "fill"
tree:SetCallback("OnGroupSelected", GroupSelected) tree:SetCallback("OnGroupSelected", GroupSelected)
tree:SetCallback("OnButtonEnter", TreeOnButtonEnter) tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
tree:SetCallback("OnButtonLeave", TreeOnButtonLeave) tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
local status = AceConfigDialog:GetStatusTable(appName, path) local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then if not status.groups then
status.groups = {} status.groups = {}
@ -1736,7 +1772,7 @@ local function RefreshOnUpdate(this)
end end
this.closing[appName] = nil this.closing[appName] = nil
end end
if this.closeAll then if this.closeAll then
for k, v in pairs(AceConfigDialog.OpenFrames) do for k, v in pairs(AceConfigDialog.OpenFrames) do
if not this.closeAllOverride[k] then if not this.closeAllOverride[k] then
@ -1746,7 +1782,7 @@ local function RefreshOnUpdate(this)
this.closeAll = nil this.closeAll = nil
wipe(this.closeAllOverride) wipe(this.closeAllOverride)
end end
for appName in pairs(this.apps) do for appName in pairs(this.apps) do
if AceConfigDialog.OpenFrames[appName] then if AceConfigDialog.OpenFrames[appName] then
local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable() local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
@ -1831,10 +1867,10 @@ function AceConfigDialog:Open(appName, container, ...)
local options = app("dialog", MAJOR) local options = app("dialog", MAJOR)
local f local f
local path = new() local path = new()
local name = GetOptionsMemberValue("name", options, options, path, appName) local name = GetOptionsMemberValue("name", options, options, path, appName)
--If an optional path is specified add it to the path table before feeding the options --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 --as container is optional as well it may contain the first element of the path
if type(container) == "string" then if type(container) == "string" then
@ -1844,7 +1880,7 @@ function AceConfigDialog:Open(appName, container, ...)
for n = 1, select("#",...) do for n = 1, select("#",...) do
tinsert(path, (select(n, ...))) tinsert(path, (select(n, ...)))
end end
local option = options local option = options
if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
for i = 1, #path do for i = 1, #path do
@ -1852,7 +1888,7 @@ function AceConfigDialog:Open(appName, container, ...)
end end
name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName)) name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
end end
--if a container is given feed into that --if a container is given feed into that
if container then if container then
f = container f = container
@ -1946,19 +1982,19 @@ end
-- @param name A descriptive name to display in the options tree (defaults to appName) -- @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 parent The parent to use in the interface options tree.
-- @param ... The path in the options table to feed into the interface options panel. -- @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, ...) function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
local BlizOptions = AceConfigDialog.BlizOptions local BlizOptions = AceConfigDialog.BlizOptions
local key = appName local key = appName
for n = 1, select("#", ...) do for n = 1, select("#", ...) do
key = key.."\001"..select(n, ...) key = key.."\001"..select(n, ...)
end end
if not BlizOptions[appName] then if not BlizOptions[appName] then
BlizOptions[appName] = {} BlizOptions[appName] = {}
end end
if not BlizOptions[appName][key] then if not BlizOptions[appName][key] then
local group = gui:Create("BlizOptionsGroup") local group = gui:Create("BlizOptionsGroup")
BlizOptions[appName][key] = group BlizOptions[appName][key] = group

@ -4,14 +4,14 @@
-- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\ -- * 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 **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 \\ -- * 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". -- :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 -- @class file
-- @name AceConfigRegistry-3.0 -- @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 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) local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
if not AceConfigRegistry then return end if not AceConfigRegistry then return end
@ -33,7 +33,7 @@ local error, assert = error, assert
AceConfigRegistry.validated = { 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 -- CLEARED ON PURPOSE, since newer versions may have newer validators
cmd = {}, cmd = {},
dropdown = {}, dropdown = {},
@ -59,7 +59,6 @@ local optstring={["nil"]=true,["string"]=true, _="string"}
local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"} 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 optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"}
local optnumber={["nil"]=true,["number"]=true, _="number"} 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 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 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"} local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true, _="methodname, funcref or table"}
@ -95,13 +94,20 @@ local basekeys={
} }
local typedkeys={ local typedkeys={
header={}, header={
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
description={ description={
image=optstringnumberfunc, image=optstringnumberfunc,
imageCoords=optmethodtable, imageCoords=optmethodtable,
imageHeight=optnumber, imageHeight=optnumber,
imageWidth=optnumber, imageWidth=optnumber,
fontSize=optstringfunc, fontSize=optstringfunc,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
}, },
group={ group={
args=istable, args=istable,
@ -118,6 +124,9 @@ local typedkeys={
imageCoords=optmethodtable, imageCoords=optmethodtable,
imageHeight=optnumber, imageHeight=optnumber,
imageWidth=optnumber, imageWidth=optnumber,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
}, },
input={ input={
pattern=optstring, pattern=optstring,
@ -131,6 +140,9 @@ local typedkeys={
tristate=optbool, tristate=optbool,
image=optstringnumberfunc, image=optstringnumberfunc,
imageCoords=optmethodtable, imageCoords=optmethodtable,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
}, },
tristate={ tristate={
}, },
@ -142,12 +154,16 @@ local typedkeys={
step=optnumber, step=optnumber,
bigStep=optnumber, bigStep=optnumber,
isPercent=optbool, isPercent=optbool,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
}, },
select={ select={
values=ismethodtable, values=ismethodtable,
sorting=optmethodtable,
style={ style={
["nil"]=true, ["nil"]=true,
["string"]={dropdown=true,radio=true}, ["string"]={dropdown=true,radio=true},
_="string: 'dropdown' or 'radio'" _="string: 'dropdown' or 'radio'"
}, },
control=optstring, control=optstring,
@ -165,9 +181,14 @@ local typedkeys={
}, },
color={ color={
hasAlpha=optmethodbool, hasAlpha=optmethodbool,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
}, },
keybinding={ keybinding={
-- TODO control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
}, },
} }
@ -204,13 +225,13 @@ local function validate(options,errlvl,...)
if type(options.type)~="string" then if type(options.type)~="string" then
err(".type: expected a string, got a "..type(options.type), errlvl,...) err(".type: expected a string, got a "..type(options.type), errlvl,...)
end end
-- get type and 'typedkeys' member -- get type and 'typedkeys' member
local tk = typedkeys[options.type] local tk = typedkeys[options.type]
if not tk then if not tk then
err(".type: unknown type '"..options.type.."'", errlvl,...) err(".type: unknown type '"..options.type.."'", errlvl,...)
end end
-- make sure that all options[] are known parameters -- make sure that all options[] are known parameters
for k,v in pairs(options) do for k,v in pairs(options) do
if not (tk[k] or basekeys[k]) then 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:ValidateOptionsTable(options, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true AceConfigRegistry.validated[uiType][appName] = true
end end
return options return options
end end
elseif type(options)=="function" then elseif type(options)=="function" then
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl) AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
@ -341,7 +362,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
if not f then if not f then
return nil return nil
end end
if uiType then if uiType then
return f(uiType,uiName,1) -- get the table for us return f(uiType,uiName,1) -- get the table for us
else 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/ <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"> ..\FrameXML\UI.xsd">
<Script file="AceConsole-3.0.lua"/> <Script file="AceConsole-3.0.lua"/>
</Ui> </Ui>

@ -40,15 +40,15 @@
-- end -- end
-- @class file -- @class file
-- @name AceDB-3.0.lua -- @name AceDB-3.0.lua
-- @release $Id: AceDB-3.0.lua 1142 2016-07-11 08:36:19Z nevcairiel $ -- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26 local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27
local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
if not AceDB then return end -- No upgrade needed if not AceDB then return end -- No upgrade needed
-- Lua APIs -- Lua APIs
local type, pairs, next, error = type, pairs, next, error 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 -- WoW APIs
local _G = _G local _G = _G
@ -397,7 +397,7 @@ AceDB.frame:SetScript("OnEvent", logoutHandler)
-- @param defaults A table of defaults for this database -- @param defaults A table of defaults for this database
function DBObjectLib:RegisterDefaults(defaults) function DBObjectLib:RegisterDefaults(defaults)
if defaults and type(defaults) ~= "table" then 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 end
validateDefaults(defaults, self.keys) validateDefaults(defaults, self.keys)
@ -429,7 +429,7 @@ end
-- @param name The name of the profile to set as the current profile -- @param name The name of the profile to set as the current profile
function DBObjectLib:SetProfile(name) function DBObjectLib:SetProfile(name)
if type(name) ~= "string" then 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 end
-- changing to the same profile, dont do anything -- changing to the same profile, dont do anything
@ -471,7 +471,7 @@ end
-- @param tbl A table to store the profile names in (optional) -- @param tbl A table to store the profile names in (optional)
function DBObjectLib:GetProfiles(tbl) function DBObjectLib:GetProfiles(tbl)
if tbl and type(tbl) ~= "table" then 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 end
-- Clear the container table -- Clear the container table
@ -509,15 +509,15 @@ end
-- @param silent If true, do not raise an error when the profile does not exist -- @param silent If true, do not raise an error when the profile does not exist
function DBObjectLib:DeleteProfile(name, silent) function DBObjectLib:DeleteProfile(name, silent)
if type(name) ~= "string" then 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 end
if self.keys.profile == name then 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 end
if not rawget(self.profiles, name) and not silent then 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 end
self.profiles[name] = nil self.profiles[name] = nil
@ -548,15 +548,15 @@ end
-- @param silent If true, do not raise an error when the profile does not exist -- @param silent If true, do not raise an error when the profile does not exist
function DBObjectLib:CopyProfile(name, silent) function DBObjectLib:CopyProfile(name, silent)
if type(name) ~= "string" then 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 end
if name == self.keys.profile then 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 end
if not rawget(self.profiles, name) and not silent then 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 end
-- Reset the profile before copying -- Reset the profile before copying
@ -611,7 +611,7 @@ end
-- @param defaultProfile The profile name to use as the default -- @param defaultProfile The profile name to use as the default
function DBObjectLib:ResetDB(defaultProfile) function DBObjectLib:ResetDB(defaultProfile)
if defaultProfile and type(defaultProfile) ~= "string" then 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 end
local sv = self.sv local sv = self.sv
@ -619,8 +619,6 @@ function DBObjectLib:ResetDB(defaultProfile)
sv[k] = nil sv[k] = nil
end end
local parent = self.parent
initdb(sv, self.defaults, defaultProfile, self) initdb(sv, self.defaults, defaultProfile, self)
-- fix the child namespaces -- fix the child namespaces
@ -647,13 +645,13 @@ end
-- @param defaults A table of values to use as defaults -- @param defaults A table of values to use as defaults
function DBObjectLib:RegisterNamespace(name, defaults) function DBObjectLib:RegisterNamespace(name, defaults)
if type(name) ~= "string" then 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 end
if defaults and type(defaults) ~= "table" then 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 end
if self.children and self.children[name] then 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 end
local sv = self.sv local sv = self.sv
@ -677,10 +675,10 @@ end
-- @return the namespace object if found -- @return the namespace object if found
function DBObjectLib:GetNamespace(name, silent) function DBObjectLib:GetNamespace(name, silent)
if type(name) ~= "string" then 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 end
if not silent and not (self.children and self.children[name]) then 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 end
if not self.children then self.children = {} end if not self.children then self.children = {} end
return self.children[name] return self.children[name]
@ -719,15 +717,15 @@ function AceDB:New(tbl, defaults, defaultProfile)
end end
if type(tbl) ~= "table" then 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 end
if defaults and type(defaults) ~= "table" then 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 end
if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then 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 end
return initdb(tbl, defaults, defaultProfile) return initdb(tbl, defaults, defaultProfile)

@ -1,9 +1,9 @@
--- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
-- @class file -- @class file
-- @name AceDBOptions-3.0 -- @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 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 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. -- @return Hashtable of all profiles with the internal name as keys and the display name as value.
local function getProfileList(db, common, nocurrent) local function getProfileList(db, common, nocurrent)
local profiles = {} local profiles = {}
-- copy existing profiles into the table -- copy existing profiles into the table
local currentProfile = db:GetCurrentProfile() local currentProfile = db:GetCurrentProfile()
for i,v in pairs(db:GetProfiles(tmpprofiles)) do for i,v in pairs(db:GetProfiles(tmpprofiles)) do
if not (nocurrent and v == currentProfile) then if not (nocurrent and v == currentProfile) then
profiles[v] = v profiles[v] = v
end end
end end
-- add our default profiles to choose from ( or rename existing profiles) -- add our default profiles to choose from ( or rename existing profiles)
for k,v in pairs(defaultProfiles) do for k,v in pairs(defaultProfiles) do
if (common or profiles[k]) and not (nocurrent and k == currentProfile) then if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
profiles[k] = v profiles[k] = v
end end
end end
return profiles return profiles
end end
@ -280,11 +280,11 @@ function OptionsHandlerPrototype:GetCurrentProfile()
return self.db:GetCurrentProfile() return self.db:GetCurrentProfile()
end end
--[[ --[[
List all active profiles List all active profiles
you can control the output with the .arg variable you can control the output with the .arg variable
currently four modes are supported currently four modes are supported
(empty) - return all available profiles (empty) - return all available profiles
"nocurrent" - returns all available profiles except the currently active profile "nocurrent" - returns all available profiles except the currently active profile
"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default") "common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
@ -302,7 +302,7 @@ function OptionsHandlerPrototype:ListProfiles(info)
else else
profiles = getProfileList(self.db) profiles = getProfileList(self.db)
end end
return profiles return profiles
end end
@ -336,19 +336,19 @@ local function getOptionsHandler(db, noDefaultProfiles)
if not defaultProfiles then if not defaultProfiles then
generateDefaultProfiles(db) generateDefaultProfiles(db)
end end
local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles } local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
for k,v in pairs(OptionsHandlerPrototype) do for k,v in pairs(OptionsHandlerPrototype) do
handler[k] = v handler[k] = v
end end
AceDBOptions.handlers[db] = handler AceDBOptions.handlers[db] = handler
return handler return handler
end end
--[[ --[[
the real options table the real options table
]] ]]
local optionsTable = { local optionsTable = {
desc = { 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. --- 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. -- @param db The database object to create the options table for.
-- @return The options table to be used in AceConfig-3.0 -- @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: -- -- Assuming `options` is your top-level options table and `self.db` is your database:
-- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) -- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
function AceDBOptions:GetOptionsTable(db, noDefaultProfiles) function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
@ -445,7 +445,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
name = L["profiles"], name = L["profiles"],
desc = L["profiles_sub"], desc = L["profiles_sub"],
} }
tbl.handler = getOptionsHandler(db, noDefaultProfiles) tbl.handler = getOptionsHandler(db, noDefaultProfiles)
tbl.args = optionsTable 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/ <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"> ..\FrameXML\UI.xsd">
<Script file="AceEvent-3.0.lua"/> <Script file="AceEvent-3.0.lua"/>
</Ui> </Ui>

@ -24,14 +24,14 @@
-- f:AddChild(btn) -- f:AddChild(btn)
-- @class file -- @class file
-- @name AceGUI-3.0 -- @name AceGUI-3.0
-- @release $Id: AceGUI-3.0.lua 1228 2019-09-06 08:51:17Z nevcairiel $ -- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 40 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
if not AceGUI then return end -- No upgrade needed if not AceGUI then return end -- No upgrade needed
-- Lua APIs -- Lua APIs
local tinsert = table.insert local tinsert, wipe = table.insert, table.wipe
local select, pairs, next, type = select, pairs, next, type local select, pairs, next, type = select, pairs, next, type
local error, assert = error, assert local error, assert = error, assert
local setmetatable, rawget = setmetatable, rawget local setmetatable, rawget = setmetatable, rawget
@ -212,6 +212,22 @@ function AceGUI:Release(widget)
delWidget(widget, widget.type) delWidget(widget, widget.type)
end 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 -- -- Focus --
----------- -----------
@ -338,6 +354,10 @@ do
AceGUI:Release(self) AceGUI:Release(self)
end end
WidgetBase.IsReleasing = function(self)
return AceGUI:IsReleasing(self)
end
WidgetBase.SetPoint = function(self, ...) WidgetBase.SetPoint = function(self, ...)
return self.frame:SetPoint(...) return self.frame:SetPoint(...)
end end

@ -2,7 +2,7 @@
BlizOptionsGroup Container BlizOptionsGroup Container
Simple container widget for the integration of AceGUI into the Blizzard Interface Options 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -99,7 +99,7 @@ local methods = {
Constructor Constructor
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local function Constructor() local function Constructor()
local frame = CreateFrame("Frame") local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer)
frame:Hide() frame:Hide()
-- support functions for the Blizzard Interface Options -- support functions for the Blizzard Interface Options

@ -2,7 +2,7 @@
DropdownGroup Container DropdownGroup Container
Container controlled by a dropdown on the top. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -125,7 +125,7 @@ local function Constructor()
dropdown.frame:Show() dropdown.frame:Show()
dropdown:SetLabel("") 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("TOPLEFT", 0, -26)
border:SetPoint("BOTTOMRIGHT", 0, 3) border:SetPoint("BOTTOMRIGHT", 0, 3)
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

@ -1,7 +1,7 @@
--[[----------------------------------------------------------------------------- --[[-----------------------------------------------------------------------------
Frame Container Frame Container
-------------------------------------------------------------------------------]] -------------------------------------------------------------------------------]]
local Type, Version = "Frame", 26 local Type, Version = "Frame", 28
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -83,6 +83,7 @@ local methods = {
["OnAcquire"] = function(self) ["OnAcquire"] = function(self)
self.frame:SetParent(UIParent) self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG") self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
self.frame:SetFrameLevel(100) -- Lots of room to draw under it
self:SetTitle() self:SetTitle()
self:SetStatusText() self:SetStatusText()
self:ApplyStatus() self:ApplyStatus()
@ -179,13 +180,14 @@ local PaneBackdrop = {
} }
local function Constructor() local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent) local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
frame:Hide() frame:Hide()
frame:EnableMouse(true) frame:EnableMouse(true)
frame:SetMovable(true) frame:SetMovable(true)
frame:SetResizable(true) frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetFrameLevel(100) -- Lots of room to draw under it
frame:SetBackdrop(FrameBackdrop) frame:SetBackdrop(FrameBackdrop)
frame:SetBackdropColor(0, 0, 0, 1) frame:SetBackdropColor(0, 0, 0, 1)
frame:SetMinResize(400, 200) frame:SetMinResize(400, 200)
@ -201,7 +203,7 @@ local function Constructor()
closebutton:SetWidth(100) closebutton:SetWidth(100)
closebutton:SetText(CLOSE) 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("BOTTOMLEFT", 15, 15)
statusbg:SetPoint("BOTTOMRIGHT", -132, 15) statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
statusbg:SetHeight(24) statusbg:SetHeight(24)

@ -2,7 +2,7 @@
InlineGroup Container InlineGroup Container
Simple container widget that creates a visible "box" with an optional title. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -75,7 +75,7 @@ local function Constructor()
titletext:SetJustifyH("LEFT") titletext:SetJustifyH("LEFT")
titletext:SetHeight(18) 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("TOPLEFT", 0, -17)
border:SetPoint("BOTTOMRIGHT", -1, 3) border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

@ -2,12 +2,12 @@
TabGroup Container TabGroup Container
Container that uses tabs on top to switch between groups. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-- Lua APIs -- 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 -- WoW APIs
local PlaySound = PlaySound local PlaySound = PlaySound
@ -316,7 +316,7 @@ local function Constructor()
titletext:SetHeight(18) titletext:SetHeight(18)
titletext:SetText("") 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("TOPLEFT", 1, -27)
border:SetPoint("BOTTOMRIGHT", -1, 3) border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop) border:SetBackdrop(PaneBackdrop)

@ -2,12 +2,10 @@
TreeGroup Container TreeGroup Container
Container that uses a tree control to switch between groups. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local WoW80 = select(4, GetBuildInfo()) >= 80000
-- Lua APIs -- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
local math_min, math_max, floor = math.min, math.max, floor 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)) local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
if maxlines <= 0 then return end if maxlines <= 0 then return end
-- workaround for lag spikes on WoW 8.0 if self.frame:GetParent() == UIParent and not fromOnUpdate then
if WoW80 and self.frame:GetParent() == UIParent and not fromOnUpdate then
self.frame:SetScript("OnUpdate", FirstFrameUpdate) self.frame:SetScript("OnUpdate", FirstFrameUpdate)
return return
end end
@ -632,7 +629,7 @@ local PaneBackdrop = {
local DraggerBackdrop = { local DraggerBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = nil, edgeFile = nil,
tile = true, tileSize = 16, edgeSize = 0, tile = true, tileSize = 16, edgeSize = 1,
insets = { left = 3, right = 3, top = 7, bottom = 7 } insets = { left = 3, right = 3, top = 7, bottom = 7 }
} }
@ -640,7 +637,7 @@ local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type) local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent) 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("TOPLEFT")
treeframe:SetPoint("BOTTOMLEFT") treeframe:SetPoint("BOTTOMLEFT")
treeframe:SetWidth(DEFAULT_TREE_WIDTH) treeframe:SetWidth(DEFAULT_TREE_WIDTH)
@ -655,7 +652,7 @@ local function Constructor()
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) 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:SetWidth(8)
dragger:SetPoint("TOP", treeframe, "TOPRIGHT") dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT") dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
@ -680,7 +677,7 @@ local function Constructor()
scrollbg:SetAllPoints(scrollbar) scrollbg:SetAllPoints(scrollbar)
scrollbg:SetColorTexture(0,0,0,0.4) 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("TOPLEFT", treeframe, "TOPRIGHT")
border:SetPoint("BOTTOMRIGHT") border:SetPoint("BOTTOMRIGHT")
border:SetBackdrop(PaneBackdrop) 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") local AceGUI = LibStub("AceGUI-3.0")
-- Lua APIs -- Lua APIs
@ -39,7 +39,7 @@ end
do do
local widgetType = "Dropdown-Pullout" local widgetType = "Dropdown-Pullout"
local widgetVersion = 3 local widgetVersion = 5
--[[ Static data ]]-- --[[ Static data ]]--
@ -193,12 +193,7 @@ do
local height = 8 local height = 8
for i, item in pairs(items) do for i, item in pairs(items) do
if i == 1 then item:SetPoint("TOP", itemFrame, "TOP", 0, -2 + (i - 1) * -16)
item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
else
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
end
item:Show() item:Show()
height = height + 16 height = height + 16
@ -258,7 +253,7 @@ do
local function Constructor() local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType) 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 = {} local self = {}
self.count = count self.count = count
self.type = widgetType self.type = widgetType
@ -309,7 +304,7 @@ do
scrollFrame.obj = self scrollFrame.obj = self
itemFrame.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:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0) slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(sliderBackdrop) slider:SetBackdrop(sliderBackdrop)
@ -356,7 +351,7 @@ end
do do
local widgetType = "Dropdown" local widgetType = "Dropdown"
local widgetVersion = 34 local widgetVersion = 35
--[[ Static data ]]-- --[[ Static data ]]--
@ -465,6 +460,7 @@ do
self:SetWidth(200) self:SetWidth(200)
self:SetLabel() self:SetLabel()
self:SetPulloutWidth(nil) self:SetPulloutWidth(nil)
self.list = {}
end end
-- exported, AceGUI callback -- exported, AceGUI callback
@ -535,9 +531,7 @@ do
-- exported -- exported
local function SetValue(self, value) local function SetValue(self, value)
if self.list then self:SetText(self.list[value] or "")
self:SetText(self.list[value] or "")
end
self.value = value self.value = value
end end
@ -601,7 +595,7 @@ do
end end
end end
local function SetList(self, list, order, itemType) local function SetList(self, list, order, itemType)
self.list = list self.list = list or {}
self.pullout:Clear() self.pullout:Clear()
self.hasClose = nil self.hasClose = nil
if not list then return end if not list then return end
@ -629,10 +623,8 @@ do
-- exported -- exported
local function AddItem(self, value, text, itemType) local function AddItem(self, value, text, itemType)
if self.list then self.list[value] = text
self.list[value] = text AddListItem(self, value, text, itemType)
AddListItem(self, value, text, itemType)
end
end end
-- exported -- exported

@ -2,7 +2,7 @@
Keybinding Widget Keybinding Widget
Set Keybindings in the Config UI. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -214,7 +214,7 @@ local function Constructor()
label:SetJustifyH("CENTER") label:SetJustifyH("CENTER")
label:SetHeight(18) label:SetHeight(18)
local msgframe = CreateFrame("Frame", nil, UIParent) local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
msgframe:SetHeight(30) msgframe:SetHeight(30)
msgframe:SetBackdrop(ControlBackdrop) msgframe:SetBackdrop(ControlBackdrop)
msgframe:SetBackdropColor(0,0,0) msgframe:SetBackdropColor(0,0,0)

@ -2,7 +2,7 @@
Label Widget Label Widget
Displays text and optionally an icon. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end 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) ["SetFont"] = function(self, font, height, flags)
self.label:SetFont(font, height, flags) self.label:SetFont(font, height, flags)
UpdateImageAnchor(self)
end, end,
["SetFontObject"] = function(self, font) ["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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end 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:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
text:SetJustifyV("MIDDLE") text:SetJustifyV("MIDDLE")
local scrollBG = CreateFrame("Frame", nil, frame) local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
scrollBG:SetBackdrop(backdrop) scrollBG:SetBackdrop(backdrop)
scrollBG:SetBackdropColor(0, 0, 0) scrollBG:SetBackdropColor(0, 0, 0)
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4) scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)

@ -2,7 +2,7 @@
Slider Widget Slider Widget
Graphical Slider, like, for Range values. 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) local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
@ -225,7 +225,7 @@ local function Constructor()
label:SetJustifyH("CENTER") label:SetJustifyH("CENTER")
label:SetHeight(15) label:SetHeight(15)
local slider = CreateFrame("Slider", nil, frame) local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
slider:SetOrientation("HORIZONTAL") slider:SetOrientation("HORIZONTAL")
slider:SetHeight(15) slider:SetHeight(15)
slider:SetHitRectInsets(0, 0, -10, 0) slider:SetHitRectInsets(0, 0, -10, 0)
@ -247,7 +247,7 @@ local function Constructor()
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3) 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:SetAutoFocus(false)
editbox:SetFontObject(GameFontHighlightSmall) editbox:SetFontObject(GameFontHighlightSmall)
editbox:SetPoint("TOP", slider, "BOTTOM") editbox:SetPoint("TOP", slider, "BOTTOM")

@ -9,8 +9,8 @@
-- make into AceHook. -- make into AceHook.
-- @class file -- @class file
-- @name AceHook-3.0 -- @name AceHook-3.0
-- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ -- @release $Id: AceHook-3.0.lua 1243 2020-10-18 00:00:19Z nevcairiel $
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8 local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)
if not AceHook then return end -- No upgrade needed if not AceHook then return end -- No upgrade needed
@ -478,10 +478,10 @@ function AceHook:UnhookAll()
for key, value in pairs(registry[self]) do for key, value in pairs(registry[self]) do
if type(key) == "table" then if type(key) == "table" then
for method in pairs(value) do for method in pairs(value) do
self:Unhook(key, method) AceHook.Unhook(self, key, method)
end end
else else
self:Unhook(key) AceHook.Unhook(self, key)
end end
end 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/ <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"> ..\FrameXML\UI.xsd">
<Script file="AceHook-3.0.lua"/> <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/ <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"> ..\FrameXML\UI.xsd">
<Script file="AceLocale-3.0.lua"/> <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 MAJOR, MINOR = "CallbackHandler-1.0", 7
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) 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/ <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"> ..\FrameXML\UI.xsd">
<Script file="CallbackHandler-1.0.lua"/> <Script file="CallbackHandler-1.0.lua"/>
</Ui> </Ui>

@ -6,7 +6,7 @@
-- --
local DBICON10 = "LibDBIcon-1.0" 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 if not LibStub then error(DBICON10 .. " requires LibStub.") end
local ldb = LibStub("LibDataBroker-1.1", true) local ldb = LibStub("LibDataBroker-1.1", true)
if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end 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.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib)
lib.notCreated = lib.notCreated or {} lib.notCreated = lib.notCreated or {}
lib.radius = lib.radius or 5 lib.radius = lib.radius or 5
local next, Minimap, CreateFrame = next, Minimap, CreateFrame
lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate")
local next, Minimap = next, Minimap
local isDraggingButton = false local isDraggingButton = false
function lib:IconCallback(event, name, key, value) function lib:IconCallback(event, name, key, value)
@ -218,8 +218,14 @@ local function createButton(name, object, db)
button.dataObject = object button.dataObject = object
button.db = db button.db = db
button:SetFrameStrata("MEDIUM") button:SetFrameStrata("MEDIUM")
button:SetSize(31, 31) if button.SetFixedFrameStrata then -- Classic support
button:SetFixedFrameStrata(true)
end
button:SetFrameLevel(8) button:SetFrameLevel(8)
if button.SetFixedFrameLevel then -- Classic support
button:SetFixedFrameLevel(true)
end
button:SetSize(31, 31)
button:RegisterForClicks("anyUp") button:RegisterForClicks("anyUp")
button:RegisterForDrag("LeftButton") button:RegisterForDrag("LeftButton")
button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" 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 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_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR] 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 if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} } LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub _G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR 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) function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") minor = assert(tonumber(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 return self.libs[major], oldminor
end 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) function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2) 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] return self.libs[major], self.minors[major]
end 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 }) setmetatable(LibStub, { __call = LibStub.GetLibrary })
end 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…
Cancel
Save