annotate DependencyLoader/DependencyLoader.lua @ 13:110baf84e7a8

fixed the LibPrint external in .pkgmeta (maybe)
author mckenziemc
date Fri, 10 Dec 2010 04:33:30 -0800
parents b230b94d4487
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