Version 1.1.3
- bumped version for all versions of WoW (Classic Era, Season of Mastery, BCC, Retail) - error on missing options at first start - updated Ace3.0 libraries for latest Shadowlands patch
This commit is contained in:
		| @@ -28,9 +28,9 @@ | ||||
| -- end | ||||
| -- @class file | ||||
| -- @name AceAddon-3.0.lua | ||||
| -- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||
| -- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $ | ||||
|  | ||||
| local MAJOR, MINOR = "AceAddon-3.0", 12 | ||||
| local MAJOR, MINOR = "AceAddon-3.0", 13 | ||||
| local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | ||||
|  | ||||
| if not AceAddon then return end -- No Upgrade needed. | ||||
| @@ -601,10 +601,20 @@ function AceAddon:IterateAddonStatus() return pairs(self.statuses) end | ||||
| function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end | ||||
| function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end | ||||
|  | ||||
| -- Blizzard AddOns which can load very early in the loading process and mess with Ace3 addon loading | ||||
| local BlizzardEarlyLoadAddons = { | ||||
| 	Blizzard_DebugTools = true, | ||||
| 	Blizzard_TimeManager = true, | ||||
| 	Blizzard_BattlefieldMap = true, | ||||
| 	Blizzard_MapCanvas = true, | ||||
| 	Blizzard_SharedMapDataProviders = true, | ||||
| 	Blizzard_CombatLog = true, | ||||
| } | ||||
|  | ||||
| -- Event Handling | ||||
| local function onEvent(this, event, arg1) | ||||
| 	-- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up | ||||
| 	if (event == "ADDON_LOADED"  and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then | ||||
| 	-- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process | ||||
| 	if (event == "ADDON_LOADED"  and (arg1 == nil or not BlizzardEarlyLoadAddons[arg1])) or event == "PLAYER_LOGIN" then | ||||
| 		-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration | ||||
| 		while(#AceAddon.initializequeue > 0) do | ||||
| 			local addon = tremove(AceAddon.initializequeue, 1) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ | ||||
| ..\FrameXML\UI.xsd"> | ||||
| 	<Script file="AceAddon-3.0.lua"/> | ||||
| </Ui> | ||||
| </Ui> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| -- as well as associate it with a slash command. | ||||
| -- @class file | ||||
| -- @name AceConfig-3.0 | ||||
| -- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ | ||||
| -- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||
|  | ||||
| --[[ | ||||
| AceConfig-3.0 | ||||
| @@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs | ||||
| function AceConfig:RegisterOptionsTable(appName, options, slashcmd) | ||||
| 	local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options) | ||||
| 	if not ok then error(msg, 2) end | ||||
| 	 | ||||
|  | ||||
| 	if slashcmd then | ||||
| 		if type(slashcmd) == "table" then | ||||
| 			for _,cmd in pairs(slashcmd) do | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames. | ||||
| -- @class file | ||||
| -- @name AceConfigCmd-3.0 | ||||
| -- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ | ||||
| -- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||
|  | ||||
| --[[ | ||||
| AceConfigCmd-3.0 | ||||
| @@ -63,7 +63,7 @@ local funcmsg = "expected function or member name" | ||||
|  | ||||
| -- pickfirstset() - picks the first non-nil value and returns it | ||||
|  | ||||
| local function pickfirstset(...)	 | ||||
| local function pickfirstset(...) | ||||
| 	for i=1,select("#",...) do | ||||
| 		if select(i,...)~=nil then | ||||
| 			return select(i,...) | ||||
| @@ -120,7 +120,7 @@ local function callfunction(info, tab, methodtype, ...) | ||||
| 	info.arg = tab.arg | ||||
| 	info.option = tab | ||||
| 	info.type = tab.type | ||||
| 	 | ||||
|  | ||||
| 	if type(method)=="function" then | ||||
| 		return method(info, ...) | ||||
| 	else | ||||
| @@ -131,7 +131,7 @@ end | ||||
| -- do_final() - do the final step (set/execute) along with validation and confirmation | ||||
|  | ||||
| local function do_final(info, inputpos, tab, methodtype, ...) | ||||
| 	if info.validate then  | ||||
| 	if info.validate then | ||||
| 		local res = callmethod(info,inputpos,tab,"validate",...) | ||||
| 		if type(res)=="string" then | ||||
| 			usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res) | ||||
| @@ -139,7 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...) | ||||
| 		end | ||||
| 	end | ||||
| 	-- console ignores .confirm | ||||
| 	 | ||||
|  | ||||
| 	callmethod(info,inputpos,tab,methodtype, ...) | ||||
| end | ||||
|  | ||||
| @@ -152,8 +152,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg) | ||||
| 	if val~=nil then | ||||
| 		if val==false then | ||||
| 			val=nil | ||||
| 		elseif not types[type(val)] then  | ||||
| 			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)  | ||||
| 		elseif not types[type(val)] then | ||||
| 			err(info, inputpos, "'" .. paramname.. "' - "..errormsg) | ||||
| 		end | ||||
| 		info[paramname] = val | ||||
| 		info[paramname.."_at"] = depth | ||||
| @@ -166,13 +166,13 @@ end | ||||
| local dummytable={} | ||||
|  | ||||
| local function iterateargs(tab) | ||||
| 	if not tab.plugins then  | ||||
| 		return pairs(tab.args)  | ||||
| 	if not tab.plugins then | ||||
| 		return pairs(tab.args) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local argtabkey,argtab=next(tab.plugins) | ||||
| 	local v | ||||
| 	 | ||||
|  | ||||
| 	return function(_, k) | ||||
| 		while argtab do | ||||
| 			k,v = next(argtab, k) | ||||
| @@ -206,18 +206,18 @@ local function showhelp(info, inputpos, tab, depth, noHead) | ||||
| 	if not noHead then | ||||
| 		print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":") | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local sortTbl = {}	-- [1..n]=name | ||||
| 	local refTbl = {}   -- [name]=tableref | ||||
| 	 | ||||
|  | ||||
| 	for k,v in iterateargs(tab) do | ||||
| 		if not refTbl[k] then	-- a plugin overriding something in .args | ||||
| 			tinsert(sortTbl, k) | ||||
| 			refTbl[k] = v | ||||
| 		end | ||||
| 	end | ||||
| 	 | ||||
| 	tsort(sortTbl, function(one, two)  | ||||
|  | ||||
| 	tsort(sortTbl, function(one, two) | ||||
| 		local o1 = refTbl[one].order or 100 | ||||
| 		local o2 = refTbl[two].order or 100 | ||||
| 		if type(o1) == "function" or type(o1) == "string" then | ||||
| @@ -240,7 +240,7 @@ local function showhelp(info, inputpos, tab, depth, noHead) | ||||
| 		if o1==o2 then return tostring(one)<tostring(two) end   -- compare names | ||||
| 		return o1<o2 | ||||
| 	end) | ||||
| 	 | ||||
|  | ||||
| 	for i = 1, #sortTbl do | ||||
| 		local k = sortTbl[i] | ||||
| 		local v = refTbl[k] | ||||
| @@ -327,7 +327,7 @@ local function keybindingValidateFunc(text) | ||||
| 	return s | ||||
| end | ||||
|  | ||||
| -- handle() - selfrecursing function that processes input->optiontable  | ||||
| -- handle() - selfrecursing function that processes input->optiontable | ||||
| -- - depth - starts at 0 | ||||
| -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups) | ||||
|  | ||||
| @@ -346,16 +346,16 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 	local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg) | ||||
| 	local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg) | ||||
| 	--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg) | ||||
| 	 | ||||
|  | ||||
| 	------------------------------------------------------------------- | ||||
| 	-- Act according to .type of this table | ||||
| 		 | ||||
|  | ||||
| 	if tab.type=="group" then | ||||
| 		------------ group -------------------------------------------- | ||||
| 		 | ||||
|  | ||||
| 		if type(tab.args)~="table" then err(info, inputpos) end | ||||
| 		if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end | ||||
| 		 | ||||
|  | ||||
| 		-- grab next arg from input | ||||
| 		local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos) | ||||
| 		if not arg then | ||||
| @@ -363,11 +363,11 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			return | ||||
| 		end | ||||
| 		nextpos=nextpos+1 | ||||
| 		 | ||||
|  | ||||
| 		-- loop .args and try to find a key with a matching name | ||||
| 		for k,v in iterateargs(tab) do | ||||
| 			if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end | ||||
| 			 | ||||
|  | ||||
| 			-- is this child an inline group? if so, traverse into it | ||||
| 			if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then | ||||
| 				info[depth+1] = k | ||||
| @@ -383,8 +383,8 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 				return handle(info,nextpos,v,depth+1) | ||||
| 			end | ||||
| 		end | ||||
| 			 | ||||
| 		-- no match  | ||||
|  | ||||
| 		-- no match | ||||
| 		if retfalse then | ||||
| 			-- restore old infotable members and return false to indicate failure | ||||
| 			info.handler,info.handler_at = oldhandler,oldhandler_at | ||||
| @@ -395,23 +395,23 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at | ||||
| 			return false | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		-- couldn't find the command, display error | ||||
| 		usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"]) | ||||
| 		return | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local str = strsub(info.input,inputpos); | ||||
| 	 | ||||
|  | ||||
| 	if tab.type=="execute" then | ||||
| 		------------ execute -------------------------------------------- | ||||
| 		do_final(info, inputpos, tab, "func") | ||||
| 		 | ||||
|  | ||||
| 	 | ||||
|  | ||||
|  | ||||
| 	elseif tab.type=="input" then | ||||
| 		------------ input -------------------------------------------- | ||||
| 		 | ||||
|  | ||||
| 		local res = true | ||||
| 		if tab.pattern then | ||||
| 			if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end | ||||
| @@ -420,11 +420,11 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 				return | ||||
| 			end | ||||
| 		end | ||||
| 		 | ||||
| 		do_final(info, inputpos, tab, "set", str) | ||||
| 		 | ||||
|  | ||||
| 	 | ||||
| 		do_final(info, inputpos, tab, "set", str) | ||||
|  | ||||
|  | ||||
|  | ||||
| 	elseif tab.type=="toggle" then | ||||
| 		------------ toggle -------------------------------------------- | ||||
| 		local b | ||||
| @@ -444,7 +444,7 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			else | ||||
| 				b = not b | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 		elseif str==L["on"] then | ||||
| 			b = true | ||||
| 		elseif str==L["off"] then | ||||
| @@ -459,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			end | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		do_final(info, inputpos, tab, "set", b) | ||||
| 		 | ||||
|  | ||||
|  | ||||
| 	elseif tab.type=="range" then | ||||
| 		------------ range -------------------------------------------- | ||||
| @@ -481,21 +481,21 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) ) | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		do_final(info, inputpos, tab, "set", val) | ||||
|  | ||||
| 	 | ||||
|  | ||||
| 	elseif tab.type=="select" then | ||||
| 		------------ select ------------------------------------ | ||||
| 		local str = strtrim(strlower(str)) | ||||
| 		 | ||||
|  | ||||
| 		local values = tab.values | ||||
| 		if type(values) == "function" or type(values) == "string" then | ||||
| 			info.values = values | ||||
| 			values = callmethod(info, inputpos, tab, "values") | ||||
| 			info.values = nil | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		if str == "" then | ||||
| 			local b = callmethod(info, inputpos, tab, "get") | ||||
| 			local fmt = "|cffffff78- [%s]|r %s" | ||||
| @@ -512,7 +512,7 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 		end | ||||
|  | ||||
| 		local ok | ||||
| 		for k,v in pairs(values) do  | ||||
| 		for k,v in pairs(values) do | ||||
| 			if strlower(k)==str then | ||||
| 				str = k	-- overwrite with key (in case of case mismatches) | ||||
| 				ok = true | ||||
| @@ -523,20 +523,20 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"]) | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		do_final(info, inputpos, tab, "set", str) | ||||
| 		 | ||||
|  | ||||
| 	elseif tab.type=="multiselect" then | ||||
| 		------------ multiselect ------------------------------------------- | ||||
| 		local str = strtrim(strlower(str)) | ||||
| 		 | ||||
|  | ||||
| 		local values = tab.values | ||||
| 		if type(values) == "function" or type(values) == "string" then | ||||
| 			info.values = values | ||||
| 			values = callmethod(info, inputpos, tab, "values") | ||||
| 			info.values = nil | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		if str == "" then | ||||
| 			local fmt = "|cffffff78- [%s]|r %s" | ||||
| 			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r" | ||||
| @@ -550,7 +550,7 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			end | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		--build a table of the selections, checking that they exist | ||||
| 		--parse for =on =off =default in the process | ||||
| 		--table will be key = true for options that should toggle, key = [on|off|default] for options to be set | ||||
| @@ -559,25 +559,25 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			--parse option=on etc | ||||
| 			local opt, val = v:match('(.+)=(.+)') | ||||
| 			--get option if toggling | ||||
| 			if not opt then  | ||||
| 				opt = v  | ||||
| 			if not opt then | ||||
| 				opt = v | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			--check that the opt is valid | ||||
| 			local ok | ||||
| 			for k,v in pairs(values) do  | ||||
| 			for k,v in pairs(values) do | ||||
| 				if strlower(k)==opt then | ||||
| 					opt = k	-- overwrite with key (in case of case mismatches) | ||||
| 					ok = true | ||||
| 					break | ||||
| 				end | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			if not ok then | ||||
| 				usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"]) | ||||
| 				return | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			--check that if val was supplied it is valid | ||||
| 			if val then | ||||
| 				if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then | ||||
| @@ -596,14 +596,14 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 				sels[opt] = true | ||||
| 			end | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		for opt, val in pairs(sels) do | ||||
| 			local newval | ||||
| 			 | ||||
|  | ||||
| 			if (val == true) then | ||||
| 				--toggle the option | ||||
| 				local b = callmethod(info, inputpos, tab, "get", opt) | ||||
| 				 | ||||
|  | ||||
| 				if tab.tristate then | ||||
| 					--cycle in true, nil, false order | ||||
| 					if b then | ||||
| @@ -627,11 +627,11 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 					newval = nil | ||||
| 				end | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			do_final(info, inputpos, tab, "set", opt, newval) | ||||
| 		end | ||||
| 					 | ||||
| 		 | ||||
|  | ||||
|  | ||||
| 	elseif tab.type=="color" then | ||||
| 		------------ color -------------------------------------------- | ||||
| 		local str = strtrim(strlower(str)) | ||||
| @@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 			--TODO: Show current value | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		local r, g, b, a | ||||
| 		 | ||||
|  | ||||
| 		local hasAlpha = tab.hasAlpha | ||||
| 		if type(hasAlpha) == "function" or type(hasAlpha) == "string" then | ||||
| 			info.hasAlpha = hasAlpha | ||||
| 			hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha') | ||||
| 			info.hasAlpha = nil | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		if hasAlpha then | ||||
| 			if str:len() == 8 and str:find("^%x*$")  then | ||||
| 				--parse a hex string | ||||
| @@ -662,7 +662,7 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str)) | ||||
| 				return | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then | ||||
| 				--values are valid | ||||
| 			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then | ||||
| @@ -701,7 +701,7 @@ local function handle(info, inputpos, tab, depth, retfalse) | ||||
| 				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str)) | ||||
| 			end | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		do_final(info, inputpos, tab, "set", r,g,b,a) | ||||
|  | ||||
| 	elseif tab.type=="keybinding" then | ||||
| @@ -737,7 +737,7 @@ end | ||||
| -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0") | ||||
| -- -- Use AceConsole-3.0 to register a Chat Command | ||||
| -- MyAddon:RegisterChatCommand("mychat", "ChatCommand") | ||||
| --  | ||||
| -- | ||||
| -- -- Show the GUI if no input is supplied, otherwise handle the chat input. | ||||
| -- function MyAddon:ChatCommand(input) | ||||
| --   -- Assuming "MyOptions" is the appName of a valid options table | ||||
| @@ -754,7 +754,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input) | ||||
| 		error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2) | ||||
| 	end | ||||
| 	local options = assert( optgetter("cmd", MAJOR) ) | ||||
| 	 | ||||
|  | ||||
| 	local info = {   -- Don't try to recycle this, it gets handed off to callbacks and whatnot | ||||
| 		[0] = slashcmd, | ||||
| 		appName = appName, | ||||
| @@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input) | ||||
| 		uiType = "cmd", | ||||
| 		uiName = MAJOR, | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	handle(info, 1, options, 0)  -- (info, inputpos, table, depth) | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. | ||||
| -- @class file | ||||
| -- @name AceConfigDialog-3.0 | ||||
| -- @release $Id: AceConfigDialog-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $ | ||||
| -- @release $Id: AceConfigDialog-3.0.lua 1248 2021-02-05 14:27:49Z funkehdude $ | ||||
|  | ||||
| local LibStub = LibStub | ||||
| local gui = LibStub("AceGUI-3.0") | ||||
| local reg = LibStub("AceConfigRegistry-3.0") | ||||
|  | ||||
| local MAJOR, MINOR = "AceConfigDialog-3.0", 66 | ||||
| local MAJOR, MINOR = "AceConfigDialog-3.0", 81 | ||||
| local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | ||||
|  | ||||
| if not AceConfigDialog then return end | ||||
| @@ -15,22 +15,23 @@ if not AceConfigDialog then return end | ||||
| AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {} | ||||
| AceConfigDialog.Status = AceConfigDialog.Status or {} | ||||
| AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame") | ||||
| AceConfigDialog.tooltip = AceConfigDialog.tooltip or CreateFrame("GameTooltip", "AceConfigDialogTooltip", UIParent, "GameTooltipTemplate") | ||||
|  | ||||
| AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {} | ||||
| AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {} | ||||
| AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} | ||||
|  | ||||
| -- Lua APIs | ||||
| local tconcat, tinsert, tsort, tremove, tsort = table.concat, table.insert, table.sort, table.remove, table.sort | ||||
| local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe | ||||
| local strmatch, format = string.match, string.format | ||||
| local assert, loadstring, error = assert, loadstring, error | ||||
| local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs | ||||
| local rawset, tostring, tonumber = rawset, tostring, tonumber | ||||
| local error = error | ||||
| local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs | ||||
| local tostring, tonumber = tostring, tonumber | ||||
| local math_min, math_max, math_floor = math.min, math.max, math.floor | ||||
|  | ||||
| -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded | ||||
| -- List them here for Mikk's FindGlobals script | ||||
| -- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show | ||||
| -- GLOBALS: NORMAL_FONT_COLOR, ACCEPT, CANCEL | ||||
| -- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge | ||||
| -- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler | ||||
|  | ||||
| @@ -45,39 +46,10 @@ local function errorhandler(err) | ||||
| 	return geterrorhandler()(err) | ||||
| end | ||||
|  | ||||
| local function CreateDispatcher(argCount) | ||||
| 	local code = [[ | ||||
| 		local xpcall, eh = ... | ||||
| 		local method, ARGS | ||||
| 		local function call() return method(ARGS) end | ||||
| 	 | ||||
| 		local function dispatch(func, ...) | ||||
| 			 method = func | ||||
| 			 if not method then return end | ||||
| 			 ARGS = ... | ||||
| 			 return xpcall(call, eh) | ||||
| 		end | ||||
| 	 | ||||
| 		return dispatch | ||||
| 	]] | ||||
| 	 | ||||
| 	local ARGS = {} | ||||
| 	for i = 1, argCount do ARGS[i] = "arg"..i end | ||||
| 	code = code:gsub("ARGS", tconcat(ARGS, ", ")) | ||||
| 	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler) | ||||
| end | ||||
|  | ||||
| local Dispatchers = setmetatable({}, {__index=function(self, argCount) | ||||
| 	local dispatcher = CreateDispatcher(argCount) | ||||
| 	rawset(self, argCount, dispatcher) | ||||
| 	return dispatcher | ||||
| end}) | ||||
| Dispatchers[0] = function(func) | ||||
| 	return xpcall(func, errorhandler) | ||||
| end | ||||
|   | ||||
| local function safecall(func, ...) | ||||
| 	return Dispatchers[select("#", ...)](func, ...) | ||||
| 	if func then | ||||
| 		return xpcall(func, errorhandler, ...) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local width_multiplier = 170 | ||||
| @@ -85,18 +57,18 @@ local width_multiplier = 170 | ||||
| --[[ | ||||
| Group Types | ||||
|   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree | ||||
|   		- Descendant Groups with inline=true and thier children will not become nodes | ||||
|         - Descendant Groups with inline=true and thier children will not become nodes | ||||
|  | ||||
|   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control | ||||
|   		- Grandchild groups will default to inline unless specified otherwise | ||||
|         - Grandchild groups will default to inline unless specified otherwise | ||||
|  | ||||
|   Select- Same as Tab but with entries in a dropdown rather than tabs | ||||
|  | ||||
|  | ||||
|   Inline Groups | ||||
|   	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border | ||||
|   	- If declared on a direct child of a root node of a select group, they will appear above the group container control | ||||
|   	- When a group is displayed inline, all descendants will also be inline members of the group | ||||
|     - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border | ||||
|     - If declared on a direct child of a root node of a select group, they will appear above the group container control | ||||
|     - When a group is displayed inline, all descendants will also be inline members of the group | ||||
|  | ||||
| ]] | ||||
|  | ||||
| @@ -197,11 +169,11 @@ local allIsLiteral = { | ||||
| local function GetOptionsMemberValue(membername, option, options, path, appName, ...) | ||||
| 	--get definition for the member | ||||
| 	local inherits = isInherited[membername] | ||||
| 	 | ||||
|  | ||||
|  | ||||
| 	--get the member of the option, traversing the tree if it can be inherited | ||||
| 	local member | ||||
| 	 | ||||
|  | ||||
| 	if inherits then | ||||
| 		local group = options | ||||
| 		if group[membername] ~= nil then | ||||
| @@ -216,7 +188,7 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, | ||||
| 	else | ||||
| 		member = option[membername] | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	--check if we need to call a functon, or if we have a literal value | ||||
| 	if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then | ||||
| 		--We have a function to call | ||||
| @@ -225,13 +197,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, | ||||
| 		local handler | ||||
| 		local group = options | ||||
| 		handler = group.handler or handler | ||||
| 		 | ||||
|  | ||||
| 		for i = 1, #path do | ||||
| 			group = GetSubOption(group, path[i]) | ||||
| 			info[i] = path[i] | ||||
| 			handler = group.handler or handler | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		info.options = options | ||||
| 		info.appName = appName | ||||
| 		info[0] = appName | ||||
| @@ -241,8 +213,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, | ||||
| 		info.type = option.type | ||||
| 		info.uiType = "dialog" | ||||
| 		info.uiName = MAJOR | ||||
| 	 | ||||
| 		local a, b, c ,d  | ||||
|  | ||||
| 		local a, b, c ,d | ||||
| 		--using 4 returns for the get of a color type, increase if a type needs more | ||||
| 		if type(member) == "function" then | ||||
| 			--Call the function | ||||
| @@ -259,8 +231,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, | ||||
| 		return a,b,c,d | ||||
| 	else | ||||
| 		--The value isnt a function to call, return it | ||||
| 		return member	 | ||||
| 	end	 | ||||
| 		return member | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --[[calls an options function that could be inherited, method name or function ref | ||||
| @@ -325,7 +297,7 @@ local function compareOptions(a,b) | ||||
| 		return NameA:upper() < NameB:upper() | ||||
| 	end | ||||
| 	if OrderA < 0 then | ||||
| 		if OrderB > 0 then | ||||
| 		if OrderB >= 0 then | ||||
| 			return false | ||||
| 		end | ||||
| 	else | ||||
| @@ -344,7 +316,7 @@ end | ||||
| local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName) | ||||
| 	tempOrders = new() | ||||
| 	tempNames = new() | ||||
| 	 | ||||
|  | ||||
| 	if group.plugins then | ||||
| 		for plugin, t in pairs(group.plugins) do | ||||
| 			for k, v in pairs(t) do | ||||
| @@ -360,7 +332,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	for k, v in pairs(group.args) do | ||||
| 		if not opts[k] then | ||||
| 			tinsert(keySort, k) | ||||
| @@ -391,7 +363,7 @@ local function DelTree(tree) | ||||
| end | ||||
|  | ||||
| local function CleanUserData(widget, event) | ||||
| 	 | ||||
|  | ||||
| 	local user = widget:GetUserDataTable() | ||||
|  | ||||
| 	if user.path then | ||||
| @@ -431,7 +403,7 @@ end | ||||
| -- - Gets a status table for the given appname and options path. | ||||
| -- @param appName The application name as given to `:RegisterOptionsTable()` | ||||
| -- @param path The path to the options (a table with all group keys) | ||||
| -- @return  | ||||
| -- @return | ||||
| function AceConfigDialog:GetStatusTable(appName, path) | ||||
| 	local status = self.Status | ||||
|  | ||||
| @@ -465,7 +437,7 @@ end | ||||
| function AceConfigDialog:SelectGroup(appName, ...) | ||||
| 	local path = new() | ||||
|  | ||||
| 	 | ||||
|  | ||||
| 	local app = reg:GetOptionsTable(appName) | ||||
| 	if not app then | ||||
| 		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2) | ||||
| @@ -477,9 +449,9 @@ function AceConfigDialog:SelectGroup(appName, ...) | ||||
| 		status.groups = {} | ||||
| 	end | ||||
| 	status = status.groups | ||||
| 	local treevalue  | ||||
| 	local treestatus  | ||||
| 	 | ||||
| 	local treevalue | ||||
| 	local treestatus | ||||
|  | ||||
| 	for n = 1, select("#",...) do | ||||
| 		local key = select(n, ...) | ||||
|  | ||||
| @@ -506,12 +478,12 @@ function AceConfigDialog:SelectGroup(appName, ...) | ||||
| 			--the selected group will be overwritten if a child is the final target but still needs to be open | ||||
| 			treestatus.selected = treevalue | ||||
| 			treestatus.groups[treevalue] = true | ||||
| 			 | ||||
|  | ||||
| 		end | ||||
| 		 | ||||
|  | ||||
| 		--move to the next group in the path | ||||
| 		group = GetSubOption(group, key) | ||||
| 		if not group then  | ||||
| 		if not group then | ||||
| 			break | ||||
| 		end | ||||
| 		tinsert(path, key) | ||||
| @@ -521,10 +493,10 @@ function AceConfigDialog:SelectGroup(appName, ...) | ||||
| 		end | ||||
| 		status = status.groups | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	del(path) | ||||
| 	reg:NotifyChange(appName) | ||||
| end	 | ||||
| end | ||||
|  | ||||
| local function OptionOnMouseOver(widget, event) | ||||
| 	--show a tooltip/set the status bar to the desc text | ||||
| @@ -533,32 +505,33 @@ local function OptionOnMouseOver(widget, event) | ||||
| 	local options = user.options | ||||
| 	local path = user.path | ||||
| 	local appName = user.appName | ||||
| 	local tooltip = AceConfigDialog.tooltip | ||||
|  | ||||
| 	GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") | ||||
| 	tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") | ||||
| 	local name = GetOptionsMemberValue("name", opt, options, path, appName) | ||||
| 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName) | ||||
| 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName) | ||||
| 	local descStyle = opt.descStyle | ||||
| 	 | ||||
|  | ||||
| 	if descStyle and descStyle ~= "tooltip" then return end | ||||
| 	 | ||||
| 	GameTooltip:SetText(name, 1, .82, 0, true) | ||||
| 	 | ||||
|  | ||||
| 	tooltip:SetText(name, 1, .82, 0, true) | ||||
|  | ||||
| 	if opt.type == "multiselect" then | ||||
| 		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) | ||||
| 	end	 | ||||
| 		tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) | ||||
| 	end | ||||
| 	if type(desc) == "string" then | ||||
| 		GameTooltip:AddLine(desc, 1, 1, 1, true) | ||||
| 		tooltip:AddLine(desc, 1, 1, 1, true) | ||||
| 	end | ||||
| 	if type(usage) == "string" then | ||||
| 		GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) | ||||
| 		tooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) | ||||
| 	end | ||||
|  | ||||
| 	GameTooltip:Show() | ||||
| 	tooltip:Show() | ||||
| end | ||||
|  | ||||
| local function OptionOnMouseLeave(widget, event) | ||||
| 	GameTooltip:Hide() | ||||
| 	AceConfigDialog.tooltip:Hide() | ||||
| end | ||||
|  | ||||
| local function GetFuncName(option) | ||||
| @@ -569,71 +542,127 @@ local function GetFuncName(option) | ||||
| 		return "set" | ||||
| 	end | ||||
| end | ||||
| local function confirmPopup(appName, rootframe, basepath, info, message, func, ...) | ||||
| 	if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then | ||||
| 		StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {} | ||||
| 	end | ||||
| 	local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] | ||||
| 	for k in pairs(t) do | ||||
| 		t[k] = nil | ||||
| 	end | ||||
| 	t.text = message | ||||
| 	t.button1 = ACCEPT | ||||
| 	t.button2 = CANCEL | ||||
| 	t.preferredIndex = STATICPOPUP_NUMDIALOGS | ||||
| 	local dialog, oldstrata | ||||
| 	t.OnAccept = function() | ||||
| 		safecall(func, unpack(t)) | ||||
| 		if dialog and oldstrata then | ||||
| 			dialog:SetFrameStrata(oldstrata) | ||||
| 		end | ||||
| 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | ||||
| 		del(info) | ||||
| 	end | ||||
| 	t.OnCancel = function() | ||||
| 		if dialog and oldstrata then | ||||
| 			dialog:SetFrameStrata(oldstrata) | ||||
| 		end | ||||
| 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | ||||
| 		del(info) | ||||
| 	end | ||||
| 	for i = 1, select("#", ...) do | ||||
| 		t[i] = select(i, ...) or false | ||||
| 	end | ||||
| 	t.timeout = 0 | ||||
| 	t.whileDead = 1 | ||||
| 	t.hideOnEscape = 1 | ||||
| do | ||||
| 	local frame = AceConfigDialog.popup | ||||
| 	if not frame or oldminor < 81 then | ||||
| 		frame = CreateFrame("Frame", nil, UIParent) | ||||
| 		AceConfigDialog.popup = frame | ||||
| 		frame:Hide() | ||||
| 		frame:SetPoint("CENTER", UIParent, "CENTER") | ||||
| 		frame:SetSize(320, 72) | ||||
| 		frame:EnableMouse(true) -- Do not allow click-through on the frame | ||||
| 		frame:SetFrameStrata("TOOLTIP") | ||||
| 		frame:SetFrameLevel(100) -- Lots of room to draw under it | ||||
| 		frame:SetScript("OnKeyDown", function(self, key) | ||||
| 			if key == "ESCAPE" then | ||||
| 				self:SetPropagateKeyboardInput(false) | ||||
| 				if self.cancel:IsShown() then | ||||
| 					self.cancel:Click() | ||||
| 				else -- Showing a validation error | ||||
| 					self:Hide() | ||||
| 				end | ||||
| 			else | ||||
| 				self:SetPropagateKeyboardInput(true) | ||||
| 			end | ||||
| 		end) | ||||
|  | ||||
| 	dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG") | ||||
| 	if dialog then | ||||
| 		oldstrata = dialog:GetFrameStrata() | ||||
| 		dialog:SetFrameStrata("TOOLTIP") | ||||
| 		if not frame.SetFixedFrameStrata then -- API capability check (classic check) | ||||
| 			frame:SetBackdrop({ | ||||
| 				bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], | ||||
| 				edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]], | ||||
| 				tile = true, | ||||
| 				tileSize = 32, | ||||
| 				edgeSize = 32, | ||||
| 				insets = { left = 11, right = 11, top = 11, bottom = 11 }, | ||||
| 			}) | ||||
| 		else | ||||
| 			local border = CreateFrame("Frame", nil, frame, "DialogBorderOpaqueTemplate") | ||||
| 			border:SetAllPoints(frame) | ||||
| 			frame:SetFixedFrameStrata(true) | ||||
| 			frame:SetFixedFrameLevel(true) | ||||
| 		end | ||||
|  | ||||
| 		local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight") | ||||
| 		text:SetSize(290, 0) | ||||
| 		text:SetPoint("TOP", 0, -16) | ||||
| 		frame.text = text | ||||
|  | ||||
| 		local function newButton(text) | ||||
| 			local button = CreateFrame("Button", nil, frame) | ||||
| 			button:SetSize(128, 21) | ||||
| 			button:SetNormalFontObject(GameFontNormal) | ||||
| 			button:SetHighlightFontObject(GameFontHighlight) | ||||
| 			button:SetNormalTexture(130763) -- "Interface\\Buttons\\UI-DialogBox-Button-Up" | ||||
| 			button:GetNormalTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) | ||||
| 			button:SetPushedTexture(130761) -- "Interface\\Buttons\\UI-DialogBox-Button-Down" | ||||
| 			button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) | ||||
| 			button:SetHighlightTexture(130762) -- "Interface\\Buttons\\UI-DialogBox-Button-Highlight" | ||||
| 			button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875) | ||||
| 			button:SetText(text) | ||||
| 			return button | ||||
| 		end | ||||
|  | ||||
| 		local accept = newButton(ACCEPT) | ||||
| 		accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16) | ||||
| 		frame.accept = accept | ||||
|  | ||||
| 		local cancel = newButton(CANCEL) | ||||
| 		cancel:SetPoint("LEFT", accept, "RIGHT", 13, 0) | ||||
| 		frame.cancel = cancel | ||||
| 	end | ||||
| end | ||||
| local function confirmPopup(appName, rootframe, basepath, info, message, func, ...) | ||||
| 	local frame = AceConfigDialog.popup | ||||
| 	frame:Show() | ||||
| 	frame.text:SetText(message) | ||||
| 	-- From StaticPopup.lua | ||||
| 	-- local height = 32 + text:GetHeight() + 2; | ||||
| 	-- height = height + 6 + accept:GetHeight() | ||||
| 	-- We add 32 + 2 + 6 + 21 (button height) == 61 | ||||
| 	local height = 61 + frame.text:GetHeight() | ||||
| 	frame:SetHeight(height) | ||||
|  | ||||
| 	frame.accept:ClearAllPoints() | ||||
| 	frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16) | ||||
| 	frame.cancel:Show() | ||||
|  | ||||
| 	local t = {...} | ||||
| 	local tCount = select("#", ...) | ||||
| 	frame.accept:SetScript("OnClick", function(self) | ||||
| 		safecall(func, unpack(t, 1, tCount)) -- Manually set count as unpack() stops on nil (bug with #table) | ||||
| 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | ||||
| 		frame:Hide() | ||||
| 		self:SetScript("OnClick", nil) | ||||
| 		frame.cancel:SetScript("OnClick", nil) | ||||
| 		del(info) | ||||
| 	end) | ||||
| 	frame.cancel:SetScript("OnClick", function(self) | ||||
| 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | ||||
| 		frame:Hide() | ||||
| 		self:SetScript("OnClick", nil) | ||||
| 		frame.accept:SetScript("OnClick", nil) | ||||
| 		del(info) | ||||
| 	end) | ||||
| end | ||||
|  | ||||
| local function validationErrorPopup(message) | ||||
| 	if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then | ||||
| 		StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {} | ||||
| 	end | ||||
| 	local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] | ||||
| 	t.text = message | ||||
| 	t.button1 = OKAY | ||||
| 	t.preferredIndex = STATICPOPUP_NUMDIALOGS | ||||
| 	local dialog, oldstrata | ||||
| 	t.OnAccept = function() | ||||
| 		if dialog and oldstrata then | ||||
| 			dialog:SetFrameStrata(oldstrata) | ||||
| 		end | ||||
| 	end | ||||
| 	t.timeout = 0 | ||||
| 	t.whileDead = 1 | ||||
| 	t.hideOnEscape = 1 | ||||
| 	local frame = AceConfigDialog.popup | ||||
| 	frame:Show() | ||||
| 	frame.text:SetText(message) | ||||
| 	-- From StaticPopup.lua | ||||
| 	-- local height = 32 + text:GetHeight() + 2; | ||||
| 	-- height = height + 6 + accept:GetHeight() | ||||
| 	-- We add 32 + 2 + 6 + 21 (button height) == 61 | ||||
| 	local height = 61 + frame.text:GetHeight() | ||||
| 	frame:SetHeight(height) | ||||
|  | ||||
| 	dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG") | ||||
| 	if dialog then | ||||
| 		oldstrata = dialog:GetFrameStrata() | ||||
| 		dialog:SetFrameStrata("TOOLTIP") | ||||
| 	end | ||||
| 	frame.accept:ClearAllPoints() | ||||
| 	frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16) | ||||
| 	frame.cancel:Hide() | ||||
|  | ||||
| 	frame.accept:SetScript("OnClick", function() | ||||
| 		frame:Hide() | ||||
| 	end) | ||||
| end | ||||
|  | ||||
| local function ActivateControl(widget, event, ...) | ||||
| @@ -704,7 +733,7 @@ local function ActivateControl(widget, event, ...) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local success | ||||
| 	if validated and option.type ~= "execute" then | ||||
| 		if type(validate) == "string" then | ||||
| @@ -719,7 +748,7 @@ local function ActivateControl(widget, event, ...) | ||||
| 			if not success then validated = false end | ||||
| 		end | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local rootframe = user.rootframe | ||||
| 	if not validated or type(validated) == "string" then | ||||
| 		if not validated then | ||||
| @@ -744,7 +773,7 @@ local function ActivateControl(widget, event, ...) | ||||
| 		del(info) | ||||
| 		return true | ||||
| 	else | ||||
| 		 | ||||
|  | ||||
| 		local confirmText = option.confirmText | ||||
| 		--call confirm func/method | ||||
| 		if type(confirm) == "string" then | ||||
| @@ -785,10 +814,10 @@ local function ActivateControl(widget, event, ...) | ||||
| 						confirmText = confirmText.." - "..desc | ||||
| 					end | ||||
| 				end | ||||
| 				 | ||||
|  | ||||
| 				local iscustom = user.rootframe:GetUserData("iscustom") | ||||
| 				local rootframe | ||||
| 				 | ||||
|  | ||||
| 				if iscustom then | ||||
| 					rootframe = user.rootframe | ||||
| 				end | ||||
| @@ -825,7 +854,7 @@ local function ActivateControl(widget, event, ...) | ||||
| 		--full refresh of the frame, some controls dont cause this on all events | ||||
| 		if option.type == "color" then | ||||
| 			if event == "OnValueConfirmed" then | ||||
| 				 | ||||
|  | ||||
| 				if iscustom then | ||||
| 					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath)) | ||||
| 				else | ||||
| @@ -886,7 +915,7 @@ end | ||||
|  | ||||
| local function MultiControlOnClosed(widget, event, ...) | ||||
| 	local user = widget:GetUserDataTable() | ||||
| 	if user.valuechanged then | ||||
| 	if user.valuechanged and not widget:IsReleasing() then | ||||
| 		local iscustom = user.rootframe:GetUserData("iscustom") | ||||
| 		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl | ||||
| 		if iscustom then | ||||
| @@ -1064,6 +1093,23 @@ local function InjectInfo(control, options, option, path, rootframe, appName) | ||||
| 	control:SetCallback("OnEnter", OptionOnMouseOver) | ||||
| end | ||||
|  | ||||
| local function CreateControl(userControlType, fallbackControlType) | ||||
| 	local control | ||||
| 	if userControlType then | ||||
| 		control = gui:Create(userControlType) | ||||
| 		if not control then | ||||
| 			geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(userControlType))) | ||||
| 		end | ||||
| 	end | ||||
| 	if not control then | ||||
| 		control = gui:Create(fallbackControlType) | ||||
| 	end | ||||
| 	return control | ||||
| end | ||||
|  | ||||
| local function sortTblAsStrings(x,y) | ||||
| 	return tostring(x) < tostring(y) -- Support numbers as keys | ||||
| end | ||||
|  | ||||
| --[[ | ||||
| 	options - root of the options table being fed | ||||
| @@ -1095,7 +1141,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 					else | ||||
| 						GroupContainer = gui:Create("SimpleGroup") | ||||
| 					end | ||||
| 					 | ||||
|  | ||||
| 					GroupContainer.width = "fill" | ||||
| 					GroupContainer:SetLayout("flow") | ||||
| 					container:AddChild(GroupContainer) | ||||
| @@ -1104,16 +1150,17 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 			else | ||||
| 				--Control to feed | ||||
| 				local control | ||||
| 				 | ||||
|  | ||||
| 				local name = GetOptionsMemberValue("name", v, options, path, appName) | ||||
| 				 | ||||
|  | ||||
| 				if v.type == "execute" then | ||||
| 					 | ||||
|  | ||||
| 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) | ||||
| 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) | ||||
| 					 | ||||
| 					if type(image) == "string" or type(image) == "number" then | ||||
| 						control = gui:Create("Icon") | ||||
|  | ||||
| 					local iconControl = type(image) == "string" or type(image) == "number" | ||||
| 					control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button") | ||||
| 					if iconControl then | ||||
| 						if not width then | ||||
| 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName) | ||||
| 						end | ||||
| @@ -1134,19 +1181,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 						control:SetImageSize(width, height) | ||||
| 						control:SetLabel(name) | ||||
| 					else | ||||
| 						control = gui:Create("Button") | ||||
| 						control:SetText(name) | ||||
| 					end | ||||
| 					control:SetCallback("OnClick",ActivateControl) | ||||
|  | ||||
| 				elseif v.type == "input" then | ||||
| 					local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox" | ||||
| 					control = gui:Create(controlType) | ||||
| 					if not control then | ||||
| 						geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType))) | ||||
| 						control = gui:Create(v.multiline and "MultiLineEditBox" or "EditBox") | ||||
| 					end | ||||
| 					 | ||||
| 					control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox") | ||||
|  | ||||
| 					if v.multiline and control.SetNumLines then | ||||
| 						control:SetNumLines(tonumber(v.multiline) or 4) | ||||
| 					end | ||||
| @@ -1159,21 +1200,21 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 					control:SetText(text) | ||||
|  | ||||
| 				elseif v.type == "toggle" then | ||||
| 					control = gui:Create("CheckBox") | ||||
| 					control = CreateControl(v.dialogControl or v.control, "CheckBox") | ||||
| 					control:SetLabel(name) | ||||
| 					control:SetTriState(v.tristate) | ||||
| 					local value = GetOptionsMemberValue("get",v, options, path, appName) | ||||
| 					control:SetValue(value) | ||||
| 					control:SetCallback("OnValueChanged",ActivateControl) | ||||
| 					 | ||||
|  | ||||
| 					if v.descStyle == "inline" then | ||||
| 						local desc = GetOptionsMemberValue("desc", v, options, path, appName) | ||||
| 						control:SetDescription(desc) | ||||
| 					end | ||||
| 					 | ||||
|  | ||||
| 					local image = GetOptionsMemberValue("image", v, options, path, appName) | ||||
| 					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName) | ||||
| 					 | ||||
|  | ||||
| 					if type(image) == "string" or type(image) == "number" then | ||||
| 						if type(imageCoords) == "table" then | ||||
| 							control:SetImage(image, unpack(imageCoords)) | ||||
| @@ -1182,7 +1223,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 						end | ||||
| 					end | ||||
| 				elseif v.type == "range" then | ||||
| 					control = gui:Create("Slider") | ||||
| 					control = CreateControl(v.dialogControl or v.control, "Slider") | ||||
| 					control:SetLabel(name) | ||||
| 					control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0) | ||||
| 					control:SetIsPercent(v.isPercent) | ||||
| @@ -1196,6 +1237,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
|  | ||||
| 				elseif v.type == "select" then | ||||
| 					local values = GetOptionsMemberValue("values", v, options, path, appName) | ||||
| 					local sorting = GetOptionsMemberValue("sorting", v, options, path, appName) | ||||
| 					if v.style == "radio" then | ||||
| 						local disabled = CheckOptionDisabled(v, options, path, appName) | ||||
| 						local width = GetOptionsMemberValue("width",v,options,path,appName) | ||||
| @@ -1206,12 +1248,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
|  | ||||
| 						control:PauseLayout() | ||||
| 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName) | ||||
| 						local t = {} | ||||
| 						for value, text in pairs(values) do | ||||
| 							t[#t+1]=value | ||||
| 						if not sorting then | ||||
| 							sorting = {} | ||||
| 							for value, text in pairs(values) do | ||||
| 								sorting[#sorting+1]=value | ||||
| 							end | ||||
| 							tsort(sorting, sortTblAsStrings) | ||||
| 						end | ||||
| 						tsort(t) | ||||
| 						for k, value in ipairs(t) do | ||||
| 						for k, value in ipairs(sorting) do | ||||
| 							local text = values[value] | ||||
| 							local radio = gui:Create("CheckBox") | ||||
| 							radio:SetLabel(text) | ||||
| @@ -1238,19 +1282,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 						control:ResumeLayout() | ||||
| 						control:DoLayout() | ||||
| 					else | ||||
| 						local controlType = v.dialogControl or v.control or "Dropdown" | ||||
| 						control = gui:Create(controlType) | ||||
| 						if not control then | ||||
| 							geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType))) | ||||
| 							control = gui:Create("Dropdown") | ||||
| 						end | ||||
| 						control = CreateControl(v.dialogControl or v.control, "Dropdown") | ||||
| 						local itemType = v.itemControl | ||||
| 						if itemType and not gui:GetWidgetVersion(itemType) then | ||||
| 							geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType))) | ||||
| 							itemType = nil | ||||
| 						end | ||||
| 						control:SetLabel(name) | ||||
| 						control:SetList(values, nil, itemType) | ||||
| 						control:SetList(values, sorting, itemType) | ||||
| 						local value = GetOptionsMemberValue("get",v, options, path, appName) | ||||
| 						if not values[value] then | ||||
| 							value = nil | ||||
| @@ -1262,9 +1301,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 				elseif v.type == "multiselect" then | ||||
| 					local values = GetOptionsMemberValue("values", v, options, path, appName) | ||||
| 					local disabled = CheckOptionDisabled(v, options, path, appName) | ||||
| 					 | ||||
| 					local controlType = v.dialogControl or v.control | ||||
| 					 | ||||
|  | ||||
| 					local valuesort = new() | ||||
| 					if values then | ||||
| 						for value, text in pairs(values) do | ||||
| @@ -1272,7 +1309,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 						end | ||||
| 					end | ||||
| 					tsort(valuesort) | ||||
| 					 | ||||
|  | ||||
| 					local controlType = v.dialogControl or v.control | ||||
| 					if controlType then | ||||
| 						control = gui:Create(controlType) | ||||
| 						if not control then | ||||
| @@ -1340,13 +1378,13 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 						control:ResumeLayout() | ||||
| 						control:DoLayout() | ||||
|  | ||||
| 						 | ||||
|  | ||||
| 					end | ||||
| 					 | ||||
|  | ||||
| 					del(valuesort) | ||||
|  | ||||
| 				elseif v.type == "color" then | ||||
| 					control = gui:Create("ColorPicker") | ||||
| 					control = CreateControl(v.dialogControl or v.control, "ColorPicker") | ||||
| 					control:SetLabel(name) | ||||
| 					control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName)) | ||||
| 					control:SetColor(GetOptionsMemberValue("get",v, options, path, appName)) | ||||
| @@ -1354,20 +1392,20 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 					control:SetCallback("OnValueConfirmed",ActivateControl) | ||||
|  | ||||
| 				elseif v.type == "keybinding" then | ||||
| 					control = gui:Create("Keybinding") | ||||
| 					control = CreateControl(v.dialogControl or v.control, "Keybinding") | ||||
| 					control:SetLabel(name) | ||||
| 					control:SetKey(GetOptionsMemberValue("get",v, options, path, appName)) | ||||
| 					control:SetCallback("OnKeyChanged",ActivateControl) | ||||
|  | ||||
| 				elseif v.type == "header" then | ||||
| 					control = gui:Create("Heading") | ||||
| 					control = CreateControl(v.dialogControl or v.control, "Heading") | ||||
| 					control:SetText(name) | ||||
| 					control.width = "fill" | ||||
|  | ||||
| 				elseif v.type == "description" then | ||||
| 					control = gui:Create("Label") | ||||
| 					control = CreateControl(v.dialogControl or v.control, "Label") | ||||
| 					control:SetText(name) | ||||
| 					 | ||||
|  | ||||
| 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName) | ||||
| 					if fontSize == "medium" then | ||||
| 						control:SetFontObject(GameFontHighlight) | ||||
| @@ -1376,10 +1414,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 					else -- small or invalid | ||||
| 						control:SetFontObject(GameFontHighlightSmall) | ||||
| 					end | ||||
| 					 | ||||
|  | ||||
| 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) | ||||
| 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) | ||||
| 					 | ||||
|  | ||||
| 					if type(image) == "string" or type(image) == "number" then | ||||
| 						if not width then | ||||
| 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName) | ||||
| @@ -1428,7 +1466,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | ||||
| 					InjectInfo(control, options, v, path, rootframe, appName) | ||||
| 					container:AddChild(control) | ||||
| 				end | ||||
| 				 | ||||
|  | ||||
| 			end | ||||
| 		end | ||||
| 		tremove(path) | ||||
| @@ -1453,7 +1491,8 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) | ||||
| 	local option = user.option | ||||
| 	local path = user.path | ||||
| 	local appName = user.appName | ||||
| 	 | ||||
| 	local tooltip = AceConfigDialog.tooltip | ||||
|  | ||||
| 	local feedpath = new() | ||||
| 	for i = 1, #path do | ||||
| 		feedpath[i] = path[i] | ||||
| @@ -1468,49 +1507,50 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) | ||||
|  | ||||
| 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName) | ||||
| 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName) | ||||
| 	 | ||||
| 	GameTooltip:SetOwner(button, "ANCHOR_NONE") | ||||
|  | ||||
| 	tooltip:SetOwner(button, "ANCHOR_NONE") | ||||
| 	tooltip:ClearAllPoints() | ||||
| 	if widget.type == "TabGroup" then | ||||
| 		GameTooltip:SetPoint("BOTTOM",button,"TOP") | ||||
| 		tooltip:SetPoint("BOTTOM",button,"TOP") | ||||
| 	else | ||||
| 		GameTooltip:SetPoint("LEFT",button,"RIGHT") | ||||
| 		tooltip:SetPoint("LEFT",button,"RIGHT") | ||||
| 	end | ||||
|  | ||||
| 	GameTooltip:SetText(name, 1, .82, 0, true) | ||||
| 	 | ||||
| 	tooltip:SetText(name, 1, .82, 0, true) | ||||
|  | ||||
| 	if type(desc) == "string" then | ||||
| 		GameTooltip:AddLine(desc, 1, 1, 1, true) | ||||
| 		tooltip:AddLine(desc, 1, 1, 1, true) | ||||
| 	end | ||||
| 	 | ||||
| 	GameTooltip:Show() | ||||
|  | ||||
| 	tooltip:Show() | ||||
| end | ||||
|  | ||||
| local function TreeOnButtonLeave(widget, event, value, button) | ||||
| 	GameTooltip:Hide() | ||||
| 	AceConfigDialog.tooltip:Hide() | ||||
| end | ||||
|  | ||||
|  | ||||
| local function GroupExists(appName, options, path, uniquevalue) | ||||
| 	if not uniquevalue then return false end | ||||
| 	 | ||||
|  | ||||
| 	local feedpath = new() | ||||
| 	local temppath = new() | ||||
| 	for i = 1, #path do | ||||
| 		feedpath[i] = path[i] | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	BuildPath(feedpath, ("\001"):split(uniquevalue)) | ||||
| 	 | ||||
|  | ||||
| 	local group = options | ||||
| 	for i = 1, #feedpath do | ||||
| 		local v = feedpath[i] | ||||
| 		temppath[i] = v | ||||
| 		group = GetSubOption(group, v) | ||||
| 		 | ||||
| 		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then  | ||||
|  | ||||
| 		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then | ||||
| 			del(feedpath) | ||||
| 			del(temppath) | ||||
| 			return false  | ||||
| 			return false | ||||
| 		end | ||||
| 	end | ||||
| 	del(feedpath) | ||||
| @@ -1533,10 +1573,6 @@ local function GroupSelected(widget, event, uniquevalue) | ||||
| 	end | ||||
|  | ||||
| 	BuildPath(feedpath, ("\001"):split(uniquevalue)) | ||||
| 	local group = options | ||||
| 	for i = 1, #feedpath do | ||||
| 		group = GetSubOption(group, feedpath[i]) | ||||
| 	end | ||||
| 	widget:ReleaseChildren() | ||||
| 	AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath) | ||||
|  | ||||
| @@ -1633,7 +1669,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR | ||||
| 			tab:SetCallback("OnGroupSelected", GroupSelected) | ||||
| 			tab:SetCallback("OnTabEnter", TreeOnButtonEnter) | ||||
| 			tab:SetCallback("OnTabLeave", TreeOnButtonLeave) | ||||
| 			 | ||||
|  | ||||
| 			local status = AceConfigDialog:GetStatusTable(appName, path) | ||||
| 			if not status.groups then | ||||
| 				status.groups = {} | ||||
| @@ -1653,7 +1689,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR | ||||
| 					break | ||||
| 				end | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			container:AddChild(tab) | ||||
|  | ||||
| 		elseif grouptype == "select" then | ||||
| @@ -1676,7 +1712,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR | ||||
| 			if firstgroup then | ||||
| 				select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup) | ||||
| 			end | ||||
| 			 | ||||
|  | ||||
| 			select.width = "fill" | ||||
| 			select.height = "fill" | ||||
|  | ||||
| @@ -1688,14 +1724,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR | ||||
| 			local tree = gui:Create("TreeGroup") | ||||
| 			InjectInfo(tree, options, group, path, rootframe, appName) | ||||
| 			tree:EnableButtonTooltips(false) | ||||
| 			 | ||||
|  | ||||
| 			tree.width = "fill" | ||||
| 			tree.height = "fill" | ||||
|  | ||||
| 			tree:SetCallback("OnGroupSelected", GroupSelected) | ||||
| 			tree:SetCallback("OnButtonEnter", TreeOnButtonEnter) | ||||
| 			tree:SetCallback("OnButtonLeave", TreeOnButtonLeave) | ||||
| 			 | ||||
|  | ||||
| 			local status = AceConfigDialog:GetStatusTable(appName, path) | ||||
| 			if not status.groups then | ||||
| 				status.groups = {} | ||||
| @@ -1736,7 +1772,7 @@ local function RefreshOnUpdate(this) | ||||
| 		end | ||||
| 		this.closing[appName] = nil | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	if this.closeAll then | ||||
| 		for k, v in pairs(AceConfigDialog.OpenFrames) do | ||||
| 			if not this.closeAllOverride[k] then | ||||
| @@ -1746,7 +1782,7 @@ local function RefreshOnUpdate(this) | ||||
| 		this.closeAll = nil | ||||
| 		wipe(this.closeAllOverride) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	for appName in pairs(this.apps) do | ||||
| 		if AceConfigDialog.OpenFrames[appName] then | ||||
| 			local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable() | ||||
| @@ -1831,10 +1867,10 @@ function AceConfigDialog:Open(appName, container, ...) | ||||
| 	local options = app("dialog", MAJOR) | ||||
|  | ||||
| 	local f | ||||
| 	 | ||||
|  | ||||
| 	local path = new() | ||||
| 	local name = GetOptionsMemberValue("name", options, options, path, appName) | ||||
| 	 | ||||
|  | ||||
| 	--If an optional path is specified add it to the path table before feeding the options | ||||
| 	--as container is optional as well it may contain the first element of the path | ||||
| 	if type(container) == "string" then | ||||
| @@ -1844,7 +1880,7 @@ function AceConfigDialog:Open(appName, container, ...) | ||||
| 	for n = 1, select("#",...) do | ||||
| 		tinsert(path, (select(n, ...))) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local option = options | ||||
| 	if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then | ||||
| 		for i = 1, #path do | ||||
| @@ -1852,7 +1888,7 @@ function AceConfigDialog:Open(appName, container, ...) | ||||
| 		end | ||||
| 		name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName)) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	--if a container is given feed into that | ||||
| 	if container then | ||||
| 		f = container | ||||
| @@ -1946,19 +1982,19 @@ end | ||||
| -- @param name A descriptive name to display in the options tree (defaults to appName) | ||||
| -- @param parent The parent to use in the interface options tree. | ||||
| -- @param ... The path in the options table to feed into the interface options panel. | ||||
| -- @return The reference to the frame registered into the Interface Options.  | ||||
| -- @return The reference to the frame registered into the Interface Options. | ||||
| function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...) | ||||
| 	local BlizOptions = AceConfigDialog.BlizOptions | ||||
| 	 | ||||
|  | ||||
| 	local key = appName | ||||
| 	for n = 1, select("#", ...) do | ||||
| 		key = key.."\001"..select(n, ...) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	if not BlizOptions[appName] then | ||||
| 		BlizOptions[appName] = {} | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	if not BlizOptions[appName][key] then | ||||
| 		local group = gui:Create("BlizOptionsGroup") | ||||
| 		BlizOptions[appName][key] = group | ||||
|   | ||||
| @@ -4,14 +4,14 @@ | ||||
| -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\ | ||||
| -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\ | ||||
| -- * The **appName** field is the options table name as given at registration time \\ | ||||
| --  | ||||
| -- | ||||
| -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName". | ||||
| -- @class file | ||||
| -- @name AceConfigRegistry-3.0 | ||||
| -- @release $Id: AceConfigRegistry-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $ | ||||
| -- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $ | ||||
| local CallbackHandler = LibStub("CallbackHandler-1.0") | ||||
|  | ||||
| local MAJOR, MINOR = "AceConfigRegistry-3.0", 18 | ||||
| local MAJOR, MINOR = "AceConfigRegistry-3.0", 20 | ||||
| local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) | ||||
|  | ||||
| if not AceConfigRegistry then return end | ||||
| @@ -33,7 +33,7 @@ local error, assert = error, assert | ||||
|  | ||||
|  | ||||
| AceConfigRegistry.validated = { | ||||
| 	-- list of options table names ran through :ValidateOptionsTable automatically.  | ||||
| 	-- list of options table names ran through :ValidateOptionsTable automatically. | ||||
| 	-- CLEARED ON PURPOSE, since newer versions may have newer validators | ||||
| 	cmd = {}, | ||||
| 	dropdown = {}, | ||||
| @@ -59,7 +59,6 @@ local optstring={["nil"]=true,["string"]=true, _="string"} | ||||
| local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"} | ||||
| local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"} | ||||
| local optnumber={["nil"]=true,["number"]=true, _="number"} | ||||
| local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"} | ||||
| local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"} | ||||
| local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true,  _="methodname, funcref or number"} | ||||
| local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true,  _="methodname, funcref or table"} | ||||
| @@ -95,13 +94,20 @@ local basekeys={ | ||||
| } | ||||
|  | ||||
| local typedkeys={ | ||||
| 	header={}, | ||||
| 	header={ | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| 	description={ | ||||
| 		image=optstringnumberfunc, | ||||
| 		imageCoords=optmethodtable, | ||||
| 		imageHeight=optnumber, | ||||
| 		imageWidth=optnumber, | ||||
| 		fontSize=optstringfunc, | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| 	group={ | ||||
| 		args=istable, | ||||
| @@ -118,6 +124,9 @@ local typedkeys={ | ||||
| 		imageCoords=optmethodtable, | ||||
| 		imageHeight=optnumber, | ||||
| 		imageWidth=optnumber, | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| 	input={ | ||||
| 		pattern=optstring, | ||||
| @@ -131,6 +140,9 @@ local typedkeys={ | ||||
| 		tristate=optbool, | ||||
| 		image=optstringnumberfunc, | ||||
| 		imageCoords=optmethodtable, | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| 	tristate={ | ||||
| 	}, | ||||
| @@ -142,12 +154,16 @@ local typedkeys={ | ||||
| 		step=optnumber, | ||||
| 		bigStep=optnumber, | ||||
| 		isPercent=optbool, | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| 	select={ | ||||
| 		values=ismethodtable, | ||||
| 		sorting=optmethodtable, | ||||
| 		style={ | ||||
| 			["nil"]=true,  | ||||
| 			["string"]={dropdown=true,radio=true},  | ||||
| 			["nil"]=true, | ||||
| 			["string"]={dropdown=true,radio=true}, | ||||
| 			_="string: 'dropdown' or 'radio'" | ||||
| 		}, | ||||
| 		control=optstring, | ||||
| @@ -165,9 +181,14 @@ local typedkeys={ | ||||
| 	}, | ||||
| 	color={ | ||||
| 		hasAlpha=optmethodbool, | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| 	keybinding={ | ||||
| 		-- TODO | ||||
| 		control=optstring, | ||||
| 		dialogControl=optstring, | ||||
| 		dropdownControl=optstring, | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| @@ -204,13 +225,13 @@ local function validate(options,errlvl,...) | ||||
| 	if type(options.type)~="string" then | ||||
| 		err(".type: expected a string, got a "..type(options.type), errlvl,...) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	-- get type and 'typedkeys' member | ||||
| 	local tk = typedkeys[options.type] | ||||
| 	if not tk then | ||||
| 		err(".type: unknown type '"..options.type.."'", errlvl,...) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	-- make sure that all options[] are known parameters | ||||
| 	for k,v in pairs(options) do | ||||
| 		if not (tk[k] or basekeys[k]) then | ||||
| @@ -303,7 +324,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation | ||||
| 				AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl)	-- upgradable | ||||
| 				AceConfigRegistry.validated[uiType][appName] = true | ||||
| 			end | ||||
| 			return options  | ||||
| 			return options | ||||
| 		end | ||||
| 	elseif type(options)=="function" then | ||||
| 		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl) | ||||
| @@ -341,7 +362,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName) | ||||
| 	if not f then | ||||
| 		return nil | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	if uiType then | ||||
| 		return f(uiType,uiName,1)	-- get the table for us | ||||
| 	else | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ | ||||
| ..\FrameXML\UI.xsd"> | ||||
| 	<Script file="AceConsole-3.0.lua"/> | ||||
| </Ui> | ||||
| </Ui> | ||||
|   | ||||
| @@ -40,15 +40,15 @@ | ||||
| -- end | ||||
| -- @class file | ||||
| -- @name AceDB-3.0.lua | ||||
| -- @release $Id: AceDB-3.0.lua 1142 2016-07-11 08:36:19Z nevcairiel $ | ||||
| local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26 | ||||
| local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) | ||||
| -- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $ | ||||
| local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27 | ||||
| local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) | ||||
|  | ||||
| if not AceDB then return end -- No upgrade needed | ||||
|  | ||||
| -- Lua APIs | ||||
| local type, pairs, next, error = type, pairs, next, error | ||||
| local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget | ||||
| local setmetatable, rawset, rawget = setmetatable, rawset, rawget | ||||
|  | ||||
| -- WoW APIs | ||||
| local _G = _G | ||||
| @@ -397,7 +397,7 @@ AceDB.frame:SetScript("OnEvent", logoutHandler) | ||||
| -- @param defaults A table of defaults for this database | ||||
| function DBObjectLib:RegisterDefaults(defaults) | ||||
| 	if defaults and type(defaults) ~= "table" then | ||||
| 		error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2) | ||||
| 		error(("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected, got %q."):format(type(defaults)), 2) | ||||
| 	end | ||||
|  | ||||
| 	validateDefaults(defaults, self.keys) | ||||
| @@ -429,7 +429,7 @@ end | ||||
| -- @param name The name of the profile to set as the current profile | ||||
| function DBObjectLib:SetProfile(name) | ||||
| 	if type(name) ~= "string" then | ||||
| 		error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2) | ||||
| 		error(("Usage: AceDBObject:SetProfile(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||
| 	end | ||||
|  | ||||
| 	-- changing to the same profile, dont do anything | ||||
| @@ -471,7 +471,7 @@ end | ||||
| -- @param tbl A table to store the profile names in (optional) | ||||
| function DBObjectLib:GetProfiles(tbl) | ||||
| 	if tbl and type(tbl) ~= "table" then | ||||
| 		error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2) | ||||
| 		error(("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected, got %q."):format(type(tbl)), 2) | ||||
| 	end | ||||
|  | ||||
| 	-- Clear the container table | ||||
| @@ -509,15 +509,15 @@ end | ||||
| -- @param silent If true, do not raise an error when the profile does not exist | ||||
| function DBObjectLib:DeleteProfile(name, silent) | ||||
| 	if type(name) ~= "string" then | ||||
| 		error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2) | ||||
| 		error(("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||
| 	end | ||||
|  | ||||
| 	if self.keys.profile == name then | ||||
| 		error("Cannot delete the active profile in an AceDBObject.", 2) | ||||
| 		error(("Cannot delete the active profile (%q) in an AceDBObject."):format(name), 2) | ||||
| 	end | ||||
|  | ||||
| 	if not rawget(self.profiles, name) and not silent then | ||||
| 		error("Cannot delete profile '" .. name .. "'. It does not exist.", 2) | ||||
| 		error(("Cannot delete profile %q as it does not exist."):format(name), 2) | ||||
| 	end | ||||
|  | ||||
| 	self.profiles[name] = nil | ||||
| @@ -548,15 +548,15 @@ end | ||||
| -- @param silent If true, do not raise an error when the profile does not exist | ||||
| function DBObjectLib:CopyProfile(name, silent) | ||||
| 	if type(name) ~= "string" then | ||||
| 		error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2) | ||||
| 		error(("Usage: AceDBObject:CopyProfile(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||
| 	end | ||||
|  | ||||
| 	if name == self.keys.profile then | ||||
| 		error("Cannot have the same source and destination profiles.", 2) | ||||
| 		error(("Cannot have the same source and destination profiles (%q)."):format(name), 2) | ||||
| 	end | ||||
|  | ||||
| 	if not rawget(self.profiles, name) and not silent then | ||||
| 		error("Cannot copy profile '" .. name .. "'. It does not exist.", 2) | ||||
| 		error(("Cannot copy profile %q as it does not exist."):format(name), 2) | ||||
| 	end | ||||
|  | ||||
| 	-- Reset the profile before copying | ||||
| @@ -611,7 +611,7 @@ end | ||||
| -- @param defaultProfile The profile name to use as the default | ||||
| function DBObjectLib:ResetDB(defaultProfile) | ||||
| 	if defaultProfile and type(defaultProfile) ~= "string" then | ||||
| 		error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2) | ||||
| 		error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected, got %q."):format(type(defaultProfile)), 2) | ||||
| 	end | ||||
|  | ||||
| 	local sv = self.sv | ||||
| @@ -619,8 +619,6 @@ function DBObjectLib:ResetDB(defaultProfile) | ||||
| 		sv[k] = nil | ||||
| 	end | ||||
|  | ||||
| 	local parent = self.parent | ||||
|  | ||||
| 	initdb(sv, self.defaults, defaultProfile, self) | ||||
|  | ||||
| 	-- fix the child namespaces | ||||
| @@ -647,13 +645,13 @@ end | ||||
| -- @param defaults A table of values to use as defaults | ||||
| function DBObjectLib:RegisterNamespace(name, defaults) | ||||
| 	if type(name) ~= "string" then | ||||
| 		error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2) | ||||
| 		error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected, got %q."):format(type(name)), 2) | ||||
| 	end | ||||
| 	if defaults and type(defaults) ~= "table" then | ||||
| 		error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2) | ||||
| 		error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected, got %q."):format(type(defaults)), 2) | ||||
| 	end | ||||
| 	if self.children and self.children[name] then | ||||
| 		error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2) | ||||
| 		error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace called %q already exists."):format(name), 2) | ||||
| 	end | ||||
|  | ||||
| 	local sv = self.sv | ||||
| @@ -677,10 +675,10 @@ end | ||||
| -- @return the namespace object if found | ||||
| function DBObjectLib:GetNamespace(name, silent) | ||||
| 	if type(name) ~= "string" then | ||||
| 		error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2) | ||||
| 		error(("Usage: AceDBObject:GetNamespace(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||
| 	end | ||||
| 	if not silent and not (self.children and self.children[name]) then | ||||
| 		error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2) | ||||
| 		error(("Usage: AceDBObject:GetNamespace(name): 'name' - namespace %q does not exist."):format(name), 2) | ||||
| 	end | ||||
| 	if not self.children then self.children = {} end | ||||
| 	return self.children[name] | ||||
| @@ -719,15 +717,15 @@ function AceDB:New(tbl, defaults, defaultProfile) | ||||
| 	end | ||||
|  | ||||
| 	if type(tbl) ~= "table" then | ||||
| 		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2) | ||||
| 		error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected, got %q."):format(type(tbl)), 2) | ||||
| 	end | ||||
|  | ||||
| 	if defaults and type(defaults) ~= "table" then | ||||
| 		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2) | ||||
| 		error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected, got %q."):format(type(defaults)), 2) | ||||
| 	end | ||||
|  | ||||
| 	if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then | ||||
| 		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2) | ||||
| 		error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected, got %q."):format(type(defaultProfile)), 2) | ||||
| 	end | ||||
|  | ||||
| 	return initdb(tbl, defaults, defaultProfile) | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. | ||||
| -- @class file | ||||
| -- @name AceDBOptions-3.0 | ||||
| -- @release $Id: AceDBOptions-3.0.lua 1140 2016-07-03 07:53:29Z nevcairiel $ | ||||
| -- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||
| local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15 | ||||
| local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) | ||||
| local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) | ||||
|  | ||||
| if not AceDBOptions then return end -- No upgrade needed | ||||
|  | ||||
| @@ -240,22 +240,22 @@ local tmpprofiles = {} | ||||
| -- @return Hashtable of all profiles with the internal name as keys and the display name as value. | ||||
| local function getProfileList(db, common, nocurrent) | ||||
| 	local profiles = {} | ||||
| 	 | ||||
|  | ||||
| 	-- copy existing profiles into the table | ||||
| 	local currentProfile = db:GetCurrentProfile() | ||||
| 	for i,v in pairs(db:GetProfiles(tmpprofiles)) do  | ||||
| 		if not (nocurrent and v == currentProfile) then  | ||||
| 			profiles[v] = v  | ||||
| 		end  | ||||
| 	for i,v in pairs(db:GetProfiles(tmpprofiles)) do | ||||
| 		if not (nocurrent and v == currentProfile) then | ||||
| 			profiles[v] = v | ||||
| 		end | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	-- add our default profiles to choose from ( or rename existing profiles) | ||||
| 	for k,v in pairs(defaultProfiles) do | ||||
| 		if (common or profiles[k]) and not (nocurrent and k == currentProfile) then | ||||
| 			profiles[k] = v | ||||
| 		end | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	return profiles | ||||
| end | ||||
|  | ||||
| @@ -280,11 +280,11 @@ function OptionsHandlerPrototype:GetCurrentProfile() | ||||
| 	return self.db:GetCurrentProfile() | ||||
| end | ||||
|  | ||||
| --[[  | ||||
| --[[ | ||||
| 	List all active profiles | ||||
| 	you can control the output with the .arg variable | ||||
| 	currently four modes are supported | ||||
| 	 | ||||
|  | ||||
| 	(empty) - return all available profiles | ||||
| 	"nocurrent" - returns all available profiles except the currently active profile | ||||
| 	"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default") | ||||
| @@ -302,7 +302,7 @@ function OptionsHandlerPrototype:ListProfiles(info) | ||||
| 	else | ||||
| 		profiles = getProfileList(self.db) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	return profiles | ||||
| end | ||||
|  | ||||
| @@ -336,19 +336,19 @@ local function getOptionsHandler(db, noDefaultProfiles) | ||||
| 	if not defaultProfiles then | ||||
| 		generateDefaultProfiles(db) | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles } | ||||
| 	 | ||||
|  | ||||
| 	for k,v in pairs(OptionsHandlerPrototype) do | ||||
| 		handler[k] = v | ||||
| 	end | ||||
| 	 | ||||
|  | ||||
| 	AceDBOptions.handlers[db] = handler | ||||
| 	return handler | ||||
| end | ||||
|  | ||||
| --[[ | ||||
| 	the real options table  | ||||
| 	the real options table | ||||
| ]] | ||||
| local optionsTable = { | ||||
| 	desc = { | ||||
| @@ -436,7 +436,7 @@ local optionsTable = { | ||||
| --- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0. | ||||
| -- @param db The database object to create the options table for. | ||||
| -- @return The options table to be used in AceConfig-3.0 | ||||
| -- @usage  | ||||
| -- @usage | ||||
| -- -- Assuming `options` is your top-level options table and `self.db` is your database: | ||||
| -- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) | ||||
| function AceDBOptions:GetOptionsTable(db, noDefaultProfiles) | ||||
| @@ -445,7 +445,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles) | ||||
| 			name = L["profiles"], | ||||
| 			desc = L["profiles_sub"], | ||||
| 		} | ||||
| 	 | ||||
|  | ||||
| 	tbl.handler = getOptionsHandler(db, noDefaultProfiles) | ||||
| 	tbl.args = optionsTable | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ | ||||
| ..\FrameXML\UI.xsd"> | ||||
| 	<Script file="AceEvent-3.0.lua"/> | ||||
| </Ui> | ||||
| </Ui> | ||||
|   | ||||
| @@ -24,14 +24,14 @@ | ||||
| -- f:AddChild(btn) | ||||
| -- @class file | ||||
| -- @name AceGUI-3.0 | ||||
| -- @release $Id: AceGUI-3.0.lua 1228 2019-09-06 08:51:17Z nevcairiel $ | ||||
| local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 40 | ||||
| -- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $ | ||||
| local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41 | ||||
| local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) | ||||
|  | ||||
| if not AceGUI then return end -- No upgrade needed | ||||
|  | ||||
| -- Lua APIs | ||||
| local tinsert = table.insert | ||||
| local tinsert, wipe = table.insert, table.wipe | ||||
| local select, pairs, next, type = select, pairs, next, type | ||||
| local error, assert = error, assert | ||||
| local setmetatable, rawget = setmetatable, rawget | ||||
| @@ -212,6 +212,22 @@ function AceGUI:Release(widget) | ||||
| 	delWidget(widget, widget.type) | ||||
| end | ||||
|  | ||||
| --- Check if a widget is currently in the process of being released | ||||
| -- This function check if this widget, or any of its parents (in which case it'll be released shortly as well) | ||||
| -- are currently being released. This allows addon to handle any callbacks accordingly. | ||||
| -- @param widget The widget to check | ||||
| function AceGUI:IsReleasing(widget) | ||||
| 	if widget.isQueuedForRelease then | ||||
| 		return true | ||||
| 	end | ||||
|  | ||||
| 	if widget.parent and widget.parent.AceGUIWidgetVersion then | ||||
| 		return AceGUI:IsReleasing(widget.parent) | ||||
| 	end | ||||
|  | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| ----------- | ||||
| -- Focus -- | ||||
| ----------- | ||||
| @@ -338,6 +354,10 @@ do | ||||
| 		AceGUI:Release(self) | ||||
| 	end | ||||
|  | ||||
| 	WidgetBase.IsReleasing = function(self) | ||||
| 		return AceGUI:IsReleasing(self) | ||||
| 	end | ||||
|  | ||||
| 	WidgetBase.SetPoint = function(self, ...) | ||||
| 		return self.frame:SetPoint(...) | ||||
| 	end | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| BlizOptionsGroup Container | ||||
| Simple container widget for the integration of AceGUI into the Blizzard Interface Options | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "BlizOptionsGroup", 21 | ||||
| local Type, Version = "BlizOptionsGroup", 22 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -99,7 +99,7 @@ local methods = { | ||||
| Constructor | ||||
| -------------------------------------------------------------------------------]] | ||||
| local function Constructor() | ||||
| 	local frame = CreateFrame("Frame") | ||||
| 	local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer) | ||||
| 	frame:Hide() | ||||
|  | ||||
| 	-- support functions for the Blizzard Interface Options | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| DropdownGroup Container | ||||
| Container controlled by a dropdown on the top. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "DropdownGroup", 21 | ||||
| local Type, Version = "DropdownGroup", 22 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -125,7 +125,7 @@ local function Constructor() | ||||
| 	dropdown.frame:Show() | ||||
| 	dropdown:SetLabel("") | ||||
|  | ||||
| 	local border = CreateFrame("Frame", nil, frame) | ||||
| 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	border:SetPoint("TOPLEFT", 0, -26) | ||||
| 	border:SetPoint("BOTTOMRIGHT", 0, 3) | ||||
| 	border:SetBackdrop(PaneBackdrop) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| --[[----------------------------------------------------------------------------- | ||||
| Frame Container | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "Frame", 26 | ||||
| local Type, Version = "Frame", 28 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -83,6 +83,7 @@ local methods = { | ||||
| 	["OnAcquire"] = function(self) | ||||
| 		self.frame:SetParent(UIParent) | ||||
| 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG") | ||||
| 		self.frame:SetFrameLevel(100) -- Lots of room to draw under it | ||||
| 		self:SetTitle() | ||||
| 		self:SetStatusText() | ||||
| 		self:ApplyStatus() | ||||
| @@ -179,13 +180,14 @@ local PaneBackdrop  = { | ||||
| } | ||||
|  | ||||
| local function Constructor() | ||||
| 	local frame = CreateFrame("Frame", nil, UIParent) | ||||
| 	local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	frame:Hide() | ||||
|  | ||||
| 	frame:EnableMouse(true) | ||||
| 	frame:SetMovable(true) | ||||
| 	frame:SetResizable(true) | ||||
| 	frame:SetFrameStrata("FULLSCREEN_DIALOG") | ||||
| 	frame:SetFrameLevel(100) -- Lots of room to draw under it | ||||
| 	frame:SetBackdrop(FrameBackdrop) | ||||
| 	frame:SetBackdropColor(0, 0, 0, 1) | ||||
| 	frame:SetMinResize(400, 200) | ||||
| @@ -201,7 +203,7 @@ local function Constructor() | ||||
| 	closebutton:SetWidth(100) | ||||
| 	closebutton:SetText(CLOSE) | ||||
|  | ||||
| 	local statusbg = CreateFrame("Button", nil, frame) | ||||
| 	local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	statusbg:SetPoint("BOTTOMLEFT", 15, 15) | ||||
| 	statusbg:SetPoint("BOTTOMRIGHT", -132, 15) | ||||
| 	statusbg:SetHeight(24) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| InlineGroup Container | ||||
| Simple container widget that creates a visible "box" with an optional title. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "InlineGroup", 21 | ||||
| local Type, Version = "InlineGroup", 22 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -75,7 +75,7 @@ local function Constructor() | ||||
| 	titletext:SetJustifyH("LEFT") | ||||
| 	titletext:SetHeight(18) | ||||
|  | ||||
| 	local border = CreateFrame("Frame", nil, frame) | ||||
| 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	border:SetPoint("TOPLEFT", 0, -17) | ||||
| 	border:SetPoint("BOTTOMRIGHT", -1, 3) | ||||
| 	border:SetBackdrop(PaneBackdrop) | ||||
|   | ||||
| @@ -2,12 +2,12 @@ | ||||
| TabGroup Container | ||||
| Container that uses tabs on top to switch between groups. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "TabGroup", 36 | ||||
| local Type, Version = "TabGroup", 37 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| -- Lua APIs | ||||
| local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe | ||||
| local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, table.wipe | ||||
|  | ||||
| -- WoW APIs | ||||
| local PlaySound = PlaySound | ||||
| @@ -316,7 +316,7 @@ local function Constructor() | ||||
| 	titletext:SetHeight(18) | ||||
| 	titletext:SetText("") | ||||
|  | ||||
| 	local border = CreateFrame("Frame", nil, frame) | ||||
| 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	border:SetPoint("TOPLEFT", 1, -27) | ||||
| 	border:SetPoint("BOTTOMRIGHT", -1, 3) | ||||
| 	border:SetBackdrop(PaneBackdrop) | ||||
|   | ||||
| @@ -2,12 +2,10 @@ | ||||
| TreeGroup Container | ||||
| Container that uses a tree control to switch between groups. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "TreeGroup", 44 | ||||
| local Type, Version = "TreeGroup", 45 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| local WoW80 = select(4, GetBuildInfo()) >= 80000 | ||||
|  | ||||
| -- Lua APIs | ||||
| local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type | ||||
| local math_min, math_max, floor = math.min, math.max, floor | ||||
| @@ -422,8 +420,7 @@ local methods = { | ||||
| 		local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18)) | ||||
| 		if maxlines <= 0 then return end | ||||
|  | ||||
| 		-- workaround for lag spikes on WoW 8.0 | ||||
| 		if WoW80 and self.frame:GetParent() == UIParent and not fromOnUpdate then | ||||
| 		if self.frame:GetParent() == UIParent and not fromOnUpdate then | ||||
| 			self.frame:SetScript("OnUpdate", FirstFrameUpdate) | ||||
| 			return | ||||
| 		end | ||||
| @@ -632,7 +629,7 @@ local PaneBackdrop  = { | ||||
| local DraggerBackdrop  = { | ||||
| 	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", | ||||
| 	edgeFile = nil, | ||||
| 	tile = true, tileSize = 16, edgeSize = 0, | ||||
| 	tile = true, tileSize = 16, edgeSize = 1, | ||||
| 	insets = { left = 3, right = 3, top = 7, bottom = 7 } | ||||
| } | ||||
|  | ||||
| @@ -640,7 +637,7 @@ local function Constructor() | ||||
| 	local num = AceGUI:GetNextWidgetNum(Type) | ||||
| 	local frame = CreateFrame("Frame", nil, UIParent) | ||||
|  | ||||
| 	local treeframe = CreateFrame("Frame", nil, frame) | ||||
| 	local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	treeframe:SetPoint("TOPLEFT") | ||||
| 	treeframe:SetPoint("BOTTOMLEFT") | ||||
| 	treeframe:SetWidth(DEFAULT_TREE_WIDTH) | ||||
| @@ -655,7 +652,7 @@ local function Constructor() | ||||
| 	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) | ||||
| 	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) | ||||
|  | ||||
| 	local dragger = CreateFrame("Frame", nil, treeframe) | ||||
| 	local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	dragger:SetWidth(8) | ||||
| 	dragger:SetPoint("TOP", treeframe, "TOPRIGHT") | ||||
| 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT") | ||||
| @@ -680,7 +677,7 @@ local function Constructor() | ||||
| 	scrollbg:SetAllPoints(scrollbar) | ||||
| 	scrollbg:SetColorTexture(0,0,0,0.4) | ||||
|  | ||||
| 	local border = CreateFrame("Frame",nil,frame) | ||||
| 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT") | ||||
| 	border:SetPoint("BOTTOMRIGHT") | ||||
| 	border:SetBackdrop(PaneBackdrop) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| --[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]-- | ||||
| --[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]-- | ||||
| local AceGUI = LibStub("AceGUI-3.0") | ||||
|  | ||||
| -- Lua APIs | ||||
| @@ -39,7 +39,7 @@ end | ||||
|  | ||||
| do | ||||
| 	local widgetType = "Dropdown-Pullout" | ||||
| 	local widgetVersion = 3 | ||||
| 	local widgetVersion = 5 | ||||
|  | ||||
| 	--[[ Static data ]]-- | ||||
|  | ||||
| @@ -193,12 +193,7 @@ do | ||||
|  | ||||
| 		local height = 8 | ||||
| 		for i, item in pairs(items) do | ||||
| 			if i == 1 then | ||||
| 				item:SetPoint("TOP", itemFrame, "TOP", 0, -2) | ||||
| 			else | ||||
| 				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1) | ||||
| 			end | ||||
|  | ||||
| 			item:SetPoint("TOP", itemFrame, "TOP", 0, -2 + (i - 1) * -16) | ||||
| 			item:Show() | ||||
|  | ||||
| 			height = height + 16 | ||||
| @@ -258,7 +253,7 @@ do | ||||
|  | ||||
| 	local function Constructor() | ||||
| 		local count = AceGUI:GetNextWidgetNum(widgetType) | ||||
| 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent) | ||||
| 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 		local self = {} | ||||
| 		self.count = count | ||||
| 		self.type = widgetType | ||||
| @@ -309,7 +304,7 @@ do | ||||
| 		scrollFrame.obj = self | ||||
| 		itemFrame.obj = self | ||||
|  | ||||
| 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame) | ||||
| 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 		slider:SetOrientation("VERTICAL") | ||||
| 		slider:SetHitRectInsets(0, 0, -10, 0) | ||||
| 		slider:SetBackdrop(sliderBackdrop) | ||||
| @@ -356,7 +351,7 @@ end | ||||
|  | ||||
| do | ||||
| 	local widgetType = "Dropdown" | ||||
| 	local widgetVersion = 34 | ||||
| 	local widgetVersion = 35 | ||||
|  | ||||
| 	--[[ Static data ]]-- | ||||
|  | ||||
| @@ -465,6 +460,7 @@ do | ||||
| 		self:SetWidth(200) | ||||
| 		self:SetLabel() | ||||
| 		self:SetPulloutWidth(nil) | ||||
| 		self.list = {} | ||||
| 	end | ||||
|  | ||||
| 	-- exported, AceGUI callback | ||||
| @@ -535,9 +531,7 @@ do | ||||
|  | ||||
| 	-- exported | ||||
| 	local function SetValue(self, value) | ||||
| 		if self.list then | ||||
| 			self:SetText(self.list[value] or "") | ||||
| 		end | ||||
| 		self:SetText(self.list[value] or "") | ||||
| 		self.value = value | ||||
| 	end | ||||
|  | ||||
| @@ -601,7 +595,7 @@ do | ||||
| 		end | ||||
| 	end | ||||
| 	local function SetList(self, list, order, itemType) | ||||
| 		self.list = list | ||||
| 		self.list = list or {} | ||||
| 		self.pullout:Clear() | ||||
| 		self.hasClose = nil | ||||
| 		if not list then return end | ||||
| @@ -629,10 +623,8 @@ do | ||||
|  | ||||
| 	-- exported | ||||
| 	local function AddItem(self, value, text, itemType) | ||||
| 		if self.list then | ||||
| 			self.list[value] = text | ||||
| 			AddListItem(self, value, text, itemType) | ||||
| 		end | ||||
| 		self.list[value] = text | ||||
| 		AddListItem(self, value, text, itemType) | ||||
| 	end | ||||
|  | ||||
| 	-- exported | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| Keybinding Widget | ||||
| Set Keybindings in the Config UI. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "Keybinding", 25 | ||||
| local Type, Version = "Keybinding", 26 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -214,7 +214,7 @@ local function Constructor() | ||||
| 	label:SetJustifyH("CENTER") | ||||
| 	label:SetHeight(18) | ||||
|  | ||||
| 	local msgframe = CreateFrame("Frame", nil, UIParent) | ||||
| 	local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	msgframe:SetHeight(30) | ||||
| 	msgframe:SetBackdrop(ControlBackdrop) | ||||
| 	msgframe:SetBackdropColor(0,0,0) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| Label Widget | ||||
| Displays text and optionally an icon. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "Label", 26 | ||||
| local Type, Version = "Label", 27 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -130,6 +130,7 @@ local methods = { | ||||
|  | ||||
| 	["SetFont"] = function(self, font, height, flags) | ||||
| 		self.label:SetFont(font, height, flags) | ||||
| 		UpdateImageAnchor(self) | ||||
| 	end, | ||||
|  | ||||
| 	["SetFontObject"] = function(self, font) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| local Type, Version = "MultiLineEditBox", 28 | ||||
| local Type, Version = "MultiLineEditBox", 29 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -297,7 +297,7 @@ local function Constructor() | ||||
| 	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1) | ||||
| 	text:SetJustifyV("MIDDLE") | ||||
|  | ||||
| 	local scrollBG = CreateFrame("Frame", nil, frame) | ||||
| 	local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	scrollBG:SetBackdrop(backdrop) | ||||
| 	scrollBG:SetBackdropColor(0, 0, 0) | ||||
| 	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| Slider Widget | ||||
| Graphical Slider, like, for Range values. | ||||
| -------------------------------------------------------------------------------]] | ||||
| local Type, Version = "Slider", 22 | ||||
| local Type, Version = "Slider", 23 | ||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||
|  | ||||
| @@ -225,7 +225,7 @@ local function Constructor() | ||||
| 	label:SetJustifyH("CENTER") | ||||
| 	label:SetHeight(15) | ||||
|  | ||||
| 	local slider = CreateFrame("Slider", nil, frame) | ||||
| 	local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	slider:SetOrientation("HORIZONTAL") | ||||
| 	slider:SetHeight(15) | ||||
| 	slider:SetHitRectInsets(0, 0, -10, 0) | ||||
| @@ -247,7 +247,7 @@ local function Constructor() | ||||
| 	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") | ||||
| 	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3) | ||||
|  | ||||
| 	local editbox = CreateFrame("EditBox", nil, frame) | ||||
| 	local editbox = CreateFrame("EditBox", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||
| 	editbox:SetAutoFocus(false) | ||||
| 	editbox:SetFontObject(GameFontHighlightSmall) | ||||
| 	editbox:SetPoint("TOP", slider, "BOTTOM") | ||||
|   | ||||
| @@ -9,8 +9,8 @@ | ||||
| -- make into AceHook. | ||||
| -- @class file | ||||
| -- @name AceHook-3.0 | ||||
| -- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||
| local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8 | ||||
| -- @release $Id: AceHook-3.0.lua 1243 2020-10-18 00:00:19Z nevcairiel $ | ||||
| local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9 | ||||
| local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) | ||||
|  | ||||
| if not AceHook then return end -- No upgrade needed | ||||
| @@ -478,10 +478,10 @@ function AceHook:UnhookAll() | ||||
| 	for key, value in pairs(registry[self]) do | ||||
| 		if type(key) == "table" then | ||||
| 			for method in pairs(value) do | ||||
| 				self:Unhook(key, method) | ||||
| 				AceHook.Unhook(self, key, method) | ||||
| 			end | ||||
| 		else | ||||
| 			self:Unhook(key) | ||||
| 			AceHook.Unhook(self, key) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ | ||||
| ..\FrameXML\UI.xsd"> | ||||
| 	<Script file="AceHook-3.0.lua"/> | ||||
| </Ui> | ||||
| </Ui> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ | ||||
| ..\FrameXML\UI.xsd"> | ||||
| 	<Script file="AceLocale-3.0.lua"/> | ||||
| </Ui> | ||||
| </Ui> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| --[[ $Id: CallbackHandler-1.0.lua 22 2018-07-21 14:17:22Z nevcairiel $ ]] | ||||
| --[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]] | ||||
| local MAJOR, MINOR = "CallbackHandler-1.0", 7 | ||||
| local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ | ||||
| ..\FrameXML\UI.xsd"> | ||||
| 	<Script file="CallbackHandler-1.0.lua"/> | ||||
| </Ui> | ||||
| </Ui> | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| -- | ||||
|  | ||||
| local DBICON10 = "LibDBIcon-1.0" | ||||
| local DBICON10_MINOR = 43 -- Bump on changes | ||||
| local DBICON10_MINOR = 44 -- Bump on changes | ||||
| if not LibStub then error(DBICON10 .. " requires LibStub.") end | ||||
| local ldb = LibStub("LibDataBroker-1.1", true) | ||||
| if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end | ||||
| @@ -18,8 +18,8 @@ lib.callbackRegistered = lib.callbackRegistered or nil | ||||
| lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) | ||||
| lib.notCreated = lib.notCreated or {} | ||||
| lib.radius = lib.radius or 5 | ||||
| local next, Minimap, CreateFrame = next, Minimap, CreateFrame | ||||
| lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") | ||||
| local next, Minimap = next, Minimap | ||||
| local isDraggingButton = false | ||||
|  | ||||
| function lib:IconCallback(event, name, key, value) | ||||
| @@ -218,8 +218,14 @@ local function createButton(name, object, db) | ||||
| 	button.dataObject = object | ||||
| 	button.db = db | ||||
| 	button:SetFrameStrata("MEDIUM") | ||||
| 	button:SetSize(31, 31) | ||||
| 	if button.SetFixedFrameStrata then -- Classic support | ||||
| 		button:SetFixedFrameStrata(true) | ||||
| 	end | ||||
| 	button:SetFrameLevel(8) | ||||
| 	if button.SetFixedFrameLevel then -- Classic support | ||||
| 		button:SetFixedFrameLevel(true) | ||||
| 	end | ||||
| 	button:SetSize(31, 31) | ||||
| 	button:RegisterForClicks("anyUp") | ||||
| 	button:RegisterForDrag("LeftButton") | ||||
| 	button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" | ||||
|   | ||||
| @@ -1,13 +1,22 @@ | ||||
| -- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $ | ||||
| -- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info | ||||
| -- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke | ||||
| -- LibStub is hereby placed in the Public Domain | ||||
| -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke | ||||
| local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! | ||||
| local LibStub = _G[LIBSTUB_MAJOR] | ||||
|  | ||||
| -- Check to see is this version of the stub is obsolete | ||||
| if not LibStub or LibStub.minor < LIBSTUB_MINOR then | ||||
| 	LibStub = LibStub or {libs = {}, minors = {} } | ||||
| 	_G[LIBSTUB_MAJOR] = LibStub | ||||
| 	LibStub.minor = LIBSTUB_MINOR | ||||
| 	 | ||||
| 	-- LibStub:NewLibrary(major, minor) | ||||
| 	-- major (string) - the major version of the library | ||||
| 	-- minor (string or number ) - the minor version of the library | ||||
| 	--  | ||||
| 	-- returns nil if a newer or same version of the lib is already present | ||||
| 	-- returns empty library object or old library object if upgrade is needed | ||||
| 	function LibStub:NewLibrary(major, minor) | ||||
| 		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") | ||||
| 		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") | ||||
| @@ -18,6 +27,12 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then | ||||
| 		return self.libs[major], oldminor | ||||
| 	end | ||||
| 	 | ||||
| 	-- LibStub:GetLibrary(major, [silent]) | ||||
| 	-- major (string) - the major version of the library | ||||
| 	-- silent (boolean) - if true, library is optional, silently return nil if its not found | ||||
| 	-- | ||||
| 	-- throws an error if the library can not be found (except silent is set) | ||||
| 	-- returns the library object if found | ||||
| 	function LibStub:GetLibrary(major, silent) | ||||
| 		if not self.libs[major] and not silent then | ||||
| 			error(("Cannot find a library instance of %q."):format(tostring(major)), 2) | ||||
| @@ -25,6 +40,12 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then | ||||
| 		return self.libs[major], self.minors[major] | ||||
| 	end | ||||
| 	 | ||||
| 	function LibStub:IterateLibraries() return pairs(self.libs) end | ||||
| 	-- LibStub:IterateLibraries() | ||||
| 	--  | ||||
| 	-- Returns an iterator for the currently registered libraries | ||||
| 	function LibStub:IterateLibraries()  | ||||
| 		return pairs(self.libs)  | ||||
| 	end | ||||
| 	 | ||||
| 	setmetatable(LibStub, { __call = LibStub.GetLibrary }) | ||||
| end | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| ## Interface: 20400 | ||||
| ## Title: Lib: LibStub | ||||
| ## Notes: Universal Library Stub | ||||
| ## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel | ||||
| ## X-Website: http://jira.wowace.com/browse/LS | ||||
| ## X-Category: Library | ||||
| ## X-License: Public Domain	 | ||||
|  | ||||
| LibStub.lua | ||||
		Reference in New Issue
	
	Block a user