fix(compat): guard retail-only InterfaceOptions globals and Settings.* API
AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua: the Constructor parented its frame to the global InterfaceOptionsFramePanelContainer, which is nil at AceGUI widget-construction time on the CoA reworked FrameXML. Guard with 'local _parent = InterfaceOptionsFramePanelContainer or UIParent' and pass _parent to CreateFrame so addons that register a Blizzard Interface Options panel don't error out during load. AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua: :AddToBlizOptions used the Dragonflight+ Settings.* API (GetCategory, RegisterCanvasLayoutCategory, RegisterCanvasLayoutSubcategory, RegisterAddOnCategory). The Settings table doesn't exist on the 3.3.5-based CoA client, so every AceConfig-driven options panel errored the moment it was registered. Wrap the whole Settings.* block in 'if Settings and Settings.GetCategory then ... else ... end' and fall back to the WotLK-era InterfaceOptions_AddCategory(group.frame) after stamping the category name via group:SetName(name or appName, parent). Both retail and CoA paths now work; behaviour on retail is unchanged. luac -p passes on both files. README CoA-compat patches table updated (entries 2 and 3). This bundle is the source-of-truth for the Exiles/coa-* forks; the propagation to bartender / quartz / shadowedunitframes / ai-voiceover / etc. bundled Ace copies is handled separately.
This commit is contained in:
@@ -2014,28 +2014,37 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
|
||||
group:SetCallback("OnHide", ClearBlizPanel)
|
||||
|
||||
local categoryName = name or appName
|
||||
if parent then
|
||||
local parentID = BlizOptionsIDMap[parent] or parent
|
||||
local category = Settings.GetCategory(parentID)
|
||||
if not category then
|
||||
error(("The parent category '%s' was not found"):format(parent), 2)
|
||||
end
|
||||
local subcategory = Settings.RegisterCanvasLayoutSubcategory(category, group.frame, categoryName)
|
||||
group:SetName(subcategory.ID, parentID)
|
||||
else
|
||||
if BlizOptionsIDMap[categoryName] then
|
||||
error(("%s has already been added to the Blizzard Options Window with the given name: %s"):format(appName, categoryName), 2)
|
||||
end
|
||||
-- CoA-compat: the Settings.* API (GetCategory / RegisterCanvasLayoutCategory /
|
||||
-- RegisterCanvasLayoutSubcategory / RegisterAddOnCategory) is a retail-only
|
||||
-- (Dragonflight+) replacement for the WotLK-era InterfaceOptions_AddCategory.
|
||||
-- On the 3.3.5-based CoA client Settings is nil, so fall back to the legacy API.
|
||||
if Settings and Settings.GetCategory then
|
||||
if parent then
|
||||
local parentID = BlizOptionsIDMap[parent] or parent
|
||||
local category = Settings.GetCategory(parentID)
|
||||
if not category then
|
||||
error(("The parent category '%s' was not found"):format(parent), 2)
|
||||
end
|
||||
local subcategory = Settings.RegisterCanvasLayoutSubcategory(category, group.frame, categoryName)
|
||||
group:SetName(subcategory.ID, parentID)
|
||||
else
|
||||
if BlizOptionsIDMap[categoryName] then
|
||||
error(("%s has already been added to the Blizzard Options Window with the given name: %s"):format(appName, categoryName), 2)
|
||||
end
|
||||
|
||||
local category = Settings.RegisterCanvasLayoutCategory(group.frame, categoryName)
|
||||
if not (C_SettingsUtil and C_SettingsUtil.OpenSettingsPanel) then
|
||||
-- override the ID so the name can be used in Settings.OpenToCategory
|
||||
-- unfortunately with incoming API changes in 12.0 (and likely classic at some point) this override is no longer possible
|
||||
category.ID = categoryName
|
||||
local category = Settings.RegisterCanvasLayoutCategory(group.frame, categoryName)
|
||||
if not (C_SettingsUtil and C_SettingsUtil.OpenSettingsPanel) then
|
||||
-- override the ID so the name can be used in Settings.OpenToCategory
|
||||
-- unfortunately with incoming API changes in 12.0 (and likely classic at some point) this override is no longer possible
|
||||
category.ID = categoryName
|
||||
end
|
||||
group:SetName(category.ID)
|
||||
BlizOptionsIDMap[categoryName] = category.ID
|
||||
Settings.RegisterAddOnCategory(category)
|
||||
end
|
||||
group:SetName(category.ID)
|
||||
BlizOptionsIDMap[categoryName] = category.ID
|
||||
Settings.RegisterAddOnCategory(category)
|
||||
else
|
||||
group:SetName(name or appName, parent)
|
||||
InterfaceOptions_AddCategory(group.frame)
|
||||
end
|
||||
|
||||
return group.frame, group.frame.name
|
||||
|
||||
Reference in New Issue
Block a user