vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1  
2 local vmajor, vminor = "Bank 1", tonumber(string.sub("$Revision: 1519 $", 12, -3))
3 local stubvarname = "TekLibStub"
4 local libvarname = "SpecialEventsEmbed"
5  
6  
7 -- Check to see if an update is needed
8 -- if not then just return out now before we do anything
9 local libobj = getglobal(libvarname)
10 if libobj and not libobj:NeedsUpgraded(vmajor, vminor) then return end
11  
12  
13 local stubobj = getglobal(stubvarname)
14 if not stubobj then
15 stubobj = {}
16 setglobal(stubvarname, stubobj)
17  
18  
19 -- Instance replacement method, replace contents of old with that of new
20 function stubobj:ReplaceInstance(old, new)
21 for k,v in pairs(old) do old[k]=nil end
22 for k,v in pairs(new) do old[k]=v end
23 end
24  
25  
26 -- Get a new copy of the stub
27 function stubobj:NewStub(name)
28 local newStub = {}
29 self:ReplaceInstance(newStub, self)
30 newStub.libName = name
31 newStub.lastVersion = ''
32 newStub.versions = {}
33 return newStub
34 end
35  
36  
37 -- Get instance version
38 function stubobj:NeedsUpgraded(vmajor, vminor)
39 local versionData = self.versions[vmajor]
40 if not versionData or versionData.minor < vminor then return true end
41 end
42  
43  
44 -- Get instance version
45 function stubobj:GetInstance(version)
46 if not version then version = self.lastVersion end
47 local versionData = self.versions[version]
48 if not versionData then print(string.format("<%s> Cannot find library version: %s", self.libName, version or "")) return end
49 return versionData.instance
50 end
51  
52  
53 -- Register new instance
54 function stubobj:Register(newInstance)
55 local version,minor = newInstance:GetLibraryVersion()
56 self.lastVersion = version
57 local versionData = self.versions[version]
58 if not versionData then
59 -- This one is new!
60 versionData = {
61 instance = newInstance,
62 minor = minor,
63 old = {},
64 }
65 self.versions[version] = versionData
66 newInstance:LibActivate(self)
67 return newInstance
68 end
69 -- This is an update
70 local oldInstance = versionData.instance
71 local oldList = versionData.old
72 versionData.instance = newInstance
73 versionData.minor = minor
74 local skipCopy = newInstance:LibActivate(self, oldInstance, oldList)
75 table.insert(oldList, oldInstance)
76 if not skipCopy then
77 for i, old in ipairs(oldList) do self:ReplaceInstance(old, newInstance) end
78 end
79 return newInstance
80 end
81 end
82  
83  
84 if not libobj then
85 libobj = stubobj:NewStub(libvarname)
86 setglobal(libvarname, libobj)
87 end
88  
89 local lib = {}
90  
91  
92 -- Return the library's current version
93 function lib:GetLibraryVersion()
94 return vmajor, vminor
95 end
96  
97  
98 function lib:RegisterEvent(caller, eventname, method)
99 if not eventname or not caller then return end
100  
101 if not self.registrar[eventname] then self.registrar[eventname] = {} end
102 self.registrar[eventname][caller] = method or eventname
103 return true
104 end
105  
106  
107 function lib:UnregisterEvent(caller, eventname)
108 if not eventname or not caller or not self.registrar[eventname]
109 or not self.registrar[eventname][caller] then return end
110  
111 self.registrar[eventname][caller] = nil
112 return true
113 end
114  
115  
116 function lib:UnregisterAllEvents(caller)
117 if not caller then return end
118  
119 for _,v in pairs(self.registrar) do v[caller] = nil end
120 return true
121 end
122  
123  
124 function lib:TriggerEvent(eventname, a1,a2,a3,a4)
125 if not eventname or not self.registrar[eventname] then return end
126  
127 for i,v in pairs(self.registrar[eventname]) do
128 if type(v) == "function" then v(i,a1,a2,a3,a4)
129 elseif i[v] then i[v](i,a1,a2,a3,a4) end
130 end
131 end
132  
133  
134 -- Activate a new instance of this library
135 function lib:LibActivate(stub, oldLib, oldList)
136 if oldLib then
137 self.vars, self.registrar = oldLib.vars, oldLib.registrar
138 self.frame = oldLib.frame
139 else
140 self.registrar, self.vars = {}, {}
141 self.frame = CreateFrame("Frame")
142 self.frame.name = "SEEmbed Bank Frame"
143 self.frame:RegisterEvent("BANKFRAME_OPENED")
144 self.frame:RegisterEvent("BANKFRAME_CLOSED")
145 end
146 self.frame:SetScript("OnEvent", self.OnEvent)
147 end
148  
149  
150 function lib:OnEvent()
151 local self = lib
152 if self[event] then self[event](self) end
153 end
154  
155  
156 --------------------------------
157 -- Tracking methods --
158 --------------------------------
159  
160 function lib:BANKFRAME_OPENED()
161 self.frame:RegisterEvent("BAG_UPDATE")
162 self.frame:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
163 if self.vars.bank then return end
164  
165 self.vars.bank = {}
166  
167 for bag=-1,10 do
168 if bag >= 0 and bag <= 4 then break end
169 self.vars.bank[bag] = {}
170  
171 for slot=1,GetContainerNumSlots(bag) do
172 local itemlink = GetContainerItemLink(bag, slot)
173 local _, stack = GetContainerItemInfo(bag, slot)
174  
175 self.vars.bank[bag][slot] = {itemlink, stack}
176 end
177 end
178 end
179  
180  
181 function lib:BANKFRAME_CLOSED()
182 self.frame:UnregisterEvent("BAG_UPDATE")
183 self.frame:UnregisterEvent("PLAYERBANKSLOTS_CHANGED")
184 end
185  
186  
187 function lib:PLAYERBANKSLOTS_CHANGED()
188 self:BAG_UPDATE(-1)
189 end
190  
191  
192 function lib:BAG_UPDATE(bagnum)
193 local bag = bagnum or arg1
194 if not bag then self:TriggerEvent("SPECIAL_WTF", "No bag!") return end
195 if bag >= 0 and bag <= 4 then return end
196  
197 for slot=1,self:GetNumSlots(bag) do
198 local itemlink = GetContainerItemLink(bag, slot)
199 local _, stack = GetContainerItemInfo(bag, slot)
200  
201 if not self.vars.bank[bag] then self.vars.bank[bag] = {} end
202 if not self.vars.bank[bag][slot] then self.vars.bank[bag][slot] = {} end
203  
204 local oldlink, oldstack = self.vars.bank[bag][slot][1], self.vars.bank[bag][slot][2]
205  
206 if (oldlink ~= itemlink) or (oldstack ~= stack) then
207 self:TriggerEvent("SPECIAL_BANKBAGSLOT_UPDATE", bag, slot, itemlink, stack, oldlink, oldstack)
208 self.vars.bank[bag][slot][1], self.vars.bank[bag][slot][2] = itemlink, stack
209 end
210 end
211 end
212  
213  
214 function lib:GetNumSlots(bag)
215 if not self.vars.bank[bag] then return GetContainerNumSlots(bag) end
216  
217 local n = 0
218 for i in pairs(self.vars.bank[bag]) do n = n + 1 end
219 return math.max(n, GetContainerNumSlots(bag))
220 end
221  
222  
223 --------------------------------
224 -- Load this bitch! --
225 --------------------------------
226 libobj:Register(lib)