mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-21 23:26:56 +00:00
addoncompat: an addon compatibility checker
* Checks for redundant and incompatible addons. * Asks the user for soft-conflicts if they want to keep it * Saves soft-conflicts to not annoy the user on every login * Automatically disables hard-conflicts
This commit is contained in:
@@ -60,4 +60,5 @@
|
||||
<Include file="..\modules\addonbuttons.lua"/>
|
||||
<Include file="..\modules\afkcam.lua"/>
|
||||
<Include file="..\modules\screenshot.lua"/>
|
||||
<Include file="..\modules\addoncompat.lua"/>
|
||||
</Ui>
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
pfUI:RegisterModule("addoncompat", function ()
|
||||
-- save addon decissions across logins
|
||||
pfUI_init.addons = pfUI_init.addons or {}
|
||||
|
||||
-- used as a dummy for an always matching dependency
|
||||
local always = function()
|
||||
return true
|
||||
end
|
||||
|
||||
-- The first entry of the conflict tables contain a function
|
||||
-- that is used as a dependency checker. For example, to make sure
|
||||
-- we don't deactivate snowfall when actionbars aren't in use.
|
||||
-- The second entry is a function that runs specific code. This
|
||||
-- can be used to enable a specific option when the addon gets disabled.
|
||||
|
||||
local hardconflict = {
|
||||
["ClassicSnowFall"] = {
|
||||
function() return pfUI.bars end, -- dependency
|
||||
function() pfUI_config.bars.keydown = "1" end, -- option
|
||||
},
|
||||
}
|
||||
|
||||
local softconflict = {
|
||||
["MinimapButtonFrame"] = { always, function() pfUI_config.abuttons.enable = "1" end },
|
||||
["MBB"] = { always, function() pfUI_config.abuttons.enable = "1" end },
|
||||
["SellValue"] = { always },
|
||||
["EquipCompare"] = { always },
|
||||
["EQCompare"] = { always },
|
||||
["OmniCC"] = { always },
|
||||
["ShaguBoP"] = { always },
|
||||
["ShaguCombat"] = { always },
|
||||
["ShaguCopy"] = { always },
|
||||
["ShaguError"] = { always },
|
||||
["ShaguMount"] = { always },
|
||||
["ShaguPlates"] = { always },
|
||||
["ShaguTooltips"] = { always },
|
||||
["ShaguValue"] = { always },
|
||||
["ColorGuildFrame-1.0"] = { always },
|
||||
["ColorSocialFrame"] = { always },
|
||||
["DebuffTimers"] = { always },
|
||||
["EquipColor"] = { always },
|
||||
["FocusFrame"] = { always },
|
||||
["GrayAutoSell"] = { always },
|
||||
["QuickBind"] = { always },
|
||||
["SmallerRollFrames"] = { always },
|
||||
["EzDismount"] = { always },
|
||||
["AddOnOrganizer"] = { always },
|
||||
}
|
||||
|
||||
local require_reload
|
||||
local queue_soft = {}
|
||||
local queue_hard = {}
|
||||
|
||||
-- scan through all addons
|
||||
for i=1, GetNumAddOns() do
|
||||
local name, title, notes, enabled = GetAddOnInfo(i)
|
||||
if enabled and not pfUI_init.addons[name] then
|
||||
if hardconflict[name] and hardconflict[name][1]() then
|
||||
queue_hard[name] = i
|
||||
end
|
||||
|
||||
if softconflict[name] and softconflict[name][1]() then
|
||||
queue_soft[name] = i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function RunQueue()
|
||||
-- run through hardlist
|
||||
local name, id = next(queue_hard)
|
||||
if name and id then
|
||||
-- disable addon
|
||||
DisableAddOn(id)
|
||||
|
||||
-- trigger action if availabe
|
||||
if hardconflict[name][2] then
|
||||
hardconflict[name][2]()
|
||||
end
|
||||
|
||||
-- ask for reload
|
||||
CreateQuestionDialog(
|
||||
string.format(T["The addon \"|cff33ffcc%s|r\" doesn't work with pfUI and has been disabled."], name) .. "\n"
|
||||
.. T["Do you want to reload the UI now?"],
|
||||
{T["Yes"], function()
|
||||
ReloadUI()
|
||||
end},
|
||||
{T["No"], function()
|
||||
queue_hard[name] = nil
|
||||
end},
|
||||
nil, RunQueue)
|
||||
return
|
||||
end
|
||||
|
||||
-- run through softlist
|
||||
local name, id = next(queue_soft)
|
||||
if name and id then
|
||||
CreateQuestionDialog(
|
||||
string.format(T["Every feature that \"|cff33ffcc%s|r\" offers is already built into pfUI."], name) .. "\n"
|
||||
.. T["Do you want to disable the addon?"],
|
||||
{T["Yes"], function()
|
||||
queue_soft[name] = nil
|
||||
|
||||
-- trigger action if availabe
|
||||
if softconflict[name][2] then
|
||||
softconflict[name][2]()
|
||||
end
|
||||
|
||||
DisableAddOn(id)
|
||||
require_reload = true
|
||||
end},
|
||||
{T["No"], function()
|
||||
queue_soft[name] = nil
|
||||
|
||||
-- cache value to not ask again
|
||||
pfUI_init.addons[name] = true
|
||||
end},
|
||||
nil, RunQueue)
|
||||
return
|
||||
end
|
||||
|
||||
-- in case of changes, ask for reload
|
||||
if require_reload then
|
||||
CreateQuestionDialog(
|
||||
T["The addon selection has changed."] .. "\n"
|
||||
.. T["Do you want to reload the UI now?"],
|
||||
{"Yes", function()
|
||||
ReloadUI()
|
||||
end},
|
||||
{"No", function() end},
|
||||
nil)
|
||||
end
|
||||
end
|
||||
|
||||
-- run the addonconflict queue when firstrun is ready
|
||||
local delay = CreateFrame("Frame")
|
||||
delay:SetScript("OnUpdate", function()
|
||||
-- throttle to to one query per .1 second
|
||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .1 end
|
||||
|
||||
-- make sure the firstrun dialog has finished
|
||||
if pfUI.firstrun and pfUI.firstrun.steps then
|
||||
for _, step in pairs(pfUI.firstrun.steps) do
|
||||
if not pfUI_init[step.name] then return end
|
||||
end
|
||||
end
|
||||
|
||||
RunQueue()
|
||||
this:SetScript("OnUpdate", nil)
|
||||
end)
|
||||
end)
|
||||
Reference in New Issue
Block a user