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:
		| @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. | |||||||
| The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),  | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),  | ||||||
| and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||||||
|  |  | ||||||
|  | ## Version 1.1.3 - 2021-10-06 | ||||||
|  | ### Changed | ||||||
|  | - bumped version for all versions of WoW (Classic Era, Season of Mastery, BCC, Retail) | ||||||
|  | ### Fixed | ||||||
|  | - error on missing options at first start | ||||||
|  | - updated Ace3.0 libraries for latest Shadowlands patch | ||||||
|  |  | ||||||
| ## Version 1.1.2 - 2021-05-23 | ## Version 1.1.2 - 2021-05-23 | ||||||
| ### Changed | ### Changed | ||||||
| - adopted to BigWigs release script to better support different game packages | - adopted to BigWigs release script to better support different game packages | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| ## Interface: 11307 | ## Interface: 11401 | ||||||
| ## Interface-Classic: 11307 | ## Interface-Classic: 11401 | ||||||
| ## Interface-BCC: 20501 | ## Interface-BCC: 20502 | ||||||
| ## Interface-Retail: 90005 | ## Interface-Retail: 90100 | ||||||
|  |  | ||||||
| ## Title: Grichelde | ## Title: Grichelde | ||||||
| ## Notes: Replaces characters of your chat input line before sending. | ## Notes: Replaces characters of your chat input line before sending. | ||||||
| ## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile vor dem Versenden. | ## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile vor dem Versenden. | ||||||
| #@debug@ | #@debug@ | ||||||
| ## Version: 1.1.2 | ## Version: 1.1.3 | ||||||
| #@end-debug@ | #@end-debug@ | ||||||
| #@non-debug@ | #@non-debug@ | ||||||
| # ## Version: @project-version@ | # ## Version: @project-version@ | ||||||
| @@ -17,19 +17,19 @@ | |||||||
|  |  | ||||||
| #@version-classic@ | #@version-classic@ | ||||||
| ## X-Build: Classic | ## X-Build: Classic | ||||||
| ## X-Compatible: 20501 | ## X-Compatible: 20502 | ||||||
| ## X-Compatible: 90005 | ## X-Compatible: 90100 | ||||||
| #@end-version-classic@ | #@end-version-classic@ | ||||||
| #@non-version-classic@ | #@non-version-classic@ | ||||||
| #@version-bcc@ | #@version-bcc@ | ||||||
| # ## X-Build: BCC | # ## X-Build: BCC | ||||||
| # ## X-Compatible: 11307 | # ## X-Compatible: 11401 | ||||||
| # ## X-Compatible: 90005 | # ## X-Compatible: 90100 | ||||||
| #@end-version-bcc@ | #@end-version-bcc@ | ||||||
| #@version-retail@ | #@version-retail@ | ||||||
| # ## X-Build: Retail | # ## X-Build: Retail | ||||||
| # ## X-Compatible: 11307 | # ## X-Compatible: 11401 | ||||||
| # ## X-Compatible: 20501 | # ## X-Compatible: 20502 | ||||||
| #@end-version-retail@ | #@end-version-retail@ | ||||||
| #@end-non-version-classic@ | #@end-non-version-classic@ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -254,7 +254,7 @@ function Grichelde:CreateOptionsUI() | |||||||
|                                 name = self.L.Options_Help_Examples_Import_Name, |                                 name = self.L.Options_Help_Examples_Import_Name, | ||||||
|                                 -- desc = self.L.Options_Help_Examples_Import_Desc, |                                 -- desc = self.L.Options_Help_Examples_Import_Desc, | ||||||
|                                 desc = function() return format(self.L.Options_Help_Examples_Import_Desc, cPrefix(self.L.Options_Help_Examples[selectedExample].name)) end, |                                 desc = function() return format(self.L.Options_Help_Examples_Import_Desc, cPrefix(self.L.Options_Help_Examples[selectedExample].name)) end, | ||||||
|                                 func = function(info) self:ImportExample(selectedExample) end, |                                 func = function(_) self:ImportExample(selectedExample) end, | ||||||
|                             }, |                             }, | ||||||
|  |  | ||||||
|                             spacer4 = { |                             spacer4 = { | ||||||
| @@ -617,17 +617,19 @@ function Grichelde:RefreshOptions(replacementsTable) | |||||||
|     self:TracePrint("RefreshOptions : DB table:") |     self:TracePrint("RefreshOptions : DB table:") | ||||||
|     self:TracePrint(replacementsTable) |     self:TracePrint(replacementsTable) | ||||||
|  |  | ||||||
|     -- remove all previous replacements from options (not DB), except header and buttons |     if (self.options ~= nil) then | ||||||
|     local replacements = self.options.args.replacements.args or {} |         -- remove all previous replacements from options (not DB), except header and buttons | ||||||
|     for k, _ in pairs(replacements) do |         local replacements = self.options.args.replacements.args or {} | ||||||
|         if (k and (find(k, "^replacement_") ~= nil)) then |         for k, _ in pairs(replacements) do | ||||||
|             replacements[k] = nil |             if (k and (find(k, "^replacement_") ~= nil)) then | ||||||
|  |                 replacements[k] = nil | ||||||
|  |             end | ||||||
|         end |         end | ||||||
|     end |  | ||||||
|  |  | ||||||
|     for replName, _ in pairs(replacementsTable or {}) do |         for replName, _ in pairs(replacementsTable or {}) do | ||||||
|         local _, replNumber = self:SplitOnFirstMatch(replName, "_") |             local _, replNumber = self:SplitOnFirstMatch(replName, "_") | ||||||
|         replacements[replName] = self:CreateMapping(toNumber(replNumber)) |             replacements[replName] = self:CreateMapping(toNumber(replNumber)) | ||||||
|  |         end | ||||||
|     end |     end | ||||||
|  |  | ||||||
| --  self:TracePrint("RefreshOptions : UI options:") | --  self:TracePrint("RefreshOptions : UI options:") | ||||||
| @@ -635,7 +637,9 @@ function Grichelde:RefreshOptions(replacementsTable) | |||||||
| end | end | ||||||
|  |  | ||||||
| function Grichelde:RefreshDialog() | function Grichelde:RefreshDialog() | ||||||
|     self.dialog:ConfigTableChanged(nil, self.name) |     if (self.dialog ~= nil) then | ||||||
|  |         self.dialog:ConfigTableChanged(nil, self.name) | ||||||
|  |     end | ||||||
| end | end | ||||||
|  |  | ||||||
| function Grichelde:AddEmptyMapping() | function Grichelde:AddEmptyMapping() | ||||||
|   | |||||||
| @@ -28,9 +28,9 @@ | |||||||
| -- end | -- end | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceAddon-3.0.lua | -- @name AceAddon-3.0.lua | ||||||
| -- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | -- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $ | ||||||
|  |  | ||||||
| local MAJOR, MINOR = "AceAddon-3.0", 12 | local MAJOR, MINOR = "AceAddon-3.0", 13 | ||||||
| local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | ||||||
|  |  | ||||||
| if not AceAddon then return end -- No Upgrade needed. | if not AceAddon then return end -- No Upgrade needed. | ||||||
| @@ -601,10 +601,20 @@ function AceAddon:IterateAddonStatus() return pairs(self.statuses) end | |||||||
| function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end | function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end | ||||||
| function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end | function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end | ||||||
|  |  | ||||||
|  | -- Blizzard AddOns which can load very early in the loading process and mess with Ace3 addon loading | ||||||
|  | local BlizzardEarlyLoadAddons = { | ||||||
|  | 	Blizzard_DebugTools = true, | ||||||
|  | 	Blizzard_TimeManager = true, | ||||||
|  | 	Blizzard_BattlefieldMap = true, | ||||||
|  | 	Blizzard_MapCanvas = true, | ||||||
|  | 	Blizzard_SharedMapDataProviders = true, | ||||||
|  | 	Blizzard_CombatLog = true, | ||||||
|  | } | ||||||
|  |  | ||||||
| -- Event Handling | -- Event Handling | ||||||
| local function onEvent(this, event, arg1) | local function onEvent(this, event, arg1) | ||||||
| 	-- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up | 	-- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process | ||||||
| 	if (event == "ADDON_LOADED"  and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then | 	if (event == "ADDON_LOADED"  and (arg1 == nil or not BlizzardEarlyLoadAddons[arg1])) or event == "PLAYER_LOGIN" then | ||||||
| 		-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration | 		-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration | ||||||
| 		while(#AceAddon.initializequeue > 0) do | 		while(#AceAddon.initializequeue > 0) do | ||||||
| 			local addon = tremove(AceAddon.initializequeue, 1) | 			local addon = tremove(AceAddon.initializequeue, 1) | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| -- as well as associate it with a slash command. | -- as well as associate it with a slash command. | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceConfig-3.0 | -- @name AceConfig-3.0 | ||||||
| -- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ | -- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||||
|  |  | ||||||
| --[[ | --[[ | ||||||
| AceConfig-3.0 | AceConfig-3.0 | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames. | --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames. | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceConfigCmd-3.0 | -- @name AceConfigCmd-3.0 | ||||||
| -- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ | -- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||||
|  |  | ||||||
| --[[ | --[[ | ||||||
| AceConfigCmd-3.0 | AceConfigCmd-3.0 | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. | --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceConfigDialog-3.0 | -- @name AceConfigDialog-3.0 | ||||||
| -- @release $Id: AceConfigDialog-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $ | -- @release $Id: AceConfigDialog-3.0.lua 1248 2021-02-05 14:27:49Z funkehdude $ | ||||||
|  |  | ||||||
| local LibStub = LibStub | local LibStub = LibStub | ||||||
| local gui = LibStub("AceGUI-3.0") | local gui = LibStub("AceGUI-3.0") | ||||||
| local reg = LibStub("AceConfigRegistry-3.0") | local reg = LibStub("AceConfigRegistry-3.0") | ||||||
|  |  | ||||||
| local MAJOR, MINOR = "AceConfigDialog-3.0", 66 | local MAJOR, MINOR = "AceConfigDialog-3.0", 81 | ||||||
| local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) | ||||||
|  |  | ||||||
| if not AceConfigDialog then return end | if not AceConfigDialog then return end | ||||||
| @@ -15,22 +15,23 @@ if not AceConfigDialog then return end | |||||||
| AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {} | AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {} | ||||||
| AceConfigDialog.Status = AceConfigDialog.Status or {} | AceConfigDialog.Status = AceConfigDialog.Status or {} | ||||||
| AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame") | AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame") | ||||||
|  | AceConfigDialog.tooltip = AceConfigDialog.tooltip or CreateFrame("GameTooltip", "AceConfigDialogTooltip", UIParent, "GameTooltipTemplate") | ||||||
|  |  | ||||||
| AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {} | AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {} | ||||||
| AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {} | AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {} | ||||||
| AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} | AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} | ||||||
|  |  | ||||||
| -- Lua APIs | -- Lua APIs | ||||||
| local tconcat, tinsert, tsort, tremove, tsort = table.concat, table.insert, table.sort, table.remove, table.sort | local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe | ||||||
| local strmatch, format = string.match, string.format | local strmatch, format = string.match, string.format | ||||||
| local assert, loadstring, error = assert, loadstring, error | local error = error | ||||||
| local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs | local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs | ||||||
| local rawset, tostring, tonumber = rawset, tostring, tonumber | local tostring, tonumber = tostring, tonumber | ||||||
| local math_min, math_max, math_floor = math.min, math.max, math.floor | local math_min, math_max, math_floor = math.min, math.max, math.floor | ||||||
|  |  | ||||||
| -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded | -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded | ||||||
| -- List them here for Mikk's FindGlobals script | -- List them here for Mikk's FindGlobals script | ||||||
| -- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show | -- GLOBALS: NORMAL_FONT_COLOR, ACCEPT, CANCEL | ||||||
| -- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge | -- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge | ||||||
| -- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler | -- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler | ||||||
|  |  | ||||||
| @@ -45,39 +46,10 @@ local function errorhandler(err) | |||||||
| 	return geterrorhandler()(err) | 	return geterrorhandler()(err) | ||||||
| end | end | ||||||
|  |  | ||||||
| local function CreateDispatcher(argCount) |  | ||||||
| 	local code = [[ |  | ||||||
| 		local xpcall, eh = ... |  | ||||||
| 		local method, ARGS |  | ||||||
| 		local function call() return method(ARGS) end |  | ||||||
| 	 |  | ||||||
| 		local function dispatch(func, ...) |  | ||||||
| 			 method = func |  | ||||||
| 			 if not method then return end |  | ||||||
| 			 ARGS = ... |  | ||||||
| 			 return xpcall(call, eh) |  | ||||||
| 		end |  | ||||||
| 	 |  | ||||||
| 		return dispatch |  | ||||||
| 	]] |  | ||||||
| 	 |  | ||||||
| 	local ARGS = {} |  | ||||||
| 	for i = 1, argCount do ARGS[i] = "arg"..i end |  | ||||||
| 	code = code:gsub("ARGS", tconcat(ARGS, ", ")) |  | ||||||
| 	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local Dispatchers = setmetatable({}, {__index=function(self, argCount) |  | ||||||
| 	local dispatcher = CreateDispatcher(argCount) |  | ||||||
| 	rawset(self, argCount, dispatcher) |  | ||||||
| 	return dispatcher |  | ||||||
| end}) |  | ||||||
| Dispatchers[0] = function(func) |  | ||||||
| 	return xpcall(func, errorhandler) |  | ||||||
| end |  | ||||||
|   |  | ||||||
| local function safecall(func, ...) | local function safecall(func, ...) | ||||||
| 	return Dispatchers[select("#", ...)](func, ...) | 	if func then | ||||||
|  | 		return xpcall(func, errorhandler, ...) | ||||||
|  | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| local width_multiplier = 170 | local width_multiplier = 170 | ||||||
| @@ -85,18 +57,18 @@ local width_multiplier = 170 | |||||||
| --[[ | --[[ | ||||||
| Group Types | Group Types | ||||||
|   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree |   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree | ||||||
|   		- Descendant Groups with inline=true and thier children will not become nodes |         - Descendant Groups with inline=true and thier children will not become nodes | ||||||
|  |  | ||||||
|   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control |   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control | ||||||
|   		- Grandchild groups will default to inline unless specified otherwise |         - Grandchild groups will default to inline unless specified otherwise | ||||||
|  |  | ||||||
|   Select- Same as Tab but with entries in a dropdown rather than tabs |   Select- Same as Tab but with entries in a dropdown rather than tabs | ||||||
|  |  | ||||||
|  |  | ||||||
|   Inline Groups |   Inline Groups | ||||||
|   	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border |     - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border | ||||||
|   	- If declared on a direct child of a root node of a select group, they will appear above the group container control |     - If declared on a direct child of a root node of a select group, they will appear above the group container control | ||||||
|   	- When a group is displayed inline, all descendants will also be inline members of the group |     - When a group is displayed inline, all descendants will also be inline members of the group | ||||||
|  |  | ||||||
| ]] | ]] | ||||||
|  |  | ||||||
| @@ -325,7 +297,7 @@ local function compareOptions(a,b) | |||||||
| 		return NameA:upper() < NameB:upper() | 		return NameA:upper() < NameB:upper() | ||||||
| 	end | 	end | ||||||
| 	if OrderA < 0 then | 	if OrderA < 0 then | ||||||
| 		if OrderB > 0 then | 		if OrderB >= 0 then | ||||||
| 			return false | 			return false | ||||||
| 		end | 		end | ||||||
| 	else | 	else | ||||||
| @@ -533,8 +505,9 @@ local function OptionOnMouseOver(widget, event) | |||||||
| 	local options = user.options | 	local options = user.options | ||||||
| 	local path = user.path | 	local path = user.path | ||||||
| 	local appName = user.appName | 	local appName = user.appName | ||||||
|  | 	local tooltip = AceConfigDialog.tooltip | ||||||
|  |  | ||||||
| 	GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") | 	tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT") | ||||||
| 	local name = GetOptionsMemberValue("name", opt, options, path, appName) | 	local name = GetOptionsMemberValue("name", opt, options, path, appName) | ||||||
| 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName) | 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName) | ||||||
| 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName) | 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName) | ||||||
| @@ -542,23 +515,23 @@ local function OptionOnMouseOver(widget, event) | |||||||
|  |  | ||||||
| 	if descStyle and descStyle ~= "tooltip" then return end | 	if descStyle and descStyle ~= "tooltip" then return end | ||||||
|  |  | ||||||
| 	GameTooltip:SetText(name, 1, .82, 0, true) | 	tooltip:SetText(name, 1, .82, 0, true) | ||||||
|  |  | ||||||
| 	if opt.type == "multiselect" then | 	if opt.type == "multiselect" then | ||||||
| 		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) | 		tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) | ||||||
| 	end | 	end | ||||||
| 	if type(desc) == "string" then | 	if type(desc) == "string" then | ||||||
| 		GameTooltip:AddLine(desc, 1, 1, 1, true) | 		tooltip:AddLine(desc, 1, 1, 1, true) | ||||||
| 	end | 	end | ||||||
| 	if type(usage) == "string" then | 	if type(usage) == "string" then | ||||||
| 		GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) | 		tooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	GameTooltip:Show() | 	tooltip:Show() | ||||||
| end | end | ||||||
|  |  | ||||||
| local function OptionOnMouseLeave(widget, event) | local function OptionOnMouseLeave(widget, event) | ||||||
| 	GameTooltip:Hide() | 	AceConfigDialog.tooltip:Hide() | ||||||
| end | end | ||||||
|  |  | ||||||
| local function GetFuncName(option) | local function GetFuncName(option) | ||||||
| @@ -569,71 +542,127 @@ local function GetFuncName(option) | |||||||
| 		return "set" | 		return "set" | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
| local function confirmPopup(appName, rootframe, basepath, info, message, func, ...) | do | ||||||
| 	if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then | 	local frame = AceConfigDialog.popup | ||||||
| 		StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {} | 	if not frame or oldminor < 81 then | ||||||
| 	end | 		frame = CreateFrame("Frame", nil, UIParent) | ||||||
| 	local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] | 		AceConfigDialog.popup = frame | ||||||
| 	for k in pairs(t) do | 		frame:Hide() | ||||||
| 		t[k] = nil | 		frame:SetPoint("CENTER", UIParent, "CENTER") | ||||||
| 	end | 		frame:SetSize(320, 72) | ||||||
| 	t.text = message | 		frame:EnableMouse(true) -- Do not allow click-through on the frame | ||||||
| 	t.button1 = ACCEPT | 		frame:SetFrameStrata("TOOLTIP") | ||||||
| 	t.button2 = CANCEL | 		frame:SetFrameLevel(100) -- Lots of room to draw under it | ||||||
| 	t.preferredIndex = STATICPOPUP_NUMDIALOGS | 		frame:SetScript("OnKeyDown", function(self, key) | ||||||
| 	local dialog, oldstrata | 			if key == "ESCAPE" then | ||||||
| 	t.OnAccept = function() | 				self:SetPropagateKeyboardInput(false) | ||||||
| 		safecall(func, unpack(t)) | 				if self.cancel:IsShown() then | ||||||
| 		if dialog and oldstrata then | 					self.cancel:Click() | ||||||
| 			dialog:SetFrameStrata(oldstrata) | 				else -- Showing a validation error | ||||||
| 		end | 					self:Hide() | ||||||
| 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | 				end | ||||||
| 		del(info) | 			else | ||||||
| 	end | 				self:SetPropagateKeyboardInput(true) | ||||||
| 	t.OnCancel = function() | 			end | ||||||
| 		if dialog and oldstrata then | 		end) | ||||||
| 			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 |  | ||||||
|  |  | ||||||
| 	dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG") | 		if not frame.SetFixedFrameStrata then -- API capability check (classic check) | ||||||
| 	if dialog then | 			frame:SetBackdrop({ | ||||||
| 		oldstrata = dialog:GetFrameStrata() | 				bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], | ||||||
| 		dialog:SetFrameStrata("TOOLTIP") | 				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 | ||||||
| end | end | ||||||
|  | local function confirmPopup(appName, rootframe, basepath, info, message, func, ...) | ||||||
|  | 	local frame = AceConfigDialog.popup | ||||||
|  | 	frame:Show() | ||||||
|  | 	frame.text:SetText(message) | ||||||
|  | 	-- From StaticPopup.lua | ||||||
|  | 	-- local height = 32 + text:GetHeight() + 2; | ||||||
|  | 	-- height = height + 6 + accept:GetHeight() | ||||||
|  | 	-- We add 32 + 2 + 6 + 21 (button height) == 61 | ||||||
|  | 	local height = 61 + frame.text:GetHeight() | ||||||
|  | 	frame:SetHeight(height) | ||||||
|  |  | ||||||
|  | 	frame.accept:ClearAllPoints() | ||||||
|  | 	frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16) | ||||||
|  | 	frame.cancel:Show() | ||||||
|  |  | ||||||
|  | 	local t = {...} | ||||||
|  | 	local tCount = select("#", ...) | ||||||
|  | 	frame.accept:SetScript("OnClick", function(self) | ||||||
|  | 		safecall(func, unpack(t, 1, tCount)) -- Manually set count as unpack() stops on nil (bug with #table) | ||||||
|  | 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | ||||||
|  | 		frame:Hide() | ||||||
|  | 		self:SetScript("OnClick", nil) | ||||||
|  | 		frame.cancel:SetScript("OnClick", nil) | ||||||
|  | 		del(info) | ||||||
|  | 	end) | ||||||
|  | 	frame.cancel:SetScript("OnClick", function(self) | ||||||
|  | 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl)) | ||||||
|  | 		frame:Hide() | ||||||
|  | 		self:SetScript("OnClick", nil) | ||||||
|  | 		frame.accept:SetScript("OnClick", nil) | ||||||
|  | 		del(info) | ||||||
|  | 	end) | ||||||
|  | end | ||||||
|  |  | ||||||
| local function validationErrorPopup(message) | local function validationErrorPopup(message) | ||||||
| 	if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then | 	local frame = AceConfigDialog.popup | ||||||
| 		StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {} | 	frame:Show() | ||||||
| 	end | 	frame.text:SetText(message) | ||||||
| 	local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] | 	-- From StaticPopup.lua | ||||||
| 	t.text = message | 	-- local height = 32 + text:GetHeight() + 2; | ||||||
| 	t.button1 = OKAY | 	-- height = height + 6 + accept:GetHeight() | ||||||
| 	t.preferredIndex = STATICPOPUP_NUMDIALOGS | 	-- We add 32 + 2 + 6 + 21 (button height) == 61 | ||||||
| 	local dialog, oldstrata | 	local height = 61 + frame.text:GetHeight() | ||||||
| 	t.OnAccept = function() | 	frame:SetHeight(height) | ||||||
| 		if dialog and oldstrata then |  | ||||||
| 			dialog:SetFrameStrata(oldstrata) |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	t.timeout = 0 |  | ||||||
| 	t.whileDead = 1 |  | ||||||
| 	t.hideOnEscape = 1 |  | ||||||
|  |  | ||||||
| 	dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG") | 	frame.accept:ClearAllPoints() | ||||||
| 	if dialog then | 	frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16) | ||||||
| 		oldstrata = dialog:GetFrameStrata() | 	frame.cancel:Hide() | ||||||
| 		dialog:SetFrameStrata("TOOLTIP") |  | ||||||
| 	end | 	frame.accept:SetScript("OnClick", function() | ||||||
|  | 		frame:Hide() | ||||||
|  | 	end) | ||||||
| end | end | ||||||
|  |  | ||||||
| local function ActivateControl(widget, event, ...) | local function ActivateControl(widget, event, ...) | ||||||
| @@ -886,7 +915,7 @@ end | |||||||
|  |  | ||||||
| local function MultiControlOnClosed(widget, event, ...) | local function MultiControlOnClosed(widget, event, ...) | ||||||
| 	local user = widget:GetUserDataTable() | 	local user = widget:GetUserDataTable() | ||||||
| 	if user.valuechanged then | 	if user.valuechanged and not widget:IsReleasing() then | ||||||
| 		local iscustom = user.rootframe:GetUserData("iscustom") | 		local iscustom = user.rootframe:GetUserData("iscustom") | ||||||
| 		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl | 		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl | ||||||
| 		if iscustom then | 		if iscustom then | ||||||
| @@ -1064,6 +1093,23 @@ local function InjectInfo(control, options, option, path, rootframe, appName) | |||||||
| 	control:SetCallback("OnEnter", OptionOnMouseOver) | 	control:SetCallback("OnEnter", OptionOnMouseOver) | ||||||
| end | end | ||||||
|  |  | ||||||
|  | local function CreateControl(userControlType, fallbackControlType) | ||||||
|  | 	local control | ||||||
|  | 	if userControlType then | ||||||
|  | 		control = gui:Create(userControlType) | ||||||
|  | 		if not control then | ||||||
|  | 			geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(userControlType))) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	if not control then | ||||||
|  | 		control = gui:Create(fallbackControlType) | ||||||
|  | 	end | ||||||
|  | 	return control | ||||||
|  | end | ||||||
|  |  | ||||||
|  | local function sortTblAsStrings(x,y) | ||||||
|  | 	return tostring(x) < tostring(y) -- Support numbers as keys | ||||||
|  | end | ||||||
|  |  | ||||||
| --[[ | --[[ | ||||||
| 	options - root of the options table being fed | 	options - root of the options table being fed | ||||||
| @@ -1112,8 +1158,9 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) | 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) | ||||||
| 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) | 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) | ||||||
|  |  | ||||||
| 					if type(image) == "string" or type(image) == "number" then | 					local iconControl = type(image) == "string" or type(image) == "number" | ||||||
| 						control = gui:Create("Icon") | 					control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button") | ||||||
|  | 					if iconControl then | ||||||
| 						if not width then | 						if not width then | ||||||
| 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName) | 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName) | ||||||
| 						end | 						end | ||||||
| @@ -1134,18 +1181,12 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 						control:SetImageSize(width, height) | 						control:SetImageSize(width, height) | ||||||
| 						control:SetLabel(name) | 						control:SetLabel(name) | ||||||
| 					else | 					else | ||||||
| 						control = gui:Create("Button") |  | ||||||
| 						control:SetText(name) | 						control:SetText(name) | ||||||
| 					end | 					end | ||||||
| 					control:SetCallback("OnClick",ActivateControl) | 					control:SetCallback("OnClick",ActivateControl) | ||||||
|  |  | ||||||
| 				elseif v.type == "input" then | 				elseif v.type == "input" then | ||||||
| 					local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox" | 					control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox") | ||||||
| 					control = gui:Create(controlType) |  | ||||||
| 					if not control then |  | ||||||
| 						geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType))) |  | ||||||
| 						control = gui:Create(v.multiline and "MultiLineEditBox" or "EditBox") |  | ||||||
| 					end |  | ||||||
|  |  | ||||||
| 					if v.multiline and control.SetNumLines then | 					if v.multiline and control.SetNumLines then | ||||||
| 						control:SetNumLines(tonumber(v.multiline) or 4) | 						control:SetNumLines(tonumber(v.multiline) or 4) | ||||||
| @@ -1159,7 +1200,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 					control:SetText(text) | 					control:SetText(text) | ||||||
|  |  | ||||||
| 				elseif v.type == "toggle" then | 				elseif v.type == "toggle" then | ||||||
| 					control = gui:Create("CheckBox") | 					control = CreateControl(v.dialogControl or v.control, "CheckBox") | ||||||
| 					control:SetLabel(name) | 					control:SetLabel(name) | ||||||
| 					control:SetTriState(v.tristate) | 					control:SetTriState(v.tristate) | ||||||
| 					local value = GetOptionsMemberValue("get",v, options, path, appName) | 					local value = GetOptionsMemberValue("get",v, options, path, appName) | ||||||
| @@ -1182,7 +1223,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 						end | 						end | ||||||
| 					end | 					end | ||||||
| 				elseif v.type == "range" then | 				elseif v.type == "range" then | ||||||
| 					control = gui:Create("Slider") | 					control = CreateControl(v.dialogControl or v.control, "Slider") | ||||||
| 					control:SetLabel(name) | 					control:SetLabel(name) | ||||||
| 					control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0) | 					control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0) | ||||||
| 					control:SetIsPercent(v.isPercent) | 					control:SetIsPercent(v.isPercent) | ||||||
| @@ -1196,6 +1237,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
|  |  | ||||||
| 				elseif v.type == "select" then | 				elseif v.type == "select" then | ||||||
| 					local values = GetOptionsMemberValue("values", v, options, path, appName) | 					local values = GetOptionsMemberValue("values", v, options, path, appName) | ||||||
|  | 					local sorting = GetOptionsMemberValue("sorting", v, options, path, appName) | ||||||
| 					if v.style == "radio" then | 					if v.style == "radio" then | ||||||
| 						local disabled = CheckOptionDisabled(v, options, path, appName) | 						local disabled = CheckOptionDisabled(v, options, path, appName) | ||||||
| 						local width = GetOptionsMemberValue("width",v,options,path,appName) | 						local width = GetOptionsMemberValue("width",v,options,path,appName) | ||||||
| @@ -1206,12 +1248,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
|  |  | ||||||
| 						control:PauseLayout() | 						control:PauseLayout() | ||||||
| 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName) | 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName) | ||||||
| 						local t = {} | 						if not sorting then | ||||||
| 						for value, text in pairs(values) do | 							sorting = {} | ||||||
| 							t[#t+1]=value | 							for value, text in pairs(values) do | ||||||
|  | 								sorting[#sorting+1]=value | ||||||
|  | 							end | ||||||
|  | 							tsort(sorting, sortTblAsStrings) | ||||||
| 						end | 						end | ||||||
| 						tsort(t) | 						for k, value in ipairs(sorting) do | ||||||
| 						for k, value in ipairs(t) do |  | ||||||
| 							local text = values[value] | 							local text = values[value] | ||||||
| 							local radio = gui:Create("CheckBox") | 							local radio = gui:Create("CheckBox") | ||||||
| 							radio:SetLabel(text) | 							radio:SetLabel(text) | ||||||
| @@ -1238,19 +1282,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 						control:ResumeLayout() | 						control:ResumeLayout() | ||||||
| 						control:DoLayout() | 						control:DoLayout() | ||||||
| 					else | 					else | ||||||
| 						local controlType = v.dialogControl or v.control or "Dropdown" | 						control = CreateControl(v.dialogControl or v.control, "Dropdown") | ||||||
| 						control = gui:Create(controlType) |  | ||||||
| 						if not control then |  | ||||||
| 							geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType))) |  | ||||||
| 							control = gui:Create("Dropdown") |  | ||||||
| 						end |  | ||||||
| 						local itemType = v.itemControl | 						local itemType = v.itemControl | ||||||
| 						if itemType and not gui:GetWidgetVersion(itemType) then | 						if itemType and not gui:GetWidgetVersion(itemType) then | ||||||
| 							geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType))) | 							geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType))) | ||||||
| 							itemType = nil | 							itemType = nil | ||||||
| 						end | 						end | ||||||
| 						control:SetLabel(name) | 						control:SetLabel(name) | ||||||
| 						control:SetList(values, nil, itemType) | 						control:SetList(values, sorting, itemType) | ||||||
| 						local value = GetOptionsMemberValue("get",v, options, path, appName) | 						local value = GetOptionsMemberValue("get",v, options, path, appName) | ||||||
| 						if not values[value] then | 						if not values[value] then | ||||||
| 							value = nil | 							value = nil | ||||||
| @@ -1263,8 +1302,6 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 					local values = GetOptionsMemberValue("values", v, options, path, appName) | 					local values = GetOptionsMemberValue("values", v, options, path, appName) | ||||||
| 					local disabled = CheckOptionDisabled(v, options, path, appName) | 					local disabled = CheckOptionDisabled(v, options, path, appName) | ||||||
|  |  | ||||||
| 					local controlType = v.dialogControl or v.control |  | ||||||
| 					 |  | ||||||
| 					local valuesort = new() | 					local valuesort = new() | ||||||
| 					if values then | 					if values then | ||||||
| 						for value, text in pairs(values) do | 						for value, text in pairs(values) do | ||||||
| @@ -1273,6 +1310,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 					end | 					end | ||||||
| 					tsort(valuesort) | 					tsort(valuesort) | ||||||
|  |  | ||||||
|  | 					local controlType = v.dialogControl or v.control | ||||||
| 					if controlType then | 					if controlType then | ||||||
| 						control = gui:Create(controlType) | 						control = gui:Create(controlType) | ||||||
| 						if not control then | 						if not control then | ||||||
| @@ -1346,7 +1384,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 					del(valuesort) | 					del(valuesort) | ||||||
|  |  | ||||||
| 				elseif v.type == "color" then | 				elseif v.type == "color" then | ||||||
| 					control = gui:Create("ColorPicker") | 					control = CreateControl(v.dialogControl or v.control, "ColorPicker") | ||||||
| 					control:SetLabel(name) | 					control:SetLabel(name) | ||||||
| 					control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName)) | 					control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName)) | ||||||
| 					control:SetColor(GetOptionsMemberValue("get",v, options, path, appName)) | 					control:SetColor(GetOptionsMemberValue("get",v, options, path, appName)) | ||||||
| @@ -1354,18 +1392,18 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin | |||||||
| 					control:SetCallback("OnValueConfirmed",ActivateControl) | 					control:SetCallback("OnValueConfirmed",ActivateControl) | ||||||
|  |  | ||||||
| 				elseif v.type == "keybinding" then | 				elseif v.type == "keybinding" then | ||||||
| 					control = gui:Create("Keybinding") | 					control = CreateControl(v.dialogControl or v.control, "Keybinding") | ||||||
| 					control:SetLabel(name) | 					control:SetLabel(name) | ||||||
| 					control:SetKey(GetOptionsMemberValue("get",v, options, path, appName)) | 					control:SetKey(GetOptionsMemberValue("get",v, options, path, appName)) | ||||||
| 					control:SetCallback("OnKeyChanged",ActivateControl) | 					control:SetCallback("OnKeyChanged",ActivateControl) | ||||||
|  |  | ||||||
| 				elseif v.type == "header" then | 				elseif v.type == "header" then | ||||||
| 					control = gui:Create("Heading") | 					control = CreateControl(v.dialogControl or v.control, "Heading") | ||||||
| 					control:SetText(name) | 					control:SetText(name) | ||||||
| 					control.width = "fill" | 					control.width = "fill" | ||||||
|  |  | ||||||
| 				elseif v.type == "description" then | 				elseif v.type == "description" then | ||||||
| 					control = gui:Create("Label") | 					control = CreateControl(v.dialogControl or v.control, "Label") | ||||||
| 					control:SetText(name) | 					control:SetText(name) | ||||||
|  |  | ||||||
| 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName) | 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName) | ||||||
| @@ -1453,6 +1491,7 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) | |||||||
| 	local option = user.option | 	local option = user.option | ||||||
| 	local path = user.path | 	local path = user.path | ||||||
| 	local appName = user.appName | 	local appName = user.appName | ||||||
|  | 	local tooltip = AceConfigDialog.tooltip | ||||||
|  |  | ||||||
| 	local feedpath = new() | 	local feedpath = new() | ||||||
| 	for i = 1, #path do | 	for i = 1, #path do | ||||||
| @@ -1469,24 +1508,25 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) | |||||||
| 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName) | 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName) | ||||||
| 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName) | 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName) | ||||||
|  |  | ||||||
| 	GameTooltip:SetOwner(button, "ANCHOR_NONE") | 	tooltip:SetOwner(button, "ANCHOR_NONE") | ||||||
|  | 	tooltip:ClearAllPoints() | ||||||
| 	if widget.type == "TabGroup" then | 	if widget.type == "TabGroup" then | ||||||
| 		GameTooltip:SetPoint("BOTTOM",button,"TOP") | 		tooltip:SetPoint("BOTTOM",button,"TOP") | ||||||
| 	else | 	else | ||||||
| 		GameTooltip:SetPoint("LEFT",button,"RIGHT") | 		tooltip:SetPoint("LEFT",button,"RIGHT") | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	GameTooltip:SetText(name, 1, .82, 0, true) | 	tooltip:SetText(name, 1, .82, 0, true) | ||||||
|  |  | ||||||
| 	if type(desc) == "string" then | 	if type(desc) == "string" then | ||||||
| 		GameTooltip:AddLine(desc, 1, 1, 1, true) | 		tooltip:AddLine(desc, 1, 1, 1, true) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	GameTooltip:Show() | 	tooltip:Show() | ||||||
| end | end | ||||||
|  |  | ||||||
| local function TreeOnButtonLeave(widget, event, value, button) | local function TreeOnButtonLeave(widget, event, value, button) | ||||||
| 	GameTooltip:Hide() | 	AceConfigDialog.tooltip:Hide() | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1533,10 +1573,6 @@ local function GroupSelected(widget, event, uniquevalue) | |||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	BuildPath(feedpath, ("\001"):split(uniquevalue)) | 	BuildPath(feedpath, ("\001"):split(uniquevalue)) | ||||||
| 	local group = options |  | ||||||
| 	for i = 1, #feedpath do |  | ||||||
| 		group = GetSubOption(group, feedpath[i]) |  | ||||||
| 	end |  | ||||||
| 	widget:ReleaseChildren() | 	widget:ReleaseChildren() | ||||||
| 	AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath) | 	AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,10 +8,10 @@ | |||||||
| -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName". | -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName". | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceConfigRegistry-3.0 | -- @name AceConfigRegistry-3.0 | ||||||
| -- @release $Id: AceConfigRegistry-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $ | -- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $ | ||||||
| local CallbackHandler = LibStub("CallbackHandler-1.0") | local CallbackHandler = LibStub("CallbackHandler-1.0") | ||||||
|  |  | ||||||
| local MAJOR, MINOR = "AceConfigRegistry-3.0", 18 | local MAJOR, MINOR = "AceConfigRegistry-3.0", 20 | ||||||
| local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) | local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) | ||||||
|  |  | ||||||
| if not AceConfigRegistry then return end | if not AceConfigRegistry then return end | ||||||
| @@ -59,7 +59,6 @@ local optstring={["nil"]=true,["string"]=true, _="string"} | |||||||
| local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"} | local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"} | ||||||
| local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"} | local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"} | ||||||
| local optnumber={["nil"]=true,["number"]=true, _="number"} | local optnumber={["nil"]=true,["number"]=true, _="number"} | ||||||
| local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"} |  | ||||||
| local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"} | local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"} | ||||||
| local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true,  _="methodname, funcref or number"} | local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true,  _="methodname, funcref or number"} | ||||||
| local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true,  _="methodname, funcref or table"} | local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true,  _="methodname, funcref or table"} | ||||||
| @@ -95,13 +94,20 @@ local basekeys={ | |||||||
| } | } | ||||||
|  |  | ||||||
| local typedkeys={ | local typedkeys={ | ||||||
| 	header={}, | 	header={ | ||||||
|  | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
|  | 	}, | ||||||
| 	description={ | 	description={ | ||||||
| 		image=optstringnumberfunc, | 		image=optstringnumberfunc, | ||||||
| 		imageCoords=optmethodtable, | 		imageCoords=optmethodtable, | ||||||
| 		imageHeight=optnumber, | 		imageHeight=optnumber, | ||||||
| 		imageWidth=optnumber, | 		imageWidth=optnumber, | ||||||
| 		fontSize=optstringfunc, | 		fontSize=optstringfunc, | ||||||
|  | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
| 	}, | 	}, | ||||||
| 	group={ | 	group={ | ||||||
| 		args=istable, | 		args=istable, | ||||||
| @@ -118,6 +124,9 @@ local typedkeys={ | |||||||
| 		imageCoords=optmethodtable, | 		imageCoords=optmethodtable, | ||||||
| 		imageHeight=optnumber, | 		imageHeight=optnumber, | ||||||
| 		imageWidth=optnumber, | 		imageWidth=optnumber, | ||||||
|  | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
| 	}, | 	}, | ||||||
| 	input={ | 	input={ | ||||||
| 		pattern=optstring, | 		pattern=optstring, | ||||||
| @@ -131,6 +140,9 @@ local typedkeys={ | |||||||
| 		tristate=optbool, | 		tristate=optbool, | ||||||
| 		image=optstringnumberfunc, | 		image=optstringnumberfunc, | ||||||
| 		imageCoords=optmethodtable, | 		imageCoords=optmethodtable, | ||||||
|  | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
| 	}, | 	}, | ||||||
| 	tristate={ | 	tristate={ | ||||||
| 	}, | 	}, | ||||||
| @@ -142,9 +154,13 @@ local typedkeys={ | |||||||
| 		step=optnumber, | 		step=optnumber, | ||||||
| 		bigStep=optnumber, | 		bigStep=optnumber, | ||||||
| 		isPercent=optbool, | 		isPercent=optbool, | ||||||
|  | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
| 	}, | 	}, | ||||||
| 	select={ | 	select={ | ||||||
| 		values=ismethodtable, | 		values=ismethodtable, | ||||||
|  | 		sorting=optmethodtable, | ||||||
| 		style={ | 		style={ | ||||||
| 			["nil"]=true, | 			["nil"]=true, | ||||||
| 			["string"]={dropdown=true,radio=true}, | 			["string"]={dropdown=true,radio=true}, | ||||||
| @@ -165,9 +181,14 @@ local typedkeys={ | |||||||
| 	}, | 	}, | ||||||
| 	color={ | 	color={ | ||||||
| 		hasAlpha=optmethodbool, | 		hasAlpha=optmethodbool, | ||||||
|  | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
| 	}, | 	}, | ||||||
| 	keybinding={ | 	keybinding={ | ||||||
| 		-- TODO | 		control=optstring, | ||||||
|  | 		dialogControl=optstring, | ||||||
|  | 		dropdownControl=optstring, | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -40,15 +40,15 @@ | |||||||
| -- end | -- end | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceDB-3.0.lua | -- @name AceDB-3.0.lua | ||||||
| -- @release $Id: AceDB-3.0.lua 1142 2016-07-11 08:36:19Z nevcairiel $ | -- @release $Id: AceDB-3.0.lua 1217 2019-07-11 03:06:18Z funkydude $ | ||||||
| local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26 | local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 27 | ||||||
| local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) | local AceDB = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR) | ||||||
|  |  | ||||||
| if not AceDB then return end -- No upgrade needed | if not AceDB then return end -- No upgrade needed | ||||||
|  |  | ||||||
| -- Lua APIs | -- Lua APIs | ||||||
| local type, pairs, next, error = type, pairs, next, error | local type, pairs, next, error = type, pairs, next, error | ||||||
| local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget | local setmetatable, rawset, rawget = setmetatable, rawset, rawget | ||||||
|  |  | ||||||
| -- WoW APIs | -- WoW APIs | ||||||
| local _G = _G | local _G = _G | ||||||
| @@ -397,7 +397,7 @@ AceDB.frame:SetScript("OnEvent", logoutHandler) | |||||||
| -- @param defaults A table of defaults for this database | -- @param defaults A table of defaults for this database | ||||||
| function DBObjectLib:RegisterDefaults(defaults) | function DBObjectLib:RegisterDefaults(defaults) | ||||||
| 	if defaults and type(defaults) ~= "table" then | 	if defaults and type(defaults) ~= "table" then | ||||||
| 		error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2) | 		error(("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected, got %q."):format(type(defaults)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	validateDefaults(defaults, self.keys) | 	validateDefaults(defaults, self.keys) | ||||||
| @@ -429,7 +429,7 @@ end | |||||||
| -- @param name The name of the profile to set as the current profile | -- @param name The name of the profile to set as the current profile | ||||||
| function DBObjectLib:SetProfile(name) | function DBObjectLib:SetProfile(name) | ||||||
| 	if type(name) ~= "string" then | 	if type(name) ~= "string" then | ||||||
| 		error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2) | 		error(("Usage: AceDBObject:SetProfile(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- changing to the same profile, dont do anything | 	-- changing to the same profile, dont do anything | ||||||
| @@ -471,7 +471,7 @@ end | |||||||
| -- @param tbl A table to store the profile names in (optional) | -- @param tbl A table to store the profile names in (optional) | ||||||
| function DBObjectLib:GetProfiles(tbl) | function DBObjectLib:GetProfiles(tbl) | ||||||
| 	if tbl and type(tbl) ~= "table" then | 	if tbl and type(tbl) ~= "table" then | ||||||
| 		error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2) | 		error(("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected, got %q."):format(type(tbl)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- Clear the container table | 	-- Clear the container table | ||||||
| @@ -509,15 +509,15 @@ end | |||||||
| -- @param silent If true, do not raise an error when the profile does not exist | -- @param silent If true, do not raise an error when the profile does not exist | ||||||
| function DBObjectLib:DeleteProfile(name, silent) | function DBObjectLib:DeleteProfile(name, silent) | ||||||
| 	if type(name) ~= "string" then | 	if type(name) ~= "string" then | ||||||
| 		error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2) | 		error(("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if self.keys.profile == name then | 	if self.keys.profile == name then | ||||||
| 		error("Cannot delete the active profile in an AceDBObject.", 2) | 		error(("Cannot delete the active profile (%q) in an AceDBObject."):format(name), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if not rawget(self.profiles, name) and not silent then | 	if not rawget(self.profiles, name) and not silent then | ||||||
| 		error("Cannot delete profile '" .. name .. "'. It does not exist.", 2) | 		error(("Cannot delete profile %q as it does not exist."):format(name), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	self.profiles[name] = nil | 	self.profiles[name] = nil | ||||||
| @@ -548,15 +548,15 @@ end | |||||||
| -- @param silent If true, do not raise an error when the profile does not exist | -- @param silent If true, do not raise an error when the profile does not exist | ||||||
| function DBObjectLib:CopyProfile(name, silent) | function DBObjectLib:CopyProfile(name, silent) | ||||||
| 	if type(name) ~= "string" then | 	if type(name) ~= "string" then | ||||||
| 		error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2) | 		error(("Usage: AceDBObject:CopyProfile(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if name == self.keys.profile then | 	if name == self.keys.profile then | ||||||
| 		error("Cannot have the same source and destination profiles.", 2) | 		error(("Cannot have the same source and destination profiles (%q)."):format(name), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if not rawget(self.profiles, name) and not silent then | 	if not rawget(self.profiles, name) and not silent then | ||||||
| 		error("Cannot copy profile '" .. name .. "'. It does not exist.", 2) | 		error(("Cannot copy profile %q as it does not exist."):format(name), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- Reset the profile before copying | 	-- Reset the profile before copying | ||||||
| @@ -611,7 +611,7 @@ end | |||||||
| -- @param defaultProfile The profile name to use as the default | -- @param defaultProfile The profile name to use as the default | ||||||
| function DBObjectLib:ResetDB(defaultProfile) | function DBObjectLib:ResetDB(defaultProfile) | ||||||
| 	if defaultProfile and type(defaultProfile) ~= "string" then | 	if defaultProfile and type(defaultProfile) ~= "string" then | ||||||
| 		error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2) | 		error(("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected, got %q."):format(type(defaultProfile)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local sv = self.sv | 	local sv = self.sv | ||||||
| @@ -619,8 +619,6 @@ function DBObjectLib:ResetDB(defaultProfile) | |||||||
| 		sv[k] = nil | 		sv[k] = nil | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local parent = self.parent |  | ||||||
|  |  | ||||||
| 	initdb(sv, self.defaults, defaultProfile, self) | 	initdb(sv, self.defaults, defaultProfile, self) | ||||||
|  |  | ||||||
| 	-- fix the child namespaces | 	-- fix the child namespaces | ||||||
| @@ -647,13 +645,13 @@ end | |||||||
| -- @param defaults A table of values to use as defaults | -- @param defaults A table of values to use as defaults | ||||||
| function DBObjectLib:RegisterNamespace(name, defaults) | function DBObjectLib:RegisterNamespace(name, defaults) | ||||||
| 	if type(name) ~= "string" then | 	if type(name) ~= "string" then | ||||||
| 		error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2) | 		error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected, got %q."):format(type(name)), 2) | ||||||
| 	end | 	end | ||||||
| 	if defaults and type(defaults) ~= "table" then | 	if defaults and type(defaults) ~= "table" then | ||||||
| 		error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2) | 		error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected, got %q."):format(type(defaults)), 2) | ||||||
| 	end | 	end | ||||||
| 	if self.children and self.children[name] then | 	if self.children and self.children[name] then | ||||||
| 		error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2) | 		error(("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace called %q already exists."):format(name), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local sv = self.sv | 	local sv = self.sv | ||||||
| @@ -677,10 +675,10 @@ end | |||||||
| -- @return the namespace object if found | -- @return the namespace object if found | ||||||
| function DBObjectLib:GetNamespace(name, silent) | function DBObjectLib:GetNamespace(name, silent) | ||||||
| 	if type(name) ~= "string" then | 	if type(name) ~= "string" then | ||||||
| 		error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2) | 		error(("Usage: AceDBObject:GetNamespace(name): 'name' - string expected, got %q."):format(type(name)), 2) | ||||||
| 	end | 	end | ||||||
| 	if not silent and not (self.children and self.children[name]) then | 	if not silent and not (self.children and self.children[name]) then | ||||||
| 		error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2) | 		error(("Usage: AceDBObject:GetNamespace(name): 'name' - namespace %q does not exist."):format(name), 2) | ||||||
| 	end | 	end | ||||||
| 	if not self.children then self.children = {} end | 	if not self.children then self.children = {} end | ||||||
| 	return self.children[name] | 	return self.children[name] | ||||||
| @@ -719,15 +717,15 @@ function AceDB:New(tbl, defaults, defaultProfile) | |||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if type(tbl) ~= "table" then | 	if type(tbl) ~= "table" then | ||||||
| 		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2) | 		error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected, got %q."):format(type(tbl)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if defaults and type(defaults) ~= "table" then | 	if defaults and type(defaults) ~= "table" then | ||||||
| 		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2) | 		error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected, got %q."):format(type(defaults)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then | 	if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then | ||||||
| 		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2) | 		error(("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected, got %q."):format(type(defaultProfile)), 2) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	return initdb(tbl, defaults, defaultProfile) | 	return initdb(tbl, defaults, defaultProfile) | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. | --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceDBOptions-3.0 | -- @name AceDBOptions-3.0 | ||||||
| -- @release $Id: AceDBOptions-3.0.lua 1140 2016-07-03 07:53:29Z nevcairiel $ | -- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | ||||||
| local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15 | local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15 | ||||||
| local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) | local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) | ||||||
|  |  | ||||||
| if not AceDBOptions then return end -- No upgrade needed | if not AceDBOptions then return end -- No upgrade needed | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,14 +24,14 @@ | |||||||
| -- f:AddChild(btn) | -- f:AddChild(btn) | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceGUI-3.0 | -- @name AceGUI-3.0 | ||||||
| -- @release $Id: AceGUI-3.0.lua 1228 2019-09-06 08:51:17Z nevcairiel $ | -- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $ | ||||||
| local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 40 | local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41 | ||||||
| local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) | local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) | ||||||
|  |  | ||||||
| if not AceGUI then return end -- No upgrade needed | if not AceGUI then return end -- No upgrade needed | ||||||
|  |  | ||||||
| -- Lua APIs | -- Lua APIs | ||||||
| local tinsert = table.insert | local tinsert, wipe = table.insert, table.wipe | ||||||
| local select, pairs, next, type = select, pairs, next, type | local select, pairs, next, type = select, pairs, next, type | ||||||
| local error, assert = error, assert | local error, assert = error, assert | ||||||
| local setmetatable, rawget = setmetatable, rawget | local setmetatable, rawget = setmetatable, rawget | ||||||
| @@ -212,6 +212,22 @@ function AceGUI:Release(widget) | |||||||
| 	delWidget(widget, widget.type) | 	delWidget(widget, widget.type) | ||||||
| end | end | ||||||
|  |  | ||||||
|  | --- Check if a widget is currently in the process of being released | ||||||
|  | -- This function check if this widget, or any of its parents (in which case it'll be released shortly as well) | ||||||
|  | -- are currently being released. This allows addon to handle any callbacks accordingly. | ||||||
|  | -- @param widget The widget to check | ||||||
|  | function AceGUI:IsReleasing(widget) | ||||||
|  | 	if widget.isQueuedForRelease then | ||||||
|  | 		return true | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	if widget.parent and widget.parent.AceGUIWidgetVersion then | ||||||
|  | 		return AceGUI:IsReleasing(widget.parent) | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	return false | ||||||
|  | end | ||||||
|  |  | ||||||
| ----------- | ----------- | ||||||
| -- Focus -- | -- Focus -- | ||||||
| ----------- | ----------- | ||||||
| @@ -338,6 +354,10 @@ do | |||||||
| 		AceGUI:Release(self) | 		AceGUI:Release(self) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	WidgetBase.IsReleasing = function(self) | ||||||
|  | 		return AceGUI:IsReleasing(self) | ||||||
|  | 	end | ||||||
|  |  | ||||||
| 	WidgetBase.SetPoint = function(self, ...) | 	WidgetBase.SetPoint = function(self, ...) | ||||||
| 		return self.frame:SetPoint(...) | 		return self.frame:SetPoint(...) | ||||||
| 	end | 	end | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| BlizOptionsGroup Container | BlizOptionsGroup Container | ||||||
| Simple container widget for the integration of AceGUI into the Blizzard Interface Options | Simple container widget for the integration of AceGUI into the Blizzard Interface Options | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "BlizOptionsGroup", 21 | local Type, Version = "BlizOptionsGroup", 22 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -99,7 +99,7 @@ local methods = { | |||||||
| Constructor | Constructor | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local function Constructor() | local function Constructor() | ||||||
| 	local frame = CreateFrame("Frame") | 	local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer) | ||||||
| 	frame:Hide() | 	frame:Hide() | ||||||
|  |  | ||||||
| 	-- support functions for the Blizzard Interface Options | 	-- support functions for the Blizzard Interface Options | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| DropdownGroup Container | DropdownGroup Container | ||||||
| Container controlled by a dropdown on the top. | Container controlled by a dropdown on the top. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "DropdownGroup", 21 | local Type, Version = "DropdownGroup", 22 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -125,7 +125,7 @@ local function Constructor() | |||||||
| 	dropdown.frame:Show() | 	dropdown.frame:Show() | ||||||
| 	dropdown:SetLabel("") | 	dropdown:SetLabel("") | ||||||
|  |  | ||||||
| 	local border = CreateFrame("Frame", nil, frame) | 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	border:SetPoint("TOPLEFT", 0, -26) | 	border:SetPoint("TOPLEFT", 0, -26) | ||||||
| 	border:SetPoint("BOTTOMRIGHT", 0, 3) | 	border:SetPoint("BOTTOMRIGHT", 0, 3) | ||||||
| 	border:SetBackdrop(PaneBackdrop) | 	border:SetBackdrop(PaneBackdrop) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| --[[----------------------------------------------------------------------------- | --[[----------------------------------------------------------------------------- | ||||||
| Frame Container | Frame Container | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "Frame", 26 | local Type, Version = "Frame", 28 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -83,6 +83,7 @@ local methods = { | |||||||
| 	["OnAcquire"] = function(self) | 	["OnAcquire"] = function(self) | ||||||
| 		self.frame:SetParent(UIParent) | 		self.frame:SetParent(UIParent) | ||||||
| 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG") | 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG") | ||||||
|  | 		self.frame:SetFrameLevel(100) -- Lots of room to draw under it | ||||||
| 		self:SetTitle() | 		self:SetTitle() | ||||||
| 		self:SetStatusText() | 		self:SetStatusText() | ||||||
| 		self:ApplyStatus() | 		self:ApplyStatus() | ||||||
| @@ -179,13 +180,14 @@ local PaneBackdrop  = { | |||||||
| } | } | ||||||
|  |  | ||||||
| local function Constructor() | local function Constructor() | ||||||
| 	local frame = CreateFrame("Frame", nil, UIParent) | 	local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	frame:Hide() | 	frame:Hide() | ||||||
|  |  | ||||||
| 	frame:EnableMouse(true) | 	frame:EnableMouse(true) | ||||||
| 	frame:SetMovable(true) | 	frame:SetMovable(true) | ||||||
| 	frame:SetResizable(true) | 	frame:SetResizable(true) | ||||||
| 	frame:SetFrameStrata("FULLSCREEN_DIALOG") | 	frame:SetFrameStrata("FULLSCREEN_DIALOG") | ||||||
|  | 	frame:SetFrameLevel(100) -- Lots of room to draw under it | ||||||
| 	frame:SetBackdrop(FrameBackdrop) | 	frame:SetBackdrop(FrameBackdrop) | ||||||
| 	frame:SetBackdropColor(0, 0, 0, 1) | 	frame:SetBackdropColor(0, 0, 0, 1) | ||||||
| 	frame:SetMinResize(400, 200) | 	frame:SetMinResize(400, 200) | ||||||
| @@ -201,7 +203,7 @@ local function Constructor() | |||||||
| 	closebutton:SetWidth(100) | 	closebutton:SetWidth(100) | ||||||
| 	closebutton:SetText(CLOSE) | 	closebutton:SetText(CLOSE) | ||||||
|  |  | ||||||
| 	local statusbg = CreateFrame("Button", nil, frame) | 	local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	statusbg:SetPoint("BOTTOMLEFT", 15, 15) | 	statusbg:SetPoint("BOTTOMLEFT", 15, 15) | ||||||
| 	statusbg:SetPoint("BOTTOMRIGHT", -132, 15) | 	statusbg:SetPoint("BOTTOMRIGHT", -132, 15) | ||||||
| 	statusbg:SetHeight(24) | 	statusbg:SetHeight(24) | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| InlineGroup Container | InlineGroup Container | ||||||
| Simple container widget that creates a visible "box" with an optional title. | Simple container widget that creates a visible "box" with an optional title. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "InlineGroup", 21 | local Type, Version = "InlineGroup", 22 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -75,7 +75,7 @@ local function Constructor() | |||||||
| 	titletext:SetJustifyH("LEFT") | 	titletext:SetJustifyH("LEFT") | ||||||
| 	titletext:SetHeight(18) | 	titletext:SetHeight(18) | ||||||
|  |  | ||||||
| 	local border = CreateFrame("Frame", nil, frame) | 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	border:SetPoint("TOPLEFT", 0, -17) | 	border:SetPoint("TOPLEFT", 0, -17) | ||||||
| 	border:SetPoint("BOTTOMRIGHT", -1, 3) | 	border:SetPoint("BOTTOMRIGHT", -1, 3) | ||||||
| 	border:SetBackdrop(PaneBackdrop) | 	border:SetBackdrop(PaneBackdrop) | ||||||
|   | |||||||
| @@ -2,12 +2,12 @@ | |||||||
| TabGroup Container | TabGroup Container | ||||||
| Container that uses tabs on top to switch between groups. | Container that uses tabs on top to switch between groups. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "TabGroup", 36 | local Type, Version = "TabGroup", 37 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| -- Lua APIs | -- Lua APIs | ||||||
| local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe | local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, table.wipe | ||||||
|  |  | ||||||
| -- WoW APIs | -- WoW APIs | ||||||
| local PlaySound = PlaySound | local PlaySound = PlaySound | ||||||
| @@ -316,7 +316,7 @@ local function Constructor() | |||||||
| 	titletext:SetHeight(18) | 	titletext:SetHeight(18) | ||||||
| 	titletext:SetText("") | 	titletext:SetText("") | ||||||
|  |  | ||||||
| 	local border = CreateFrame("Frame", nil, frame) | 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	border:SetPoint("TOPLEFT", 1, -27) | 	border:SetPoint("TOPLEFT", 1, -27) | ||||||
| 	border:SetPoint("BOTTOMRIGHT", -1, 3) | 	border:SetPoint("BOTTOMRIGHT", -1, 3) | ||||||
| 	border:SetBackdrop(PaneBackdrop) | 	border:SetBackdrop(PaneBackdrop) | ||||||
|   | |||||||
| @@ -2,12 +2,10 @@ | |||||||
| TreeGroup Container | TreeGroup Container | ||||||
| Container that uses a tree control to switch between groups. | Container that uses a tree control to switch between groups. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "TreeGroup", 44 | local Type, Version = "TreeGroup", 45 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| local WoW80 = select(4, GetBuildInfo()) >= 80000 |  | ||||||
|  |  | ||||||
| -- Lua APIs | -- Lua APIs | ||||||
| local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type | local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type | ||||||
| local math_min, math_max, floor = math.min, math.max, floor | local math_min, math_max, floor = math.min, math.max, floor | ||||||
| @@ -422,8 +420,7 @@ local methods = { | |||||||
| 		local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18)) | 		local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18)) | ||||||
| 		if maxlines <= 0 then return end | 		if maxlines <= 0 then return end | ||||||
|  |  | ||||||
| 		-- workaround for lag spikes on WoW 8.0 | 		if self.frame:GetParent() == UIParent and not fromOnUpdate then | ||||||
| 		if WoW80 and self.frame:GetParent() == UIParent and not fromOnUpdate then |  | ||||||
| 			self.frame:SetScript("OnUpdate", FirstFrameUpdate) | 			self.frame:SetScript("OnUpdate", FirstFrameUpdate) | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| @@ -632,7 +629,7 @@ local PaneBackdrop  = { | |||||||
| local DraggerBackdrop  = { | local DraggerBackdrop  = { | ||||||
| 	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", | 	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", | ||||||
| 	edgeFile = nil, | 	edgeFile = nil, | ||||||
| 	tile = true, tileSize = 16, edgeSize = 0, | 	tile = true, tileSize = 16, edgeSize = 1, | ||||||
| 	insets = { left = 3, right = 3, top = 7, bottom = 7 } | 	insets = { left = 3, right = 3, top = 7, bottom = 7 } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -640,7 +637,7 @@ local function Constructor() | |||||||
| 	local num = AceGUI:GetNextWidgetNum(Type) | 	local num = AceGUI:GetNextWidgetNum(Type) | ||||||
| 	local frame = CreateFrame("Frame", nil, UIParent) | 	local frame = CreateFrame("Frame", nil, UIParent) | ||||||
|  |  | ||||||
| 	local treeframe = CreateFrame("Frame", nil, frame) | 	local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	treeframe:SetPoint("TOPLEFT") | 	treeframe:SetPoint("TOPLEFT") | ||||||
| 	treeframe:SetPoint("BOTTOMLEFT") | 	treeframe:SetPoint("BOTTOMLEFT") | ||||||
| 	treeframe:SetWidth(DEFAULT_TREE_WIDTH) | 	treeframe:SetWidth(DEFAULT_TREE_WIDTH) | ||||||
| @@ -655,7 +652,7 @@ local function Constructor() | |||||||
| 	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) | 	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) | ||||||
| 	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) | 	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) | ||||||
|  |  | ||||||
| 	local dragger = CreateFrame("Frame", nil, treeframe) | 	local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	dragger:SetWidth(8) | 	dragger:SetWidth(8) | ||||||
| 	dragger:SetPoint("TOP", treeframe, "TOPRIGHT") | 	dragger:SetPoint("TOP", treeframe, "TOPRIGHT") | ||||||
| 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT") | 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT") | ||||||
| @@ -680,7 +677,7 @@ local function Constructor() | |||||||
| 	scrollbg:SetAllPoints(scrollbar) | 	scrollbg:SetAllPoints(scrollbar) | ||||||
| 	scrollbg:SetColorTexture(0,0,0,0.4) | 	scrollbg:SetColorTexture(0,0,0,0.4) | ||||||
|  |  | ||||||
| 	local border = CreateFrame("Frame",nil,frame) | 	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT") | 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT") | ||||||
| 	border:SetPoint("BOTTOMRIGHT") | 	border:SetPoint("BOTTOMRIGHT") | ||||||
| 	border:SetBackdrop(PaneBackdrop) | 	border:SetBackdrop(PaneBackdrop) | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| --[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]-- | --[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]-- | ||||||
| local AceGUI = LibStub("AceGUI-3.0") | local AceGUI = LibStub("AceGUI-3.0") | ||||||
|  |  | ||||||
| -- Lua APIs | -- Lua APIs | ||||||
| @@ -39,7 +39,7 @@ end | |||||||
|  |  | ||||||
| do | do | ||||||
| 	local widgetType = "Dropdown-Pullout" | 	local widgetType = "Dropdown-Pullout" | ||||||
| 	local widgetVersion = 3 | 	local widgetVersion = 5 | ||||||
|  |  | ||||||
| 	--[[ Static data ]]-- | 	--[[ Static data ]]-- | ||||||
|  |  | ||||||
| @@ -193,12 +193,7 @@ do | |||||||
|  |  | ||||||
| 		local height = 8 | 		local height = 8 | ||||||
| 		for i, item in pairs(items) do | 		for i, item in pairs(items) do | ||||||
| 			if i == 1 then | 			item:SetPoint("TOP", itemFrame, "TOP", 0, -2 + (i - 1) * -16) | ||||||
| 				item:SetPoint("TOP", itemFrame, "TOP", 0, -2) |  | ||||||
| 			else |  | ||||||
| 				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1) |  | ||||||
| 			end |  | ||||||
|  |  | ||||||
| 			item:Show() | 			item:Show() | ||||||
|  |  | ||||||
| 			height = height + 16 | 			height = height + 16 | ||||||
| @@ -258,7 +253,7 @@ do | |||||||
|  |  | ||||||
| 	local function Constructor() | 	local function Constructor() | ||||||
| 		local count = AceGUI:GetNextWidgetNum(widgetType) | 		local count = AceGUI:GetNextWidgetNum(widgetType) | ||||||
| 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent) | 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 		local self = {} | 		local self = {} | ||||||
| 		self.count = count | 		self.count = count | ||||||
| 		self.type = widgetType | 		self.type = widgetType | ||||||
| @@ -309,7 +304,7 @@ do | |||||||
| 		scrollFrame.obj = self | 		scrollFrame.obj = self | ||||||
| 		itemFrame.obj = self | 		itemFrame.obj = self | ||||||
|  |  | ||||||
| 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame) | 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 		slider:SetOrientation("VERTICAL") | 		slider:SetOrientation("VERTICAL") | ||||||
| 		slider:SetHitRectInsets(0, 0, -10, 0) | 		slider:SetHitRectInsets(0, 0, -10, 0) | ||||||
| 		slider:SetBackdrop(sliderBackdrop) | 		slider:SetBackdrop(sliderBackdrop) | ||||||
| @@ -356,7 +351,7 @@ end | |||||||
|  |  | ||||||
| do | do | ||||||
| 	local widgetType = "Dropdown" | 	local widgetType = "Dropdown" | ||||||
| 	local widgetVersion = 34 | 	local widgetVersion = 35 | ||||||
|  |  | ||||||
| 	--[[ Static data ]]-- | 	--[[ Static data ]]-- | ||||||
|  |  | ||||||
| @@ -465,6 +460,7 @@ do | |||||||
| 		self:SetWidth(200) | 		self:SetWidth(200) | ||||||
| 		self:SetLabel() | 		self:SetLabel() | ||||||
| 		self:SetPulloutWidth(nil) | 		self:SetPulloutWidth(nil) | ||||||
|  | 		self.list = {} | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- exported, AceGUI callback | 	-- exported, AceGUI callback | ||||||
| @@ -535,9 +531,7 @@ do | |||||||
|  |  | ||||||
| 	-- exported | 	-- exported | ||||||
| 	local function SetValue(self, value) | 	local function SetValue(self, value) | ||||||
| 		if self.list then | 		self:SetText(self.list[value] or "") | ||||||
| 			self:SetText(self.list[value] or "") |  | ||||||
| 		end |  | ||||||
| 		self.value = value | 		self.value = value | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| @@ -601,7 +595,7 @@ do | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
| 	local function SetList(self, list, order, itemType) | 	local function SetList(self, list, order, itemType) | ||||||
| 		self.list = list | 		self.list = list or {} | ||||||
| 		self.pullout:Clear() | 		self.pullout:Clear() | ||||||
| 		self.hasClose = nil | 		self.hasClose = nil | ||||||
| 		if not list then return end | 		if not list then return end | ||||||
| @@ -629,10 +623,8 @@ do | |||||||
|  |  | ||||||
| 	-- exported | 	-- exported | ||||||
| 	local function AddItem(self, value, text, itemType) | 	local function AddItem(self, value, text, itemType) | ||||||
| 		if self.list then | 		self.list[value] = text | ||||||
| 			self.list[value] = text | 		AddListItem(self, value, text, itemType) | ||||||
| 			AddListItem(self, value, text, itemType) |  | ||||||
| 		end |  | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- exported | 	-- exported | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| Keybinding Widget | Keybinding Widget | ||||||
| Set Keybindings in the Config UI. | Set Keybindings in the Config UI. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "Keybinding", 25 | local Type, Version = "Keybinding", 26 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -214,7 +214,7 @@ local function Constructor() | |||||||
| 	label:SetJustifyH("CENTER") | 	label:SetJustifyH("CENTER") | ||||||
| 	label:SetHeight(18) | 	label:SetHeight(18) | ||||||
|  |  | ||||||
| 	local msgframe = CreateFrame("Frame", nil, UIParent) | 	local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	msgframe:SetHeight(30) | 	msgframe:SetHeight(30) | ||||||
| 	msgframe:SetBackdrop(ControlBackdrop) | 	msgframe:SetBackdrop(ControlBackdrop) | ||||||
| 	msgframe:SetBackdropColor(0,0,0) | 	msgframe:SetBackdropColor(0,0,0) | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| Label Widget | Label Widget | ||||||
| Displays text and optionally an icon. | Displays text and optionally an icon. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "Label", 26 | local Type, Version = "Label", 27 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -130,6 +130,7 @@ local methods = { | |||||||
|  |  | ||||||
| 	["SetFont"] = function(self, font, height, flags) | 	["SetFont"] = function(self, font, height, flags) | ||||||
| 		self.label:SetFont(font, height, flags) | 		self.label:SetFont(font, height, flags) | ||||||
|  | 		UpdateImageAnchor(self) | ||||||
| 	end, | 	end, | ||||||
|  |  | ||||||
| 	["SetFontObject"] = function(self, font) | 	["SetFontObject"] = function(self, font) | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| local Type, Version = "MultiLineEditBox", 28 | local Type, Version = "MultiLineEditBox", 29 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -297,7 +297,7 @@ local function Constructor() | |||||||
| 	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1) | 	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1) | ||||||
| 	text:SetJustifyV("MIDDLE") | 	text:SetJustifyV("MIDDLE") | ||||||
|  |  | ||||||
| 	local scrollBG = CreateFrame("Frame", nil, frame) | 	local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	scrollBG:SetBackdrop(backdrop) | 	scrollBG:SetBackdrop(backdrop) | ||||||
| 	scrollBG:SetBackdropColor(0, 0, 0) | 	scrollBG:SetBackdropColor(0, 0, 0) | ||||||
| 	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4) | 	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4) | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| Slider Widget | Slider Widget | ||||||
| Graphical Slider, like, for Range values. | Graphical Slider, like, for Range values. | ||||||
| -------------------------------------------------------------------------------]] | -------------------------------------------------------------------------------]] | ||||||
| local Type, Version = "Slider", 22 | local Type, Version = "Slider", 23 | ||||||
| local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | ||||||
| if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | ||||||
|  |  | ||||||
| @@ -225,7 +225,7 @@ local function Constructor() | |||||||
| 	label:SetJustifyH("CENTER") | 	label:SetJustifyH("CENTER") | ||||||
| 	label:SetHeight(15) | 	label:SetHeight(15) | ||||||
|  |  | ||||||
| 	local slider = CreateFrame("Slider", nil, frame) | 	local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	slider:SetOrientation("HORIZONTAL") | 	slider:SetOrientation("HORIZONTAL") | ||||||
| 	slider:SetHeight(15) | 	slider:SetHeight(15) | ||||||
| 	slider:SetHitRectInsets(0, 0, -10, 0) | 	slider:SetHitRectInsets(0, 0, -10, 0) | ||||||
| @@ -247,7 +247,7 @@ local function Constructor() | |||||||
| 	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") | 	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") | ||||||
| 	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3) | 	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3) | ||||||
|  |  | ||||||
| 	local editbox = CreateFrame("EditBox", nil, frame) | 	local editbox = CreateFrame("EditBox", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil) | ||||||
| 	editbox:SetAutoFocus(false) | 	editbox:SetAutoFocus(false) | ||||||
| 	editbox:SetFontObject(GameFontHighlightSmall) | 	editbox:SetFontObject(GameFontHighlightSmall) | ||||||
| 	editbox:SetPoint("TOP", slider, "BOTTOM") | 	editbox:SetPoint("TOP", slider, "BOTTOM") | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ | |||||||
| -- make into AceHook. | -- make into AceHook. | ||||||
| -- @class file | -- @class file | ||||||
| -- @name AceHook-3.0 | -- @name AceHook-3.0 | ||||||
| -- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ | -- @release $Id: AceHook-3.0.lua 1243 2020-10-18 00:00:19Z nevcairiel $ | ||||||
| local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8 | local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9 | ||||||
| local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) | local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) | ||||||
|  |  | ||||||
| if not AceHook then return end -- No upgrade needed | if not AceHook then return end -- No upgrade needed | ||||||
| @@ -478,10 +478,10 @@ function AceHook:UnhookAll() | |||||||
| 	for key, value in pairs(registry[self]) do | 	for key, value in pairs(registry[self]) do | ||||||
| 		if type(key) == "table" then | 		if type(key) == "table" then | ||||||
| 			for method in pairs(value) do | 			for method in pairs(value) do | ||||||
| 				self:Unhook(key, method) | 				AceHook.Unhook(self, key, method) | ||||||
| 			end | 			end | ||||||
| 		else | 		else | ||||||
| 			self:Unhook(key) | 			AceHook.Unhook(self, key) | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| --[[ $Id: CallbackHandler-1.0.lua 22 2018-07-21 14:17:22Z nevcairiel $ ]] | --[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]] | ||||||
| local MAJOR, MINOR = "CallbackHandler-1.0", 7 | local MAJOR, MINOR = "CallbackHandler-1.0", 7 | ||||||
| local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) | local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| -- | -- | ||||||
|  |  | ||||||
| local DBICON10 = "LibDBIcon-1.0" | local DBICON10 = "LibDBIcon-1.0" | ||||||
| local DBICON10_MINOR = 43 -- Bump on changes | local DBICON10_MINOR = 44 -- Bump on changes | ||||||
| if not LibStub then error(DBICON10 .. " requires LibStub.") end | if not LibStub then error(DBICON10 .. " requires LibStub.") end | ||||||
| local ldb = LibStub("LibDataBroker-1.1", true) | local ldb = LibStub("LibDataBroker-1.1", true) | ||||||
| if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end | if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end | ||||||
| @@ -18,8 +18,8 @@ lib.callbackRegistered = lib.callbackRegistered or nil | |||||||
| lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) | lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) | ||||||
| lib.notCreated = lib.notCreated or {} | lib.notCreated = lib.notCreated or {} | ||||||
| lib.radius = lib.radius or 5 | lib.radius = lib.radius or 5 | ||||||
|  | local next, Minimap, CreateFrame = next, Minimap, CreateFrame | ||||||
| lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") | lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") | ||||||
| local next, Minimap = next, Minimap |  | ||||||
| local isDraggingButton = false | local isDraggingButton = false | ||||||
|  |  | ||||||
| function lib:IconCallback(event, name, key, value) | function lib:IconCallback(event, name, key, value) | ||||||
| @@ -218,8 +218,14 @@ local function createButton(name, object, db) | |||||||
| 	button.dataObject = object | 	button.dataObject = object | ||||||
| 	button.db = db | 	button.db = db | ||||||
| 	button:SetFrameStrata("MEDIUM") | 	button:SetFrameStrata("MEDIUM") | ||||||
| 	button:SetSize(31, 31) | 	if button.SetFixedFrameStrata then -- Classic support | ||||||
|  | 		button:SetFixedFrameStrata(true) | ||||||
|  | 	end | ||||||
| 	button:SetFrameLevel(8) | 	button:SetFrameLevel(8) | ||||||
|  | 	if button.SetFixedFrameLevel then -- Classic support | ||||||
|  | 		button:SetFixedFrameLevel(true) | ||||||
|  | 	end | ||||||
|  | 	button:SetSize(31, 31) | ||||||
| 	button:RegisterForClicks("anyUp") | 	button:RegisterForClicks("anyUp") | ||||||
| 	button:RegisterForDrag("LeftButton") | 	button:RegisterForDrag("LeftButton") | ||||||
| 	button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" | 	button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" | ||||||
|   | |||||||
| @@ -1,13 +1,22 @@ | |||||||
|  | -- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $ | ||||||
| -- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info | -- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info | ||||||
| -- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke | -- LibStub is hereby placed in the Public Domain | ||||||
|  | -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke | ||||||
| local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! | local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! | ||||||
| local LibStub = _G[LIBSTUB_MAJOR] | local LibStub = _G[LIBSTUB_MAJOR] | ||||||
|  |  | ||||||
|  | -- Check to see is this version of the stub is obsolete | ||||||
| if not LibStub or LibStub.minor < LIBSTUB_MINOR then | if not LibStub or LibStub.minor < LIBSTUB_MINOR then | ||||||
| 	LibStub = LibStub or {libs = {}, minors = {} } | 	LibStub = LibStub or {libs = {}, minors = {} } | ||||||
| 	_G[LIBSTUB_MAJOR] = LibStub | 	_G[LIBSTUB_MAJOR] = LibStub | ||||||
| 	LibStub.minor = LIBSTUB_MINOR | 	LibStub.minor = LIBSTUB_MINOR | ||||||
| 	 | 	 | ||||||
|  | 	-- LibStub:NewLibrary(major, minor) | ||||||
|  | 	-- major (string) - the major version of the library | ||||||
|  | 	-- minor (string or number ) - the minor version of the library | ||||||
|  | 	--  | ||||||
|  | 	-- returns nil if a newer or same version of the lib is already present | ||||||
|  | 	-- returns empty library object or old library object if upgrade is needed | ||||||
| 	function LibStub:NewLibrary(major, minor) | 	function LibStub:NewLibrary(major, minor) | ||||||
| 		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") | 		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") | ||||||
| 		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") | 		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") | ||||||
| @@ -18,6 +27,12 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then | |||||||
| 		return self.libs[major], oldminor | 		return self.libs[major], oldminor | ||||||
| 	end | 	end | ||||||
| 	 | 	 | ||||||
|  | 	-- LibStub:GetLibrary(major, [silent]) | ||||||
|  | 	-- major (string) - the major version of the library | ||||||
|  | 	-- silent (boolean) - if true, library is optional, silently return nil if its not found | ||||||
|  | 	-- | ||||||
|  | 	-- throws an error if the library can not be found (except silent is set) | ||||||
|  | 	-- returns the library object if found | ||||||
| 	function LibStub:GetLibrary(major, silent) | 	function LibStub:GetLibrary(major, silent) | ||||||
| 		if not self.libs[major] and not silent then | 		if not self.libs[major] and not silent then | ||||||
| 			error(("Cannot find a library instance of %q."):format(tostring(major)), 2) | 			error(("Cannot find a library instance of %q."):format(tostring(major)), 2) | ||||||
| @@ -25,6 +40,12 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then | |||||||
| 		return self.libs[major], self.minors[major] | 		return self.libs[major], self.minors[major] | ||||||
| 	end | 	end | ||||||
| 	 | 	 | ||||||
| 	function LibStub:IterateLibraries() return pairs(self.libs) end | 	-- LibStub:IterateLibraries() | ||||||
|  | 	--  | ||||||
|  | 	-- Returns an iterator for the currently registered libraries | ||||||
|  | 	function LibStub:IterateLibraries()  | ||||||
|  | 		return pairs(self.libs)  | ||||||
|  | 	end | ||||||
|  | 	 | ||||||
| 	setmetatable(LibStub, { __call = LibStub.GetLibrary }) | 	setmetatable(LibStub, { __call = LibStub.GetLibrary }) | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,9 +0,0 @@ | |||||||
| ## Interface: 20400 |  | ||||||
| ## Title: Lib: LibStub |  | ||||||
| ## Notes: Universal Library Stub |  | ||||||
| ## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel |  | ||||||
| ## X-Website: http://jira.wowace.com/browse/LS |  | ||||||
| ## X-Category: Library |  | ||||||
| ## X-License: Public Domain	 |  | ||||||
|  |  | ||||||
| LibStub.lua |  | ||||||
		Reference in New Issue
	
	Block a user