diff --git a/init/modules.xml b/init/modules.xml index 8ff10ac0..676cec85 100644 --- a/init/modules.xml +++ b/init/modules.xml @@ -60,4 +60,5 @@ + diff --git a/modules/addoncompat.lua b/modules/addoncompat.lua new file mode 100644 index 00000000..ed78bdde --- /dev/null +++ b/modules/addoncompat.lua @@ -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)