annotate DependencyLoader/DependencyLoader.lua @ 12:b230b94d4487

fixed Addon.lua to use the unhooked EnableAddOn (still needs to be changed to grab from the interface) improved the error message when creating an Addon object on a Blizzard addon (will add direct support later) implemented the hooks on EnableAddOn and LoadAddOn rearranged functions inside Tree.lua, with some edits copied OptDeps from main module to the bootstrap module, to delegate loading to the client when possible
author mckenziemc
date Fri, 10 Dec 2010 00:21:17 -0800
parents e0a4a8b5b389
children 78b28ebdc169
rev   line source
mckenziemc@10 1 -- DependencyLoader
mckenziemc@0 2 --
mckenziemc@0 3
mckenziemc@12 4
mckenziemc@0 5 local addonName, addonTable = ...
mckenziemc@0 6
mckenziemc@0 7
mckenziemc@10 8 local DependencyLoader = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceHook-3.0")
mckenziemc@0 9 _G[addonName] = DependencyLoader
mckenziemc@0 10
mckenziemc@10 11 addonTable.interface = DependencyLoader
mckenziemc@10 12
mckenziemc@10 13
mckenziemc@12 14 local LibPrint = LibStub("LibPrint-1.0")
mckenziemc@10 15 local LibScriptLink = LibStub("LibScriptLink-1.0")
mckenziemc@10 16
mckenziemc@12 17 DependencyLoader.printStream = LibPrint:NewStream("DependencyLoader", "DpLdr", print)
mckenziemc@12 18 DependencyLoader.debugStream = LibPrint:NewStream("DependencyLoader", "DpLdr", "mcm")
mckenziemc@0 19
mckenziemc@0 20
mckenziemc@0 21 function DependencyLoader:Print(...)
mckenziemc@0 22 self.printStream:Print(...)
mckenziemc@0 23 end
mckenziemc@0 24
mckenziemc@0 25
mckenziemc@0 26 function DependencyLoader:Debug(...)
mckenziemc@0 27 self.debugStream:Print(...)
mckenziemc@0 28 end
mckenziemc@0 29
mckenziemc@0 30
mckenziemc@0 31 function DependencyLoader:OnInitialize()
mckenziemc@10 32 self:Debug("Initializing", addonName)
mckenziemc@0 33 self:Enable()
mckenziemc@0 34 end
mckenziemc@0 35
mckenziemc@0 36
mckenziemc@0 37 function DependencyLoader:OnEnable()
mckenziemc@12 38 self:RawHook("LoadAddOn", true)
mckenziemc@12 39 self:RawHook("EnableAddOn", true)
mckenziemc@12 40
mckenziemc@12 41 self:PrepareAllAddons()
mckenziemc@12 42
mckenziemc@10 43 self:Print("Enabled", addonName)
mckenziemc@0 44 end
mckenziemc@0 45
mckenziemc@10 46
mckenziemc@0 47 function DependencyLoader:OnDisable()
mckenziemc@0 48 self:Print("Disabled", addonName)
mckenziemc@0 49 end
mckenziemc@0 50
mckenziemc@0 51
mckenziemc@10 52 -- Does not consider user settings or addon errata.
mckenziemc@10 53 function DependencyLoader:IsForceLoadAvailable()
mckenziemc@10 54 return IsLoggedIn() and true or false
mckenziemc@10 55 end
mckenziemc@10 56
mckenziemc@10 57
mckenziemc@10 58 function DependencyLoader:IsForceLoadAllowed()
mckenziemc@10 59 -- TODO: check user settings
mckenziemc@10 60 return true
mckenziemc@10 61 end
mckenziemc@10 62
mckenziemc@10 63
mckenziemc@10 64 function DependencyLoader:CanForceLoad()
mckenziemc@10 65 return self:IsForceLoadAvailable() and self:IsForceLoadAllowed()
mckenziemc@10 66 end
mckenziemc@10 67
mckenziemc@0 68
mckenziemc@0 69 -- Enables any dependencies needed by the addons
mckenziemc@0 70 -- that have already been enabled
mckenziemc@12 71 function DependencyLoader:PrepareAllAddons()
mckenziemc@10 72 local requestReload = false
mckenziemc@10 73
mckenziemc@0 74 for i=1, GetNumAddOns() do
mckenziemc@10 75 local addon = addonTable.classes.Addon:Get(i)
mckenziemc@0 76
mckenziemc@10 77 -- TODO: what if an addon was loaded but its deps were then disabled?
mckenziemc@10 78 if addon:IsEnabled() and not addon:IsLoaded() then
mckenziemc@12 79 self:EnableAddOn(addon:GetName())
mckenziemc@0 80 end
mckenziemc@0 81 end
mckenziemc@10 82
mckenziemc@12 83 --[[
mckenziemc@10 84 if requestReload then
mckenziemc@10 85 local message = LibScriptLink:NewLink(ReloadUI) .. " to reload your UI."
mckenziemc@10 86 self:Print(message)
mckenziemc@10 87 end
mckenziemc@12 88 ]]
mckenziemc@0 89 end
mckenziemc@10 90
mckenziemc@10 91
mckenziemc@10 92 function DependencyLoader:EnableAddOn(...)
mckenziemc@12 93 local id = ...
mckenziemc@12 94 local addon = addonTable.classes.Addon:Get(id)
mckenziemc@12 95 local tree = addonTable.classes.Tree:Get(addon)
mckenziemc@12 96
mckenziemc@12 97 local requestReload = false
mckenziemc@12 98
mckenziemc@12 99 if self:CanForceLoad() then
mckenziemc@12 100 -- NOTE: if we can force-load, then will enabling LoD addons cause them to load too?
mckenziemc@12 101 -- A: no, they will still wait for LoadAddOn
mckenziemc@12 102
mckenziemc@12 103 -- Can the addon be loaded on demand if force-loading is
mckenziemc@12 104 -- allowed for its dependencies
mckenziemc@12 105 -- if so, enable all deps and force-load if nec.
mckenziemc@12 106 -- deps will get enabled if all parents are lod, force-loaded
mckenziemc@12 107 -- if any parent can't be loaded on demand
mckenziemc@12 108 -- else
mckenziemc@12 109 -- if the addon is not loadable on demand but the tree can be
mckenziemc@12 110 -- force-loaded, then force-load it all
mckenziemc@12 111 -- deps will all get loaded since req. for root to load
mckenziemc@12 112 -- else
mckenziemc@12 113 -- if it can be loaded with a reloadui then prepare after login
mckenziemc@12 114 -- else
mckenziemc@12 115 -- it can't be loaded, maybe tell the user
mckenziemc@12 116
mckenziemc@12 117 if tree:CanLoDWithForce() then
mckenziemc@12 118 tree:PrepareForLoD()
mckenziemc@12 119 elseif tree:CanForceLoad() then
mckenziemc@12 120 tree:ForceLoad()
mckenziemc@12 121 elseif tree:CanLoad() then
mckenziemc@12 122 tree:PrepareForReload()
mckenziemc@12 123 requestReload = true
mckenziemc@12 124 else
mckenziemc@12 125 -- TODO: tell user
mckenziemc@12 126 end
mckenziemc@12 127 else
mckenziemc@12 128 -- if it can be loaded on demand (deps are loaded or LoD) then
mckenziemc@12 129 -- prepare it (enable all deps)
mckenziemc@12 130 -- else
mckenziemc@12 131 -- if it can be loaded (and isn't already) then
mckenziemc@12 132 -- if force loading is available, we have to wait, then enable everything
mckenziemc@12 133 -- else
mckenziemc@12 134 -- prepare for reload (TODO: move this check and similar to PLAYER_LOGOUT)
mckenziemc@12 135 -- else
mckenziemc@12 136 -- can't be loaded, maybe tell the user
mckenziemc@12 137
mckenziemc@12 138 if tree:CanLoD() then
mckenziemc@12 139 tree:PrepareForReload()
mckenziemc@12 140 -- don't actually intend to reload, just enable everything
mckenziemc@12 141 elseif tree:CanLoad() then
mckenziemc@12 142 tree:PrepareForReload()
mckenziemc@12 143 requestReload = true
mckenziemc@12 144 else
mckenziemc@12 145 -- TODO: tell user
mckenziemc@12 146 end
mckenziemc@12 147 end
mckenziemc@12 148
mckenziemc@12 149 -- TODO: requestReload
mckenziemc@12 150
mckenziemc@12 151 return self.hooks.EnableAddOn(...)
mckenziemc@10 152 end
mckenziemc@12 153
mckenziemc@12 154
mckenziemc@12 155
mckenziemc@12 156 --- Prepares the addon tree rooted at the specified addon
mckenziemc@12 157 function DependencyLoader:LoadAddOn(...)
mckenziemc@12 158 local id = ...
mckenziemc@12 159
mckenziemc@12 160 local isBlizzardAddon = false
mckenziemc@12 161
mckenziemc@12 162 if type(id) == "string" and string.match(id, "Blizzard_") then
mckenziemc@12 163 self:Debug("Asked to load Blizzard addon", id, ", skipping")
mckenziemc@12 164 isBlizzardAddon = true
mckenziemc@12 165 end
mckenziemc@12 166
mckenziemc@12 167 if not isBlizzardAddon then
mckenziemc@12 168 local addon = addonTable.classes.Addon:Get(id)
mckenziemc@12 169 local tree = addonTable.classes.Tree:Get(addon)
mckenziemc@12 170
mckenziemc@12 171 if tree:CanLoD() then
mckenziemc@12 172 tree:PrepareForLoD()
mckenziemc@12 173 elseif tree:CanLoad() then
mckenziemc@12 174 tree:PrepareForReload()
mckenziemc@12 175 end
mckenziemc@12 176 end
mckenziemc@12 177
mckenziemc@12 178 -- call even if it can't be loaded so regular returns appear
mckenziemc@12 179 return self.hooks.LoadAddOn(...)
mckenziemc@12 180 end